Commit Graph

543 Commits

Author SHA1 Message Date
ship-bot
2463b9fc41 chore: bump tower to 0.66.24 - Step 2 installed flag + reconcile loop 2026-05-02 16:43:27 +02:00
ship-bot
53613b7533 chore: bump tower to 0.66.23 — Promote install-replay audit fixes
- partial-install visibility: error path now carries the modules
  installed before the failure, instead of silently dropping the list
- introspect log line: shows source-installed/target-installed/delta
  counts so the bell row narrates the comparison
- Authenticate calls: 15s timeout context (matches addon_lifecycle
  pattern; hung Odoo no longer pins the parent op)
- source readiness probe: 30s waitForOdooReady before introspect so
  source-down fails fast with clear message instead of cryptic auth
2026-05-02 15:58:56 +02:00
ship-bot
02097d8dd1 chore: bump tower to 0.66.22 — Promote install-delta replay (Step 1)
Promote no longer ships only code. After commit + sync it now:
- waits for target Odoo readiness
- queries source + target for installed-set across the recipe
- pre-checkpoint on target (best-effort)
- ButtonImmediate(install) on target for the delta

Op stays running until install hooks complete; complete means
prods Modules tab matches stages installed-set, not just mount layer.
2026-05-02 15:45:30 +02:00
ship-bot
c259e1a2c8 chore: bump tower to 0.66.21 — addon Dockerfile pip --break-system-packages
Odoo 19 image runs Python 3.12 (Bookworm), which enforces PEP 668.
pip install --user is blocked without --break-system-packages, so
every addon with even one external_dependencies.python entry failed
on Odoo 19. Build container is single-shot, so the lock does not
apply — the flag is the correct override here.
2026-05-02 15:15:42 +02:00
ship-bot
555a9297c8 chore: bump tower + tower-ui to 0.66.20
- Wizard: default Odoo to latest matrix entry; PG snaps to recommended
  on every Odoo change (was sticky-compatible, leaving PG 16 when
  switching to Odoo 19 even though 17 is recommended)
- export.go: pgClientImageFor(shape.PostgresVersion) — pg_dump tracks
  source instances actual PG version (17/18/whatever ships next)
2026-05-02 14:53:16 +02:00
ship-bot
08f5b12ab5 chore: bump tower to 0.66.19 — pg client images to 17-alpine (pg_dump 16 vs PG 17 server mismatch in export Job) 2026-05-02 14:48:39 +02:00
ship-bot
7c1c739555 chore: bump tower + tower-ui to 0.66.18
- ProjectsView: super-admin All-tenants mode now fans out across tenants
  (was falling back to platform tenant → empty Projects page)
- waitForJobTerminal: pod log tail spliced into job-failed errors
  (export, import, backup, restore — visibility into REAL cause)
- runSpawnEnv: register env BEFORE seed (was after) so a failed seed
  leaves a registered-but-empty env instead of a ghost instance
2026-05-02 14:22:08 +02:00
ship-bot
fea8246562 chore: bump tower-ui to 0.66.17 — unify tenant context (single source of truth across UI) 2026-05-02 14:03:11 +02:00
OdooSky Tower
e6afb17097 Bump tower to 0.66.16 — strict tenant isolation in /api/servers (#341) 2026-05-02 13:34:18 +02:00
OdooSky Tower
bb4edab194 Bump tower to 0.66.15 — DELETE /api/addons/{code} (full unpublish: tags + branch source) + ModuleDetailDrawer danger zone 2026-05-02 13:12:41 +02:00
OdooSky Tower
aee85dd453 Bump tower to 0.66.14 — fix manifest rewrite (#336) + slog visibility (#338) + addon delete button (UX) 2026-05-02 13:00:06 +02:00
OdooSky Tower
62455dbaf6 Bump tower to 0.66.13 — spawn-env confirm dialog (#333) + Promote disabled when in-sync (#334) 2026-05-02 11:58:16 +02:00
OdooSky Tower
7150de473c Bump tower to 0.66.12 — orphan project env sweep + RemoveProjectEnv writer (#321) 2026-05-02 11:47:54 +02:00
OdooSky Tower
ad2997a68c Bump tower to 0.66.11 — Domain Picker UI + smart deploy ETA + GET /api/tenants/{id}/cloudflare/zones 2026-05-02 11:40:05 +02:00
OdooSky Tower
681a572c06 Bump tower to 0.66.10 — close anonymous list-instance leak (fail-closed tenantFilter + requireAuth gates) 2026-05-02 11:30:38 +02:00
OdooSky Tower
07a178e0fc Bump tower image to 0.66.9 — CF/S3 token rotation propagates to all owned cluster Secrets (#330) 2026-05-02 11:00:12 +02:00
Tower deploy
388688bf71 feat: per-host TLS for non-wildcard instance domains — tower 0.66.8 + chart change 2026-05-02 10:11:32 +02:00
Tower deploy
0dbdcc4d59 fix: op actor can always see their own op (cross-tenant scope) — tower 0.66.7 2026-05-02 09:54:00 +02:00
Tower deploy
abbee48aad feat: addon publish is async (op + poll, no Traefik timeout) — tower 0.66.6 2026-05-02 09:34:11 +02:00
Tower deploy
98eca0184a feat: bulk Overwrite-all button in conflict wizard — tower-ui 0.66.5 2026-05-02 09:19:43 +02:00
Tower deploy
cb13cd3e33 fix: backfill handles canonical-already-exists case (delete orphan short tag) — tower 0.66.4 2026-05-02 09:16:05 +02:00
Tower deploy
80625e3123 perf: addon publish uses Gitea ChangeFiles batch (1 commit per addon, ~20x speedup) — tower 0.66.3 2026-05-02 09:10:15 +02:00
Tower deploy
20ece132a9 feat: bulk Odoo-major setter for multi-addon zips — tower-ui 0.66.2 2026-05-02 08:42:35 +02:00
Tower deploy
6376dc9357 feat: marketplace backfill admin endpoint — tower 0.66.1 2026-05-02 08:40:22 +02:00
Tower deploy
c2e39736a5 feat: addon upload wizard with operator-driven Odoo major picker + OCA-shape rewrite — tower 0.66.0 2026-05-02 08:31:08 +02:00
Tower deploy
5da802fe8d fix: catalog falls back to branch probe when version-derivation produces non-Odoo-major — tower 0.65.8 2026-05-02 08:15:11 +02:00
Tower deploy
57119556cb fix: ProjectsView uses tenant filter + super-admin fan-out — tower-ui 0.65.7 2026-05-02 08:06:33 +02:00
Tower deploy
443e69aac5 fix: Projects back in Admin sidebar for super-admin — tower-ui 0.65.6 2026-05-02 08:02:39 +02:00
Tower deploy
f0385dbc49 fix: hide tenant pill from non-super-admins — tower-ui 0.65.5 2026-05-02 07:48:41 +02:00
Tower deploy
b851071fc2 fix: spawn-env inherits source server URL + flat domain pattern — tower 0.65.4 2026-05-02 07:37:48 +02:00
Tower deploy
82424c2687 fix: spawn-env no-redirect + sticky tenant filter — tower-ui 0.65.3 2026-05-02 07:30:11 +02:00
Tower deploy
ece9a26bd7 fix: applicationExists treat 403 as missing — tower 0.65.2 2026-05-02 07:23:30 +02:00
Tower deploy
370b98e7fc fix: spawn-env stray 400 from projectEndpointAuth — bump tower 0.65.1 2026-05-02 07:19:14 +02:00
Tower deploy
57e15b25dd F-undo: tower 0.65.0 + tower-ui 0.65.0 (Instances primary + tenant pinning + spawn-env from instance card) 2026-05-02 07:11:21 +02:00
3c3f921854 ship 0.64.5 — resolve addon Odoo major from Gitea branch (fixes odoo:1.0 build error) 2026-05-02 04:48:38 +00:00
c625d9c29e ship 0.64.4 — derive Odoo major from filename when manifest version is short 2026-05-01 14:18:18 +00:00
820832a634 ship 0.64.3 — multi-addon zip + upload progress bar 2026-05-01 14:13:22 +00:00
8e0057b967 ship 0.64.2 — hide platform server from /servers (tower itself, not a deploy target) 2026-05-01 13:11:17 +00:00
dcfad63247 ship 0.64.1 — fix /instances → /projects links across views 2026-05-01 07:55:18 +00:00
89b80bca2d ship 0.64.0 — Phase F2 (Add Env buttons + sidebar reorder + Deploy Odoo CTA) 2026-05-01 07:48:37 +00:00
e8990f7f65 ship 0.63.2 — fix promotable null + bump frontend 2026-05-01 07:38:09 +00:00
183df42f1d ship 0.63.1 — Phase F1 fix: sweep reads actual env kind 2026-05-01 07:33:07 +00:00
baf04829a1 ship 0.63.0 — Phase F1 (Project as identity unit + spawn-env + sweep) 2026-05-01 07:28:52 +00:00
4d5aa41a91 ship 0.62.1 backend — pin k3s v1.34.6+k3s1 in bootstrap.sh (1.35.4 cloud-controller race) 2026-04-30 19:21:35 +00:00
6aabb11fff ship 0.62.0 — Phase E (Projects: dev/stage/prod + Promote ↑ + Refresh ↓ + Drift) 2026-04-30 18:38:47 +00:00
Claude
5f569ae2e0 tower-ui 0.61.25 — bell + activity follow the tenant filter
Backend SSE handler already accepts ?tenantId= as an additive filter
on top of canSeeOp (Phase G stays load-bearing); frontend now passes
the global tenant filter chip's value through both NotificationBell
and ActivityTab. Watcher clears + restarts the stream when the
super-admin switches tenant context. Dismissed Set is user-level
and survives the switch.
2026-04-30 18:38:59 +03:00
Claude
b5a3a3029b tower-ui 0.61.24 — bell dismiss + completion toasts
#2 Dismiss / Clear failed:
  - Per-row [×] (text 'Dismiss', shown on hover) on terminal ops
  - 'Clear' button in dropdown header when any dismissable rows exist
  - Dismissed IDs persisted to localStorage (tower_dismissed_ops)
  - Pruned during the 30s sweep when the underlying op falls out
    of the recent window — keeps storage from growing forever
  - badgeCount + failedCount filter dismissed entries so the red
    pill clears the moment the operator acks the failure

#4 Toast popups:
  - useToast composable + Toaster.vue mounted at App.vue
  - Triggered from NotificationBell.upsert on terminal transition
    when the op was running ≥30s AND the bell isn't open
  - Success: 5s auto-dismiss; Failure: sticky until clicked away
  - Click-through links to the per-instance Activity timeline
    (#op_<id>) for any op carrying instanceCode
  - Stack of 3, oldest drops on overflow
  - No external dep — hand-rolled to match v3's component style
2026-04-30 18:25:45 +03:00
Claude
6b7743ecaf tower 0.61.23 / tower-ui 0.61.23 — SSE auth via ?token=
NotificationBell + ActivityTab opened EventSource without auth
(native EventSource API can't set Authorization headers). Phase G's
canSeeOp guard correctly dropped every event for the resulting
anonymous viewer, leaving the bell silent except for the one-shot
backfill on mount.

Backend: claimsFromRequest now falls back to ?token= query param
when the Authorization header is absent. HTTPS-only ingress means
the token stays inside the TLS tunnel; the 15-min access-token TTL
bounds any leakage if it ever surfaces in browser history or proxy
logs.

Frontend: streamOperation + streamAllOperations append the access
token via streamURL(). Plus token-expiry-aware reconnect: on
EventSource error, debounce 5s, close, run authFetch('/me') to let
the 0.61.18 refresh path renew the access token, then re-open with
a fresh streamURL. Without this, the native auto-reconnect would
loop forever with the now-stale token after 15 min.
2026-04-30 18:15:11 +03:00
Claude
b96204312f tower 0.61.22 — import filestore-rename: head -1 + debug echo
The grep -oE for instanceCode matches BOTH provenance.instanceCode
AND the v2 root mirror, returning two lines. sed processes each line
but the resulting SOURCE_CODE shell variable was multi-line, which
made the directory check fail (-d "/var/lib/odoo/filestore/odoo16
[newline]odoo16") → rename branch silently skipped → Odoo with
db_name=odoo16v2 looks at /var/lib/odoo/filestore/odoo16v2/, finds
nothing, returns 500 on every asset.

Added head -1 to the pipe so SOURCE_CODE is single-line, plus an
echo so the rename branch's path is visible in Job logs even when
it short-circuits.
2026-04-30 17:43:37 +03:00
Claude
8024015b9e tower 0.61.21 — migrate + template-deploy use tenant CF resolver
Phase C made instance-create tenant-aware for Cloudflare DNS, but
migrate.go and templates_deploy.go kept using the legacy global
*cloudflareClient (zone=odoosky.org). Result: a tenant migrate to
4th.online silently created the A record under odoosky.org as a
literal subdomain ('odoo16v2.tenants.4th.online.odoosky.org' →
right IP) — Tower logged 'DNS A record set' successfully because
the API accepted the call, but the actual hostname the user
browses to was never published to the right zone.

Both flows now use cfResolver.clientFor(tenantID, fqdn) to find
the tenant's CF token + correct zone. If no token covers the
domain, the op fails with a clear 'configure tenant CF token'
message instead of silently writing to the wrong zone.
2026-04-30 17:31:44 +03:00