Ежедневная автоматическая загрузка xray-логов со всех нод в S3-хранилище, парсинг ошибок и красивый отчёт в Telegram. Полная инструкция.
Каждая нода ежедневно загружает свежие access.log и error.log от remnanode в S3-bucket. Раз в день collector проходит по bucket'у, формирует отчёт и шлёт в Telegram. Все логи остаются в S3 для расследований.
Без баз данных и Docker. Полностью на стандартных инструментах Linux.
/var/log/remnanode/access.log → access.log.1.gz ежедневно. Мы это используем — берём готовые сжатые файлы, ничего не пережимаем.Можно использовать любого S3-совместимого провайдера. Я покажу на Timeweb (РФ-friendly, без блокировок).
Зайти в Timeweb Cloud → Хранилище S3 → Создать бакет:
vpn-logs)После создания у бакета сразу есть встроенные S3-ключи (Access Key + Secret Key) — найти их в свойствах созданного бакета.
S3 endpoint: https://s3.twcstorage.ru S3 bucket: YOUR_BUCKET_NAME Access Key: YOUR_ACCESS_KEY Secret Key: YOUR_SECRET_KEY
Нужны две вещи: токен бота и твой Telegram ID куда слать отчёты.
Через @BotFather создай бота — получишь токен. Через @userinfobot узнай свой Chat ID.
Найди своего бота по username в Telegram → отправь ему /start. Без этого бот не сможет тебе писать.
Bot token: YOUR_BOT_TOKEN Chat ID: YOUR_CHAT_ID
Любой VPS с Debian 12+ / Ubuntu 22+. Желательно не в РФ (чтобы избежать блокировок Telegram API). Финский / эстонский — идеально.
SSH под root на collector-сервер и одной командой:
curl -fsSL https://logs.killu.net/install-collector.sh | bash
Скрипт спросит твои значения и сам всё настроит:
После установки отредактируй файл со списком твоих нод:
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 придёт тестовый отчёт
Запускается на каждой ноде где стоит remnanode. После установки нода каждый день в 01:00 UTC отправляет вчерашние логи в твой S3.
SSH под root на ноду → одной командой:
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'е.
zstd, gzip, curl, mc (MinIO client)/etc/log-upload/secrets.env с твоими S3-ключами (chmod 600)/usr/local/sbin/log-upload.shСкрипт не трогает:
/var/log/remnanode/*.log — не удаляет, не модифицирует.log.1.gz каждые сутки)Для быстрой установки на 20+ нод используй bash-скрипт rollout.sh.example — заполни массив NODES и запусти.
# статус таймера 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 ═══
# посмотреть S3 mc ls -r tw/YOUR_BUCKET/ # ручной отчёт (придёт в Telegram) /usr/local/bin/log-report.py
Открой бакет в web-UI Timeweb. Должна быть структура:
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/
│ └── ...
На следующее утро (06:00 UTC = 09:00 МСК) придёт отчёт автоматически:
Состоит из двух сообщений:
report-YYYY-MM-DD.txt.gz — детальная разбивка| Время UTC | МСК | Что происходит |
|---|---|---|
00:00 | 03:00 | remnanode сам ротирует свои логи (access.log → .log.1.gz) |
01:00 | 04:00 | На каждой ноде запускается uploader (с random delay до 10 мин) |
~01:05 | 04:05 | Все ноды обычно закончили загрузку |
06:00 | 09:00 | Collector формирует отчёт и шлёт в Telegram |
| Путь | Что |
|---|---|
/usr/local/sbin/log-upload.sh | основной скрипт загрузки |
/etc/log-upload/secrets.env | S3 credentials (chmod 600) |
/etc/systemd/system/log-upload.timer | расписание (01:00 UTC) |
/var/log/log-upload.log | лог работы скрипта |
/var/spool/log-upload/ | временный каталог (между сжатием и загрузкой) |
/usr/local/bin/mc | MinIO client для S3 |
| Путь | Что |
|---|---|
/usr/local/bin/log-report.py | скрипт отчёта |
/etc/log-collector/inventory.yaml | список нод |
/etc/log-collector/secrets.env | S3 + Telegram креды |
/etc/systemd/system/log-report.timer | расписание (06:00 UTC) |
/var/log/log-collector/ | сохранённые отчёты |
Все компоненты системы. Можешь скачать и изучить или модифицировать под себя.