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; + } +}