📦 Docker Compose

Файл docker-compose.yml описывает все сервисы проекта. Здесь разбираем структуру, ключевые параметры и типичные операции.

🗺️ Обзор сервисов

8 сервисов в docker-compose.yml

bot
Python/FastAPI
:28000
postgres
PostgreSQL 16
:25432
n8n
Workflow Engine
:25678
ollama
LLM Runtime
:21435
prometheus
Metrics
:29090
alertmanager
Alerts
:29093
grafana
Dashboards
:3001
cadvisor
Container Stats
internal

📁 Структура файла

services:

Определения контейнеров

  • • bot, postgres, n8n, ollama
  • • prometheus, alertmanager
  • • grafana, cadvisor
volumes:

Постоянные хранилища

  • • postgres_data
  • • n8n_data
  • • ollama_data
  • • voice_data
networks:

Сеть по умолчанию

  • • clowbot_default
  • • Внутренний DNS
  • • Изоляция сервисов

🤖 Сервис Bot (подробно)

# Основной сервис — Telegram Bot
services:
  bot:
    build:
      context: ./bot
      dockerfile: Dockerfile
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    ports:
      - "${BOT_PORT:-28000}:8000"
    environment:
      TZ: ${TZ:-Asia/Bangkok}
      TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN}
      DATABASE_URL: postgresql://clowbot:clowbot_pass@postgres:5432/clowbot
      OLLAMA_BASE_URL: http://ollama:11434
      N8N_BASE_URL: http://n8n:5678
      INTERNAL_API_TOKEN: ${INTERNAL_API_TOKEN}
    volumes:
      - voice_data:/data/voice
      - ./dist:/data/dist:ro
    extra_hosts:
      - "host.docker.internal:host-gateway"

🔧 Ключевые параметры

buildСборка из исходников

context: ./bot — путь к директории с Dockerfile.

Используется для Bot и PostgreSQL (кастомные образы с миграциями). Остальные — готовые image.
depends_onЗависимости запуска

Bot ждёт пока PostgreSQL станет healthy. n8n тоже ждёт Postgres.

depends_on:
postgres:
condition: service_healthy # ждёт health check
portsПроброс портов

Формат: HOST_PORT:CONTAINER_PORT

${BOT_PORT:-28000}:8000
28000 снаружи → 8000 внутри
${POSTGRES_PORT:-25432}:5432
25432 снаружи → 5432 внутри
environmentПеременные окружения
⚠️ Важно: Все секреты (токены, ключи) передаются через .env файл. Никогда не хардкодить в compose!
Обязательные переменные:
TELEGRAM_BOT_TOKEN
POSTGRES_PASSWORD
N8N_ENCRYPTION_KEY
INTERNAL_API_TOKEN
volumesТома данных
Named volumes
voice_data:/data/voice
Docker управляет расположением
Bind mounts
./dist:/data/dist:ro
Прямой путь на хосте
:ro — read-only mount (безопасность, prevents accidental writes)
extra_hostsДоступ к хосту

host.docker.internal:host-gateway — позволяет контейнерам обращаться к localhost хоста.

Используется когда Ollama запущен на хосте (OLLAMA_MODE=host), а не в контейнере.

💾 Volumes (хранилища)

P0postgres_data

База данных PostgreSQL — все данные проекта.

Volume name: clowbot_postgres_data
P1n8n_data

Credentials, encryption key, настройки n8n.

Volume name: clowbot_n8n_data
P1ollama_data

Скачанные модели LLM (~4GB каждая).

Volume name: clowbot_ollama_data
P2voice_data

Временные голосовые файлы (удаляются).

Volume name: clowbot_voice_data

⌨️ Частые команды

Запуск и остановка

docker compose up -dЗапуск всех сервисов в фоне
docker compose downОстановка всех сервисов
docker compose restart botПерезапуск конкретного сервиса

Мониторинг и логи

docker compose psСтатус всех сервисов
docker compose logs -f botЛоги сервиса bot в реальном времени
docker compose logs --tail=100 n8nПоследние 100 строк логов n8n

Сборка и обновление

docker compose build botПересборка образа bot
docker compose up -d --buildПересборка и запуск всех сервисов
docker compose pullОбновление готовых образов

🔧 Troubleshooting

Service не запускается

docker compose logs bot --tail=50

Сначала смотрите логи. Частые причины: отсутствие .env, неправильный токен, база недоступна.

Health check падает

docker compose ps # проверьте статус

Если postgres показывает (unhealthy), проверьте логи и убедитесь что миграции прошли успешно.

Port уже занят

lsof -i :28000 # кто занял порт?

Измените порт в .env или остановите конфликтующий сервис.

🔗 Связанные страницы