Skip to content

Provision reproducible staging and production infrastructure #243

Description

@Vinosaamaa

Parent

#107 (identified by #238)

Owner direction and deployment decision

The owner has delegated product and infrastructure decisions and requires free resources for the initial launch. No hosting account, domain or staging environment has been provisioned. This replaces the previous assumption that paid managed PostgreSQL/Redis and an owned chanter.app domain were already available.

Prepare a reproducible single-host deployment for an Oracle Always Free A1 allocation, subject to actual account eligibility and capacity. The current published allowance is 2 OCPU and 12 GB memory. Use self-managed PostgreSQL and Redis with explicit persistent volumes, backups and restoration procedures; serve the frontend and API/WebSockets through a same-origin Caddy HTTPS entry point. Cloudflare remains optional for an owned domain. Do not introduce paid plans, credit-card charges or automatic top-ups.

The free host can operate one environment at a time. Separate staging and production Compose projects, secrets and data; validate ephemeral staging in CI and document the stop/switch procedure and downtime when staging must run on the host. Persistent simultaneous staging, high availability and managed databases are not promised by this budget.

Acceptance criteria

  • Every application deploy unit has a reproducible non-root OCI image, health/readiness probes, resource limits, graceful shutdown and pinned runtime version.
  • Versioned configuration defines the frontend, API/realtime services, PostgreSQL, Redis, secret injection and persistent data; environment identity prevents staging/production volume or secret overlap.
  • The provisioned public hostname serves the SPA over valid TLS; API and realtime WebSockets work through the public entry point without exposing internal service ports.
  • HTTPS/security headers, allowed origins, firewall boundaries, secret permissions and optional Cloudflare settings are auditable. Do not claim an unowned domain or untested dynamic-DNS address as deployed.
  • CI builds and scans release images on free public runners. Deployment uses an immutable release identity, serialized migration ownership, health verification and a tested rollback to the prior compatible release.
  • Production does not start unused Redpanda or MinIO components. Each retained dependency has an owning code path and runbook. Store Course Resources durably and quarantine unsafe uploads #244 owns durable private resource storage.
  • Secrets and production data never enter repository files, build logs, frontend bundles or demo seed scripts.
  • The decision records free-tier limits, resource sizing, capacity/reclamation risks, single-host failure domain, downtime and upgrade triggers.
  • Actual account provisioning, HTTPS smoke, migration/rollback smoke and production readiness are recorded separately from repository/CI checks; the issue stays open until the required deployment proof exists.

Blocked by

Provisioning checkpoint

Complete all repository implementation and dry-run validation first. Account identity, provider eligibility and any required authentication cannot be invented or bypassed. Ask for only a concrete required account action after the deployment package is ready. No paid resources are authorized.

Source: Oracle Always Free resources.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    architectureArchitecture and designinfraInfrastructure and toolingpost-launchAfter Public Launch #86–#104; see post-launch-ui-backlog.mdready-for-agentReady for agent implementationsecuritySecurity and permissionsstoryVertical-slice story

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions