feat(infrastructure): pull pre-built images from Gitea registry
migrate/api/worker/frontend now reference
git.devils.zone/devil/youtube-studio-flow-{backend,frontend}:\${IMAGE_TAG}
instead of building on the deploy host. Adds scripts/build-and-push.sh
to build+tag (git short SHA + latest) and push both images from a dev
machine, and updates infrastructure/README.md with the pull-based
deploy sequence.
This commit is contained in:
@@ -2,6 +2,12 @@
|
|||||||
# The public domain Traefik routes to this app (no https://, no trailing slash).
|
# The public domain Traefik routes to this app (no https://, no trailing slash).
|
||||||
DOMAIN=yourdomain.com
|
DOMAIN=yourdomain.com
|
||||||
|
|
||||||
|
# ─── Image tag ────────────────────────────────────────────────────────────────
|
||||||
|
# Which tag to pull from git.devils.zone/devil/youtube-studio-flow-{backend,frontend}.
|
||||||
|
# Pin to a git short SHA or release tag for reproducible deploys; `latest` tracks
|
||||||
|
# whatever scripts/build-and-push.sh last pushed.
|
||||||
|
IMAGE_TAG=latest
|
||||||
|
|
||||||
# ─── Postgres ─────────────────────────────────────────────────────────────────
|
# ─── Postgres ─────────────────────────────────────────────────────────────────
|
||||||
POSTGRES_USER=studioflow
|
POSTGRES_USER=studioflow
|
||||||
POSTGRES_PASSWORD=change_me_strong_password
|
POSTGRES_PASSWORD=change_me_strong_password
|
||||||
|
|||||||
@@ -10,11 +10,23 @@ Dieses Verzeichnis enthält die Konfiguration für die lokale Entwicklung und da
|
|||||||
- **postgres:** PostgreSQL 16 (Port 5432)
|
- **postgres:** PostgreSQL 16 (Port 5432)
|
||||||
- **redis:** Redis 7 für Caching und Queues (Port 6379)
|
- **redis:** Redis 7 für Caching und Queues (Port 6379)
|
||||||
|
|
||||||
## Schnellstart
|
## Schnellstart (Server-Deployment)
|
||||||
|
|
||||||
|
Images werden **nicht** auf dem Server gebaut — sie kommen fertig aus der Gitea Container
|
||||||
|
Registry (`git.devils.zone/devil/youtube-studio-flow-{backend,frontend}`), gebaut per
|
||||||
|
`scripts/build-and-push.sh` auf der Dev-Maschine.
|
||||||
|
|
||||||
1. `.env.example` kopieren: `cp .env.example .env`
|
1. `.env.example` kopieren: `cp .env.example .env`
|
||||||
2. Werte in `.env` anpassen (besonders Google API Keys).
|
2. Werte in `.env` anpassen (Secrets, Domain, Google API Keys, `IMAGE_TAG`).
|
||||||
3. Container starten: `docker compose up -d`
|
3. Am Server einloggen: `docker login git.devils.zone`
|
||||||
4. Datenbank migrieren: `docker compose run --rm migrate`
|
4. Images ziehen: `docker compose pull`
|
||||||
|
5. Datenbank migrieren: `docker compose run --rm migrate`
|
||||||
|
6. Container starten: `docker compose up -d`
|
||||||
|
|
||||||
|
Für ein Update auf eine neue Version: `IMAGE_TAG` in `.env` anpassen (oder `latest`
|
||||||
|
belassen), dann Schritte 4–6 wiederholen. Das externe Docker-Netzwerk `traefik-network`
|
||||||
|
muss vorher existieren (`docker network create traefik-network`), falls Traefik das nicht
|
||||||
|
bereits selbst anlegt.
|
||||||
|
|
||||||
## Daten-Persistenz
|
## Daten-Persistenz
|
||||||
- PostgreSQL-Daten liegen im Volume `postgres_data`.
|
- PostgreSQL-Daten liegen im Volume `postgres_data`.
|
||||||
|
|||||||
@@ -2,9 +2,7 @@ services:
|
|||||||
|
|
||||||
# Runs database migrations once before the API and worker start.
|
# Runs database migrations once before the API and worker start.
|
||||||
migrate:
|
migrate:
|
||||||
build:
|
image: git.devils.zone/devil/youtube-studio-flow-backend:${IMAGE_TAG:-latest}
|
||||||
context: ../backend
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
command: npx prisma migrate deploy
|
command: npx prisma migrate deploy
|
||||||
restart: "no"
|
restart: "no"
|
||||||
environment:
|
environment:
|
||||||
@@ -16,9 +14,7 @@ services:
|
|||||||
- app-network
|
- app-network
|
||||||
|
|
||||||
api:
|
api:
|
||||||
build:
|
image: git.devils.zone/devil/youtube-studio-flow-backend:${IMAGE_TAG:-latest}
|
||||||
context: ../backend
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
@@ -57,9 +53,7 @@ services:
|
|||||||
- traefik-network
|
- traefik-network
|
||||||
|
|
||||||
worker:
|
worker:
|
||||||
build:
|
image: git.devils.zone/devil/youtube-studio-flow-backend:${IMAGE_TAG:-latest}
|
||||||
context: ../backend
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: node dist/worker.js
|
command: node dist/worker.js
|
||||||
environment:
|
environment:
|
||||||
@@ -84,11 +78,10 @@ services:
|
|||||||
- app-network
|
- app-network
|
||||||
|
|
||||||
frontend:
|
frontend:
|
||||||
build:
|
# NEXT_PUBLIC_API_URL is baked in at build time (scripts/build-and-push.sh uses the
|
||||||
context: ../frontend
|
# Dockerfile default, /api/v1) — the relative path works because Traefik serves both
|
||||||
dockerfile: Dockerfile
|
# frontend and API on the same domain.
|
||||||
# NEXT_PUBLIC_API_URL defaults to /api/v1 in the Dockerfile — no override needed.
|
image: git.devils.zone/devil/youtube-studio-flow-frontend:${IMAGE_TAG:-latest}
|
||||||
# The relative path works because Traefik serves both frontend and API on the same domain.
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Builds the backend and frontend images and pushes them to the Gitea
|
||||||
|
# container registry at git.devils.zone. Requires `docker login
|
||||||
|
# git.devils.zone` to already be done (run that yourself, out of band, so
|
||||||
|
# the token never ends up in a Claude transcript).
|
||||||
|
#
|
||||||
|
# Usage: scripts/build-and-push.sh [tag]
|
||||||
|
# tag Extra tag to push alongside the git short SHA and `latest`.
|
||||||
|
# Useful for a release, e.g. scripts/build-and-push.sh v0.1.0
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REGISTRY="git.devils.zone"
|
||||||
|
OWNER="devil"
|
||||||
|
SHA=$(git rev-parse --short HEAD)
|
||||||
|
EXTRA_TAG="${1:-}"
|
||||||
|
|
||||||
|
BACKEND_IMAGE="${REGISTRY}/${OWNER}/youtube-studio-flow-backend"
|
||||||
|
FRONTEND_IMAGE="${REGISTRY}/${OWNER}/youtube-studio-flow-frontend"
|
||||||
|
|
||||||
|
echo "==> Building backend (${BACKEND_IMAGE}:${SHA})"
|
||||||
|
docker build -t "${BACKEND_IMAGE}:${SHA}" -t "${BACKEND_IMAGE}:latest" ./backend
|
||||||
|
|
||||||
|
echo "==> Building frontend (${FRONTEND_IMAGE}:${SHA})"
|
||||||
|
docker build -t "${FRONTEND_IMAGE}:${SHA}" -t "${FRONTEND_IMAGE}:latest" ./frontend
|
||||||
|
|
||||||
|
if [ -n "$EXTRA_TAG" ]; then
|
||||||
|
docker tag "${BACKEND_IMAGE}:${SHA}" "${BACKEND_IMAGE}:${EXTRA_TAG}"
|
||||||
|
docker tag "${FRONTEND_IMAGE}:${SHA}" "${FRONTEND_IMAGE}:${EXTRA_TAG}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> Pushing backend"
|
||||||
|
docker push "${BACKEND_IMAGE}:${SHA}"
|
||||||
|
docker push "${BACKEND_IMAGE}:latest"
|
||||||
|
[ -n "$EXTRA_TAG" ] && docker push "${BACKEND_IMAGE}:${EXTRA_TAG}"
|
||||||
|
|
||||||
|
echo "==> Pushing frontend"
|
||||||
|
docker push "${FRONTEND_IMAGE}:${SHA}"
|
||||||
|
docker push "${FRONTEND_IMAGE}:latest"
|
||||||
|
[ -n "$EXTRA_TAG" ] && docker push "${FRONTEND_IMAGE}:${EXTRA_TAG}"
|
||||||
|
|
||||||
|
echo "==> Done. Pushed tags: ${SHA}, latest${EXTRA_TAG:+, $EXTRA_TAG}"
|
||||||
|
echo " On the server: docker compose pull && docker compose run --rm migrate && docker compose up -d"
|
||||||
Reference in New Issue
Block a user