# M7: упаковка в docker-compose — API, PostgreSQL, фронт (nginx), Ollama + модель.
# Настройки читаются из .env в корне репо (шаблон — .env.example).
services:
db:
image: postgres:17-alpine
environment:
POSTGRES_USER: ${POSTGRES_USER:-gntodo}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-gntodo}
POSTGRES_DB: ${POSTGRES_DB:-gntodo}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-gntodo}"]
interval: 5s
timeout: 3s
retries: 12
ollama:
image: ollama/ollama:latest
volumes:
- ollama:/root/.ollama
healthcheck:
test: ["CMD-SHELL", "ollama ls >/dev/null 2>&1"]
interval: 10s
timeout: 5s
retries: 12
# Одноразовая загрузка модели (idempotent: pull обновляет, если уже есть)
ollama-init:
image: ollama/ollama:latest
depends_on:
ollama:
condition: service_healthy
environment:
OLLAMA_HOST: http://ollama:11434
command: ["ollama", "pull", "${OLLAMA_MODEL:-qwen2.5:3b}"]
restart: "no"
api:
build: ./backend
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ollama-init:
condition: service_completed_successfully
environment:
DATABASE_URL: postgresql+psycopg://${POSTGRES_USER:-gntodo}:${POSTGRES_PASSWORD:-gntodo}@db:5432/${POSTGRES_DB:-gntodo}
GAUTH_BASE_URL: ${GAUTH_BASE_URL}
GAUTH_CLIENT_ID: ${GAUTH_CLIENT_ID}
GAUTH_CLIENT_SECRET: ${GAUTH_CLIENT_SECRET}
GAUTH_REDIRECT_URI: ${GAUTH_REDIRECT_URI}
SESSION_SECRET: ${SESSION_SECRET}
OLLAMA_BASE_URL: http://ollama:11434
OLLAMA_MODEL: ${OLLAMA_MODEL:-qwen2.5:3b}
MCP_TOKEN: ${MCP_TOKEN:-}
ATTACHMENTS_PATH: /data/attachments
volumes:
- attachments:/data/attachments
expose:
- "8134"
web:
build: ./frontend
restart: unless-stopped
depends_on:
- api
ports:
- "${WEB_PORT:-8135}:80"
volumes:
pgdata:
attachments:
ollama: