feat(ci): publish steward image to the registry + remote-deploy compose
Add the rule-46 image-publish lane: a `publish` job gated on [lint, unit, integration] that builds the runtime Dockerfile in ci-builder and pushes git.fabledsword.com/bvandeusen/steward:<sha> always, :dev on dev and :latest on main. Authenticates with the REGISTRY_TOKEN repo secret (the injected GITHUB_TOKEN lacks write:package). Steward is the first family app to implement the publish lane; mechanics mirror CI-runner's build-ci-python.yml. Add compose.deploy.yml for a persistent remote instance that pulls :dev (no source bind-mounts, persistent app_data+pgdata volumes, bundled Postgres), plus a README "Remote dev instance" runbook and the POSTGRES_PASSWORD env key. Fix .env.example's database URL var to the canonical STEWARD_DATABASE_URL (single underscore) and document the publish lane in ci-requirements.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# Remote deployment — pulls the published :dev image instead of building locally.
|
||||
#
|
||||
# This is NOT the local-dev compose. `docker-compose.yml` bind-mounts ./steward
|
||||
# + ./plugins and runs --debug for live editing; THIS file runs the image as the
|
||||
# source of truth (no bind-mounts, no reloader) for a persistent remote instance
|
||||
# that tracks the dev CI line.
|
||||
#
|
||||
# Standup + update runbook: see README → "Remote dev instance".
|
||||
|
||||
services:
|
||||
steward:
|
||||
image: git.fabledsword.com/bvandeusen/steward:dev
|
||||
container_name: steward
|
||||
# Re-pull :dev on every `up` so restarting the stack picks up the latest
|
||||
# green dev build without a manual `docker pull`.
|
||||
pull_policy: always
|
||||
ports:
|
||||
- "5000:5000"
|
||||
volumes:
|
||||
# /data holds the auto-generated secret key, third-party plugins, and the
|
||||
# Ansible playbook cache — all of which must survive image updates. No
|
||||
# source bind-mounts: core + first-party plugins live inside the image.
|
||||
- app_data:/data
|
||||
environment:
|
||||
- STEWARD_DATABASE_URL=postgresql+asyncpg://steward:${POSTGRES_PASSWORD:-steward}@db/steward
|
||||
# Optional: if unset, the app generates a key and persists it to
|
||||
# /data/secret.key, so sessions survive restarts via the app_data volume.
|
||||
# Set STEWARD_SECRET_KEY in .env to pin it explicitly across volume resets.
|
||||
- STEWARD_SECRET_KEY=${STEWARD_SECRET_KEY:-}
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
|
||||
db:
|
||||
image: postgres:16-alpine
|
||||
environment:
|
||||
POSTGRES_USER: steward
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-steward}
|
||||
POSTGRES_DB: steward
|
||||
volumes:
|
||||
- pgdata:/var/lib/postgresql/data
|
||||
# No host port published — Postgres is reachable only on the compose network.
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U steward"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
pgdata:
|
||||
app_data:
|
||||
Reference in New Issue
Block a user