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
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