Files
topsysops-app/docker-compose.yml
T
ogrechkoandClaude Sonnet 5 130c5382cd Initial commit: TopSysOps site + admin panel
Multi-page public site (Next.js), Node/Express backend with Postgres,
and Vite admin/account app, restructured from a single-page layout
into dedicated service, promotions, cases, about, FAQ, and blog pages
for SEO.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013otXCiTZsxdZ4SJKZ9wUky
2026-08-25 23:12:16 +03:00

80 lines
3.0 KiB
YAML

services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
backend:
build: ./backend
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
JWT_SECRET: ${JWT_SECRET}
ADMIN_USERNAME: ${ADMIN_USERNAME}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
COOKIE_SECURE: ${COOKIE_SECURE:-true}
PORT: 4000
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}
OPENROUTER_MODEL: ${OPENROUTER_MODEL:-openai/gpt-4o-mini}
PUBLIC_SITE_URL: ${PUBLIC_SITE_URL:-}
# Next.js: публичный сайт + блог, с серверным рендерингом (SEO).
nextjs:
build:
context: ./public-site
args:
NEXT_PUBLIC_SITE_URL: ${PUBLIC_SITE_URL:-https://top-sysops.ru}
NEXT_PUBLIC_CHAT_PROVIDER: ${CHAT_PROVIDER:-none}
NEXT_PUBLIC_TOPTICKET_WIDGET_URL: ${TOPTICKET_WIDGET_URL:-}
NEXT_PUBLIC_TOPTICKET_WIDGET_KEY: ${TOPTICKET_WIDGET_KEY:-}
NEXT_PUBLIC_CHATWOOT_BASE_URL: ${CHATWOOT_BASE_URL:-}
NEXT_PUBLIC_CHATWOOT_WEBSITE_TOKEN: ${CHATWOOT_WEBSITE_TOKEN:-}
restart: unless-stopped
depends_on:
- backend
environment:
# Внутренний адрес бэкенда по docker-сети - используется в Server Components
# (SSR) для прямых запросов, в обход Caddy.
BACKEND_INTERNAL_URL: http://backend:4000
NEXT_PUBLIC_SITE_URL: ${PUBLIC_SITE_URL:-https://top-sysops.ru}
# Caddy: единственный сервис с портами наружу. Отдаёт статику admin-app
# (/admin, /account), проксирует /api на backend, всё остальное - на nextjs.
web:
build:
context: ./admin-app
restart: unless-stopped
depends_on:
- backend
- nextjs
environment:
DOMAIN: ${DOMAIN:-:80}
ports:
- "${HTTP_PORT:-80}:80"
# Порт 443 контейнеру не нужен, если TLS терминирует внешний реверс-прокси
# (например, Nginx Proxy Manager) - именно ваш случай. Строка закомментирована;
# раскомментируйте её, только если хотите, чтобы Caddy сам получал
# сертификат Let's Encrypt (тогда нужен реальный DOMAIN без схемы http://).
# - "${HTTPS_PORT:-443}:443"
volumes:
- caddy_data:/data
- caddy_config:/config
volumes:
db_data:
caddy_data:
caddy_config: