Архитектура сервиса ЕвроТранс

Единая техническая карта инфраструктуры (логистика · автобусные перевозки · продажа билетов · сдача данных в ЕГИС ОТБ). Описание того, что и как устроено сейчас: три облачных сервера, их внутреннее устройство и связи между собой.

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.

① ПРОД-ЯДРО
global
vm-evrotrans-yandex-global-1749891880453
метка SERVER_EVROTRANS_PROD_MAIN
  • 8 vCPU · 7.9 ГБ RAM (swap ~3.4 ГБ занят) · диск 48 ГБ (75%)
  • 18 запущенных контейнеров + 4 отключённых
  • nginx → php8/php5 → MySQL ET/PT + Mongo · фронты Nuxt · OpenVPN
  • cron: интеграции api3, бэкапы, wget-скрейперы вокзалов/билетов
  • uptime 97 дней
89.111.137.188eth0 10.128.0.15eth1 10.0.0.15eth2 10.150.0.15
② ПОЧТА
mailer
vm-evrotrans-yandex-mailer-1750877542270
  • 2 vCPU Xeon Icelake · 964 МБ RAM (своп активен) · диск 16 ГБ (74%)
  • 3 контейнера: postfix, autoheal, crontab (dormant)
  • SMTP-релей с DKIM для evrotrans.net — исходящая почта парка
  • порт 25 только во внутренней сети 10.150.0.20
  • uptime 343 дня
31.44.10.106eth0 10.128.0.20eth1 10.150.0.20
③ ГОС-ШЛЮЗ
vipnet
vm-evrotrans-yandex-vipnet-1769183391910
  • FTP-шлюз в ЕГИС ОТБ через защищённую сеть ViPNet
  • 4 контейнера ftp-proxy (21001–21004) + vsftpd (48080)
  • графический АРМ оператора (LightDM/Xorg/VNC)
  • tun0 7.1.39.7 — туннель ViPNet
  • uptime 133 дня
eth0 10.128.0.5eth1 10.0.0.5tun0 7.1.39.7
Параметрglobalmailervipnet
РольВся бизнес-логикаИсходящая почтаГосотчётность ЕГИС ОТБ
CPU / RAM8 ядер / 7.9 ГБ2 ядра / 1 ГБнет данных
Диск48 ГБ (75%)16 ГБ (74%)нет данных
Docker-сеть172.19.0.0/16172.18.0.0/16host (docker0 DOWN)
Внешний IP89.111.137.18831.44.10.106нет (внутр. + ViPNet)
Публичные сервисы80, 443, 1194, 48008, 4808048008, 48080, 25(внутр.)48008, 48080, 21001-21004
Контейнеров18 (+4 off)34
Uptime97 дней343 дня133 дня

🗺️2. Общая карта связей

Сплошные стрелки — основные потоки данных; пунктир — служебные (мониторинг). Цвет рамки = сервер: global mailer vipnet.

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.

Интерфейсы и адреса (все узлы)

СерверИнтерфейсАдресМетрика / маршрутНазначение
globaleth010.128.0.15/24DHCPУправление, мониторинг
eth110.0.0.15/24DHCPСеть данных (→ vipnet)
eth210.150.0.15/24DHCPСервисная сеть (→ mailer SMTP)
mailereth010.128.0.20/24default metric 100Управление, внешний IP (NAT), бэкап
eth110.150.0.20/24default metric 200Только сюда проброшен Postfix :25
vipneteth010.128.0.5/24default metric 100Управление, интернет
eth110.0.0.5/24default metric 200Сеть данных (← global FTP)
tun07.1.39.7/32point-to-pointТуннель ViPNet → ЕГИС ОТБ

4. Сервер GLOBAL — производственное ядро

vm-evrotrans-yandex-global-1749891880453SERVER_EVROTRANS_PROD_MAIN

Монолитный Docker Compose-стек, разворачивающий всю инфраструктуру компании на одной VM: фронтенды (Nuxt/Node), PHP-бэкенды (8.1 и 5.6), три БД, VPN, набор админ-/мониторинг-панелей, систему бэкапов и десятки cron-задач. Наружу торчит только nginx (80/443) и openvpn (1194).

ПараметрЗначение
ОС / ядроUbuntu 20.04.6 LTS · 5.4.0-216-generic · cloud-init 24.4.1
CPU / RAM8 ядер · 7.9 ГБ (занято ≈5.0, своп занят ≈3.4 ГБ из 8)
Диск/dev/vda1 48 ГБ, занято 36 ГБ (75%); стек 11 ГБ (mysql 3.4G · web 2.6G · api3 1.3G · mongo 946M)
Load avg / uptime1.64 / 1.76 / 1.93 · 97 дней
Каталог стека/home/evrotrans/stable (compose-проект stable)
Порты наружу48008 sshd · 80/443 docker-proxy · 1194 tcp+udp openvpn · 48080 vsftpd · 10050 zabbix · 40963 Acronis grpm-sync

4.1 Docker-стек (18 запущенных контейнеров)

Все сервисы: privileged:false, no-new-privileges, apparmor=docker-default, логирование json-file 4×64 МБ. Порядок старта: БД (healthy) → PHP (healthy) → nginx. Сеть 172.19.0.0/16.

flowchart TB
  NET(["Интернет :80 :443"])
  VPNI(["Интернет :1194"])
  NGINX["nginx 1.24-alpine
:80 / :443 · .5"] CB["certbot .15
(TLS Let's Encrypt)"] BA["basicauth .3"] PHP8["php8 · 8.1.17 · .19
OPcache"] PHP5["php5 · 5.6.31 (EOL) · .18"] FR["Nuxt-фронты
monofront3-site .7
-personal .8 · sakai3 .6"] ADM["Админки
portainer .10 :9000
dozzle .4 :8080
mongo-express .11 :8081
phpMyAdmin ET/PT .17/.16"] OVPN["openvpn .14
:1194 / :943 · NET_ADMIN"] MY[("mysql ET
mariadb 10.8.3 · .13")] MYPT[("mysqlpt PT
mariadb 10.8.3 · .12")] MO[("mongo 4.4.30
:27017 · .9")] CRON["crontab (host-сеть)
cron · php-cli · wget-скрейперы"] AH["autoheal .2
рестарт unhealthy"] NET --> NGINX VPNI --> OVPN NGINX -->|"FastCGI :9000"| PHP8 NGINX -->|"FastCGI :9000"| PHP5 NGINX -->|"proxy :3000"| FR NGINX -->|"proxy"| ADM NGINX -.->|"TLS"| CB NGINX -.->|"htpasswd"| BA PHP8 --> MY PHP8 --> MYPT PHP8 --> MO PHP5 --> MY CRON -.->|"SSH localhost 48008"| NGINX AH -.->|"docker.sock"| NGINX class NGINX,CB,BA,PHP8,PHP5,FR,ADM,OVPN,CRON,AH g1 class MY,MYPT,MO db classDef g1 fill:#11202e,stroke:#4ea1ff,color:#dbe4ee classDef db fill:#0e2030,stroke:#3d7bb0,color:#dbe4ee
Рис. 3 — Внутренняя структура стека global: вход nginx → бэкенды/фронты/админки → три БД.
КонтейнерОбраз : тегIPCPU / RAMСтатус · HC
stable-nginx-1nginx:1.24.0-alpine.52.9% · 44 МБhealthy · nginx -t
stable-php8-1ddan9/php8 (8.1.17).19231% · 313 МБhealthy · php -v
stable-php5-1ddan9/php5 (5.6.31).180% · 71 МБhealthy
stable-mysql-1mariadb:10.8.3.135.7% · 2.34/4 ГБhealthy · 3 рестарта
stable-mysqlpt-1mariadb:10.8.3.120% · 17/2048 МБhealthy
stable-mongo-1mongo:4.4.30.90.3% · 458 МБ:27017
stable-monofront3-main-site-1build · pm2-runtime.71.7% · 395/512 МБhealthy :3000
stable-monofront3-main-personal-1build · pm2-runtime.81.5% · 242/512 МБhealthy :3001
stable-sakai3-1build · node .output.60% · 79 МБhealthy (SakaiERP)
stable-openvpn-1ddan9/openvpn-asu:2.14.1.140.1% · 60 МБNET_ADMIN · :1194/943
stable-portainer-1portainer:1.24.1-alpine.100% · 13 МБdocker.sock rw
stable-dozzle-1amir20/dozzle:v8.14.8.45.3% · 55 МБhealthy · docker.sock ro
stable-mongoexpress-1mongo-express:1.0.2.110% · 27 МБ:8081 basicauth
stable-phpmyadmin-1phpmyadmin:5.1.170% · 79 МБPMA_HOST=ET
stable-phpmyadminpt-1phpmyadmin:5.1.160% · 27 МБPMA_HOST=PT
stable-certbot-1ddan9/certbot.150% · 4 МБcertbot renew; tail -f
stable-basicauth-1ddan9/basicauth.30% · 1 МБtail -f /dev/null
stable-autoheal-1willfarrell/autoheal:1.2.0.20% · 12 МБhealthy · docker.sock rw
stable-crontab-1ddan9/crontabhost16 МБcrond -f -l 0

replicas:0 — собраны, но выключены   postfix (catatnight/postfix), erp3, evro3, frontv3. Доп. capability: php5/php8 — cap_add: SYS_PTRACE; openvpn — NET_ADMIN + sysctl ip_forward=1.

4.2 nginx — домены и маршрутизация

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.netphp5:9000 + прокси на api3/salesphp5
api3.evrotrans.net (/web)php8:9000php8
sales.evrotrans.net (/web)php8:9000 + прокси api3/salesphp8
partnerstickets.evrotrans.net (/web)php8:9000php8
erp.evrotrans.net / erp2.evrotrans.netphp5:9000 (legacy)php5
erp3.evrotrans.netдинамический $service (sakai3:3000 закомм.)→ Node
pma / pma1.evrotrans.netphpmyadmin:80 / phpmyadminpt:80proxy
mde.evrotrans.netmongoexpress:8081proxy
doz.evrotrans.netdozzle:8080proxy
ptr.evrotrans.netportainer:9000proxy
vpn.evrotrans.nethttps://openvpn:943proxy

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.

4.3 Бэкенды, БД, фронты

PHP-FPM (порт 9000)

СервисВерсияНазначение · модули
php8PHP 8.1.17 NTS (Mar 2023), OPcache 8.1.17Основной. mongodb, imagick, intl, gd, mysqli/pdo_mysql, pgsql, ldap, soap, snmp, mcrypt, bcmath, gmp, zip, xsl, imap…
php5PHP 5.6.31 (Jul 2017, EOL)Legacy для api/erp/erp2

Общие тома кода (в php5, php8 и nginx): ./api3→/var/api3, ./pti3→/var/pti3, ./sales3→/var/sales3, ./web→/var/www. Таймаут FPM PHP_FPM_REQUEST_TERMINATE_TIMEOUT=300.

Базы данных

СервисОбразКонтурЛимитENV-префикс · данные
mysqlmariadb:10.8.3ET (основной)4 ГБENV_MYSQL_ET_* · ./mysql/database
mysqlptmariadb:10.8.3PT2 ГБENV_MYSQL_ETPT_* · ./mysqlpt/database
mongomongo:4.4.30NoSQL (php8)ENV_MONGO_* · ./mongo/database :27017

Фронтенды (Node/Nuxt, pm2)

СервисСтатусНазначение
monofront3-main-sitehealthy (512М)Публичный сайт (монорепо apps/main-site, pm2-runtime)
monofront3-main-personalhealthy (512М)Личный кабинет (apps/main-personal)
sakai3healthyERP-фронт SakaiERP (node .output/server)
erp3 / evro3 / frontv3replicas:0Старые фронты (собраны, выключены)

4.4 Cron-задачи (./crontab/config/root)

Запуск через обёртки cron_admin.sh (от r3ddan9) и cron_user.sh (от evrotrans), которые по SSH ходят на localhost:48008.

ГруппаРасписание · задача
Бэкапы0 6 1,10,20 config · 58 * * * * database (ежечасно) · 0 6 1,7,14,21,28 web
Очистка30 * * * * cleaner database · 0 5 * * 6 logs cleaner · config/web по числам
Стек20 2 7 * * mysql_courtship · 0 1 * * 6 certbot renew · 35 3 * * 6 рестарт nginx
PHP CLI (api3)* * * * * api3_1min (каждую минуту) · */3 3min · */30 30min · 45 4 * * 1 1w
WGET apix_api-evrotrans-{2,10,20}min · x_api3-evrotrans-{sms-5,sms-20,telegram-20,actions-5,actions-30}
WGET билетыx_partners-tickets-evrotrans-4am · x_partners-tickets-rosbilet-{2min,10min,4am}
WGET ведомостиx_vedomosti-avgust-7min · x_vedomosti-kpasru-{10min,1hour}
WGET вокзалыartmark-mosmetro {4min..3hour} · melitopol-10min · region-bilet-{5,10} · rostov-{5,10,30,60} · probilets-{2,5,10,15min,1hour}

4.5 Интеграции (переменные .env)

ИнтеграцияПеременные / адрес
Почта (→ mailer)MAIL_HOST=10.150.0.20, MAIL_PORT=25, MAIL_ENCRYPTION=null; ENV_POSTFIX_{USERNAME,PASSWORD,MAILDOMAIN}
Минтранс FTP (→ vipnet/ЕГИС ОТБ)ENV_PHP8_MINTRANS_FTP_{USERNAME,PASSWORD} + по каналам {PDP,ONSI,MR,ACT}_{URL,PORT}
JWTENV_PHP8_JWT_ERP_{KEY,SALT}, ENV_PHP8_JWT_SITE_{KEY,SALT}
Telegram / SMSENV_PHP8_TG_BOT_KEY, ENV_PHP8_SMS_API_KEY
GitHub (деплой)ENV_GITHUB_TOKEN + deploy-ключ root@7cb276780667 в authorized_keys
Бэкап-серверENV_BACKUP_SERVER_{ADDRESS,PORT,USER,PASSWORD}
ШифрованиеENV_ENCRYPTION_PASSWORD, ENV_ENCRYPTION_PASSWORD_SELF

Приватные ключи на диске (global)

5. Сервер MAILER — почтовый релей

vm-evrotrans-yandex-mailer-1750877542270mail.evrotrans.net · 31.44.10.106

Маленькая VM (2 vCPU / 1 ГБ). Принимает почту от приложений по внутренней сети, подписывает DKIM-ключом домена evrotrans.net и отправляет наружу. Локальных ящиков нет — чистый исходящий релей. Дополнительно несёт dormant cron-оркестратор и неиспользуемый FTP.

ПараметрЗначение
ОС / ядроUbuntu 20.04.6 · 5.4.0-216 · uptime 343 дня
CPU / RAM2 vCPU Xeon Icelake · 964 МБ (≈81 МБ free, своп активен)
Свопzram 1.5 ГБ (zram0+zram1) + /swapfile 1 ГБ
Диск16 ГБ, занято 74%; крупное: journald 1.2 ГБ, Acronis ~3.7 ГБ, один лог Acronis 152 МБ
Сетьeth0 10.128.0.20 · eth1 10.150.0.20 · bridge 172.18.0.0/16 · DNS ru-central1.internal
КонтейнерОбразОсобенности
stable-postfix-1catatnight/postfix (2.11.0)expose 25/451/465/587; наружу только 10.150.0.20:25; bridge .3; OpenDKIM milter localhost:12301
stable-autoheal-1willfarrell/autoheal:1.2.0монтирует /var/run/docker.sock:rw; перезапуск unhealthy (интервал 60с)
stable-crontab-1ddan9/crontabnetwork_mode:host; dormant (config пуст, лог = спам wakeup)

5.1 Postfix (main.cf)

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}.

5.2 Доставляемость (DKIM / SPF / DMARC / PTR / MX)

Сервер реально отправляет почту от webmaster@evrotrans.net (живая рассылка на Gmail/Yandex).

МеханизмDNS-значениеФакт
DKIM default._domainkeyv=DKIM1; k=rsa; p=MIGf…LbwIDAQABсовпадает с локальным ключом
SPFv=spf1 ip4:89.169.159.46 ip4:31.44.10.106 ip4:77.222.52.97 ip4:185.129.100.112 ip4:109.94.209.116 a mx include:spf.mail.ru ~allIP сервера в списке (5 IP парка)
PTR 31.44.10.106evrotrans.netсовпадает с HELO
DMARCv=DMARC1; p=none; sp=none; rua/ruf=noreply@evrotrans.netp=none (мониторинг)
MX10 emx.mail.ru · 20/30 beget · 40 evrotrans.net · 50 mail.evrotrans.netвходящая на mail.ru/beget

Часть писем в очереди — 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).

6. Сервер VIPNET — шлюз в ЕГИС ОТБ

vm-evrotrans-yandex-vipnet-1769183391910tun0 7.1.39.7

Выходной FTP-шлюз ЕвроТранса в ЕГИС ОТБ (Единая государственная информационная система обеспечения транспортной безопасности): принимает данные от операторов и проксирует FTP к серверам импорта через защищённую сеть ViPNet. Несёт графический АРМ. Это не веб-узел: нет 80/443, нет OpenVPN, нет certbot.

ПараметрЗначение
ОС / ядро / uptimeUbuntu 20.04.6 · 5.4.0-216 · 133 дня · TZ Europe/Moscow
Compose-проектstable, базовый образ ubuntu:20.04, контейнеры подняты 2026-01-30
Порты наружу48008 ssh · 48080 vsftpd · 21001-21004 ftp-proxy · 10050 zabbix · 41765 Acronis · 5353 avahi · 41034/55781 vipnetclient
.envсекретов нет — только 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-10.0.0.0:21001auto.pdp.import.inet.egis-otb.local:21021Персданные пассажиров (ПДП)
stable-ftp-onsi-10.0.0.0:21002onsi.import.inet.egis-otb.local:21021Подсистема ОНСИ
stable-ftp-timetable-10.0.0.0:21003timetable.import.inet.egis-otb.local:21021Расписания
stable-ftp-ack-10.0.0.0:21004ack.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.

6.2 ViPNet (криптозащита)

ЭлементЗначение
Клиентvipnetclient / vipnetclientdaemon; timer vipnetclientdaemon1002.timer (UID 1002 = evrotrans), каждую минуту
Туннельtun0 7.1.39.7/32; служебные UDP 41034, 55781; DNS туннеля 7.1.39.7:53
Каталог/home/evrotrans/.vipnet/ — владелец root; подкаталоги data/etc/mftp/var/tmp = drwx------ root
MFTPподсистема mftp/ — защищённый файловый/почтовый транспорт ViPNet
Файлыexport.db (49 КБ, rw-r--r--) — справочник узлов; for_rand.key — инициализация ГПСЧ ViPNet CSP
Маршруты туннеля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.

6.3 АРМ / десктоп и эксплуатация

КомпонентСостояние
LightDM / Xorgлокальная консоль, greeter активен (seat0, UID 125)
TigerVNCне запущен сейчас; по логам слушал localhost:5903 (дисплей :3), пароль задан, ключ /home/evrotrans/.vnc/…SrvKey.pem; последняя активность 23 января
CUPS / Avahicupsd только localhost:631; avahi mDNS 5353/38317/39398
Десктоп-демоныcolord, upower, switcheroo-control, rtkit, udisks2, ModemManager, wpa_supplicant
Acronis Cyber Protectmms (43234/9850/24100-24102), active-protection (6109), aakore (35375), adp-agent (9772), task-manager (33159), grpm-sync (41765)

🔀7. Межсерверные потоки данных

7.1 📧 Почта: GLOBAL → MAILER → внешний мир

flowchart LR
  PHP["php8 (GLOBAL)
MAIL_HOST=10.150.0.20"] PF["postfix (MAILER)
OpenDKIM milter :12301 · :25"] MX(["Gmail / Yandex
почтовые серверы MX"]) PHP -->|"SMTP+SASL · 10.150.0.15 → 10.150.0.20:25"| PF PF -->|"подпись DKIM evrotrans.net → MX"| MX class PHP g1 class PF g2 class MX ext classDef g1 fill:#11202e,stroke:#4ea1ff,color:#dbe4ee classDef g2 fill:#241a0c,stroke:#ffb454,color:#dbe4ee classDef ext fill:#12161c,stroke:#5a6675,color:#cfd8e2
Рис. 6 — Общий сервисный VPC 10.150.0.0/24; на global свой postfix выключен, вся почта идёт через mailer.

7.2 🚌 Госотчётность: GLOBAL → VIPNET → ЕГИС ОТБ

flowchart LR
  G["php8 (GLOBAL)
MINTRANS_FTP_{PDP,ONSI,MR,ACT}"] VF["vsftpd :48080
(VIPNET)"] FP["ftp-proxy :21001-04"] EG(["ЕГИС ОТБ
*.import.inet.egis-otb.local:21021"]) G -->|"FTP · 10.0.0.15 → 10.0.0.5"| VF VF --> FP FP -->|"ViPNet tun0 7.1.39.7"| EG class G g1 class VF,FP g3 class EG gp classDef g1 fill:#11202e,stroke:#4ea1ff,color:#dbe4ee classDef g3 fill:#0f2417,stroke:#56d364,color:#dbe4ee classDef gp fill:#1d1430,stroke:#bc8cff,color:#e9def9
Рис. 7 — global и vipnet имеют общий сегмент 10.0.0.0/24; vipnet — единственный узел с доступом в ViPNet.

7.3 💾 Резервное копирование (два контура)

flowchart TB
  G1["GLOBAL"]
  M1["MAILER"]
  V1["VIPNET"]
  AC(["Acronis / Yandex Cyber Backup
облако 84.47.172.135:7771"]) SC["скрипты host/
tar+lzma → AES-256 → scp"] DST(["dev.evrotrans.net · 77.222.52.97"]) G1 -->|"Контур A: агент"| AC M1 -->|"Контур A: агент"| AC V1 -->|"Контур A: агент"| AC G1 -->|"Контур B: скрипты"| SC SC --> DST class G1 g1 class M1,SC g2 class V1 g3 class AC,DST ext 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 ext fill:#12161c,stroke:#5a6675,color:#cfd8e2
Рис. 8 — Облачный бэкап-агент на всех узлах + самописный скриптовый контур на внешние хосты.

7.4 📊 Мониторинг (внешний контур nunkinet.ru)

flowchart TB
  G1["GLOBAL"]
  M1["MAILER"]
  V1["VIPNET"]
  Z(["zbx.nunkinet.ru
Zabbix-сервер"]) ST(["status.nunkinet.ru
статус-страница"]) TG(["Telegram
@evrotrans_alert_bot"]) G1 -->|"zabbix-agent2 :10050"| Z M1 -->|"zabbix-agent2 :10050"| Z V1 -->|"zabbix-agent2 :10050"| Z Z --> ST Z --> TG class G1 g1 class M1 g2 class V1 g3 class Z,ST,TG ext 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 ext fill:#12161c,stroke:#5a6675,color:#cfd8e2
Рис. 9 — Все три агента отчитываются центральному Zabbix; алерты уходят в Telegram.

🔑8. Единая модель доступа

Все три узла построены по одному шаблону (общий cloud-init / golden image Yandex Cloud).

Элементglobalmailervipnet
SSH порт480084800848008
SSH-аутентификациятолько ключи, root запрещёнтолько ключи, root запрещёнтолько ключи, root запрещён
AllowUsersr3ddan9 evrotransr3ddan9 evrotransr3ddan9 evrotrans
SSH-ключодин и тот же danil@IdeaPad-3-14ALC6 во всех аккаунтах всех серверов (+ deploy-ключ root@7cb276780667 на global)
y4tsun0v (UID 1000)NOPASSWD:ALL (orphan)NOPASSWD:ALL (orphan)NOPASSWD:ALL (orphan)
r3ddan9 (UID 1001)sudo + dockersudo + dockersudo + docker
evrotrans (UID 1002)dockerdockerdocker (владелец ViPNet/VNC)
группа dockerr3ddan9, evrotransr3ddan9, evrotrans, zabbixr3ddan9, evrotrans
FTP vsftpd:48080 (исп.):48080 (не исп.):48080 (исп.)
cloud-init источникметаданные Yandex Cloud: ssh-keys = danil@IdeaPad; user-data прописывает y4tsun0v NOPASSWD; %google-sudoers NOPASSWD; OS Login выключен
политика паролейPASS_MAX_DAYS 99999 (бессрочные), PASS_MIN_DAYS 0, PASS_WARN_AGE 7

📇9. Сводные реестры

9.1 Все домены

ДоменГде обслуживаетсяНазначение
evrotrans.net + поддоменыglobal (nginx)web/API/ERP/продажи/билеты/админки
mail.evrotrans.netmailerимя почтового релея (MX 50)
dev.evrotrans.netвнешнийбэкап-узел (:48008)
eprojeckt.ruglobal (web, .bak)вторичный домен
nunkinet.ru (zbx., status.)внешниймониторинг / статус-страница
*.import.inet.egis-otb.localчерез ViPNet (vipnet)ЕГИС ОТБ — серверы импорта

9.2 Карта портов (наружу)

Портglobalmailervipnet
48008SSHSSHSSH
48080vsftpdvsftpd (idle)vsftpd
80 / 443nginx
1194 tcp+udpopenvpn
25postfix (10.150.0.20)
21001-21004ftp-proxy
10050zabbixzabbixzabbix
Acronis grpm-sync409633784541765

9.3 Реестр учётных данных (как задано сейчас)

Чувствительные данные. Приведены значения, найденные в конфигах/скриптах при аудите собственной инфраструктуры.
НазначениеЛогинЗначение / расположениеУзел
Системный admin / sudor3ddan9xe3LLhaPFWfsgzoc (ENV_SERVER_ADMIN_PASSWORD)mailer .env
Системный user / FTPevrotransb3dYoqkHJYtfd9Xk (ENV_SERVER_USER_PASSWORD)mailer .env
SMTP-релейwebmaster@evrotrans.netV9MbTVH7… (ENV_POSTFIX_PASSWORD)mailer .env
Бэкап-серверevrotransUoXR9Jca… (ENV_BACKUP_SERVER_PASSWORD) → dev.evrotrans.netmailer .env
Шифрование бэкаповw7yNyNnJVx4N (в .env и захардкожен в host/*.sh)mailer
MySQL root (бэкап-дамп)rootvsyvzoajoa (в cron_home_backuper_database.sh)mailer host/
SSH к соседнему серверуetrans@77.222.52.97:8008V2LaYJMAc0 (в cron_backup_catcher_config.sh)mailer host/
MySQL (мониторинг)zabbixkQUmfTKERn-Az4wMezp8L-XxXHNmneHV_общее
Zabbix webAdmin → zbx.nunkinet.ruvnM72bLYYJ-XZQJUe6NJd-3QnQgXipuA_общее
Telegram-бот ET Monitoring@evrotrans_alert_bot8980383742:AAEJvkXpsUj4g_Cuqq_xblAaL7eXoCSM01c_общее
status.nunkinet.ruadmin@nunkinet.ruT7nR3vK9mP2xW8qL5cD1hF6y_общее
GitHub deploy-токенENV_GITHUB_TOKEN (на global реальный; в mailer .env — плейсхолдер ghp_hash)global / mailer

9.4 Инвентарь контейнеров (все узлы)

УзелКонтейнеры
globalnginx, php8, php5, mysql, mysqlpt, mongo, monofront3-main-site, monofront3-main-personal, sakai3, openvpn, portainer, dozzle, mongoexpress, phpmyadmin, phpmyadminpt, certbot, basicauth, autoheal, crontab(host); off: postfix, erp3, evro3, frontv3
mailerpostfix, autoheal, crontab(host)
vipnetftp-pdp, ftp-onsi, ftp-timetable, ftp-ack (все network_mode:host)