From 51788f73ee7fba1f4eaf889dae4ce0a5e444cb71 Mon Sep 17 00:00:00 2001 From: nineap Date: Fri, 10 Jul 2026 19:07:10 +0700 Subject: [PATCH] =?UTF-8?q?nginx+TLS=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20?= =?UTF-8?q?=D0=B1=D1=8D=D0=BA=D0=B5=D0=BD=D0=B4=D0=BE=D0=BC=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B4=20VPS=20=D0=B2=D0=BC=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=20=D0=B3=D0=BE=D0=BB=D1=8B=D1=85=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D0=BE=D0=B2=20=D0=BD=D0=B0=D1=80=D1=83=D0=B6=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Порт 8080 закрыт для всего интернета (ufw allow только с IP VPS данных — нужен центральному Prometheus для /metrics), публичный вход только account.netrunner-vpn.com через system nginx с настоящим Let's Encrypt сертификатом. Тот же принцип, что и nginx у netrunner-data. --- .gitea/workflows/deploy-nginx.yml | 69 ++++++++++++++++++++++++++++++ .github/workflows/deploy-nginx.yml | 69 ++++++++++++++++++++++++++++++ nginx/account-http.conf | 17 ++++++++ nginx/account-ssl.conf | 26 +++++++++++ 4 files changed, 181 insertions(+) create mode 100644 .gitea/workflows/deploy-nginx.yml create mode 100644 .github/workflows/deploy-nginx.yml create mode 100644 nginx/account-http.conf create mode 100644 nginx/account-ssl.conf diff --git a/.gitea/workflows/deploy-nginx.yml b/.gitea/workflows/deploy-nginx.yml new file mode 100644 index 0000000..43bf82b --- /dev/null +++ b/.gitea/workflows/deploy-nginx.yml @@ -0,0 +1,69 @@ +name: Deploy Nginx + +# Единственный публичный вход (443/80) на прод VPS (backend+лендинг вместе) — +# system nginx, тот же принцип, что и в netrunner-data. Только ручной запуск. +# +# Порядок первого запуска: +# 1. Запустить эту джобу (поднимет http-конфиг + сам nginx). +# 2. Один раз руками на сервере: +# sudo apt-get install -y certbot +# sudo certbot certonly --webroot -w /var/www/certbot \ +# -d account.netrunner-vpn.com +# (если лендинг деплоится на этот же VPS первым — можно сразу одной +# командой на оба домена, см. deploy-nginx.yml у netrunner-landing) +# 3. Запустить эту джобу ещё раз — включит HTTPS. +on: + workflow_dispatch: + +jobs: + deploy: + name: Deploy nginx config for account.netrunner-vpn.com + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + + - name: Sync nginx configs to VPS + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ vars.VPS_IP }} + username: root + key: ${{ secrets.SSH_PRIVATE_KEY }} + source: "nginx/account-http.conf,nginx/account-ssl.conf" + target: "/root/netrunner-core" + strip_components: 0 + + - name: Install/enable nginx via SSH + uses: appleboy/ssh-action@v1 + with: + host: ${{ vars.VPS_IP }} + username: root + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + set -e + + if ! command -v nginx >/dev/null 2>&1; then + apt-get update + apt-get install -y nginx + fi + + mkdir -p /var/www/certbot + rm -f /etc/nginx/sites-enabled/default + + cp /root/netrunner-core/nginx/account-http.conf /etc/nginx/sites-available/account-http.conf + cp /root/netrunner-core/nginx/account-ssl.conf /etc/nginx/sites-available/account-ssl.conf + ln -sf /etc/nginx/sites-available/account-http.conf /etc/nginx/sites-enabled/account-http.conf + + CERT=/etc/letsencrypt/live/account.netrunner-vpn.com/fullchain.pem + if [ -f "$CERT" ]; then + ln -sf /etc/nginx/sites-available/account-ssl.conf /etc/nginx/sites-enabled/account-ssl.conf + echo "🔒 Сертификат найден — HTTPS-конфиг включён." + else + rm -f /etc/nginx/sites-enabled/account-ssl.conf + echo "⚠️ Сертификата ещё нет ($CERT) — HTTPS-конфиг НЕ включён." + fi + + nginx -t + systemctl enable --now nginx + systemctl reload nginx + + echo "✅ nginx (account.netrunner-vpn.com) synchronized." diff --git a/.github/workflows/deploy-nginx.yml b/.github/workflows/deploy-nginx.yml new file mode 100644 index 0000000..43bf82b --- /dev/null +++ b/.github/workflows/deploy-nginx.yml @@ -0,0 +1,69 @@ +name: Deploy Nginx + +# Единственный публичный вход (443/80) на прод VPS (backend+лендинг вместе) — +# system nginx, тот же принцип, что и в netrunner-data. Только ручной запуск. +# +# Порядок первого запуска: +# 1. Запустить эту джобу (поднимет http-конфиг + сам nginx). +# 2. Один раз руками на сервере: +# sudo apt-get install -y certbot +# sudo certbot certonly --webroot -w /var/www/certbot \ +# -d account.netrunner-vpn.com +# (если лендинг деплоится на этот же VPS первым — можно сразу одной +# командой на оба домена, см. deploy-nginx.yml у netrunner-landing) +# 3. Запустить эту джобу ещё раз — включит HTTPS. +on: + workflow_dispatch: + +jobs: + deploy: + name: Deploy nginx config for account.netrunner-vpn.com + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + + - name: Sync nginx configs to VPS + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ vars.VPS_IP }} + username: root + key: ${{ secrets.SSH_PRIVATE_KEY }} + source: "nginx/account-http.conf,nginx/account-ssl.conf" + target: "/root/netrunner-core" + strip_components: 0 + + - name: Install/enable nginx via SSH + uses: appleboy/ssh-action@v1 + with: + host: ${{ vars.VPS_IP }} + username: root + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + set -e + + if ! command -v nginx >/dev/null 2>&1; then + apt-get update + apt-get install -y nginx + fi + + mkdir -p /var/www/certbot + rm -f /etc/nginx/sites-enabled/default + + cp /root/netrunner-core/nginx/account-http.conf /etc/nginx/sites-available/account-http.conf + cp /root/netrunner-core/nginx/account-ssl.conf /etc/nginx/sites-available/account-ssl.conf + ln -sf /etc/nginx/sites-available/account-http.conf /etc/nginx/sites-enabled/account-http.conf + + CERT=/etc/letsencrypt/live/account.netrunner-vpn.com/fullchain.pem + if [ -f "$CERT" ]; then + ln -sf /etc/nginx/sites-available/account-ssl.conf /etc/nginx/sites-enabled/account-ssl.conf + echo "🔒 Сертификат найден — HTTPS-конфиг включён." + else + rm -f /etc/nginx/sites-enabled/account-ssl.conf + echo "⚠️ Сертификата ещё нет ($CERT) — HTTPS-конфиг НЕ включён." + fi + + nginx -t + systemctl enable --now nginx + systemctl reload nginx + + echo "✅ nginx (account.netrunner-vpn.com) synchronized." diff --git a/nginx/account-http.conf b/nginx/account-http.conf new file mode 100644 index 0000000..419d81e --- /dev/null +++ b/nginx/account-http.conf @@ -0,0 +1,17 @@ +# Часть 1/2 — включается всегда, с самого первого деплоя (см. +# .gitea/workflows/deploy-nginx.yml). Обслуживает ACME-challenge для certbot +# и редиректит всё остальное на HTTPS. account-ssl.conf (сам бэкенд) деплой +# включает отдельно, только когда сертификат уже существует. +server { + listen 80; + listen [::]:80; + server_name account.netrunner-vpn.com; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + return 301 https://$host$request_uri; + } +} diff --git a/nginx/account-ssl.conf b/nginx/account-ssl.conf new file mode 100644 index 0000000..898f6da --- /dev/null +++ b/nginx/account-ssl.conf @@ -0,0 +1,26 @@ +# Часть 2/2 — деплой (.gitea/workflows/deploy-nginx.yml) включает этот файл +# ТОЛЬКО когда на сервере уже есть сертификат +# /etc/letsencrypt/live/account.netrunner-vpn.com/ (иначе nginx -t упадёт). +# +# Реальный IP посетителя восстанавливается из CF-Connecting-IP — +# см. /etc/nginx/conf.d/cloudflare-real-ip.conf на самом сервере (общий для +# всех доменов на этом VPS, не часть этого репозитория) — без него +# rate-limiting (tower_governor) считал бы все запросы приходящими с одного +# IP Cloudflare, а не реальных клиентов. +server { + listen 443 ssl; + listen [::]:443 ssl; + http2 on; + server_name account.netrunner-vpn.com; + + ssl_certificate /etc/letsencrypt/live/account.netrunner-vpn.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/account.netrunner-vpn.com/privkey.pem; + + location / { + proxy_pass http://127.0.0.1:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +}