Перейти к содержимому

Развёртывание

slimTDS поддерживает три режима развёртывания. Выбирайте в зависимости от топологии вашей сети.

РежимCompose-файлыTLSРеальный IP клиента
devdocker-compose.yml + авто-слияние docker-compose.override.ymlTLS обрабатывается локальным окружением (Caddyfile.dev работает с auto_https off)локально (без прокси)
cf_flexdocker-compose.yml + docker-compose.prod.cf.ymlCloudflare терминирует TLS; Caddy слушает :80заголовок CF-Connecting-IP; Caddy доверяет IP-диапазонам Cloudflare
cf_fulldocker-compose.yml + docker-compose.prod.cf.ymlCloudflare Origin Certificate; Caddy слушает :443заголовок CF-Connecting-IP; Caddy доверяет IP-диапазонам Cloudflare
directdocker-compose.yml + docker-compose.prod.direct.ymlCaddy auto-TLS через Let’s Encrypt; порты 80 + 443 должны быть публичнымитолько доверенные прокси (без промежуточного прокси)

И cf_flex, и cf_full используют один и тот же Caddyfile.cf. Порт прослушивания контролируется CF_LISTEN_PORT, который entrypoint.sh ставит в 443 для cf_full и 80 для cf_flex.

Режим direct использует Caddyfile.direct, который берёт переменную окружения $DOMAIN для адреса сайта Caddy и устанавливает ACME-email в admin@{$DOMAIN}.

DEPLOY_MODE в .env — единственный источник истины. При старте контейнера docker/entrypoint.sh читает его и выбирает Caddyfile:

dev → config/frankenphp/Caddyfile.dev
cf_flex → config/frankenphp/Caddyfile.cf (CF_LISTEN_PORT=80)
cf_full → config/frankenphp/Caddyfile.cf (CF_LISTEN_PORT=443)
direct → config/frankenphp/Caddyfile.direct

Любое другое значение приводит к тому, что entrypoint.sh завершается с ошибкой.

Скопируйте .env.example в .env командой make env, которая также генерирует случайные значения для APP_SECRET и ADMIN_PASSWORD. Ключевые переменные:

ПеременнаяНазначение
DEPLOY_MODEОдно из dev, cf_flex, cf_full, direct
DOMAINПубличный хостнейм (обязателен для режима direct; необязателен для cf_*)
APP_SECRET64 hex-символа; подписывает сессии и CSRF-токены — ротация инвалидирует все сессии
APP_TZТаймзона приложения, например Europe/Moscow. Сессии PostgreSQL устанавливаются в эту таймзону, поэтому чтения timestamptz возвращаются локализованными; хранение остаётся в UTC
DB_HOST / DB_PORT / DB_NAME / DB_USER / DB_PASSWORDПодключение к PostgreSQL
DB_DSNПолный PDO DSN, собранный из переменных DB_* выше
ADMIN_LOGINИмя администратора (по умолчанию admin)
ADMIN_PASSWORDЗадаётся однократно командой admin:init; меняется через UI или admin:set-password впоследствии
TRUSTED_PROXIESСписок IP/CIDR через запятую для режимов cf_* (обрабатывается автоматически в Caddyfile.cf; задаётся здесь для осведомлённости на уровне приложения)
MAXMIND_ACCOUNT_ID / MAXMIND_LICENSE_KEYБесплатные учётные данные GeoLite2 для гео-фильтров
TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_IDTelegram-бот для ежедневной сводки и ежечасных оповещений
FRANKENPHP_WORKER_MODE1 (по умолчанию, in-memory worker) или 0 (как CGI, проще отлаживать)
Окно терминала
make env # скопировать .env.example и сгенерировать секреты (нужно один раз)
make migrate # применить миграции Phinx
make up # запустить контейнеры db + app + cron

Откройте /admin/login на хосте, где вы опубликовали slimTDS.

  1. Установите DEPLOY_MODE=cf_full (или cf_flex) в .env. Задайте APP_SECRET, ADMIN_PASSWORD и любые другие необходимые переменные.

  2. Примените миграции и инициализируйте аккаунт администратора:

    Окно терминала
    docker compose -f docker-compose.yml -f docker-compose.prod.cf.yml run --rm app php bin/console admin:init
  3. Запустите стек:

    Окно терминала
    make prod-up-cf

    make prod-up-cf проверяет, что DEPLOY_MODE начинается с cf, прежде чем продолжить. Он выполняет:

    Окно терминала
    docker compose -f docker-compose.yml -f docker-compose.prod.cf.yml up -d
  1. Установите DEPLOY_MODE=direct и DOMAIN=tds.example.com в .env. Порты 80 и 443 должны быть публично доступны.

  2. Примените миграции и инициализируйте аккаунт администратора:

    Окно терминала
    docker compose -f docker-compose.yml -f docker-compose.prod.direct.yml run --rm app php bin/console admin:init
  3. Запустите стек:

    Окно терминала
    make prod-up-direct

    make prod-up-direct проверяет и DEPLOY_MODE=direct, и что DOMAIN задан, прежде чем продолжить.

Окно терминала
make prod-down

make prod-down читает DEPLOY_MODE из .env и автоматически останавливает соответствующий compose-стек.

Первый администратор создаётся командой admin:init, которая читает ADMIN_LOGIN и ADMIN_PASSWORD из .env. Команда идемпотентна — она пропускается, если аккаунт уже существует:

Окно терминала
docker compose exec app php bin/console admin:init

После первого входа смените пароль на /admin/settings или через CLI:

Окно терминала
docker compose exec app php bin/console admin:set-password admin <new-password>

Базы GeoLite2 не входят в комплект. Без них GeoLookup молча ничего не делает, и все условия гео-фильтров дают «не совпало» (ожидаемое поведение).

  1. Зарегистрируйте бесплатный аккаунт MaxMind
  2. Сгенерируйте лицензионный ключ и добавьте в .env:
    MAXMIND_ACCOUNT_ID=123456
    MAXMIND_LICENSE_KEY=xxxxxxxxxxxx
  3. Выполните однократную загрузку:
    Окно терминала
    docker compose --profile geo up geoipupdate
    Это наполнит ./geoip-data/ файлами GeoLite2-City.mmdb, GeoLite2-Country.mmdb и GeoLite2-ASN.mmdb.

Cron-задача geoip:check (запускается ежедневно в 06:00 UTC) логирует предупреждение и выходит с ненулевым кодом, если какой-либо файл .mmdb отсутствует или старше 14 дней. (Telegram-уведомление об устаревшем GeoIP доставляется отдельно ежечасной задачей telegram:alerts.)

  1. Создайте бота через @BotFather и скопируйте токен.
  2. Узнайте свой chat ID (например, перешлите любое сообщение боту @userinfobot).
  3. Добавьте в .env:
    TELEGRAM_BOT_TOKEN=1234567890:AAAAA...
    TELEGRAM_CHAT_ID=-100xxxxxxxx

Контейнер cron автоматически отправляет ежедневную сводку в 10:00 UTC и ежечасные системные оповещения.

Окно терминала
make backup
# или:
docker compose exec app php bin/console db:backup

Дампы пишутся в /app/var/backups/ внутри контейнера app в custom-формате PostgreSQL. Ежедневный cron (db:backup, 01:00 UTC) хранит файлы за последние 14 дней и автоматически удаляет более старые.

Окно терминала
# Список доступных дампов
docker compose exec app ls /app/var/backups/
# Восстановление (аргумент 'yes' подтверждает деструктивную операцию)
docker compose exec app php bin/console db:restore slimtds_2026-04-24_03-00-00.dump yes

Если возникает глобальная ошибка инициализации (например, плохое значение в .env или отсутствующая миграция), worker может падать в цикле перезапусков. Временно откатитесь на классический режим:

FRANKENPHP_WORKER_MODE=0

Затем проверьте make logs на предмет ошибки PHP. Не забудьте снова включить worker-режим после исправления проблемы.

Окно терминала
docker compose --profile geo up geoipupdate

Не должна. make test использует db-test — отдельный контейнер PostgreSQL с хранилищем tmpfs — поэтому dev-база никогда не затрагивается. Если подозреваете загрязнение, проверьте, что DB_DSN в .env указывает на dev-базу, а не на тестовую.

Дашборд статистики slimTDS