Files
MikrotikManager/deploy/docker-compose.yml
T
DenozordecandCursor ec43591a99
Docker images / prepare-release (push) Successful in 12s
Docker images / backend-test (push) Successful in 4m9s
Docker images / frontend-image (push) Successful in 4m28s
Docker images / updater-image (push) Successful in 58s
Docker images / backend-image (push) Successful in 2m49s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 11s
feat(db): перевести хранилище с SQLite на PostgreSQL
При старте backend накатывает схему PostgreSQL 18 и, если база пустая, один раз импортирует mikrotik.db с тома. Повторный старт не копирует данные. Бэкап в UI идёт через pg_dump.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 01:36:48 +07:00

107 lines
3.2 KiB
YAML

services:
postgres:
image: ${POSTGRES_IMAGE_TAG:-postgres:18-alpine}
container_name: mmapp-postgres
restart: unless-stopped
shm_size: "256mb"
environment:
POSTGRES_USER: mmapp
POSTGRES_DB: mmapp
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C.UTF-8 --data-checksums"
TZ: UTC
PGTZ: UTC
command:
- postgres
- -c
- timezone=UTC
- -c
- listen_addresses=*
- -c
- max_connections=100
- -c
- shared_buffers=256MB
- -c
- work_mem=16MB
- -c
- maintenance_work_mem=128MB
- -c
- wal_compression=on
volumes:
- mmapp-pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U mmapp -d mmapp"]
interval: 5s
timeout: 5s
retries: 10
backend:
image: git.shx.one/denozord/mikrotikmanager-backend:latest
container_name: mmapp-backend
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
ports:
- "8000:8000"
# IPFIX: только на WG-адресе хоста после `wg-quick up wg-flow`, не 0.0.0.0
# - "10.255.254.1:4739:4739/udp"
environment:
CORS_ORIGIN: ${CORS_ORIGIN:-http://localhost:3000}
DATABASE_URL: postgres://mmapp:${POSTGRES_PASSWORD}@postgres:5432/mmapp
DATABASE_PATH: /app/data/mikrotik.db
# IPFIX: внутри контейнера слушаем все интерфейсы; на хосте UDP 4739 публикуется только на WG-IP
FLOW_LISTEN_HOST: "0.0.0.0"
volumes:
- /opt/mmapp/data:/app/data
healthcheck:
test:
[
"CMD",
"node",
"-e",
"fetch('http://127.0.0.1:8000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))",
]
interval: 30s
timeout: 5s
retries: 3
start_period: 300s
labels:
mmapp.updater.managed: "true"
mmapp.updater.target: backend
mmapp.updater.image: git.shx.one/denozord/mikrotikmanager-backend:latest
frontend:
image: git.shx.one/denozord/mikrotikmanager-frontend:latest
container_name: mmapp-frontend
restart: unless-stopped
depends_on:
- backend
ports:
- "3000:3000"
environment:
BACKEND_INTERNAL_URL: http://backend:8000
labels:
mmapp.updater.managed: "true"
mmapp.updater.target: frontend
mmapp.updater.image: git.shx.one/denozord/mikrotikmanager-frontend:latest
updater:
image: git.shx.one/denozord/mikrotikmanager-updater:latest
container_name: mmapp-updater
restart: unless-stopped
environment:
REGISTRY: git.shx.one
REGISTRY_USERNAME: ${REGISTRY_USERNAME:-}
REGISTRY_PASSWORD: ${REGISTRY_PASSWORD:-}
POLL_INTERVAL_SECONDS: ${POLL_INTERVAL_SECONDS:-300}
HEALTH_TIMEOUT_SECONDS: ${HEALTH_TIMEOUT_SECONDS:-600}
STOP_TIMEOUT_SECONDS: ${STOP_TIMEOUT_SECONDS:-30}
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/mmapp/state:/state
- /opt/mmapp/updater/targets.json:/etc/updater/targets.json:ro
volumes:
mmapp-pgdata: