VPS

Администратор • 19 ноября 2025, 17:35

Публикация сайтов с домашнего сервера через VPS + OpenVPN + Nginx

> VPS IP: 185.218.0.204  Домен: project-tmb.ru

📌 Общая схема

Интернет
   |
   v
[VPS с белым IP: 185.218.0.204]
   |-- Nginx слушает 80/443
   |-- proxy_pass --> 127.0.0.1:8080 (основной сайт)
   |-- proxy_pass --> 127.0.0.1:8081 (поддомен qr.project-tmb.ru)
   |-- proxy_pass --> 127.0.0.1:8082 (поддомен sub.project-tmb.ru)
   |
   v
[Домашний сервер через VPN]
   |-- 10.8.0.2:8080 (основной сайт)
   |-- 10.8.0.2:8081 (поддомен qr.project-tmb.ru)
   |-- 10.8.0.2:8082 (поддомен sub.project-tmb.ru)

1️⃣ Настройка OpenVPN

Генерация конфигурации на VPS

  1. Скачиваем скрипт для установки OpenVPN:
cd /root
wget https://git.io/vpn -O openvpn-install.sh
bash openvpn-install.sh
  1. Настройки при установке:

  2. IPv4 address: выбираем белый IP VPS

  3. Protocol: TCP
  4. Port: 443 (рекомендуется)
  5. DNS: Google (8.8.8.8)
  6. Имя клиента: client

  7. Конфиг клиента (client.ovpn) копируем на домашний сервер:

scp /root/client.ovpn user@home-server:/etc/openvpn/client.conf
  1. На домашнем сервере (Linux) запускаем VPN клиент:
sudo systemctl enable openvpn@client
sudo systemctl start openvpn@client

Проверка соединения:

ping 10.8.0.1  # VPS по внутреннему VPN

2️⃣ Настройка портов и iptables на VPS

Обязательно включить IP forwarding:

sudo sysctl -w net.ipv4.ip_forward=1

Открываем порты для HTTP/HTTPS:

sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -I INPUT -i lo -j ACCEPT

❗ Важно: DNAT через iptables на внутренние порты не делаем, Nginx будет заниматься маршрутизацией.


Понял 👍 Тебе нужно объединить пункт про Nginx + пункт про заглушку в один общий блок, чтобы документация выглядела логично:

3️⃣ Настройка Nginx + Подключение заглушки (maintenance.html)

Ниже готовый полностью объединённый блок, который можно сразу вставить в документацию. Он заменяет текущий пункт 3️⃣ и включает всё, что относится к Nginx и файлу заглушки.


3️⃣ Настройка Nginx + Файл-заглушка (Maintenance Mode)

Этот раздел отвечает сразу за три важные задачи:

  1. Настройку сайтов и поддоменов через Nginx
  2. Проксирование запросов на домашний сервер (10.8.0.2:порт)
  3. Автоматическое отображение красивой заглушки, если backend недоступен (ошибка 502/503/504)

📌 3.1 — Создание HTML-файла заглушки

Файл-заглушка используется, если backend не отвечает. Он лежит в стандартном каталоге:

/var/www/html/maintenance.html

Создание:

sudo mkdir -p /var/www/html
sudo nano /var/www/html/maintenance.html

Пример минимального HTML:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Технические работы</title>
    <style>
        body { font-family: Arial; text-align: center; padding-top: 120px; background: #0d1b3d; color: #fff; }
        h1 { font-size: 36px; margin-bottom: 10px; }
        p { font-size: 18px; opacity: .8; }
    </style>
</head>
<body>
    <h1>Сайт временно недоступен</h1>
    <p>Мы работаем над восстановлением доступа...</p>
</body>
</html>

📌 3.2 — Шаблон server-блока для любого сайта

Каждый сайт обязательно содержит блок заглушки:

error_page 502 503 504 /maintenance.html;

location = /maintenance.html {
    root /var/www/html;   # путь к файлу заглушки
    internal;             # запрещает прямой доступ
}

И блок proxy_pass:

location / {
    proxy_pass http://10.8.0.2:PORT;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;

    # Ускорение реакции при падении backend
    proxy_connect_timeout 3s;
    proxy_read_timeout 5s;
}

📌 3.3 — Основной сайт (порт 8080)

Файл: /etc/nginx/conf.d/main_site.conf

server {
    listen 80;
    server_name project-tmb.ru www.project-tmb.ru;

    # Заглушка при ошибках backend
    error_page 502 503 504 /maintenance.html;
    location = /maintenance.html {
        root /var/www/html;
        internal;
    }

    location / {
        proxy_pass http://10.8.0.2:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_connect_timeout 3s;
        proxy_read_timeout 5s;
    }
}

📌 3.4 — Поддомен qr.project-tmb.ru (порт 8081)

Файл: /etc/nginx/conf.d/qr_site.conf

server {
    listen 80;
    server_name qr.project-tmb.ru;

    error_page 502 503 504 /maintenance.html;
    location = /maintenance.html {
        root /var/www/html;
        internal;
    }

    location / {
        proxy_pass http://10.8.0.2:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_connect_timeout 3s;
        proxy_read_timeout 5s;
    }
}

📌 3.5 — Новый поддомен sub.project-tmb.ru (порт 8082)

Файл: /etc/nginx/conf.d/sub_site.conf

server {
    listen 80;
    server_name sub.project-tmb.ru;

    error_page 502 503 504 /maintenance.html;
    location = /maintenance.html {
        root /var/www/html;
        internal;
    }

    location / {
        proxy_pass http://10.8.0.2:8082;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_connect_timeout 3s;
        proxy_read_timeout 5s;
    }
}

📌 3.6 — Проверка и перезапуск Nginx

sudo nginx -t
sudo systemctl restart nginx

📌 3.7 — Проверка заглушки вручную

Останавливаем backend на домашнем сервере:

sudo systemctl stop my-app

Проверяем на VPS:

curl -H "Host: qr.project-tmb.ru" http://127.0.0.1

Если виден maintenance.html — всё работает.


4️⃣ Проверка конфигурации Nginx

sudo nginx -t
sudo systemctl restart nginx

Проверка локально через curl:

curl -H "Host: qr.project-tmb.ru" http://127.0.0.1
curl -H "Host: sub.project-tmb.ru" http://127.0.0.1

5️⃣ Настройка DNS для поддоменов

  • Тип записи: A
  • Поддомен: qr.project-tmb.ru, sub.project-tmb.ru
  • IP: 185.218.0.204 (IP VPS)
  • TTL: 300 (или по умолчанию)

После изменения DNS подождать 5–60 минут, чтобы изменения распространились.


6️⃣ Поднятие Flask-приложений

Пример команды запуска Flask на определённом порту:

cd /home/pawel/SUB-BOT
/usr/bin/python3 main.py  # Flask слушает порт 8082

Для продакшн лучше использовать Gunicorn:

/usr/bin/gunicorn -w 4 -b 0.0.0.0:8082 main:app

7️⃣ Возможные ошибки и их причины

Симптом Причина Решение
Сайт не открывается по поддомену DNS не обновился Проверить nslookup
504 Gateway Timeout VPN или iptables неправильно настроены Проверить VPN соединение и ip_forward
502 Bad Gateway Flask не слушает нужный порт Проверить Flask/Gunicorn
Nginx не стартует Дубликат default_server или синтаксис nginx Удалить /etc/nginx/sites-enabled/default и проверить nginx -t

✅ Итоговая структура

  • VPS с белым IP: Nginx + OpenVPN
  • Домашний сервер: Flask/Node.js приложения на портах 8080, 8081, 8082…
  • Nginx: проксирует поддомены на соответствующие порты
  • iptables: только открытие портов 80 и 443 + ESTABLISHED/RELATED
  • DNS: поддомены A-записями на VPS IP

Комментарии

a
a 21 февраля 2026, 18:32

куча вонюча