Создание ноды remnanode с ssl сертификатами (Если много нод)

Ниже описана инструкция по настройке ноды для панели remnawave, для ее использования необходимо заранее купить домен и создать поддомен для vps сервера. 

 Обновление пакетов и установка всех необходимых пакетов 

 Обновление и установка пакетов 

 apt update && apt install sudo curl nginx 

 Отключаем дефолтный сайт nginx 

 rm -f /etc/nginx/sites-enabled/default && systemctl stop nginx 

 Установка  docker 

 sudo curl -fsSL https://get.docker.com | sh 

 Установка и выпуск сертификатов certbot 

 Каталоги для certbot в docker 

 mkdir -p /opt/certbot && cd /opt/certbot && nano docker-compose.yml 

 Вставьте следующее содержимое: 

 services:

 certbot:

   container_name: certbot

   image: certbot/certbot

   network_mode: host

   volumes:

     - ./certs:/etc/letsencrypt 

 Первичное получение сертификата Замените your-domain.com и admin@your-domain.com на ваши данные: 

 docker run --rm \

 -v $(pwd)/certs:/etc/letsencrypt \

 -v $(pwd)/var-lib-letsencrypt:/var/lib/letsencrypt \

 --network host \

 certbot/certbot certonly --standalone \

 --non-interactive --agree-tos \

 --email admin@your-domain.com \

 -d your-domain.com

 

 Удалить  каталог  README 

 rm /opt/certbot/certs/live/README 

 Установка remnanode 

 Создание каталога для remnanode 

 mkdir /opt/remnanode && cd /opt/remnanode && nano docker-compose.yml 

 Вставьте текст, не забудьте указать SECRET_KEY и NODE_PORT , если у вас он другой 

 services:

 remnanode:

 container_name: remnanode

 hostname: remnanode

 image: remnawave/node:latest

 network_mode: host

 restart: always

 cap_add:

 - NET_ADMIN

 ulimits:

 nofile:

 soft: 1048576

 hard: 1048576

 environment:

 - NODE_PORT=2272

 - SECRET_KEY=""

 volumes:

 - '/opt/certbot/certs/live:/etc/letsencrypt/live:ro'

 

 Поднимаем контейнер, проверяем линк на панели. 

 docker compose up -d && docker compose logs -f -t 

 Скрипт для переноса ssl сертификатов в удобный каталог + параметры cron 

 Создаем скрипт для переноса файлов сертификата 

 cat > /opt/remnanode/update-certs-universal.sh << 'EOF'

#!/bin/bash

TARGET_DIR="/opt/certbot/certs/live"

echo "🔍 Анализируем $TARGET_DIR..."

# Ищем папку домена (игнорируем файлы)

DOMAIN=$(ls -A1 "$TARGET_DIR" 2>/dev/null | grep -E '^[a-zA-Z0-9][a-zA-Z0-9.-]*$' | grep -v '\.pem$' | head -1)

if [ -z "$DOMAIN" ]; then

 echo "❌ Папка домена не найдена, пробуем файлы в корне..."

 

 # Если нет папки — используем файлы из корня

 if [ -f "$TARGET_DIR/fullchain.pem" ] && [ -f "$TARGET_DIR/privkey.pem" ]; then

 echo "✅ Файлы уже в корне $TARGET_DIR — ничего не копируем"

 echo "Домен: auto (файлы в корне)"

 ls -la "$TARGET_DIR/"

 

 cd /opt/remnanode && docker compose restart remnanode

 echo "🔄 remnanode перезапущен"

 sleep 3

 docker logs remnanode --tail=10

 exit 0

 fi

 

 echo "❌ Ни папки домена, ни файлов в корне не найдено!"

 exit 1

fi

SOURCE_DIR="$TARGET_DIR/$DOMAIN"

echo "🔄 Найден домен: $DOMAIN → $SOURCE_DIR"

mkdir -p "$TARGET_DIR"

if [ -f "$SOURCE_DIR/fullchain.pem" ] && [ -f "$SOURCE_DIR/privkey.pem" ]; then

 cp "$SOURCE_DIR/fullchain.pem" "$TARGET_DIR/fullchain.pem"

 cp "$SOURCE_DIR/privkey.pem" "$TARGET_DIR/privkey.pem"

 chmod 644 "$TARGET_DIR/fullchain.pem"

 chmod 600 "$TARGET_DIR/privkey.pem"

 

 echo "✅ ✅ ✅ СЕРТИФИКАТЫ СКОПИРОВАНЫ ИЗ ПАПКИ ✅ ✅ ✅"

else

 echo "✅ Файлы уже в корне $TARGET_DIR"

fi

echo "📋 Финальное состояние:"

ls -la "$TARGET_DIR/"

cd /opt/remnanode && docker compose restart remnanode

echo "🔄 remnanode перезапущен"

sleep 3

docker logs remnanode --tail=10

EOF

chmod +x /opt/remnanode/update-certs-universal.sh 

 Запустить скрипт 

 cd /opt/remnanode

./update-certs-universal.sh 

 Добавить в cron задачу 

 (crontab -l 2>/dev/null; echo "0 0 28 * * cd /opt/certbot && docker compose run --rm certbot renew && /opt/remnanode/update-certs-universal.sh") | crontab - 

 Поднимаем заглушку 

 Запускаем nginx и добавляем в автозагрузку 

 sudo systemctl enable --now nginx 

 Создаем каталог для заглушки 

 mkdir -p /var/www/masq 

 Создаем html файл заглушки 

 tee /var/www/masq/index.html >/dev/null <<'HTML'

<!DOCTYPE html><html><head><meta charset="utf-8"><title>Please wait</title><style>body{background:#080808;height:100vh;margin:0;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:sans-serif}.dots{display:flex;gap:15px;margin-bottom:30px}.d{width:20px;height:20px;background:#fff;border-radius:50%;animation:b 1.4s infinite ease-in-out both}.d:nth-child(1){animation-delay:-0.32s}.d:nth-child(2){animation-delay:-0.16s}@keyframes b{0%,80%,100%{transform:scale(0);opacity:0.2}40%{transform:scale(1);opacity:1}}.t{color:#555;font-size:14px;letter-spacing:2px;font-weight:600}</style></head><body><div class="dots"><div class="d"></div><div class="d"></div><div class="d"></div></div><div class="t">RETRYING CONNECTION</div></body></html>

HTML 

 Создаем конфиг nginx 

 nano /etc/nginx/sites-available/masq 

 Вставляем конфиг ниже, необходимо заменить Y_D.ru на домен vps 

 server {

 listen 127.0.0.1:8443 ssl http2;

 server_name Y_D.ru www.Y_D.ru;

 root /var/www/masq;

 index index.html index.htm;

 ssl_certificate /opt/certbot/certs/live/fullchain.pem;

 ssl_certificate_key /opt/certbot/certs/live/privkey.pem;

 location / {

 try_files $uri $uri/ /index.html;

 }

} 

 Создаем симлинк 

 ln -s /etc/nginx/sites-available/masq /etc/nginx/sites-enabled/masq 

 После перезагрузки nginx заглушка будет готова 

 sudo systemctl reload nginx 

 Сетевые настройки сервера 

 cat > /etc/sysctl.d/99-vpn-optim.conf << EOF

# VPN оптимизация - буферы 64MB

net.core.rmem_max = 67108864

net.core.wmem_max = 67108864

# TCP буферы (min default max)

net.ipv4.tcp_rmem = 4096 87380 67108864

net.ipv4.tcp_wmem = 4096 65536 67108864

# BBR + сетевые улучшения

net.ipv4.tcp_congestion_control = bbr

net.core.default_qdisc = fq

net.core.netdev_max_backlog = 5000

EOF

# Применить

sysctl -p /etc/sysctl.d/99-vpn-optim.conf

# Проверить

sysctl net.core.rmem_max net.ipv4.tcp_congestion_control