{"repo": "amineakik/sentinel-fullstack", "files": {"docker-compose.yml": {"492826051c9013f6780aabba286e0954d6a2586f": {"t": 1785745268.1707659, "n": 4224, "h": "6a38042ff679fd26", "c": "x-logging: &default-logging\n driver: json-file\n options:\n max-size: 10m\n max-file: '5'\n\nservices:\n postgres:\n image: postgres:15.18-alpine3.23@sha256:3889f6e66267065437b17a404058a6220d9080c73b701edd225770f8b2d6a52c\n restart: unless-stopped\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n networks:\n - internal\n healthcheck:\n test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}']\n interval: 5s\n timeout: 5s\n retries: 10\n start_period: 10s\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n args:\n BUILD_SHA: ${BUILD_SHA:?BUILD_SHA must be set to the deployed Git commit}\n restart: unless-stopped\n init: true\n depends_on:\n postgres:\n condition: service_healthy\n networks:\n - internal\n - edge\n healthcheck:\n test: ['CMD-SHELL', 'wget -qO- http://127.0.0.1:3000/api/health > /dev/null || exit 1']\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 20s\n environment:\n PORT: 3000\n NODE_ENV: production\n DATABASE_URL: ${DATABASE_URL:?DATABASE_URL must be set}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-}\n COOKIE_SECRET: ${COOKIE_SECRET:?COOKIE_SECRET must be set}\n JWT_SECRET: ${JWT_SECRET:?JWT_SECRET must be set}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:?CLIENT_ORIGIN must be set}\n BOARD_ACCESS_CODE_HASH: ${BOARD_ACCESS_CODE_HASH:?BOARD_ACCESS_CODE_HASH must be set}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n TRUST_PROXY: ${TRUST_PROXY:?TRUST_PROXY must be set}\n LOG_LEVEL: ${LOG_LEVEL:-info}\n GLOBAL_API_RATE_LIMIT_MAX: ${GLOBAL_API_RATE_LIMIT_MAX:-3000}\n GLOBAL_API_RATE_LIMIT_WINDOW_MS: ${GLOBAL_API_RATE_LIMIT_WINDOW_MS:-900000}\n SUPPORT_API_TIMEOUT_MS: ${SUPPORT_API_TIMEOUT_MS:-20000}\n NOTIFICATION_BATCH_SIZE: ${NOTIFICATION_BATCH_SIZE:-10}\n NOTIFICATION_MAX_ATTEMPTS: ${NOTIFICATION_MAX_ATTEMPTS:-5}\n NOTIFICATION_POLL_INTERVAL_MS: ${NOTIFICATION_POLL_INTERVAL_MS:-5000}\n SMTP_HOST: ${SMTP_HOST:-}\n SMTP_PORT: ${SMTP_PORT:-587}\n SMTP_SECURE: ${SMTP_SECURE:-false}\n SMTP_USER: ${SMTP_USER:-}\n SMTP_PASS: ${SMTP_PASS:-}\n SMTP_FROM: ${SMTP_FROM:-}\n ADMIN_EMAIL: ${ADMIN_EMAIL:-}\n read_only: true\n tmpfs:\n - /tmp:rw,noexec,nosuid,size=64m\n cap_drop:\n - ALL\n security_opt:\n - no-new-privileges:true\n stop_grace_period: 30s\n logging: *default-logging\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n args:\n VITE_API_URL: ${VITE_API_URL:-}\n BUILD_SHA: ${BUILD_SHA:?BUILD_SHA must be set to the deployed Git commit}\n restart: unless-stopped\n depends_on:\n backend:\n condition: service_healthy\n networks:\n - internal\n healthcheck:\n test: ['CMD-SHELL', 'wget -qO- http://127.0.0.1:8080/ > /dev/null || exit 1']\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 10s\n read_only: true\n tmpfs:\n - /tmp:rw,noexec,nosuid,size=64m\n cap_drop:\n - ALL\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\n caddy:\n image: caddy:2.11.4-alpine@sha256:5f5c8640aae01df9654968d946d8f1a56c497f1dd5c5cda4cf95ab7c14d58648\n restart: unless-stopped\n ports:\n - '80:80'\n - '443:443'\n - '443:443/udp'\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile:ro\n - caddy_data:/data\n - caddy_config:/config\n environment:\n CADDY_DOMAIN: ${CADDY_DOMAIN:?CADDY_DOMAIN must be set}\n depends_on:\n frontend:\n condition: service_healthy\n backend:\n condition: service_healthy\n networks:\n - internal\n - edge\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\nnetworks:\n internal:\n internal: true\n edge:\n\nvolumes:\n sentinel_data:\n caddy_data:\n caddy_config:\n"}, "ef9dca2f9eaad36b429af18ad45b2952c58207a0": {"t": 1785749422.9968348, "n": 4224, "h": "6a38042ff679fd26", "c": "x-logging: &default-logging\n driver: json-file\n options:\n max-size: 10m\n max-file: '5'\n\nservices:\n postgres:\n image: postgres:15.18-alpine3.23@sha256:3889f6e66267065437b17a404058a6220d9080c73b701edd225770f8b2d6a52c\n restart: unless-stopped\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n networks:\n - internal\n healthcheck:\n test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}']\n interval: 5s\n timeout: 5s\n retries: 10\n start_period: 10s\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n args:\n BUILD_SHA: ${BUILD_SHA:?BUILD_SHA must be set to the deployed Git commit}\n restart: unless-stopped\n init: true\n depends_on:\n postgres:\n condition: service_healthy\n networks:\n - internal\n - edge\n healthcheck:\n test: ['CMD-SHELL', 'wget -qO- http://127.0.0.1:3000/api/health > /dev/null || exit 1']\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 20s\n environment:\n PORT: 3000\n NODE_ENV: production\n DATABASE_URL: ${DATABASE_URL:?DATABASE_URL must be set}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-}\n COOKIE_SECRET: ${COOKIE_SECRET:?COOKIE_SECRET must be set}\n JWT_SECRET: ${JWT_SECRET:?JWT_SECRET must be set}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:?CLIENT_ORIGIN must be set}\n BOARD_ACCESS_CODE_HASH: ${BOARD_ACCESS_CODE_HASH:?BOARD_ACCESS_CODE_HASH must be set}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n TRUST_PROXY: ${TRUST_PROXY:?TRUST_PROXY must be set}\n LOG_LEVEL: ${LOG_LEVEL:-info}\n GLOBAL_API_RATE_LIMIT_MAX: ${GLOBAL_API_RATE_LIMIT_MAX:-3000}\n GLOBAL_API_RATE_LIMIT_WINDOW_MS: ${GLOBAL_API_RATE_LIMIT_WINDOW_MS:-900000}\n SUPPORT_API_TIMEOUT_MS: ${SUPPORT_API_TIMEOUT_MS:-20000}\n NOTIFICATION_BATCH_SIZE: ${NOTIFICATION_BATCH_SIZE:-10}\n NOTIFICATION_MAX_ATTEMPTS: ${NOTIFICATION_MAX_ATTEMPTS:-5}\n NOTIFICATION_POLL_INTERVAL_MS: ${NOTIFICATION_POLL_INTERVAL_MS:-5000}\n SMTP_HOST: ${SMTP_HOST:-}\n SMTP_PORT: ${SMTP_PORT:-587}\n SMTP_SECURE: ${SMTP_SECURE:-false}\n SMTP_USER: ${SMTP_USER:-}\n SMTP_PASS: ${SMTP_PASS:-}\n SMTP_FROM: ${SMTP_FROM:-}\n ADMIN_EMAIL: ${ADMIN_EMAIL:-}\n read_only: true\n tmpfs:\n - /tmp:rw,noexec,nosuid,size=64m\n cap_drop:\n - ALL\n security_opt:\n - no-new-privileges:true\n stop_grace_period: 30s\n logging: *default-logging\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n args:\n VITE_API_URL: ${VITE_API_URL:-}\n BUILD_SHA: ${BUILD_SHA:?BUILD_SHA must be set to the deployed Git commit}\n restart: unless-stopped\n depends_on:\n backend:\n condition: service_healthy\n networks:\n - internal\n healthcheck:\n test: ['CMD-SHELL', 'wget -qO- http://127.0.0.1:8080/ > /dev/null || exit 1']\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 10s\n read_only: true\n tmpfs:\n - /tmp:rw,noexec,nosuid,size=64m\n cap_drop:\n - ALL\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\n caddy:\n image: caddy:2.11.4-alpine@sha256:5f5c8640aae01df9654968d946d8f1a56c497f1dd5c5cda4cf95ab7c14d58648\n restart: unless-stopped\n ports:\n - '80:80'\n - '443:443'\n - '443:443/udp'\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile:ro\n - caddy_data:/data\n - caddy_config:/config\n environment:\n CADDY_DOMAIN: ${CADDY_DOMAIN:?CADDY_DOMAIN must be set}\n depends_on:\n frontend:\n condition: service_healthy\n backend:\n condition: service_healthy\n networks:\n - internal\n - edge\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\nnetworks:\n internal:\n internal: true\n edge:\n\nvolumes:\n sentinel_data:\n caddy_data:\n caddy_config:\n"}, "4ff629f41cf5e3e1ca8b77e6c0faee2c17c030b2": {"t": 1785749424.2240922, "n": 4080, "h": "d7bd3363f51bb18a", "c": "x-logging: &default-logging\n driver: json-file\n options:\n max-size: 10m\n max-file: '5'\n\nservices:\n postgres:\n image: postgres:15.18-alpine3.23\n restart: unless-stopped\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n networks:\n - internal\n healthcheck:\n test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}']\n interval: 5s\n timeout: 5s\n retries: 10\n start_period: 10s\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n args:\n BUILD_SHA: ${BUILD_SHA:?BUILD_SHA must be set to the deployed Git commit}\n restart: unless-stopped\n init: true\n depends_on:\n postgres:\n condition: service_healthy\n networks:\n - internal\n - edge\n healthcheck:\n test: ['CMD-SHELL', 'wget -qO- http://127.0.0.1:3000/api/health > /dev/null || exit 1']\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 20s\n environment:\n PORT: 3000\n NODE_ENV: production\n DATABASE_URL: ${DATABASE_URL:?DATABASE_URL must be set}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-}\n COOKIE_SECRET: ${COOKIE_SECRET:?COOKIE_SECRET must be set}\n JWT_SECRET: ${JWT_SECRET:?JWT_SECRET must be set}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:?CLIENT_ORIGIN must be set}\n BOARD_ACCESS_CODE_HASH: ${BOARD_ACCESS_CODE_HASH:?BOARD_ACCESS_CODE_HASH must be set}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n TRUST_PROXY: ${TRUST_PROXY:?TRUST_PROXY must be set}\n LOG_LEVEL: ${LOG_LEVEL:-info}\n GLOBAL_API_RATE_LIMIT_MAX: ${GLOBAL_API_RATE_LIMIT_MAX:-3000}\n GLOBAL_API_RATE_LIMIT_WINDOW_MS: ${GLOBAL_API_RATE_LIMIT_WINDOW_MS:-900000}\n SUPPORT_API_TIMEOUT_MS: ${SUPPORT_API_TIMEOUT_MS:-20000}\n NOTIFICATION_BATCH_SIZE: ${NOTIFICATION_BATCH_SIZE:-10}\n NOTIFICATION_MAX_ATTEMPTS: ${NOTIFICATION_MAX_ATTEMPTS:-5}\n NOTIFICATION_POLL_INTERVAL_MS: ${NOTIFICATION_POLL_INTERVAL_MS:-5000}\n SMTP_HOST: ${SMTP_HOST:-}\n SMTP_PORT: ${SMTP_PORT:-587}\n SMTP_SECURE: ${SMTP_SECURE:-false}\n SMTP_USER: ${SMTP_USER:-}\n SMTP_PASS: ${SMTP_PASS:-}\n SMTP_FROM: ${SMTP_FROM:-}\n ADMIN_EMAIL: ${ADMIN_EMAIL:-}\n read_only: true\n tmpfs:\n - /tmp:rw,noexec,nosuid,size=64m\n cap_drop:\n - ALL\n security_opt:\n - no-new-privileges:true\n stop_grace_period: 30s\n logging: *default-logging\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n args:\n VITE_API_URL: ${VITE_API_URL:-}\n BUILD_SHA: ${BUILD_SHA:?BUILD_SHA must be set to the deployed Git commit}\n restart: unless-stopped\n depends_on:\n backend:\n condition: service_healthy\n networks:\n - internal\n healthcheck:\n test: ['CMD-SHELL', 'wget -qO- http://127.0.0.1:8080/ > /dev/null || exit 1']\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 10s\n read_only: true\n tmpfs:\n - /tmp:rw,noexec,nosuid,size=64m\n cap_drop:\n - ALL\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\n caddy:\n image: caddy:2.11.4-alpine\n restart: unless-stopped\n ports:\n - '80:80'\n - '443:443'\n - '443:443/udp'\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile:ro\n - caddy_data:/data\n - caddy_config:/config\n environment:\n CADDY_DOMAIN: ${CADDY_DOMAIN:?CADDY_DOMAIN must be set}\n depends_on:\n frontend:\n condition: service_healthy\n backend:\n condition: service_healthy\n networks:\n - internal\n - edge\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\nnetworks:\n internal:\n internal: true\n edge:\n\nvolumes:\n sentinel_data:\n caddy_data:\n caddy_config:\n"}, "73e02322a5e1a91d429bc5e0ab75c4dbadab883a": {"t": 1785749425.3094294, "n": 4029, "h": "000627a66a7922a4", "c": "x-logging: &default-logging\n driver: json-file\n options:\n max-size: 10m\n max-file: '5'\n\nservices:\n postgres:\n image: postgres:15.18-alpine3.23\n restart: unless-stopped\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}\"]\n interval: 5s\n timeout: 5s\n retries: 10\n start_period: 10s\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n restart: unless-stopped\n init: true\n depends_on:\n postgres:\n condition: service_healthy\n networks:\n - internal\n - edge\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://127.0.0.1:3000/api/health > /dev/null || exit 1\"]\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 20s\n environment:\n PORT: 3000\n NODE_ENV: production\n DATABASE_URL: ${DATABASE_URL:?DATABASE_URL must be set}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-}\n COOKIE_SECRET: ${COOKIE_SECRET:?COOKIE_SECRET must be set}\n JWT_SECRET: ${JWT_SECRET:?JWT_SECRET must be set}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:?CLIENT_ORIGIN must be set}\n BOARD_ACCESS_LABEL: ${BOARD_ACCESS_LABEL:-Board atelier}\n BOARD_SESSION_TTL_HOURS: ${BOARD_SESSION_TTL_HOURS:-12}\n BOARD_ACCESS_CODE_HASH: ${BOARD_ACCESS_CODE_HASH:?BOARD_ACCESS_CODE_HASH must be set}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n TRUST_PROXY: ${TRUST_PROXY:?TRUST_PROXY must be set}\n LOG_LEVEL: ${LOG_LEVEL:-info}\n GLOBAL_API_RATE_LIMIT_MAX: ${GLOBAL_API_RATE_LIMIT_MAX:-3000}\n GLOBAL_API_RATE_LIMIT_WINDOW_MS: ${GLOBAL_API_RATE_LIMIT_WINDOW_MS:-900000}\n SUPPORT_API_TIMEOUT_MS: ${SUPPORT_API_TIMEOUT_MS:-20000}\n NOTIFICATION_BATCH_SIZE: ${NOTIFICATION_BATCH_SIZE:-10}\n NOTIFICATION_MAX_ATTEMPTS: ${NOTIFICATION_MAX_ATTEMPTS:-5}\n NOTIFICATION_POLL_INTERVAL_MS: ${NOTIFICATION_POLL_INTERVAL_MS:-5000}\n SMTP_HOST: ${SMTP_HOST:-}\n SMTP_PORT: ${SMTP_PORT:-587}\n SMTP_SECURE: ${SMTP_SECURE:-false}\n SMTP_USER: ${SMTP_USER:-}\n SMTP_PASS: ${SMTP_PASS:-}\n SMTP_FROM: ${SMTP_FROM:-}\n ADMIN_EMAIL: ${ADMIN_EMAIL:-}\n read_only: true\n tmpfs:\n - /tmp:rw,noexec,nosuid,size=64m\n cap_drop:\n - ALL\n security_opt:\n - no-new-privileges:true\n stop_grace_period: 30s\n logging: *default-logging\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n args:\n VITE_API_URL: ${VITE_API_URL:-}\n restart: unless-stopped\n depends_on:\n backend:\n condition: service_healthy\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://127.0.0.1:8080/ > /dev/null || exit 1\"]\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 10s\n read_only: true\n tmpfs:\n - /tmp:rw,noexec,nosuid,size=64m\n cap_drop:\n - ALL\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\n caddy:\n image: caddy:2.11.4-alpine\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"443:443\"\n - \"443:443/udp\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile:ro\n - caddy_data:/data\n - caddy_config:/config\n environment:\n CADDY_DOMAIN: ${CADDY_DOMAIN:?CADDY_DOMAIN must be set}\n depends_on:\n frontend:\n condition: service_healthy\n backend:\n condition: service_healthy\n networks:\n - internal\n - edge\n security_opt:\n - no-new-privileges:true\n logging: *default-logging\n\nnetworks:\n internal:\n internal: true\n edge:\n\nvolumes:\n sentinel_data:\n caddy_data:\n caddy_config:\n"}, "ad05cfcd9349b56b4b3f0bdc86da620a7c6f26a5": {"t": 1785749426.38969, "n": 2958, "h": "2a27c1983122043e", "c": "version: '3.9'\n\nservices:\n postgres:\n image: postgres:15-alpine\n container_name: sentinel_postgres\n restart: unless-stopped\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sentinel_password}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER:-sentinel} -d ${POSTGRES_DB:-sentinel}\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n container_name: sentinel_backend\n restart: unless-stopped\n depends_on:\n postgres:\n condition: service_healthy\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://localhost:3000/api/health > /dev/null || exit 1\"]\n interval: 10s\n timeout: 5s\n retries: 5\n environment:\n PORT: ${PORT:-3000}\n NODE_ENV: ${NODE_ENV:-development}\n DATABASE_URL: ${DATABASE_URL:-postgres://sentinel:sentinel_password@postgres:5432/sentinel}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}\n COOKIE_SECRET: ${COOKIE_SECRET:-change_me_in_production}\n JWT_SECRET: ${JWT_SECRET:-jwt_secret_change_me_in_production}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:-http://localhost:5173}\n BOARD_ACCESS_LABEL: ${BOARD_ACCESS_LABEL:-Board atelier}\n BOARD_SESSION_TTL_HOURS: ${BOARD_SESSION_TTL_HOURS:-12}\n BOARD_ACCESS_CODE_HASH: ${BOARD_ACCESS_CODE_HASH:-}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n TRUST_PROXY: ${TRUST_PROXY:-}\n LOG_LEVEL: ${LOG_LEVEL:-}\n GLOBAL_API_RATE_LIMIT_MAX: ${GLOBAL_API_RATE_LIMIT_MAX:-}\n GLOBAL_API_RATE_LIMIT_WINDOW_MS: ${GLOBAL_API_RATE_LIMIT_WINDOW_MS:-}\n SMTP_HOST: ${SMTP_HOST:-}\n SMTP_PORT: ${SMTP_PORT:-587}\n SMTP_SECURE: ${SMTP_SECURE:-false}\n SMTP_USER: ${SMTP_USER:-}\n SMTP_PASS: ${SMTP_PASS:-}\n SMTP_FROM: ${SMTP_FROM:-}\n ADMIN_EMAIL: ${ADMIN_EMAIL:-}\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n args:\n VITE_API_URL: ${VITE_API_URL:-http://localhost:3000}\n container_name: sentinel_frontend\n restart: unless-stopped\n depends_on:\n backend:\n condition: service_healthy\n networks:\n - internal\n\n caddy:\n image: caddy:2-alpine\n container_name: sentinel_caddy\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"443:443\"\n - \"443:443/udp\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile:ro\n - caddy_data:/data\n - caddy_config:/config\n environment:\n CADDY_DOMAIN: ${CADDY_DOMAIN:-localhost}\n depends_on:\n - frontend\n - backend\n networks:\n - internal\n\nnetworks:\n internal:\n driver: bridge\n\nvolumes:\n sentinel_data:\n caddy_data:\n caddy_config:\n"}, "ea202b4fb16b31c3161e6dca0feb18875b64f9a8": {"t": 1785749428.491816, "n": 2846, "h": "f7b0b3a18ec1974e", "c": "version: '3.9'\n\nservices:\n postgres:\n image: postgres:15-alpine\n container_name: sentinel_postgres\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sentinel_password}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER:-sentinel} -d ${POSTGRES_DB:-sentinel}\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n container_name: sentinel_backend\n depends_on:\n postgres:\n condition: service_healthy\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://localhost:3000/api/health > /dev/null || exit 1\"]\n interval: 10s\n timeout: 5s\n retries: 5\n environment:\n PORT: ${PORT:-3000}\n NODE_ENV: ${NODE_ENV:-development}\n DATABASE_URL: ${DATABASE_URL:-postgres://sentinel:sentinel_password@postgres:5432/sentinel}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}\n COOKIE_SECRET: ${COOKIE_SECRET:-change_me_in_production}\n JWT_SECRET: ${JWT_SECRET:-jwt_secret_change_me_in_production}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:-http://localhost:5173}\n BOARD_ACCESS_LABEL: ${BOARD_ACCESS_LABEL:-Board atelier}\n BOARD_SESSION_TTL_HOURS: ${BOARD_SESSION_TTL_HOURS:-12}\n BOARD_ACCESS_CODE_HASH: ${BOARD_ACCESS_CODE_HASH:-}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n TRUST_PROXY: ${TRUST_PROXY:-}\n LOG_LEVEL: ${LOG_LEVEL:-}\n GLOBAL_API_RATE_LIMIT_MAX: ${GLOBAL_API_RATE_LIMIT_MAX:-}\n GLOBAL_API_RATE_LIMIT_WINDOW_MS: ${GLOBAL_API_RATE_LIMIT_WINDOW_MS:-}\n SMTP_HOST: ${SMTP_HOST:-}\n SMTP_PORT: ${SMTP_PORT:-587}\n SMTP_SECURE: ${SMTP_SECURE:-false}\n SMTP_USER: ${SMTP_USER:-}\n SMTP_PASS: ${SMTP_PASS:-}\n SMTP_FROM: ${SMTP_FROM:-}\n ADMIN_EMAIL: ${ADMIN_EMAIL:-}\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n args:\n VITE_API_URL: ${VITE_API_URL:-http://localhost:3000}\n container_name: sentinel_frontend\n depends_on:\n backend:\n condition: service_healthy\n networks:\n - internal\n\n caddy:\n image: caddy:2-alpine\n container_name: sentinel_caddy\n ports:\n - \"80:80\"\n - \"443:443\"\n - \"443:443/udp\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile:ro\n - caddy_data:/data\n - caddy_config:/config\n environment:\n CADDY_DOMAIN: ${CADDY_DOMAIN:-localhost}\n depends_on:\n - frontend\n - backend\n networks:\n - internal\n\nnetworks:\n internal:\n driver: bridge\n\nvolumes:\n sentinel_data:\n caddy_data:\n caddy_config:\n"}, "2c86938346a8decb0d735cd3c8fe61908a464664": {"t": 1785749429.5741448, "n": 2606, "h": "8a1c8ea92278e867", "c": "version: '3.9'\n\nservices:\n postgres:\n image: postgres:15-alpine\n container_name: sentinel_postgres\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sentinel_password}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER:-sentinel} -d ${POSTGRES_DB:-sentinel}\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n container_name: sentinel_backend\n depends_on:\n postgres:\n condition: service_healthy\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://localhost:3000/api/health > /dev/null || exit 1\"]\n interval: 10s\n timeout: 5s\n retries: 5\n environment:\n PORT: ${PORT:-3000}\n NODE_ENV: ${NODE_ENV:-development}\n DATABASE_URL: ${DATABASE_URL:-postgres://sentinel:sentinel_password@postgres:5432/sentinel}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}\n COOKIE_SECRET: ${COOKIE_SECRET:-change_me_in_production}\n JWT_SECRET: ${JWT_SECRET:-jwt_secret_change_me_in_production}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:-http://localhost:5173}\n BOARD_ACCESS_LABEL: ${BOARD_ACCESS_LABEL:-Board atelier}\n BOARD_SESSION_TTL_HOURS: ${BOARD_SESSION_TTL_HOURS:-12}\n BOARD_ACCESS_CODE_HASH: ${BOARD_ACCESS_CODE_HASH:-}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n TRUST_PROXY: ${TRUST_PROXY:-}\n LOG_LEVEL: ${LOG_LEVEL:-}\n GLOBAL_API_RATE_LIMIT_MAX: ${GLOBAL_API_RATE_LIMIT_MAX:-}\n GLOBAL_API_RATE_LIMIT_WINDOW_MS: ${GLOBAL_API_RATE_LIMIT_WINDOW_MS:-}\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n args:\n VITE_API_URL: ${VITE_API_URL:-http://localhost:3000}\n container_name: sentinel_frontend\n depends_on:\n backend:\n condition: service_healthy\n networks:\n - internal\n\n caddy:\n image: caddy:2-alpine\n container_name: sentinel_caddy\n ports:\n - \"80:80\"\n - \"443:443\"\n - \"443:443/udp\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile:ro\n - caddy_data:/data\n - caddy_config:/config\n environment:\n CADDY_DOMAIN: ${CADDY_DOMAIN:-localhost}\n depends_on:\n - frontend\n - backend\n networks:\n - internal\n\nnetworks:\n internal:\n driver: bridge\n\nvolumes:\n sentinel_data:\n caddy_data:\n caddy_config:\n"}, "1e2b0612f0ac4f0451e77737af4e0e5ed69eb94d": {"t": 1785749430.6644845, "n": 2434, "h": "2f2645a060f21557", "c": "version: '3.9'\n\nservices:\n postgres:\n image: postgres:15-alpine\n container_name: sentinel_postgres\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sentinel_password}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER:-sentinel} -d ${POSTGRES_DB:-sentinel}\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n container_name: sentinel_backend\n depends_on:\n postgres:\n condition: service_healthy\n networks:\n - internal\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://localhost:3000/api/health > /dev/null || exit 1\"]\n interval: 10s\n timeout: 5s\n retries: 5\n environment:\n PORT: ${PORT:-3000}\n NODE_ENV: ${NODE_ENV:-development}\n DATABASE_URL: ${DATABASE_URL:-postgres://sentinel:sentinel_password@postgres:5432/sentinel}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}\n COOKIE_SECRET: ${COOKIE_SECRET:-change_me_in_production}\n JWT_SECRET: ${JWT_SECRET:-jwt_secret_change_me_in_production}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:-http://localhost:5173}\n BOARD_ACCESS_LABEL: ${BOARD_ACCESS_LABEL:-Board atelier}\n BOARD_SESSION_TTL_HOURS: ${BOARD_SESSION_TTL_HOURS:-12}\n BOARD_ACCESS_CODE_HASH: ${BOARD_ACCESS_CODE_HASH:-}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n TRUST_PROXY: ${TRUST_PROXY:-}\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n args:\n VITE_API_URL: ${VITE_API_URL:-http://localhost:3000}\n container_name: sentinel_frontend\n depends_on:\n backend:\n condition: service_healthy\n networks:\n - internal\n\n caddy:\n image: caddy:2-alpine\n container_name: sentinel_caddy\n ports:\n - \"80:80\"\n - \"443:443\"\n - \"443:443/udp\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile:ro\n - caddy_data:/data\n - caddy_config:/config\n environment:\n CADDY_DOMAIN: ${CADDY_DOMAIN:-localhost}\n depends_on:\n - frontend\n - backend\n networks:\n - internal\n\nnetworks:\n internal:\n driver: bridge\n\nvolumes:\n sentinel_data:\n caddy_data:\n caddy_config:\n"}, "67deb0423891e25c41ac96b2c95f0a6779566483": {"t": 1785749431.7378166, "n": 1637, "h": "82298cacc6991000", "c": "version: '3.9'\n\nservices:\n postgres:\n image: postgres:15-alpine\n container_name: sentinel_postgres\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sentinel_password}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U sentinel -d sentinel\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n container_name: sentinel_backend\n ports:\n - \"3000:3000\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://localhost:3000/api/health > /dev/null || exit 1\"]\n interval: 10s\n timeout: 5s\n retries: 5\n environment:\n PORT: ${PORT:-3000}\n DATABASE_URL: ${DATABASE_URL:-postgres://sentinel:sentinel_password@postgres:5432/sentinel}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}\n COOKIE_SECRET: ${COOKIE_SECRET:-change_me_in_production}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:-http://localhost:5173}\n JWT_SECRET: ${JWT_SECRET:-jwt_secret_change_me_in_production}\n NODE_ENV: ${NODE_ENV:-development}\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n args:\n VITE_API_URL: ${VITE_API_URL:-http://localhost:3000}\n container_name: sentinel_frontend\n ports:\n - \"5173:80\"\n depends_on:\n backend:\n condition: service_healthy\n\nvolumes:\n sentinel_data:\n"}, "d264c346abfee320e2f5f77c85c53f66f8d65bd3": {"t": 1785749432.938781, "n": 1581, "h": "d2222b9a298e4fc5", "c": "version: '3.9'\n\nservices:\n postgres:\n image: postgres:15-alpine\n container_name: sentinel_postgres\n environment:\n POSTGRES_DB: ${POSTGRES_DB:-sentinel}\n POSTGRES_USER: ${POSTGRES_USER:-sentinel}\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sentinel_password}\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n ports:\n - \"5432:5432\"\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U sentinel -d sentinel\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n container_name: sentinel_backend\n ports:\n - \"3000:3000\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD-SHELL\", \"curl -f http://localhost:3000/api/health || exit 1\"]\n interval: 10s\n timeout: 5s\n retries: 5\n environment:\n PORT: ${PORT:-3000}\n DATABASE_URL: ${DATABASE_URL:-postgres://sentinel:sentinel_password@postgres:5432/sentinel}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}\n COOKIE_SECRET: ${COOKIE_SECRET:-change_me_in_production}\n CLIENT_ORIGIN: ${CLIENT_ORIGIN:-http://localhost:5173}\n JWT_SECRET: ${JWT_SECRET:-jwt_secret_change_me_in_production}\n NODE_ENV: ${NODE_ENV:-development}\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n container_name: sentinel_frontend\n ports:\n - \"5173:80\"\n depends_on:\n backend:\n condition: service_healthy\n\nvolumes:\n sentinel_data:\n"}, "b440bd9fbcf969f63b3f4a7b8da93e8139626c98": {"t": 1785749434.1878042, "n": 1210, "h": "97c254aa308a2c5b", "c": "version: '3.9'\n\nservices:\n postgres:\n image: postgres:15-alpine\n container_name: sentinel_postgres\n environment:\n POSTGRES_DB: sentinel\n POSTGRES_USER: sentinel\n POSTGRES_PASSWORD: sentinel_password\n volumes:\n - sentinel_data:/var/lib/postgresql/data\n ports:\n - \"5432:5432\"\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U sentinel -d sentinel\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ./backend\n dockerfile: Dockerfile\n container_name: sentinel_backend\n ports:\n - \"3000:3000\"\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n PORT: 3000\n DATABASE_URL: postgres://sentinel:sentinel_password@postgres:5432/sentinel\n ADMIN_USERNAME: admin\n ADMIN_PASSWORD: admin123\n COOKIE_SECRET: change_me_in_production\n CLIENT_ORIGIN: http://localhost:5173\n JWT_SECRET: jwt_secret_change_me_in_production\n NODE_ENV: production\n\n frontend:\n build:\n context: ./frontend\n dockerfile: Dockerfile\n container_name: sentinel_frontend\n ports:\n - \"5173:80\"\n depends_on:\n - backend\n\nvolumes:\n sentinel_data:\n"}}}}