VPS
Публикация сайтов с домашнего сервера через 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
- Скачиваем скрипт для установки OpenVPN:
cd /root
wget https://git.io/vpn -O openvpn-install.sh
bash openvpn-install.sh
-
Настройки при установке:
-
IPv4 address: выбираем белый IP VPS
- Protocol: TCP
- Port: 443 (рекомендуется)
- DNS: Google (8.8.8.8)
-
Имя клиента:
client -
Конфиг клиента (
client.ovpn) копируем на домашний сервер:
scp /root/client.ovpn user@home-server:/etc/openvpn/client.conf
- На домашнем сервере (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)
Этот раздел отвечает сразу за три важные задачи:
- Настройку сайтов и поддоменов через Nginx
- Проксирование запросов на домашний сервер (10.8.0.2:порт)
- Автоматическое отображение красивой заглушки, если 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