Files
PnvPanel/docker-compose.yml
T
mrleo1nidandClaude Opus 5.5 d7743977a1 Use bind mounts for pgdata and dp_keys in docker-compose
Matches the production compose so the stack data lives next to the
compose file and can be backed up with the server. ticket_uploads stays
a named volume to avoid losing existing attachments on pull.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 19:45:17 +03:00

64 lines
2.2 KiB
YAML

services:
db:
image: postgres:17-alpine
environment:
POSTGRES_DB: ${POSTGRES_DB:-pnvpanel}
POSTGRES_USER: ${POSTGRES_USER:-pnvpanel}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-pnvpanel}
volumes:
- ./pgdata:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-pnvpanel} -d ${POSTGRES_DB:-pnvpanel}']
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
app:
build:
context: .
dockerfile: Dockerfile
depends_on:
db:
condition: service_healthy
# Секреты (Jwt__SigningKey, AdminSeed__Password, Telegram__BotToken, ...) — из .env,
# см. .env.example. ConnectionStrings__Default ниже переопределяет .env: адрес БД внутри
# сети compose всегда 'db', не значение из .env (которое рассчитано на локальный запуск).
env_file:
- .env
environment:
ASPNETCORE_ENVIRONMENT: Production
ASPNETCORE_HTTP_PORTS: '8085'
ConnectionStrings__Default: 'Host=db;Port=5432;Database=${POSTGRES_DB:-pnvpanel};Username=${POSTGRES_USER:-pnvpanel};Password=${POSTGRES_PASSWORD:-pnvpanel}'
FileStorage__RootPath: '/app/uploads'
volumes:
# Data Protection key-ring (шифрование секретов нод at-rest) должен пережить пересоздание
# контейнера — иначе расшифровка паролей нод после рестарта станет невозможна.
- ./dp_keys:/app/keys
# Вложения тикетов поддержки (скриншоты) — обычные файлы на диске, см. DiskFileStorage.
- ticket_uploads:/app/uploads
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:8085/health']
interval: 15s
timeout: 5s
start_period: 20s
retries: 5
ports:
- '8085:8085'
restart: unless-stopped
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
volumes:
pgdata:
dp_keys:
ticket_uploads: