Сервис mtg снят с ru-docker-infra: убран из compose, удалены mtg/config.toml и переменная MTG_FAKE_TLS_HOST, вычищены записи в inventory и CLAUDE.md. Заодно обновлён host узла на новый адрес. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6.6 KiB
Personal Infrastructure
Репозиторий моей личной инфраструктуры: VPN, git-хостинг, автоматизация, реверс-прокси и всё, что будет добавляться дальше. Цель — держать в одном месте всё, что нужно, чтобы развернуть любой узел с нуля.
Принципы:
- Docker — предпочтительный способ развёртывания. Если можно завернуть в compose — заворачиваем.
- Репозиторий — единственный источник правды. На самих серверах ничего уникального жить не должно: все конфиги, compose-файлы, скрипты, артефакты,
.env— в git. Сервер тянет нужную папку и поднимает её. - Секреты тоже в репо.
.envс паролями коммитим вместе с остальным (репо приватный). Приватные ключи (ssh/tunnel_keyи т.п.) — туда же, как файлы рядом с compose.
Структура репозитория
servers/
inventory.yml # источник правды о парке серверов
<server-name>/ # одна папка на сервер, имя совпадает с inventory.servers[].name
docker-compose.yml # compose этого узла
.env # переменные окружения узла (включая пароли)
<service>/ # конфиги конкретных сервисов (xray, nginx, ...)
ssh/ # ключи и прочие чувствительные файлы
domains.yml # источник правды о DNS-записях для всех доменов
CLAUDE.md # этот файл — обзор и правила
README.md
servers/inventory.yml — реестр узлов: имена, адреса, роли, локации, ssh-настройки, список сервисов. Любые ответы про «какой сервер», «где что крутится», «какой у него IP» берём оттуда.
domains.yml — реестр DNS-записей. Для каждого домена перечислены все нужные записи (A, CNAME, TXT, MX и т.п.) с указанием либо узла из inventory (server: <name> — IP подтягивается), либо буквального значения (value: ...). Состояние DNS у регистратора должно совпадать с этим файлом.
Папка servers/<name>/ содержит всё, что нужно для развёртывания этого узла. Имя папки = name в inventory.
Где что прописывать при изменениях
Добавили новый сервер:
- Запись в
servers/inventory.yml(name, host, role, env, location, tags, services). - Папка
servers/<name>/сdocker-compose.ymlи.env. - Если узлу нужен домен — добавить записи в
domains.ymlи прописать их у регистратора. - Если узел упоминается смысловой ролью (например, тут есть бэкенд для другого узла) — обновить соответствующие compose/конфиги, ссылаясь на роль, а не IP.
Добавили сервис на существующий сервер:
- Сервис в
servers/<name>/docker-compose.yml. Внешние — через traefik-метки (traefik.http.routers.<name>.*) с хостом из.env. Внутренние — только в сетиinternal. - Конфиги сервиса — в
servers/<name>/<service>/, монтировать в контейнер read-only. - Новые переменные — в
.envузла. В compose использовать${VAR}, не хардкодить. - Запись
services: [...]у узла вinventory.yml. - Если сервис публикуется наружу — DNS-запись в
domains.ymlи у регистратора.
Изменили IP / переехали:
- Только
inventory.yml(полеhost). Compose-файлы IP не содержат — там ссылки на сервисы по имени или на роли. - Проверить
domains.yml: записи со ссылкойserver: <name>подтянут новый IP автоматически — но у регистратора надо обновить вручную.
Добавили / изменили домен:
- Запись в
domains.yml: блокdomainsдля домена, нужныеrecords. Для записей, указывающих на наш узел —server: <name>, иначеvalue: <строка>. - Синхронизировать у регистратора. Состояние DNS должно совпадать с файлом.
Добавили секрет:
- В
.envузла либо как файл вservers/<name>/ssh/(или аналогичной служебной папке). - Никогда не хардкодить в compose или конфиг-файлах — только через
${VAR}или монтируемый файл.
Удалили сервис / сервер:
- Убрать запись из
inventory.yml(или изservicesузла). - Удалить соответствующий блок из compose и папку с конфигами.
Конвенции
- Адреса серверов — только в
inventory.yml. В compose и доках ссылаемся на роли (core,vpn-entry,reverse-proxy,vpn-exitи т.п.). - Сети compose:
proxyдля внешнего трафика через traefik,internalдля межсервисной коммуникации и БД. Сервис в обеих сетях — только если ему правда нужен доступ и снаружи, и к внутренним зависимостям. - Имя папки сервера =
nameв inventory, по роли, не по IP. - Любой артефакт, без которого сервер не поднимется (compose,
.env, конфиг, ключ) — лежит вservers/<name>/и коммитится в репо.