busyfeed: Initial commit mit Tag-Deployment

Bestehende App plus Gitea-Actions-Pipeline: Tag v* loest Build, Tests
und Container-Neustart auf dem VPS aus.

- .gitea/workflows/deploy.yml: npm ci/build/test als Gate, danach
  docker compose up -d --build. Die .env wird aus dem Repo-Secret DOTENV
  erzeugt, damit auf dem Host keine Secret-Datei gepflegt werden muss.
- docker-compose.yml: fester Projektname (der CI-Job hat ein anderes
  Arbeitsverzeichnis als der Host), Image mit Versionstag fuer Rollback,
  fester Volume-Name.
- README: Deployment- und Rollback-Abschnitt, Token-Rotation angepasst.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 19:56:54 +02:00
commit 45d881f9a9
14 changed files with 1401 additions and 0 deletions

31
docker-compose.yml Normal file
View File

@@ -0,0 +1,31 @@
# Fester Projektname: sonst leitet Compose ihn aus dem Verzeichnisnamen ab und
# der weicht im CI-Job vom Host ab.
name: busyfeed
services:
busyfeed:
image: busyfeed:${IMAGE_TAG:-latest}
build: .
container_name: busyfeed
restart: unless-stopped
env_file: .env
volumes:
- busyfeed-data:/data
networks:
- nginx-proxy-manager_default
healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8080/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
interval: 60s
timeout: 5s
retries: 3
# Kein ports-Mapping: Der nginx proxy manager erreicht den Container ueber das
# gemeinsame Docker-Netz, es liegt nichts offen am Host.
networks:
nginx-proxy-manager_default:
external: true
volumes:
busyfeed-data:
# Fester Name, damit das Volume nicht am Projektnamen haengt.
name: busyfeed-data