Установка через ИИ-агента
Дайте кодовому агенту SSH-доступ к чистому Linux-серверу, вставьте промпт ниже и один раз ответьте на его вопросы. Он поставит Docker, соберёт стек, применит миграции, создаст админа и прогонит smoke-тест из шести проверок, прежде чем отчитаться.
Работает с любым агентом, умеющим выполнять команды в шелле, — Claude Code, Codex/GPT, Qwen, Kimi.
У тебя SSH/root-доступ к чистому Linux-серверу. Установи на него slimTDS.
git clone https://github.com/izzipizzy/slimtds.git slimtds && cd slimtds
Прочитай docs/AI-INSTALL.md и выполни его точно, сверху вниз.Задай все вопросы ОДНИМ сообщением в начале (§1), дальше работай до концабез остановок. Секреты не печатай. Если падает проверка из §2 — остановись искажи мне, не обходи её. Заверши отчётом из §9.You have SSH/root access to a fresh Linux server. Install slimTDS on it.
git clone https://github.com/izzipizzy/slimtds.git slimtds && cd slimtds
Read docs/AI-INSTALL.md and follow it exactly, top to bottom.Ask me every question you need in ONE message up front (§1), then run tocompletion without stopping. Never print secrets. Stop and tell me if a §2preflight check fails — do not work around it. Finish with the §9 report.Что нужно заранее
Заголовок раздела «Что нужно заранее»- Сервер — минимум 2 ГБ RAM и 20 ГБ свободного диска, порты 80 и 443 не заняты.
- Домен, A-запись которого уже указывает на этот сервер. Обязателен для TLS в режиме
direct; можно пропустить, только если ставите за Cloudflare. - Опционально: лицензионный ключ MaxMind GeoLite2 — без него гео-таргетинг молча ни с чем не совпадает — и токен Telegram-бота с chat ID для дайджеста и алертов.
Пароль администратора агент генерирует сам и сообщает его один раз, в конце.
Что делает агент
Заголовок раздела «Что делает агент»Он следует рантбуку docs/AI-INSTALL.md из репозитория. Десять пронумерованных разделов,
строго по порядку.
-
Собирает ввод — режим развёртывания, домен, таймзона и опциональные интеграции, всё одним сообщением. Дальше он вас не отвлекает.
-
Preflight — дистрибутив и архитектура, права root, RAM и диск, свободны ли порты 80/443, резолвится ли DNS на этот сервер, есть ли исходящая сеть. Провалившаяся проверка останавливает установку, а не обходится.
-
Ставит Docker из официального репозитория — не из snap и не пакет
docker.ioиз дистрибутива, потому что Compose v2 должен быть доступен какdocker compose. -
Гигиена ОС — открывает 22/80/443 в фаерволе (только добавляет правила, никогда не сбрасывает политику), создаёт swap-файл на 2 ГБ, если RAM меньше 2 ГБ, ставит таймзону.
-
Клонирует и настраивает —
git clone, затемmake env, который пишет.envсо случайнымиAPP_SECRETи паролем админа, затем значения под выбранный режим. -
Запускает стек —
make prod-up-directилиmake prod-up-cf. Первый запуск собирает образ (ассеты Bun → vendor Composer → рантайм FrankenPHP) и занимает несколько минут. -
Инициализирует — миграции Phinx, затем
partitions:rotateдля создания месячных партиций таблиц статистики, затемadmin:initдля учётной записи администратора. -
Smoke-тест — шесть проверок; установка не считается завершённой, пока не пройдут все.
-
Отчитывается — URL, доступы, режим, какие интеграции включены, куда складываются бэкапы, и таблица smoke-теста, включая провалы, если они были.
Режимы развёртывания
Заголовок раздела «Режимы развёртывания»Агент спросит, какой нужен. Выбор — по топологии сети:
| Режим | Когда выбирать |
|---|---|
direct | Сервер сам является публичным origin, Caddy получает сертификаты Let’s Encrypt. Порты 80 и 443 должны быть доступны извне. Выбор по умолчанию для обычного VPS. |
cf_flex | Домен проксируется через Cloudflare, и обычный HTTP между Cloudflare и origin вас устраивает. Caddy слушает :80. |
cf_full | Проксируется через Cloudflare и origin отдаёт HTTPS с Origin-сертификатом Cloudflare. Caddy слушает :443. |
dev | Только локальная машина. Не публикует порты и полагается на доменную маршрутизацию локального окружения, поэтому на обычном сервере недоступен. |
Значения .env, которые различаются:
APP_ENV=prodAPP_DEBUG=falseDEPLOY_MODE=directDOMAIN=tds.example.comAPP_URL=https://tds.example.comDB_PASSWORD=<сменить со значения по умолчанию>APP_ENV=prodAPP_DEBUG=falseDEPLOY_MODE=cf_flexDOMAIN=tds.example.comAPP_URL=https://tds.example.comDB_PASSWORD=<сменить со значения по умолчанию>APP_ENV=prodAPP_DEBUG=falseDEPLOY_MODE=cf_fullDOMAIN=tds.example.comAPP_URL=https://tds.example.comDB_PASSWORD=<сменить со значения по умолчанию>Дополнительно нужно смонтировать Origin-сертификат Cloudflare, чтобы Caddy отдавал :443.
Smoke-тест
Заголовок раздела «Smoke-тест»| № | Проверка | Ожидание |
|---|---|---|
| 1 | Контейнеры | app, db, cron запущены; app — healthy |
| 2 | GET /__health | 200 |
| 3 | Миграции | ни одной в состоянии down |
| 4 | GET /admin/login | 200 |
| 5 | TLS | без ошибки сертификата |
| 6 | Вход в админку | 302 на /admin |
Плюс проверка, которая ловит поломку, прячущуюся за шестью зелёными галочками: что
/assets/app.<hash>.css и /p.js отдают 200, а не 404.
Реальный IP клиента
Заголовок раздела «Реальный IP клиента»Настраивать нечего. В режимах cf_* Caddyfile.cf уже доверяет диапазонам Cloudflare и
читает CF-Connecting-IP; дальше приложение проходит цепочку
X-Slim-IP → X-Real-IP → CF-Connecting-IP → True-Client-IP → X-Forwarded-For → REMOTE_ADDR.
Агенту запрещено править Caddyfile.* руками — нужный файл выбирает entrypoint.sh по
значению DEPLOY_MODE.
Если что-то пошло не так
Заголовок раздела «Если что-то пошло не так»Рантбук заканчивается таблицей «симптом → причина → команда», покрывающей реальные отказы этого стека: админка без стилей, воркер в цикле перезапусков, Let’s Encrypt не выдаёт сертификат, ломается аутентификация в БД после поздней смены пароля, гео-фильтры ни с чем не совпадают, порты заняты. Агенту предписано свериться с ней, а не изобретать патч, и сообщать о провалившейся проверке, а не тихо объявлять успех.
Ручной, «человеческий» вариант той же установки — Режимы развёртывания.