# Personal Infrastructure Репозиторий моей личной инфраструктуры. Всё разворачивается через Docker (предпочтительный метод), конфиги хранятся в этом репо. ## Серверы | IP | Локация | Роль | |---|---|---| | `111.88.253.112` | Yandex Cloud | Основной сервер — все основные сервисы (n8n, gitea, traefik, portainer, postgres, redis, xray, mtg) | | `62.84.114.137` | Yandex Cloud | Входная нода VPN (3x-ui) | | `94.247.214.20` | Нидерланды | Реверс-прокси для n8n (принимает SSH-туннель с основного сервера) | | `94.247.214.112` | Нидерланды | Выходная нода VPN (3x-ui) | ## Структура репозитория Всё, что нужно для развёртывания, хранится в этом репо. Под каждый сервер — отдельная папка верхнего уровня со всеми его конфигами, compose-файлами, артефактами и т.п. | Папка | Сервер | Назначение | |---|---|---| | `docker/` | `111.88.253.112` | Основной сервер (текущее содержимое) | | _tbd_ | `62.84.114.137` | Входная нода VPN | | _tbd_ | `94.247.214.20` | NL реверс-прокси для n8n | | _tbd_ | `94.247.214.112` | Выходная нода VPN | Папки для остальных серверов добавим по мере того, как будем переносить туда конфиги. Имена папок — по роли сервера (например, `vpn-entry/`, `nl-proxy/`, `vpn-exit/`), не по IP. Правило: если сервис где-то крутится — его конфиг должен лежать в папке соответствующего сервера в этом репо. Никаких «живёт только на сервере» артефактов. ## Сервисы основного сервера (`docker/docker-compose.yml`) Развёрнуты на `111.88.253.112`: - **traefik** — реверс-прокси + Let's Encrypt, слушает 80/443, маршрутизирует по Host-меткам. - **postgres** (16-alpine) — общая БД для n8n и gitea. - **redis** (7-alpine) — кэш и очередь Bull для n8n. - **n8n** — автоматизация. HTTP(S)_PROXY через `xray` для обхода блокировок. Публикуется по `${N8N_HOST}` через traefik, а также пробрасывается SSH-туннелем (`tunnel` сервис) на `94.247.214.20:5678` для внешнего доступа через NL-реверс-прокси. - **tunnel** (autossh) — обратный SSH-туннель `-R` на `94.247.214.20`, пользователь `tunnel`, ключ в `./ssh/tunnel_key`. - **xray** — исходящий прокси для n8n (порт 8080 во внутренней сети). - **gitea** — git-хостинг, БД в общем postgres (`gitea`/`gitea`), SSH на хосте проброшен на `222`. - **portainer** — UI для управления docker. - **mtg** — Telegram MTProto-прокси с fake TLS, проксируется через traefik TCP по SNI `${MTG_FAKE_TLS_HOST}`. Сети: `proxy` (внешний трафик через traefik) и `internal` (между сервисами и БД). ## VPN Входная (`62.84.114.137`) и выходная (`94.247.214.112`) ноды — оба на **3x-ui**. На основном сервере отдельно крутится **xray** как исходящий прокси для n8n и **mtg** как Telegram-прокси. ## Конфиги в репо - `docker/docker-compose.yml` — основной compose. - `docker/.env` — переменные (`*_HOST`, пароли, `N8N_ENCRYPTION_KEY`, `ACME_EMAIL`, `TIMEZONE`). Не коммитить секреты. - `docker/xray/config.json` — конфиг xray-клиента. - `docker/mtg/config.toml` — конфиг mtg. - `docker/ssh/tunnel_key` — приватный ключ для autossh-туннеля (не в git). ## Конвенции - Новые сервисы добавляем в `docker/docker-compose.yml`, публикуем через traefik с метками `traefik.http.routers..*` и хостом из `.env`. - Внутренние сервисы — только в сети `internal`, публичные — в `proxy` (или в обеих, если нужен доступ к БД). - Секреты — через `.env`, не хардкодить в compose.