💜 Поддержать разработку
TRC-20 USDT — если помог, можно немного занести
TFEu63dmxdHyXZ4CnASydr7cvmLtkdQqQq
TRC-20
VPN INFRA · MONITORING

Централизованный сбор логов
с VPN-нод в S3 + Telegram

Ежедневная автоматическая загрузка xray-логов со всех нод в S3-хранилище, парсинг ошибок и красивый отчёт в Telegram. Полная инструкция.

Время ~30 минут
Нод от 1 до 100+
OS Debian 12+ / Ubuntu 22+
КАК ЭТО РАБОТАЕТ

Архитектура

Каждая нода ежедневно загружает свежие access.log и error.log от remnanode в S3-bucket. Раз в день collector проходит по bucket'у, формирует отчёт и шлёт в Telegram. Все логи остаются в S3 для расследований.

N VPN нод remnanode 📦 access.log.1.gz 📦 error.log.1.gz log-upload.sh systemd timer 01:00 UTC ↓ mc cp ☁ S3 bucket Timeweb / Selectel / etc. 2026/MM/DD/{node}__{ip}/ Collector 1 ядро · 1 ГБ log-report.py обходит bucket парсит ошибки сравнивает с inventory ↓ Telegram bot 06:00 UTC caption + .gz файл
ПОДГОТОВКА

Что нужно

Без баз данных и Docker. Полностью на стандартных инструментах Linux.

remnanode сам ротирует access.log → access.log.1.gz ежедневно. Мы это используем — берём готовые сжатые файлы, ничего не пережимаем.
ШАГ 1 · ХРАНИЛИЩЕ

S3 bucket в Timeweb

Можно использовать любого S3-совместимого провайдера. Я покажу на Timeweb (РФ-friendly, без блокировок).

1.1

Создать бакет

Зайти в Timeweb Cloud → Хранилище S3Создать бакет:

  • Регион: Санкт-Петербург
  • Класс хранения: Холодный (логи читаются редко)
  • Тип: Приватный
  • Имя бакета: своё (например vpn-logs)

После создания у бакета сразу есть встроенные S3-ключи (Access Key + Secret Key) — найти их в свойствах созданного бакета.

📸
[ скриншот: страница создания бакета ]
img/timeweb-create-bucket.png
ЧТО ЗАПИСАТЬ
S3 endpoint:  https://s3.twcstorage.ru
S3 bucket:    YOUR_BUCKET_NAME
Access Key:   YOUR_ACCESS_KEY
Secret Key:   YOUR_SECRET_KEY
ШАГ 2 · TELEGRAM

Telegram-бот

Нужны две вещи: токен бота и твой Telegram ID куда слать отчёты.

2.1

Создать бота + узнать свой Telegram ID

Через @BotFather создай бота — получишь токен. Через @userinfobot узнай свой Chat ID.

2.2

Запустить бота

Найди своего бота по username в Telegram → отправь ему /start. Без этого бот не сможет тебе писать.

ЧТО ЗАПИСАТЬ
Bot token:    YOUR_BOT_TOKEN
Chat ID:      YOUR_CHAT_ID
ШАГ 3 · COLLECTOR СЕРВЕР

Установка collector

Любой VPS с Debian 12+ / Ubuntu 22+. Желательно не в РФ (чтобы избежать блокировок Telegram API). Финский / эстонский — идеально.

3.1

Подключиться и запустить установщик

SSH под root на collector-сервер и одной командой:

root@collectorcopy
curl -fsSL https://logs.killu.net/install-collector.sh | bash

Скрипт спросит твои значения и сам всё настроит:

  • S3 endpoint, bucket, access/secret keys
  • Telegram bot token + chat_id
  • Установит fail2ban, UFW, Python с зависимостями, MinIO client
  • Создаст systemd timer на ежедневный отчёт в 06:00 UTC
  • Сделает тестовое сообщение в Telegram (проверит что всё работает)
3.2

Настроить inventory (список нод)

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

nano /etc/log-collector/inventory.yamlcopy
nodes:
  # country / name / ip / role
  - { country: DE, name: de-1,    ip: 91.92.34.5,       role: vpn }
  - { country: DE, name: de-2,    ip: 94.26.90.182,     role: vpn }
  - { country: NL, name: nl-1,    ip: 151.240.151.122,  role: vpn }
  # ...добавь все свои ноды

Это нужно чтобы collector знал ожидаемый список нод и мог сравнить «кто загрузился / кто нет».

ПРОВЕРКА
systemctl status log-report.timer
journalctl -u log-report -n 50

→ в Telegram придёт тестовый отчёт
ШАГ 4 · УСТАНОВКА НА НОДЫ

Uploader на каждую VPN-ноду

Запускается на каждой ноде где стоит remnanode. После установки нода каждый день в 01:00 UTC отправляет вчерашние логи в твой S3.

4.1

Запустить на каждой ноде

SSH под root на ноду → одной командой:

root@vpn-nodecopy
curl -fsSL https://logs.killu.net/install-uploader.sh | bash -s \
    --bucket=YOUR_BUCKET_ID \
    --endpoint=https://s3.twcstorage.ru \
    --access=YOUR_ACCESS_KEY \
    --secret=YOUR_SECRET_KEY \
    --node-name=de-1

Внимание: node-name — это уникальное имя ноды (например de-1, nl-routing) — оно используется в пути S3 ({node-name}__{ip}/). Должно совпадать с тем что ты прописал в inventory.yaml на collector'е.

4.2

Что делает скрипт

  • Устанавливает zstd, gzip, curl, mc (MinIO client)
  • Создаёт /etc/log-upload/secrets.env с твоими S3-ключами (chmod 600)
  • Кладёт /usr/local/sbin/log-upload.sh
  • Создаёт systemd timer на ежедневный запуск в 01:00 UTC (с random delay 10 мин)
  • Запускает тестовый прогон

Скрипт не трогает:

  • xray / remnanode — не перезапускается
  • файлы /var/log/remnanode/*.log — не удаляет, не модифицирует
  • встроенную ротацию remnanode (она сама делает .log.1.gz каждые сутки)
4.3

Массовая раскатка

Для быстрой установки на 20+ нод используй bash-скрипт rollout.sh.example — заполни массив NODES и запусти.

ШАГ 5 · ПРОВЕРКА

Проверить что всё работает

5.1

На ноде

root@vpn-nodecopy
# статус таймера
systemctl status log-upload.timer

# ручной тестовый запуск
/usr/local/sbin/log-upload.sh

# лог скрипта
tail -30 /var/log/log-upload.log

В /var/log/log-upload.log должны быть строки:

[2026-05-21T01:00:12Z] ═══ START upload for de-1@91.92.34.5 ═══
[2026-05-21T01:00:13Z]   picked /var/log/remnanode/access.log.1.gz (already gz)
[2026-05-21T01:00:14Z]   uploaded → 2026/05/20/de-1__91.92.34.5/xray-access.log.gz
[2026-05-21T01:00:15Z]   uploaded → 2026/05/20/de-1__91.92.34.5/_meta.json
[2026-05-21T01:00:15Z] ═══ DONE ok=5 fail=0 ═══
5.2

На collector'е

root@collectorcopy
# посмотреть S3
mc ls -r tw/YOUR_BUCKET/

# ручной отчёт (придёт в Telegram)
/usr/local/bin/log-report.py
5.3

Через web-консоль Timeweb

Открой бакет в web-UI Timeweb. Должна быть структура:

bucket structure
2026/
└── 05/
    └── 20/
        ├── de-1__91.92.34.5/
        │   ├── xray-access.log.gz
        │   ├── xray-error.log.gz
        │   ├── auth.log.gz
        │   ├── fail2ban.log.gz
        │   └── _meta.json
        ├── de-2__94.26.90.182/
        │   └── ...
📸
[ скриншот: структура в Timeweb web-консоли ]
img/bucket-structure.png
5.4

Отчёт в Telegram

На следующее утро (06:00 UTC = 09:00 МСК) придёт отчёт автоматически:

📸
[ скриншот: пример отчёта в Telegram ]
img/telegram-report.png

Состоит из двух сообщений:

  1. Текстовая сводка — сколько нод загрузило, топ ошибок
  2. Файл report-YYYY-MM-DD.txt.gz — детальная разбивка
РАСПИСАНИЕ

Когда что работает

Время UTCМСКЧто происходит
00:0003:00remnanode сам ротирует свои логи (access.log → .log.1.gz)
01:0004:00На каждой ноде запускается uploader (с random delay до 10 мин)
~01:0504:05Все ноды обычно закончили загрузку
06:0009:00Collector формирует отчёт и шлёт в Telegram
Между загрузкой нод и отчётом — 5 часов запаса. Даже самые нагруженные ноды (3 ГБ access.log) успевают за 1-2 мин.
ФАЙЛЫ И ПУТИ

Что где лежит

На каждой VPN-ноде

ПутьЧто
/usr/local/sbin/log-upload.shосновной скрипт загрузки
/etc/log-upload/secrets.envS3 credentials (chmod 600)
/etc/systemd/system/log-upload.timerрасписание (01:00 UTC)
/var/log/log-upload.logлог работы скрипта
/var/spool/log-upload/временный каталог (между сжатием и загрузкой)
/usr/local/bin/mcMinIO client для S3

На collector-сервере

ПутьЧто
/usr/local/bin/log-report.pyскрипт отчёта
/etc/log-collector/inventory.yamlсписок нод
/etc/log-collector/secrets.envS3 + Telegram креды
/etc/systemd/system/log-report.timerрасписание (06:00 UTC)
/var/log/log-collector/сохранённые отчёты
СКАЧАТЬ СКРИПТЫ

Готовые файлы

Все компоненты системы. Можешь скачать и изучить или модифицировать под себя.