Skip to content

Fix Compose deploy: hardened pull-based compose.yaml - #28

Merged
authorTom merged 3 commits into
mainfrom
fix/cleanup-pass
Jul 23, 2026
Merged

Fix Compose deploy: hardened pull-based compose.yaml#28
authorTom merged 3 commits into
mainfrom
fix/cleanup-pass

Conversation

@authorTom

Copy link
Copy Markdown
Owner

Why

The deployed docker-compose.yml failed with "can't find image" / config errors on Dockge/Portainer. The published image itself is fine — ghcr.io/authortom/simhub:latest is public and anonymously pullable (verified against the GHCR API). The usual server-side causes are a wrong-case owner (authorTom vs GHCR's forced-lowercase authortom) or a stray build: with no source tree present.

Changes

  • feat: replace docker-compose.yml with hardened compose.yaml — canonical single filename (avoids the "multiple config files" warning); pulls the published GHCR image (lowercase owner) with a documented build-from-source option; adds init: true for signal forwarding / zombie reaping; adds a healthcheck using Node's built-in fetch (alpine has no curl/wget) in exec/list form so the :// and colon-space in the script aren't misread by YAML as a mapping; keeps named volume, restart: unless-stopped, quoted port; no obsolete version:.
  • chore: add tracked .env.example — real runtime knobs (NODE_ENV, TRUST_PROXY, PORT); compose auto-reads a sibling .env; real .env stays gitignored. Notes the admin password is set in-app at first sign-in, not via env.
  • docs: pull-based deploy steps — curl compose.yaml (+ .env.example) onto the server, docker compose up -d, confirm (healthy); update all docker-compose.yml references.

Validation

  • docker compose config passes
  • No tabs, pure ASCII, no obsolete version: key
  • GHCR image confirmed public + anonymously pullable

🤖 Generated with Claude Code

authorTom and others added 3 commits July 23, 2026 08:21
Adopt the canonical single compose.yaml filename (shipping both it and
docker-compose.yml triggers a "multiple config files" warning) and harden it:

- pull the published GHCR image (lowercase owner) instead of building; keep a
  documented build-from-source option
- add init: true for signal forwarding / zombie reaping on graceful shutdown
- add a healthcheck using Node's built-in fetch (alpine has no curl/wget),
  in exec/list form so the "://" and colon-space in the script aren't misread
  by YAML as a mapping
- keep named volume, restart: unless-stopped, quoted port; no obsolete version:
- document that compose auto-reads a sibling .env

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ship a documented template of the real runtime knobs (NODE_ENV, TRUST_PROXY,
PORT). Compose auto-reads a sibling .env; real .env files stay gitignored.
Notes that the admin password is set in-app at first sign-in, not via env.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Deploy by curling compose.yaml (+ .env.example) onto the server; no source
  checkout needed since compose pulls the published image
- Document the "(healthy)" check, first-sign-in password, and TRUST_PROXY via .env
- Update all docker-compose.yml references and project-layout listing

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@authorTom
authorTom merged commit 8de2ec4 into main Jul 23, 2026
1 check passed
@authorTom
authorTom deleted the fix/cleanup-pass branch July 23, 2026 07:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant