shcizo
c3bd4ca1ed
test(master): CreateJob waits for a concurrent revoke ( #7 )
2026-10-12 19:29:43 +02:00
shcizo
961ddd275c
test(master): wait for the replacement connection to register ( #7 )
2026-10-12 19:15:24 +02:00
shcizo
caa6c81716
fix(master): treat a bare image as :latest and handle a revoked agent in Trigger ( #7 )
2026-10-12 19:14:59 +02:00
shcizo
c09e774d74
fix(master): refuse jobs for revoked agents, signal revoked jobs, agent start time wins ( #7 )
2026-10-12 19:14:32 +02:00
shcizo
8b2c10cc05
fix(web): job log polls while active, one service history limit ( #7 )
2026-10-12 19:13:01 +02:00
shcizo
02de0b8cf3
feat(master): start manual update jobs with self-protection ( #7 )
2026-10-12 18:43:11 +02:00
shcizo
68e5c33722
feat(master): route jobs to agents and reconcile them on reconnect ( #7 )
2026-10-12 18:42:30 +02:00
shcizo
574f425267
feat(web): service page, manual update, jobs list and live job log ( #7 )
...
Also publishes the jobs topic on agent revoke and updates the agent
snippet to mount stacks read-write at the same path.
2026-10-12 18:41:46 +02:00
shcizo
9d3a6f808c
feat(master): store update jobs ( #7 )
2026-10-12 18:40:48 +02:00
shcizo
c9c4e0cadb
refactor(web): web.New takes the jobs service ( #7 )
2026-10-12 18:39:57 +02:00
shcizo
9e09de0a16
feat(protocol): job messages, protocol version and job model ( #7 )
2026-10-12 18:38:39 +02:00
shcizo
2fe9b5ba0d
fix(master): block inventory writes from revoked agents ( #6 )
...
ApplySnapshot and UpsertService now take a FOR SHARE lock on the agent's
row and refuse with model.ErrRevoked when it is revoked. RevokeAgent's
UPDATE waits on that lock, so an in-flight snapshot or upsert can no
longer bring a revoked agent's services back after the revoke cleanup.
2026-10-12 15:18:51 +02:00
shcizo
0e9e34db06
fix: address final review findings for master/agent phase 1 ( #6 )
...
- inventory: resolve the image reference via ContainerInspect when a moved
tag makes ContainerList report the image ID
- store: allow reusing a revoked agent's name (partial unique index) and
mark the revoked agent's compose/container services removed
- web: publish a services event on revoke; no-store on the one-time token page
- webauth: reject empty OIDC state; accept the CSRF form token from the body only
- agent conn: bound the WebSocket handshake to 30s
- hub: log agent_replaced when a connection replaces an older one
2026-10-12 15:16:29 +02:00
shcizo
e8f7cb3378
feat(master): add updater-master binary wiring store, hub, auth and UI
2026-10-12 15:01:11 +02:00
shcizo
a596d67728
feat(master): htmx UI with live service overview and agent management
...
Vendored static assets (sha256):
e209dda5c8235479f3166defc7750e1dbcd5a5c1808b7792fc2e6733768fb447 htmx.min.js (htmx.org@2.0.4)
83eca6fa0611fe2b0bf1700b424b88b5eced38ef448ef9760a2ea08fbc875611 htmx-ext-sse.js (htmx-ext-sse@2.2.2)
2026-10-12 14:57:23 +02:00
shcizo
b4894db6d7
feat(master): OIDC login with group check, sessions and CSRF protection
2026-10-12 14:54:11 +02:00
shcizo
049324b2f4
fix(master): recheck revocation after register, reject duplicate hello
2026-10-12 14:52:24 +02:00
shcizo
75e28262f8
feat(master): agent hub that authenticates agents and stores their inventory
2026-10-12 14:50:22 +02:00
shcizo
5d75f9a7da
feat(master): in-process broker for live UI change signals
2026-10-12 14:48:03 +02:00
shcizo
8a1fb45971
feat(master): store service inventory snapshots and web sessions
2026-10-12 14:45:46 +02:00
shcizo
99c553b7c6
feat(master): postgres store with migrations, master identity and agents
2026-10-12 14:43:34 +02:00