From 7f4b08f3943dbfbc2fb3a076e48342b6f5e56b24 Mon Sep 17 00:00:00 2001 From: vados-dev <192440777+vados-dev@users.noreply.github.com> Date: Thu, 16 Apr 2026 03:45:02 +0300 Subject: [PATCH] Autocommit in repo: ros.vados.ru, generated by owner: root, in 03:45:02 16.04.2026. --- html/AM-GlobalFunc.rsc | 4 +- .../01-container-nginx-certbot.rsc | 208 ++++++++++ .../nginx-certbot/02-nginx-reverse-proxy.rsc | 165 ++++++++ html/import/nginx-certbot/README.md | 365 ++++++++++++++++++ 4 files changed, 740 insertions(+), 2 deletions(-) create mode 100644 html/import/nginx-certbot/01-container-nginx-certbot.rsc create mode 100644 html/import/nginx-certbot/02-nginx-reverse-proxy.rsc create mode 100644 html/import/nginx-certbot/README.md diff --git a/html/AM-GlobalFunc.rsc b/html/AM-GlobalFunc.rsc index a79d2b326..de33682c4 100644 --- a/html/AM-GlobalFunc.rsc +++ b/html/AM-GlobalFunc.rsc @@ -17,9 +17,9 @@ :global GlobalFuncReady false; # Git commit id & info, expected configuration version -:global CommitId "main/246/7dadb71c"; +:global CommitId "main/247/016960a4"; :global CommitTAG "unknown"; -:global CommitInfo "Autocommit in repo: ros.vados.ru, generated by owner: root, in 03:25:02 16.04.2026."; +:global CommitInfo "Autocommit in repo: ros.vados.ru, generated by owner: root, in 03:45:02 16.04.2026."; # The variables are received right here. :global GlobalConfVersion 138; diff --git a/html/import/nginx-certbot/01-container-nginx-certbot.rsc b/html/import/nginx-certbot/01-container-nginx-certbot.rsc new file mode 100644 index 000000000..ec510203c --- /dev/null +++ b/html/import/nginx-certbot/01-container-nginx-certbot.rsc @@ -0,0 +1,208 @@ +############################################################ +# 01-container-nginx-certbot.rsc - Nginx & Certbot Containers +# REQUIRES: 00-config.rsc and 00-secrets.rsc must be imported first! +# REQUIRES: 08-containers.rsc must be applied first! +# +# Sets up: +# - Nginx container (pinned version) +# - Certbot container (pinned version) +# - Cloudflare DNS challenge +# - Resource limits +# - Интеграция с bridge-containers +# +# ВАЖНО: +# - Credentials хранятся в 00-secrets.rsc +# - Интегрировано с firewall_complete.rsc +# - NAT правила уже есть в 08-containers.rsc +############################################################ + +############################################################ +# CONTAINER CONFIGURATION +############################################################ + +:local NGINX_CONTAINER "nginx" +:local CERTBOT_CONTAINER "certbot" +:local CONTAINER_BRIDGE $cfgBridgeContainers +:local NGINX_IP $cfgContainerNginxIP +:local CERTBOT_IP $cfgContainerCertbotIP +:local CONTAINER_GATEWAY [:pick $cfgContainerGateway 0 [:find $cfgContainerGateway "/"]] + +# Let's Encrypt domain and email from secrets +:local DOMAIN $secLetsEncryptDomain +:local CF_EMAIL $secLetsEncryptEmail + +# Pinned versions (НЕ используем :latest) +:local NGINX_VERSION $cfgDockerNginxImage +:local CERTBOT_VERSION $cfgDockerCertbotImage + +# Resource limits +:local NGINX_MEMORY "150M" +:local CERTBOT_MEMORY "100M" + +############################################################ +# Mount points для persistent storage (на внешнем диске) +############################################################ + +# Используем пути из 00-config.rsc +:local DATA_ROOT $cfgContainerDataRoot + +# Создаём каталоги на внешнем диске +/file +make-directory ($DATA_ROOT . "/nginx-conf") +make-directory ($DATA_ROOT . "/nginx-html") +make-directory ($DATA_ROOT . "/certbot-data") + +:log info "Created mount directories on external storage: $DATA_ROOT" + +############################################################ +# Container registry configuration +############################################################ + +/container/config +set registry-url=https://registry-1.docker.io \ + tmpdir=$cfgContainerTmpDir + +############################################################ +# Nginx container +############################################################ + +# Создаём mount points с полными путями +/container/mounts +:if ([:len [find name=nginx-conf]] = 0) do={ + add name=nginx-conf src=($DATA_ROOT . "/nginx-conf") dst="/etc/nginx" +} +:if ([:len [find name=nginx-html]] = 0) do={ + add name=nginx-html src=($DATA_ROOT . "/nginx-html") dst="/usr/share/nginx/html" +} +:if ([:len [find name=certbot-certs]] = 0) do={ + add name=certbot-certs src=($DATA_ROOT . "/certbot-data") dst="/etc/letsencrypt" +} + +/container +:if ([:len [find name=$NGINX_CONTAINER]] = 0) do={ + add remote-image=$NGINX_VERSION \ + interface=$CONTAINER_BRIDGE \ + envlist="" \ + root-dir=($cfgContainerImagesRoot . "/nginx") \ + mounts=nginx-conf,nginx-html,certbot-certs \ + dns=$CONTAINER_GATEWAY \ + hostname=$NGINX_CONTAINER \ + logging=yes \ + comment="Nginx reverse proxy (pinned version)" \ + name=$NGINX_CONTAINER +} + +# Resource limits +/container +set $NGINX_CONTAINER memory-high=$NGINX_MEMORY + +:log info "Nginx container configured with resource limits" + +############################################################ +# Certbot container +############################################################ + +# Создаём mount point для Certbot (работа с теми же сертификатами) +/container/mounts +:if ([:len [find name=certbot-work]] = 0) do={ + add name=certbot-work src=($DATA_ROOT . "/certbot-data") dst="/etc/letsencrypt" +} +:if ([:len [find name=certbot-config]] = 0) do={ + add name=certbot-config src=($DATA_ROOT . "/certbot-data") dst="/certbot-data" +} + +/container +:if ([:len [find name=$CERTBOT_CONTAINER]] = 0) do={ + add remote-image=$CERTBOT_VERSION \ + interface=$CONTAINER_BRIDGE \ + envlist="" \ + root-dir=($cfgContainerImagesRoot . "/certbot") \ + mounts=certbot-work,certbot-config \ + dns=$CONTAINER_GATEWAY \ + hostname=$CERTBOT_CONTAINER \ + logging=yes \ + comment="Certbot with Cloudflare DNS (pinned version)" \ + name=$CERTBOT_CONTAINER +} + +# Resource limits +/container +set $CERTBOT_CONTAINER memory-high=$CERTBOT_MEMORY + +:log info "Certbot container configured with resource limits" + +############################################################ +# Cloudflare credentials file +############################################################ + +# ВАЖНО: Создайте файл вручную! +# После применения этого скрипта выполните: +# +# /file/edit ($DATA_ROOT . "/certbot-data/cloudflare.ini") +# +# Пример полного пути (зависит от cfgContainerDataRoot в 00-config.rsc): +# /file/edit /disk1/data/certbot-data/cloudflare.ini # если cfgContainerDataRoot="/disk1/data" +# /file/edit /usb1/data/certbot-data/cloudflare.ini # если cfgContainerDataRoot="/usb1/data" +# +# И добавьте: +# dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN_HERE +# +# Затем установите права: +# /file/set ($DATA_ROOT . "/certbot-data/cloudflare.ini") permissions=owner-read,owner-write + +:log warning ("ВАЖНО: Создайте " . $DATA_ROOT . "/certbot-data/cloudflare.ini вручную с вашим Cloudflare API token!") +:log info ("Путь для cloudflare.ini: " . $DATA_ROOT . "/certbot-data/cloudflare.ini") + +############################################################ +# Automatic certificate renewal script +############################################################ + +/system script +:if ([:len [find name=renew-letsencrypt]] = 0) do={ + add name=renew-letsencrypt \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive \ + source=" +# Renew certificates using certbot +:log info \"Starting Let's Encrypt certificate renewal\" + +:local certbotCmd \"certbot certonly --dns-cloudflare --dns-cloudflare-credentials /certbot-data/cloudflare.ini -d $DOMAIN --agree-tos -m $CF_EMAIL --non-interactive --keep-until-expiring\" + +/container/exec number=[/container/get $CERTBOT_CONTAINER number] cmd=\$certbotCmd + +# Reload nginx to apply new certificates +:delay 5s +/container/exec number=[/container/get $NGINX_CONTAINER number] cmd=\"nginx -s reload\" + +:log info \"Certificate renewal completed\" +" \ + comment="Automatic Let's Encrypt certificate renewal" +} + +:log info "Certificate renewal script created" + +############################################################ +# Scheduler для automatic renewal +############################################################ + +/system scheduler +:if ([:len [find name="letsencrypt-renew"]] = 0) do={ + add name="letsencrypt-renew" \ + interval=1d \ + start-time=03:00:00 \ + on-event=renew-letsencrypt \ + comment="Daily certificate check and renewal" +} + +:log info "Certificate renewal scheduler configured (runs daily at 03:00)" + +############################################################ +# Container start +############################################################ + +/container start $NGINX_CONTAINER +/container start $CERTBOT_CONTAINER + +:log info "Nginx and Certbot containers started" +:log info "Module nginx-certbot/01-container-nginx-certbot.rsc applied successfully" +:log info "Domain: $DOMAIN | Email: $CF_EMAIL" +:log info "Nginx IP: $NGINX_IP | Certbot IP: $CERTBOT_IP" diff --git a/html/import/nginx-certbot/02-nginx-reverse-proxy.rsc b/html/import/nginx-certbot/02-nginx-reverse-proxy.rsc new file mode 100644 index 000000000..da8e0fc84 --- /dev/null +++ b/html/import/nginx-certbot/02-nginx-reverse-proxy.rsc @@ -0,0 +1,165 @@ +############################################################ +# 02-nginx-reverse-proxy.rsc - Nginx Reverse Proxy Configuration +# REQUIRES: 00-config.rsc and 00-secrets.rsc must be imported first! +# REQUIRES: 01-container-nginx-certbot.rsc must be applied first! +# +# Создает конфигурацию nginx reverse proxy +# Интегрировано с централизованной конфигурацией +############################################################ + +############################################################ +# CONFIGURATION +############################################################ + +# Domain from secrets +:local DOMAIN $secLetsEncryptDomain + +# Service 1 (example: Grafana) +:local SERVICE1_SUBDOMAIN "grafana" +:local SERVICE1_IP "192.168.1.10" +:local SERVICE1_PORT "3000" + +# Service 2 (example: Portainer) +:local SERVICE2_SUBDOMAIN "portainer" +:local SERVICE2_IP "192.168.1.20" +:local SERVICE2_PORT "9000" + +# Service 3 (example: Home Assistant) +:local SERVICE3_SUBDOMAIN "home" +:local SERVICE3_IP "192.168.1.30" +:local SERVICE3_PORT "8123" + +# Nginx container name +:local NGINX_CONTAINER "nginx" + +############################################################ +# Nginx configuration +############################################################ + +:local nginxConfig " +# HTTP redirect to HTTPS +server { + listen 80; + server_name $SERVICE1_SUBDOMAIN.$DOMAIN $SERVICE2_SUBDOMAIN.$DOMAIN $SERVICE3_SUBDOMAIN.$DOMAIN; + return 301 https://\$host\$request_uri; +} + +# Service 1: $SERVICE1_SUBDOMAIN.$DOMAIN +server { + listen 443 ssl http2; + server_name $SERVICE1_SUBDOMAIN.$DOMAIN; + + ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem; + + # SSL security headers + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + # Security headers + add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always; + add_header X-Frame-Options \"SAMEORIGIN\" always; + add_header X-Content-Type-Options \"nosniff\" always; + add_header X-XSS-Protection \"1; mode=block\" always; + + location / { + proxy_pass http://$SERVICE1_IP:$SERVICE1_PORT; + proxy_set_header Host \$host; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto \$scheme; + + # WebSocket support + proxy_http_version 1.1; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection \"upgrade\"; + } +} + +# Service 2: $SERVICE2_SUBDOMAIN.$DOMAIN +server { + listen 443 ssl http2; + server_name $SERVICE2_SUBDOMAIN.$DOMAIN; + + ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always; + add_header X-Frame-Options \"SAMEORIGIN\" always; + add_header X-Content-Type-Options \"nosniff\" always; + add_header X-XSS-Protection \"1; mode=block\" always; + + location / { + proxy_pass http://$SERVICE2_IP:$SERVICE2_PORT; + proxy_set_header Host \$host; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto \$scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection \"upgrade\"; + } +} + +# Service 3: $SERVICE3_SUBDOMAIN.$DOMAIN +server { + listen 443 ssl http2; + server_name $SERVICE3_SUBDOMAIN.$DOMAIN; + + ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always; + add_header X-Frame-Options \"SAMEORIGIN\" always; + add_header X-Content-Type-Options \"nosniff\" always; + add_header X-XSS-Protection \"1; mode=block\" always; + + location / { + proxy_pass http://$SERVICE3_IP:$SERVICE3_PORT; + proxy_set_header Host \$host; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto \$scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection \"upgrade\"; + } +} +" + +############################################################ +# Создание конфигурационного файла +############################################################ + +/file +set nginx-conf/default.conf contents=$nginxConfig + +:log info "Nginx reverse proxy configuration created" + +############################################################ +# Копирование конфига в контейнер и reload +############################################################ + +:log info "Копирование конфига в nginx контейнер..." + +# Тест конфигурации и перезапуск nginx +:delay 2s +/container/exec number=[/container/get $NGINX_CONTAINER number] cmd="nginx -t" +:delay 1s +/container/exec number=[/container/get $NGINX_CONTAINER number] cmd="nginx -s reload" + +:log info "Nginx configuration applied and reloaded" +:log info "Module nginx-certbot/02-nginx-reverse-proxy.rsc applied successfully" +:log info "Domain: $DOMAIN" +:log info "Services: $SERVICE1_SUBDOMAIN, $SERVICE2_SUBDOMAIN, $SERVICE3_SUBDOMAIN" diff --git a/html/import/nginx-certbot/README.md b/html/import/nginx-certbot/README.md new file mode 100644 index 000000000..b6c05aa1a --- /dev/null +++ b/html/import/nginx-certbot/README.md @@ -0,0 +1,365 @@ +# Nginx + Certbot для MikroTik + +Nginx reverse proxy с автоматическими Let's Encrypt сертификатами через Cloudflare DNS challenge. + +**Улучшенная версия** - интегрирована с основным проектом MikroTik. + +--- + +## 📋 Что включено + +1. **01-container-nginx-certbot.rsc** - Основная конфигурация: + - Nginx контейнер (pinned version: nginx:1.25.3-alpine) + - Certbot контейнер (pinned version: certbot/dns-cloudflare:v2.7.4) + - Resource limits (безопасность) + - Интеграция с bridge-containers + - Автоматическое обновление сертификатов (daily) + +2. **02-nginx-reverse-proxy.rsc** - Конфигурация reverse proxy: + - HTTP → HTTPS redirect + - SSL/TLS security headers + - WebSocket support + - 3 примера сервисов (можно расширить) + +--- + +## 🔧 Отличия от старой версии + +### ✅ Исправлено: + +| Проблема | Было | Стало | +|----------|------|-------| +| Версии контейнеров | `nginx:latest` | `nginx:1.25.3-alpine` (pinned) | +| Resource limits | Отсутствовали | `memory-high=150M` для nginx | +| DNS контейнеров | `dns=$NGINX_IP` (неправильно) | `dns=10.11.0.1` (gateway) | +| Credentials | Plain text в коде | Вынесены в отдельный файл | +| NAT правила | Дублировались | Используются из firewall_complete.rsc | +| Security headers | Отсутствовали | HSTS, X-Frame-Options, CSP | + +### ⚠️ Важно: + +- **NAT правила** уже есть в `firewall_complete.rsc` (строки 283-286 и 298-301) +- **Firewall изоляция** уже настроена в `firewall_complete.rsc` (строки 175-196) +- **НЕ нужно** применять старый `nat-nginx.rsc` - он создаст дублирующие правила! + +--- + +## 🚀 Быстрый старт + +### Шаг 1: Подготовка + +```bash +# Скопировать файлы на роутер +scp nginx-certbot/*.rsc admin@192.168.1.1:/ + +# Подключиться к роутеру +ssh admin@192.168.1.1 +``` + +### Шаг 2: Настроить переменные + +Отредактируйте **01-container-nginx-certbot.rsc** (строки 14-42): + +```routeros +:local DOMAIN "your-domain.com" +:local CF_EMAIL "your-email@example.com" +``` + +Отредактируйте **02-nginx-reverse-proxy.rsc** (строки 8-24): + +```routeros +:local DOMAIN "your-domain.com" + +# Service 1 +:local SERVICE1_SUBDOMAIN "grafana" +:local SERVICE1_IP "192.168.1.10" +:local SERVICE1_PORT "3000" + +# ... и т.д. +``` + +### Шаг 3: Применить конфигурацию контейнеров + +```routeros +/import 01-container-nginx-certbot.rsc +``` + +Это создаст: +- Nginx контейнер (остановлен) +- Certbot контейнер (остановлен) +- Mount directories +- Скрипт обновления сертификатов +- Scheduler (запуск каждый день в 03:00) + +### Шаг 4: Настроить Cloudflare API + +1. Получите Cloudflare API token: + - Зайдите в [Cloudflare Dashboard](https://dash.cloudflare.com/) + - My Profile → API Tokens → Create Token + - Используйте шаблон **"Edit zone DNS"** + - Скопируйте token + +2. Создайте файл с credentials на роутере: + +```routeros +/file/edit certbot-data/cloudflare.ini +``` + +Содержимое файла: +```ini +dns_cloudflare_api_token = your_cloudflare_api_token_here +``` + +3. Установите права доступа: + +```routeros +/file/set certbot-data/cloudflare.ini permissions=owner-read,owner-write +``` + +### Шаг 5: Применить конфигурацию nginx + +```routeros +/import 02-nginx-reverse-proxy.rsc +``` + +### Шаг 6: Первое получение сертификата + +```routeros +/system script run renew-letsencrypt +``` + +Это займет 1-2 минуты. Проверьте логи: + +```routeros +/log print where message~"Certificate" +``` + +### Шаг 7: Проверка + +```routeros +# Статус контейнеров +/container/print + +# Проверить сертификаты +/container/shell certbot +ls -la /etc/letsencrypt/live/ + +# Проверить nginx +/container/shell nginx +nginx -t +``` + +Проверьте с внешнего хоста: +```bash +curl -I https://grafana.your-domain.com +``` + +--- + +## 📂 Структура файлов после применения + +``` +/ +├── nginx-root/ # Root filesystem nginx контейнера +├── certbot-root/ # Root filesystem certbot контейнера +├── nginx-conf/ # Mount: конфиги nginx +│ └── default.conf # Reverse proxy config +├── nginx-html/ # Mount: статические файлы (если нужно) +└── certbot-data/ # Mount: сертификаты и credentials + ├── cloudflare.ini # Cloudflare API token (создать вручную!) + └── live/ # Let's Encrypt сертификаты + └── your-domain.com/ + ├── fullchain.pem + └── privkey.pem +``` + +--- + +## 🔄 Автоматическое обновление сертификатов + +Настроено автоматически: + +- **Скрипт:** `/system script print where name=renew-letsencrypt` +- **Scheduler:** Запускается каждый день в 03:00 +- **Логика:** Certbot проверяет срок действия сертификата, обновляет если < 30 дней + +Ручной запуск: +```routeros +/system script run renew-letsencrypt +``` + +--- + +## 🔐 Безопасность + +### Что сделано: + +✅ **Resource limits:** +- Nginx: max 150MB RAM +- Certbot: max 100MB RAM + +✅ **Network isolation:** +- Контейнеры изолированы от LAN (firewall_complete.rsc) +- Доступ только к DNS (53) и NTP (123) +- Блокировка management портов роутера + +✅ **SSL/TLS Security:** +- TLS 1.2 и 1.3 only +- Strong ciphers +- HSTS headers +- Security headers (X-Frame-Options, CSP, etc.) + +✅ **Rate limiting:** +- Max 50 соединений с одного IP +- Max 20 новых соединений за 5 секунд +- DDoS защита (firewall_complete.rsc строки 175-196) + +✅ **Credentials:** +- Cloudflare API token в отдельном файле +- Permissions: owner-read, owner-write +- Рекомендация: использовать Vault (см. docs/AUTOMATION_ARCHITECTURE.md) + +--- + +## 🧪 Тестирование + +### Проверка конфигурации nginx: + +```routeros +/container/shell nginx +nginx -t +``` + +### Проверка сертификатов: + +```routeros +/container/shell certbot +certbot certificates +``` + +### Проверка логов nginx: + +```routeros +/container/shell nginx +tail -f /var/log/nginx/access.log +tail -f /var/log/nginx/error.log +``` + +### Проверка с внешнего хоста: + +```bash +# Проверить SSL сертификат +openssl s_client -connect grafana.your-domain.com:443 -servername grafana.your-domain.com + +# Проверить headers +curl -I https://grafana.your-domain.com + +# Проверить редирект HTTP → HTTPS +curl -I http://grafana.your-domain.com +``` + +--- + +## 🛠️ Добавление новых сервисов + +Отредактируйте **02-nginx-reverse-proxy.rsc**, добавьте новый блок: + +```routeros +# Service 4 (новый) +:local SERVICE4_SUBDOMAIN "newapp" +:local SERVICE4_IP "192.168.1.40" +:local SERVICE4_PORT "8080" +``` + +И добавьте server block в `$nginxConfig`: + +```nginx +server { + listen 443 ssl http2; + server_name $SERVICE4_SUBDOMAIN.$DOMAIN; + + ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem; + + location / { + proxy_pass http://$SERVICE4_IP:$SERVICE4_PORT; + proxy_set_header Host $host; + # ... остальные headers + } +} +``` + +Затем: +```routeros +/import 02-nginx-reverse-proxy.rsc +``` + +--- + +## 🐛 Troubleshooting + +### Контейнер не запускается: + +```routeros +/container/print +/log print where message~"container" +``` + +### Сертификат не обновляется: + +```routeros +# Проверить cloudflare.ini +/file/print where name~"cloudflare" + +# Запустить вручную с логами +/system script run renew-letsencrypt +/log print where message~"Certificate" +``` + +### Nginx показывает 502 Bad Gateway: + +```routeros +# Проверить доступность backend сервиса +/tool/flood-ping $SERVICE1_IP count=5 + +# Проверить firewall +/ip firewall filter print where comment~"containers" +``` + +### Не работает с внешнего интернета: + +```routeros +# Проверить NAT правила (должны быть из firewall_complete.rsc) +/ip firewall nat print where comment~"nginx" + +# Проверить WAN IP +/ip address print where interface=pppoe-out1 + +# Проверить DNS +nslookup grafana.your-domain.com +``` + +--- + +## 📖 Связанная документация + +- **Firewall:** См. `/firewall_complete.rsc` (NAT и изоляция контейнеров) +- **Безопасность:** См. `/docs/SECURITY_AUDIT.md` (Container security) +- **Автоматизация:** См. `/docs/AUTOMATION_ARCHITECTURE.md` (Vault для credentials) + +--- + +## ⚠️ ВАЖНО: Что НЕ нужно делать + +❌ **НЕ применяйте** старый `nat-nginx.rsc` - правила уже есть в `firewall_complete.rsc` + +❌ **НЕ используйте** `:latest` теги для контейнеров - только pinned версии + +❌ **НЕ храните** Cloudflare API token в plain text в скриптах - используйте отдельный файл + +❌ **НЕ удаляйте** firewall правила для изоляции контейнеров + +--- + +**Создано:** 10 декабря 2025 +**Версия:** 2.0 (улучшенная, интегрированная с проектом) -- 2.52.0