feat: docker compose
This commit is contained in:
@@ -1,57 +0,0 @@
|
||||
# Fix Docker setup: proper multi-container architecture with Docker Compose
|
||||
|
||||
## Summary
|
||||
|
||||
The previous Docker setup bundled PostgreSQL and the Next.js app into a single image managed by `supervisord`. This is an anti-pattern — it violates the "one container, one process" principle, clones the repo and runs the full build at runtime (3–5 min cold start), and makes scaling, updating, and debugging significantly harder.
|
||||
|
||||
This PR replaces it with a proper Docker Compose setup following the "Docker way":
|
||||
|
||||
- **`app`** — Next.js application container (multi-stage build, standalone output)
|
||||
- **`db`** — Official `postgres:17-bookworm` container
|
||||
|
||||
Database data is persisted via a named Docker volume and survives container restarts, rebuilds, and image updates.
|
||||
|
||||
## Changes
|
||||
|
||||
### New files
|
||||
- **`compose.yml`** — Docker Compose configuration with `app` and `db` services, healthchecks, and a named volume for PostgreSQL data
|
||||
- **`docker/entrypoint.sh`** — Lightweight entrypoint: waits for the database, runs `prisma migrate deploy`, then starts the app
|
||||
|
||||
### Modified files
|
||||
- **`docker/Dockerfile`** — Replaced the single-stage bootstrap image with a proper 4-stage multi-stage build:
|
||||
- `base` — Shared `node:24-bookworm-slim` with system dependencies
|
||||
- `deps` — Runs `npm ci` (and `prisma generate` via postinstall)
|
||||
- `builder` — Runs `npm run build`, produces `.next/standalone/`
|
||||
- `runner` — Minimal production image; copies standalone output, installs only Prisma CLI for migrations
|
||||
- **`.dockerignore`** — Added `compose.yml`, test config files
|
||||
- **`DOCKER.md`** — Complete rewrite covering the new compose-based workflow, standalone single-container usage, migration guide from the old setup, backup/restore, and production deployment tips
|
||||
|
||||
### Deleted files
|
||||
- `docker/bootstrap.sh` — Replaced by `docker/entrypoint.sh`
|
||||
- `docker/supervisord.conf` — No longer needed (one process per container)
|
||||
|
||||
## Key design decisions
|
||||
|
||||
- **PCHAT_* env vars work at runtime** — `src/lib/config/index.ts` already applies overrides via `applyEnvOverrides()`. No rebuild is needed to change branding or feature flags; just update environment variables and restart.
|
||||
- **Migrations run at startup** — `prisma migrate deploy` runs in the entrypoint before the app starts, keeping deployments simple without init containers.
|
||||
- **Seeding is manual** — `docker compose exec app npx prisma db seed`
|
||||
- **All images are Debian-based** — `node:24-bookworm-slim` (bookworm) and `postgres:17-bookworm`
|
||||
- **`.github/workflows/docker-publish.yml` needs no changes** — it already builds `./docker/Dockerfile` with context `.`
|
||||
|
||||
## Quick start after this PR
|
||||
|
||||
```bash
|
||||
git clone https://github.com/f/prompts.chat.git
|
||||
cd prompts.chat
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Open http://localhost:4444
|
||||
|
||||
## Testing
|
||||
|
||||
- `docker compose build` — builds successfully
|
||||
- `docker compose up -d` — both services start, DB healthcheck passes before app starts
|
||||
- `curl http://localhost:4444/api/health` — returns `{"status":"healthy","database":"connected"}`
|
||||
- `curl http://localhost:4444/` — homepage returns 200
|
||||
- Data persists across `docker compose down && docker compose up -d`
|
||||
Reference in New Issue
Block a user