Единая техническая карта инфраструктуры (логистика · автобусные перевозки · продажа билетов · сдача данных в ЕГИС ОТБ). Описание того, что и как устроено сейчас: три облачных сервера, их внутреннее устройство и связи между собой.
3
сервера
24
контейнера
Ubuntu 20.04.6
ядро 5.4.0-216
Yandex Cloud
зона ru-central1
stable
compose-проект (все)
48008
SSH (все)
🗂️1. Обзор парка
Три специализированных узла. Все три — облачные VM Yandex Cloud (зона ru-central1 — отсюда «yandex» в именах хостов и DNS-домены ru-central1.internal / auto.internal), Ubuntu 20.04.6 LTS, ядро 5.4.0-216, Docker 24.0.2 + Compose v2.18.1, единое имя compose-проекта stable в каталоге /home/evrotrans/stable. На каждом — агенты Яндекс/Acronis Cyber Backup, Zabbix-agent2 и google-guest-agent. Важно: Yandex Cloud GCE-совместима (тот же гостевой агент Google, формат метаданных Metadata-Flavor: Google и группа %google-sudoers) — поэтому изнутри VM выглядит «как Google», но это именно Yandex Cloud.
Сплошные стрелки — основные потоки данных; пунктир — служебные (мониторинг). Цвет рамки = сервер: globalmailervipnet.
flowchart TB
NET(["🌐 Интернет"])
subgraph G["① GLOBAL — прод-ядро · 89.111.137.188"]
direction TB
NGINX["nginx :80 / :443"]
PHP["php8 / php5 :9000"]
DBG[("MySQL ET/PT · Mongo")]
FRONT["Nuxt-фронты monofront3 · sakai3"]
VPN["openvpn :1194"]
ADM["portainer · dozzle pma×2 · mongo-express"]
NGINX --> PHP --> DBG
NGINX --> FRONT
NGINX --> ADM
end
subgraph M["② MAILER · 31.44.10.106"]
POSTFIX["postfix + DKIM relay :25"]
end
subgraph V["③ VIPNET · tun0 7.1.39.7"]
direction TB
VSFTPD["vsftpd :48080"] --> FPROXY["ftp-proxy :21001-04 pdp · onsi · timetable · ack"]
end
RCPT(["Gmail / Yandex получатели"])
EGIS(["ЕГИС ОТБ *.import.inet.egis-otb.local:21021"])
EXT["Внешние бэкап-узлы dev.evrotrans.net · 77.222.52.97"]
ZBX(["zbx.nunkinet.ru Zabbix + Telegram-бот"])
NET -->|"HTTPS 443 / 80"| NGINX
NET -->|"OpenVPN 1194"| VPN
PHP -->|"SMTP · eth2 → 10.150.0.20:25"| POSTFIX
PHP -->|"FTP · eth1 → 10.0.0.5"| VSFTPD
G -->|"backup scp"| EXT
POSTFIX -->|"исходящая почта по MX"| RCPT
FPROXY -->|"ViPNet tun0"| EGIS
G -.->|"zabbix :10050"| ZBX
M -.-> ZBX
V -.-> ZBX
class NGINX,PHP,DBG,FRONT,VPN,ADM g1
class POSTFIX g2
class VSFTPD,FPROXY g3
class EGIS gp
class EXT,RCPT,ZBX ext
style G stroke:#4ea1ff,stroke-width:2px
style M stroke:#ffb454,stroke-width:2px
style V stroke:#56d364,stroke-width:2px
classDef g1 fill:#11202e,stroke:#4ea1ff,color:#dbe4ee
classDef g2 fill:#241a0c,stroke:#ffb454,color:#dbe4ee
classDef g3 fill:#0f2417,stroke:#56d364,color:#dbe4ee
classDef gp fill:#1d1430,stroke:#bc8cff,color:#e9def9
classDef ext fill:#12161c,stroke:#5a6675,color:#cfd8e2
Рис. 1 — Все три сервера, основные потоки (почта, ЕГИС ОТБ, бэкап) и общие службы.
🔌3. Сетевая архитектура
Узлы соединены через общие VPC-подсети Yandex Cloud. Ключевой факт: global имеет три интерфейса и присутствует одновременно в трёх сетях — это даёт ему прямой доступ к mailer (через 10.150.0.0/24) и к vipnet (через 10.0.0.0/24).
flowchart TB
subgraph VPC1["VPC 10.128.0.0/24 — УПРАВЛЕНИЕ (SSH · мониторинг · интернет)"]
direction LR
G1["global · .15 (eth0)"]
M1["mailer · .20 (eth0)"]
V1["vipnet · .5 (eth0)"]
end
subgraph VPC2["VPC 10.150.0.0/24 — СЕРВИС / ПОЧТА"]
direction LR
G2["global · .15 (eth2)"]
M2["mailer · .20 (eth1)"]
end
subgraph VPC3["VPC 10.0.0.0/24 — ДАННЫЕ"]
direction LR
G3["global · .15 (eth1)"]
V3["vipnet · .5 (eth1)"]
end
subgraph VIP["ViPNet — только vipnet"]
direction LR
VT["tun0 7.1.39.7/32"]
EGN["сети контрагентов 10.10.x · 11.0.0.0/8 · 172.16.x *.egis-otb.local"]
VT --> EGN
end
G2 ---|"SMTP 25"| M2
G3 ---|"FTP"| V3
V1 -.->|"vipnetclient"| VT
class G1,G2,G3 g1
class M1,M2 g2
class V1,V3,VT g3
class EGN gp
classDef g1 fill:#11202e,stroke:#4ea1ff,color:#dbe4ee
classDef g2 fill:#241a0c,stroke:#ffb454,color:#dbe4ee
classDef g3 fill:#0f2417,stroke:#56d364,color:#dbe4ee
classDef gp fill:#1d1430,stroke:#bc8cff,color:#e9def9
Рис. 2 — Три общих VPC-сегмента Yandex Cloud и защищённый контур ViPNet.
Монолитный Docker Compose-стек, разворачивающий всю инфраструктуру компании на одной VM: фронтенды (Nuxt/Node), PHP-бэкенды (8.1 и 5.6), три БД, VPN, набор админ-/мониторинг-панелей, систему бэкапов и десятки cron-задач. Наружу торчит только nginx (80/443) и openvpn (1194).
nginx 1.24.0-alpine, worker_processes auto, gzip on (lvl 6), keepalive_timeout 65, rate limiting не настроен. Сайт и erp3 используют динамический upstream через переменную $service, вычисляемую из поддомена (~^(?<subdomain>.+)\.evrotrans\.net).
Домен
Бэкенд
Тип
evrotrans.net / www / *.evrotrans.net / _
динамический proxy_pass http://$service
→ Node
api.evrotrans.net
php5:9000 + прокси на api3/sales
php5
api3.evrotrans.net (/web)
php8:9000
php8
sales.evrotrans.net (/web)
php8:9000 + прокси api3/sales
php8
partnerstickets.evrotrans.net (/web)
php8:9000
php8
erp.evrotrans.net / erp2.evrotrans.net
php5:9000 (legacy)
php5
erp3.evrotrans.net
динамический $service (sakai3:3000 закомм.)
→ Node
pma / pma1.evrotrans.net
phpmyadmin:80 / phpmyadminpt:80
proxy
mde.evrotrans.net
mongoexpress:8081
proxy
doz.evrotrans.net
dozzle:8080
proxy
ptr.evrotrans.net
portainer:9000
proxy
vpn.evrotrans.net
https://openvpn:943
proxy
TLS-сертификаты (certbot, 27 доменов): evrotrans.net, www, api, api3, sales, partnerstickets, p, erp, erp2, erp3, pma, pma1, mde, doz, ptr, vpn, old, test, v3, wld, sakai3, monofront3 + wildcard. Вторичная зона eprojeckt.ru (app/erp/p/trl/trlavs) — каталоги в ./web, конфиги только в .bak. ACME: /.well-known/acme-challenge/ → /var/keys/<domain>/. Статус nginx: /secret/nginx/status.
Маленькая VM (2 vCPU / 1 ГБ). Принимает почту от приложений по внутренней сети, подписывает DKIM-ключом домена evrotrans.net и отправляет наружу. Локальных ящиков нет — чистый исходящий релей. Дополнительно несёт dormant cron-оркестратор и неиспользуемый FTP.
myhostname = evrotrans.net relayhost = # прямая отправка по MX
mydestination = …localhost # локальной доставки нет
mynetworks = 127.0.0.0/8 [::1]/128 # релей только для localhost
smtpd_sasl_auth_enable = yes smtp_user = webmaster
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
smtpd_milters = inet:localhost:12301 non_smtpd_milters = inet:localhost:12301
smtp(d)_tls_security_level = may # оппортунистический TLS на snakeoil-сертификате
НЕ open-relay (релей только для localhost и SASL-аутентифицированных, логин webmaster). DKIM-ключи: postfix/domainkeys/{default.private, evrotrans.net.private, default.txt}.
Часть писем в очереди — deferred с 452-4.2.2 out of storage space (переполненные ящики получателей), встречаются битые адреса (опечатка yndex.ru).
5.3 Cron-оркестратор и бэкап-скрипты
Контейнер crontab — планировщик, который по SSH заходит обратно на свой хост (48008) и от имени admin (sudo) или user выполняет обслуживающие скрипты. Каталог host/ — общая библиотека, скопированная с web-сервера (пути /home/etrans/…), на mailer инертна (состояние dormant).
flowchart LR
CR["crontab контейнер cron_admin.sh / cron_user.sh"]
HOST["sshd :48008 (localhost)"]
DB[("stable_mysql_1 mysqldump -uroot")]
TAR["tar --lzma → openssl AES-256 (-k w7yNyNnJVx4N)"]
DST["dev.evrotrans.net:48008 77.222.52.97:8008 (etrans@)"]
CR -->|"sshpass ssh + sudo -S"| HOST
HOST --> TAR
DB --> TAR
TAR -->|"scp"| DST
class CR,HOST,TAR g2
class DB db
class DST ext
classDef g2 fill:#241a0c,stroke:#ffb454,color:#dbe4ee
classDef db fill:#0e2030,stroke:#3d7bb0,color:#dbe4ee
classDef ext fill:#12161c,stroke:#5a6675,color:#cfd8e2
Рис. 4 — Модель бэкапа на mailer (общая библиотека скриптов парка; на самом mailer dormant).
Выходной FTP-шлюз ЕвроТранса в ЕГИС ОТБ (Единая государственная информационная система обеспечения транспортной безопасности): принимает данные от операторов и проксирует FTP к серверам импорта через защищённую сеть ViPNet. Несёт графический АРМ. Это не веб-узел: нет 80/443, нет OpenVPN, нет certbot.
Параметр
Значение
ОС / ядро / uptime
Ubuntu 20.04.6 · 5.4.0-216 · 133 дня · TZ Europe/Moscow
Compose-проект
stable, базовый образ ubuntu:20.04, контейнеры подняты 2026-01-30
секретов нет — только TZ, ENV_TIMEZONE, DOCKER_CONTENT_TRUST=1
6.1 FTP-прокси (4 канала в ЕГИС ОТБ)
Контейнеры — это не FTP-серверы, а прокси протокола FTP (/usr/sbin/ftp-proxy -n -d, proxy-suite). Файлы не хранят. Запущены под User nobody / Group nogroup, в режиме network_mode:host. Конфиг монтируется :ro из ./ftp-<name>/config/.
flowchart TB
OP(["Оператор r3ddan9 / evrotrans"])
VS["vsftpd :48080 chroot $HOME · ssl=NO"]
P1["ftp-pdp :21001"]
P2["ftp-onsi :21002"]
P3["ftp-timetable :21003"]
P4["ftp-ack :21004"]
E1(["auto.pdp.import…:21021 персданные пассажиров"])
E2(["onsi.import…:21021 подсистема ОНСИ"])
E3(["timetable.import…:21021 расписания"])
E4(["ack.import…:21021 квитанции"])
OP -->|"FTP открытым текстом :48080"| VS
VS --> P1
VS --> P2
VS --> P3
VS --> P4
P1 -->|"ViPNet tun0"| E1
P2 -->|"ViPNet tun0"| E2
P3 -->|"ViPNet tun0"| E3
P4 -->|"ViPNet tun0"| E4
class VS,P1,P2,P3,P4 g3
class E1,E2,E3,E4 gp
classDef g3 fill:#0f2417,stroke:#56d364,color:#dbe4ee
classDef gp fill:#1d1430,stroke:#bc8cff,color:#e9def9
Рис. 5 — Путь данных в ЕГИС ОТБ: оператор → vsftpd → 4 ftp-proxy → ViPNet → серверы импорта.
Контейнер
Порт
Upstream (через ViPNet)
Канал
stable-ftp-pdp-1
0.0.0.0:21001
auto.pdp.import.inet.egis-otb.local:21021
Персданные пассажиров (ПДП)
stable-ftp-onsi-1
0.0.0.0:21002
onsi.import.inet.egis-otb.local:21021
Подсистема ОНСИ
stable-ftp-timetable-1
0.0.0.0:21003
timetable.import.inet.egis-otb.local:21021
Расписания
stable-ftp-ack-1
0.0.0.0:21004
ack.import.inet.egis-otb.local:21021
Квитанции/подтверждения
vsftpd (хост, :48080): local_enable=YES, anonymous_enable=NO, chroot_local_user=YES (local_root=/home/$USER/), allow_writeable_chroot=YES, ssl_enable=NO; белый список /etc/vsftpd.userlist = r3ddan9, evrotrans.
10.10.1-3.0/24 + десятки /31..24, 10.10.255.x, 11.0.0.0/8, 172.16.16/17/32.x — сети контрагентов
Передача в ЕГИС ОТБ работает только при поднятом туннелеtun0: vipnetclientdaemon → контейнеры ftp-proxy. При недоступности ViPNet прокси не достучатся до *.egis-otb.local.