shcizo
50ef1a9a07
Merge pull request 'feat: add Docker Swarm support (MODE=swarm)' ( #4 ) from worktree-docker-swarm-support into main
...
Docker Build / docker (push) Successful in 1m7s
Reviewed-on: #4
v0.2.0
2026-07-04 18:54:14 +00:00
shcizo
db84a2f6ba
fix(api): plumb request tag into discovery so swarm mode deploys the requested version
...
req.Tag was only echoed in the HTTP response, never used to match jobs.
Compose mode didn't care (ComposeExecutor re-pulls the compose file's own
pinned tag), but SwarmExecutor sets the service image directly from
Job.Image, which was built from the untagged req.Image alone -- so a
Swarm deploy silently rewrote the service to :latest instead of the
requested tag. Build the full image:tag reference once in the handler
and pass it into FindJobs; NormaliseImage/ImagesMatch already strip
tags before matching, so this doesn't change which jobs match in either
mode.
2026-07-04 20:41:59 +02:00
shcizo
9881812eca
docs: document MODE=swarm support and its opt-in label / manager-node requirements
2026-07-04 20:32:22 +02:00
shcizo
ac3912367f
merge: bring in CLAUDE.md and CI workflow from main
2026-07-04 20:31:25 +02:00
shcizo
9a3a200873
feat: wire MODE config to select compose or swarm discovery/executor
2026-07-04 20:28:28 +02:00
shcizo
f92f8ac6b1
feat(api): surface ServiceID in update results for swarm jobs
2026-07-04 20:22:30 +02:00
shcizo
34865c9fd0
feat(updater): add SwarmExecutor to run docker service update via the Docker API
...
Adds the Swarm-mode counterpart to ComposeExecutor: updates a Swarm
service's image directly through the Docker SDK (ServiceInspectWithRaw +
ServiceUpdate with QueryRegistry=true so floating tags resolve to a fresh
digest), gated by the same Refused guard used in Compose mode. Satisfies
the existing Executor interface unchanged, so Queue needs no changes.
2026-07-04 20:19:00 +02:00
shcizo
a8524e5ff4
feat(discovery): add SwarmDiscovery to find opted-in Swarm services by image
...
Verified the Docker SDK v28.5.2+incompatible ServiceList signature via go doc
before implementing: the options type is swarm.ServiceListOptions, not
types.ServiceListOptions as the brief assumed. Everything else (Service.ID,
Service.Spec via embedded Annotations for Name/Labels, TaskTemplate.ContainerSpec.Image)
matched the brief exactly.
Reuses discovery.ImagesMatch and discovery.HasOptIn rather than duplicating
matching/opt-in logic. Opt-in label is read from the service spec's own
labels since Swarm services have no local compose file to anchor a
STACKS_ROOT path check against (unlike Compose mode).
2026-07-04 20:12:44 +02:00
shcizo
9cf484e164
feat(discovery): add Image and ServiceID fields to Job for swarm support
2026-07-04 20:09:39 +02:00
shcizo
1002bb7b96
feat(config): add MODE env var to select compose or swarm operation
2026-07-04 20:06:50 +02:00
shcizo
8f999c69bd
docs: add docker swarm support implementation plan
2026-07-04 20:05:02 +02:00
shcizo
df54bbaacf
docs: add CLAUDE.md with project context for Claude Code
...
Captures design intent, gotchas, and references that aren't obvious
from code alone — single-worker queue rationale, defense-in-depth
security model, the not-yet-wired selfupdate package, and pointers
to the design spec and implementation plan in docs/superpowers/.
2026-05-22 14:27:28 +02:00
shcizo
476945722b
Merge pull request 'ci: docker build + push workflow on v* tags' ( #2 ) from feat/ci-docker-build into main
Docker Build / docker (push) Successful in 51s
v0.1.0
2026-05-22 14:09:02 +02:00
shcizo
2494e71969
ci: docker build + push on v* tags
2026-05-22 14:02:45 +02:00
shcizo
46ef00c742
Merge pull request 'Initial implementation: package-updater v1' ( #1 ) from feat/initial-implementation into main
2026-05-22 13:59:37 +02:00
shcizo
e43868bf41
build: bump Dockerfile to golang:1.26-alpine to match go.mod
2026-05-22 13:56:23 +02:00
shcizo
9a8b171198
feat: docker-compose.local.yml for local build/smoke-test
2026-05-22 13:53:49 +02:00
shcizo
3abd1bf9af
feat(metrics): wire instrumentation through queue, handlers, middleware
2026-05-22 13:17:09 +02:00
shcizo
ef9c0f1313
chore: gitignore stray ./server binary from go build
2026-05-22 13:05:43 +02:00
shcizo
b866f6d47c
feat(cmd): wire config, discovery, queue, http server, metrics
2026-05-22 13:04:44 +02:00
shcizo
952189eb09
feat(metrics): Prometheus collectors and /metrics handler
2026-05-22 12:59:53 +02:00
shcizo
2be2fdf325
docs: real README with quick start, endpoints, observability
2026-05-22 12:09:37 +02:00
shcizo
33a8b8689f
feat(action): reusable Gitea composite action for /update
2026-05-22 12:08:12 +02:00
shcizo
804b69b67c
docs: docker-compose.example.yml for end-user deploy
2026-05-22 12:07:47 +02:00
shcizo
00bada890b
build: multi-stage Dockerfile with build info ldflags
2026-05-22 12:07:36 +02:00
shcizo
e88f105490
feat(selfupdate): defer self-replacement until response flushed
2026-05-22 12:06:07 +02:00
shcizo
857f504d36
feat(api): /update, /healthz, /version handlers
2026-05-22 12:03:56 +02:00
shcizo
df2dc30cea
feat(api): auth, request_id, and request-logging middleware
2026-05-22 11:59:34 +02:00
shcizo
c9b1af42e5
feat(updater): FIFO queue with single worker and per-job results
2026-05-22 11:57:09 +02:00
shcizo
a275f208c4
feat(updater): ComposeExecutor shells out to docker compose
2026-05-22 11:54:03 +02:00
shcizo
058b9d8c07
feat(updater): Executor interface
2026-05-22 11:53:42 +02:00
shcizo
db784ad303
feat(discovery): orchestrate match, opt-in filter, dedup, path-check
2026-05-22 11:51:07 +02:00
shcizo
897093ed1c
feat(discovery): STACKS_ROOT path safety check
2026-05-22 11:45:56 +02:00
shcizo
13ccb79ef5
feat(discovery): parse Compose-managed labels
2026-05-22 11:44:10 +02:00
shcizo
cff6c1baff
feat(discovery): tag-agnostic image name normalisation
2026-05-22 11:41:33 +02:00
shcizo
e665b6cd7e
feat(logging): structured JSON logger with request_id context
2026-05-22 11:38:07 +02:00
shcizo
883f3cfecf
chore: tidy go.sum for testify transitive deps
2026-05-22 11:35:33 +02:00
shcizo
9832b2b190
docs: complete se.enocsson to se.shcizo rename in spec
2026-05-22 11:35:33 +02:00
shcizo
4f2a19c663
chore: gitignore Serena MCP workspace
2026-05-22 11:35:33 +02:00
shcizo
2b7f7d863a
feat(config): load and validate env-var config
2026-05-22 11:24:29 +02:00
shcizo
1ca9f5296a
chore: scaffold Go project layout
2026-05-22 11:16:23 +02:00
shcizo
ef14465314
docs: remove dead strconv import from main.go in plan
2026-05-22 11:13:40 +02:00
shcizo
3e600aeb88
docs: add package-updater implementation plan
...
19-task TDD plan covering project scaffolding, config, structured
logging, discovery (image matching, Compose label parsing, path safety,
orchestration), executor abstraction, FIFO queue + single worker, HTTP
middleware (auth, request_id, request logging), handlers (/update,
/healthz, /version), Prometheus metrics, self-update deferred
execution, wire-up in main, Dockerfile, example compose, Gitea
composite action, and README.
2026-05-22 11:10:51 +02:00
shcizo
96d94efd6a
docs: add package-updater design spec
...
Initial design spec for package-updater service:
- Go HTTP service triggered by Gitea Actions webhook
- Discovers Compose-managed containers via Docker labels
- Two-gate security: bearer token + opt-in label
- Stateless, single-worker, no rollback in v1
- Loki structured logs + Prometheus metrics
- Reusable composite Gitea action
Decisions reached via brainstorming session 2026-05-22.
2026-05-22 10:57:52 +02:00