ДРАФТ: Uptime Kuma в Docker + nginx + SMTP (Postfix)

Uptime Kuma — система мониторинга доступности сервисов с поддержкой уведомлений (HTTP, TCP, Ping, SMTP и др.).

Архитектура:

Internet → nginx (80/443) → Uptime Kuma (Docker:3001)
                               ↓
                            Postfix (SMTP)

sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker

sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
sudo apt install policykit-1

mkdir -p /opt/uptime-kuma/data 
cd /opt/uptime-kuma

services:
  kuma:
    image: louislam/uptime-kuma:2
    restart: always
    ports:
      - "127.0.0.1:3001:3001"
    volumes:
      - ./data:/app/data
 

sudo vim  /etc/nginx/sites-available/uptime-kuma
server {
    listen 80;
    server_name host.yourdomain.ru;
 
    location / {
        proxy_pass http://127.0.0.1:3001;
 
        proxy_http_version 1.1;
        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 Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Запускаем nginx

nginx -t
sudo ln -s /etc/nginx/sites-available/uptime-kuma /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

certbot --nginx -d your-domain.com
curl -I https://your-domain.com
systemctl status certbot.timer
sudo certbot renew --dry-run

cd /opt/uptime-kuma
docker compose up -d

Проверка:

docker compose ps
curl -I http://127.0.0.1
curl -I http://127.0.0.1:3001
 
sudo docker compose down --remove-orphans
sudo docker up -d

http://IP-сервера

Первый запуск — создание аккаунта администратора.


  1. PTR
  2. MX
  3. SPF v=spf1 ip4:123.14.11.55 -all
  4. DKIM
  5. DMARC _dmarc.domain.ru v=DMARC1; p=reject; rua=mailto:postmaster@mydomain.ru

Уведомления по SMTP не могут быть отправлены на localhost:

connection refused

В контейнере:

127.0.0.1 != хост

docker inspect uptime-kuma-kuma-1 \
  --format '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}'

Пример:

172.19.0.1

Host: 172.19.0.1
Port: 25
Secure: false
Ignore TLS: true

Проверка:

postconf inet_interfaces

Если:

inet_interfaces = loopback-only

Исправить:

postconf -e 'inet_interfaces = all'
systemctl restart postfix

docker network inspect uptime-kuma_default \
  --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'

Пример:

172.19.0.0/16

Добавить:

postconf -e 'mynetworks = 127.0.0.0/8 172.19.0.0/16'
systemctl reload postfix

Пример:

client=unknown[172.19.0.2]

Причина: - это IP контейнера (Docker bridge)


postconf -e 'header_checks = regexp:/etc/postfix/header_checks'
/^Received: from \[127\.0\.0\.1\].*172\.19\..*/ IGNORE

Применение:

systemctl reload postfix

WARNING: - нарушает RFC - ухудшает доставляемость


Причина: Docker создал папку вместо файла

Решение:

rm -rf nginx.conf
touch nginx.conf

Причины: - Postfix слушает только 127.0.0.1 - неверный IP SMTP


Добавить:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

docker compose pull
docker compose up -d

docker compose down
tar -czf kuma-backup.tar.gz data
docker compose up -d

- не публиковать порт 3001 наружу - использовать nginx + TLS - делать бэкапы - не удалять заголовки Received