architect/standards/SERVICES_DEPLOYMENT.md

Стандарт: размещение сервисов

Версия: 1.0.0
Дата: 2026-03-15


Правило

/etc/systemd/system/   ← ТОЛЬКО системное (OS-уровень)
Docker compose         ← ВСЕ проектные и платформенные сервисы
system/scheduler/      ← ВСЕ расписания (не cron напрямую)

⛔ ЗАПРЕЩЕНО создавать .service файлы в /etc/systemd/system/ для проектных сервисов.


Что куда

/etc/systemd/system/ — только это

Сервис Причина
nginx входная точка сервера
docker движок контейнеров
hub-mount, infra-mount монтирование дисков при старте OS
fail2ban защита OS

Всё остальное — Docker.

Docker — проекты и платформа

Категория Примеры
Платформа md-viewer, file-share
Проекты erp, pro1, filemanager, n8n, nocodb
Боты telegram-vip, любые боты

system/scheduler/ — расписания

# Смотреть задачи
python3 system/scheduler/run.py --list

# Добавить задачу
vim system/scheduler/schedule.yaml

# Запустить вручную
python3 system/scheduler/run.py --run task_name

Структура сервиса в проекте

projects/org/{project}/app/{service}/
├── solution/              ← код
├── infrastructure/
│   ├── Dockerfile         ← как собрать образ
│   ├── docker-compose.yml ← как запустить
│   └── .env.example       ← переменные окружения (без секретов)
└── CLAUDE.md

Конфиг рядом с кодом → переехал проект → конфиг переехал.


Шаблон Dockerfile (Python/FastAPI/Flask)

FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

Шаблон docker-compose.yml

services:
  app:
    build: ../solution
    container_name: {project}-{service}
    restart: always
    ports:
      - "8000:8000"
    volumes:
      - ../solution:/app          # код (для разработки)
      - /mnt/beget-s3:/data:ro    # данные (если нужны)
    env_file:
      - ../solution/.env
    networks:
      - {project}-network

networks:
  {project}-network:
    driver: bridge

Как мигрировать существующий systemd-сервис в Docker

# 1. Создать Dockerfile + docker-compose.yml в infrastructure/
# 2. Проверить запуск
docker compose -f infrastructure/docker-compose.yml up -d

# 3. Убедиться что работает
curl http://localhost:{port}/

# 4. Остановить и отключить systemd
systemctl stop {service}
systemctl disable {service}

# 5. Удалить unit-файл
rm /etc/systemd/system/{service}.service
systemctl daemon-reload

Связанные документы


← Стандарты