Initial commit: Visigine (Vite client + Express/SQLite backend)

Container-ready via docker/ compose (frontend nginx + backend Node). Compose adjusted for Coolify on the prod server: frontend uses expose:80 (no host binding — host 8080 is taken by the Coolify proxy; Traefik routes visigine.de), backend ALLOWED_ORIGINS=https://visigine.de. Secrets stay in server/.env (git-ignored); see server/.env.example.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 10:06:48 +02:00
commit e344f1b7e7
88 changed files with 11764 additions and 0 deletions

55
docker/docker-compose.yml Normal file
View File

@@ -0,0 +1,55 @@
# Visigine — single-stack compose. Frontend (nginx) is the only ingress;
# the backend container is reachable only over the internal docker network.
#
# Secrets (MISTRAL_KEY, ADMIN_TOKEN) are read from ../server/.env.
# Deployment vars (NODE_ENV, ALLOWED_ORIGINS, …) are overridden here.
name: visigine
services:
backend:
build:
context: ..
dockerfile: docker/backend.Dockerfile
container_name: visigine-backend
env_file:
- ../server/.env
environment:
NODE_ENV: production
PORT: "3001"
ALLOWED_ORIGINS: "https://visigine.de"
ALLOW_PRIVATE_HOSTS: "0"
DB_PATH: "/data/visigine.db"
expose:
- "3001"
volumes:
# Persist the SQLite file across container rebuilds.
- visigine_data:/data
restart: unless-stopped
networks:
- visigine
frontend:
build:
context: ..
dockerfile: docker/frontend.Dockerfile
container_name: visigine-frontend
# No host port binding: on the Coolify server host-port 8080 is already taken
# by the Coolify/Traefik proxy. Coolify routes the domain (visigine.de) to
# this container's port 80 via Traefik. For local `docker compose` testing,
# temporarily add: ports: ["8090:80"]
expose:
- "80"
depends_on:
backend:
condition: service_healthy
restart: unless-stopped
networks:
- visigine
networks:
visigine:
driver: bridge
volumes:
visigine_data: