diff --git a/.gitea/workflows/deploy-nginx.yml b/.gitea/workflows/deploy-nginx.yml new file mode 100644 index 0000000..1b49c18 --- /dev/null +++ b/.gitea/workflows/deploy-nginx.yml @@ -0,0 +1,68 @@ +name: Deploy Nginx + +# Единственный публичный вход (443/80) на прод VPS (backend+лендинг вместе, +# см. deploy-nginx.yml у netrunner-backend — тот же сервер, свой домен). +# Только ручной запуск. +# +# Порядок первого запуска: +# 1. Запустить эту джобу (поднимет http-конфиг). +# 2. Один раз руками на сервере: +# sudo apt-get install -y certbot +# sudo certbot certonly --webroot -w /var/www/certbot \ +# -d netrunner-vpn.com +# 3. Запустить эту джобу ещё раз — включит HTTPS. +on: + workflow_dispatch: + +jobs: + deploy: + name: Deploy nginx config for 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/landing-http.conf,nginx/landing-ssl.conf" + target: "/root/netrunner-frontend" + 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-frontend/nginx/landing-http.conf /etc/nginx/sites-available/landing-http.conf + cp /root/netrunner-frontend/nginx/landing-ssl.conf /etc/nginx/sites-available/landing-ssl.conf + ln -sf /etc/nginx/sites-available/landing-http.conf /etc/nginx/sites-enabled/landing-http.conf + + CERT=/etc/letsencrypt/live/netrunner-vpn.com/fullchain.pem + if [ -f "$CERT" ]; then + ln -sf /etc/nginx/sites-available/landing-ssl.conf /etc/nginx/sites-enabled/landing-ssl.conf + echo "🔒 Сертификат найден — HTTPS-конфиг включён." + else + rm -f /etc/nginx/sites-enabled/landing-ssl.conf + echo "⚠️ Сертификата ещё нет ($CERT) — HTTPS-конфиг НЕ включён." + fi + + nginx -t + systemctl enable --now nginx + systemctl reload nginx + + echo "✅ nginx (netrunner-vpn.com) synchronized." diff --git a/.github/workflows/deploy-nginx.yml b/.github/workflows/deploy-nginx.yml new file mode 100644 index 0000000..1b49c18 --- /dev/null +++ b/.github/workflows/deploy-nginx.yml @@ -0,0 +1,68 @@ +name: Deploy Nginx + +# Единственный публичный вход (443/80) на прод VPS (backend+лендинг вместе, +# см. deploy-nginx.yml у netrunner-backend — тот же сервер, свой домен). +# Только ручной запуск. +# +# Порядок первого запуска: +# 1. Запустить эту джобу (поднимет http-конфиг). +# 2. Один раз руками на сервере: +# sudo apt-get install -y certbot +# sudo certbot certonly --webroot -w /var/www/certbot \ +# -d netrunner-vpn.com +# 3. Запустить эту джобу ещё раз — включит HTTPS. +on: + workflow_dispatch: + +jobs: + deploy: + name: Deploy nginx config for 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/landing-http.conf,nginx/landing-ssl.conf" + target: "/root/netrunner-frontend" + 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-frontend/nginx/landing-http.conf /etc/nginx/sites-available/landing-http.conf + cp /root/netrunner-frontend/nginx/landing-ssl.conf /etc/nginx/sites-available/landing-ssl.conf + ln -sf /etc/nginx/sites-available/landing-http.conf /etc/nginx/sites-enabled/landing-http.conf + + CERT=/etc/letsencrypt/live/netrunner-vpn.com/fullchain.pem + if [ -f "$CERT" ]; then + ln -sf /etc/nginx/sites-available/landing-ssl.conf /etc/nginx/sites-enabled/landing-ssl.conf + echo "🔒 Сертификат найден — HTTPS-конфиг включён." + else + rm -f /etc/nginx/sites-enabled/landing-ssl.conf + echo "⚠️ Сертификата ещё нет ($CERT) — HTTPS-конфиг НЕ включён." + fi + + nginx -t + systemctl enable --now nginx + systemctl reload nginx + + echo "✅ nginx (netrunner-vpn.com) synchronized." diff --git a/nginx/landing-http.conf b/nginx/landing-http.conf new file mode 100644 index 0000000..9df782a --- /dev/null +++ b/nginx/landing-http.conf @@ -0,0 +1,15 @@ +# Часть 1/2 — включается всегда, с самого первого деплоя (см. +# .gitea/workflows/deploy-nginx.yml). ACME-challenge + редирект на HTTPS. +server { + listen 80; + listen [::]:80; + server_name netrunner-vpn.com; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + return 301 https://$host$request_uri; + } +} diff --git a/nginx/landing-ssl.conf b/nginx/landing-ssl.conf new file mode 100644 index 0000000..b632a61 --- /dev/null +++ b/nginx/landing-ssl.conf @@ -0,0 +1,54 @@ +# Часть 2/2 — деплой включает этот файл ТОЛЬКО когда сертификат уже есть. +# ВАЖНО: сертификат выпускается ОДНОЙ командой на оба домена сразу (см. +# .gitea/workflows/deploy-nginx.yml у netrunner-backend, туда же убегает +# первый -d) — папка в /etc/letsencrypt/live называется по ПЕРВОМУ домену, +# account.netrunner-vpn.com, а не netrunner-vpn.com, даже для этого файла. +# +# Реальный IP посетителя — из CF-Connecting-IP, см. +# /etc/nginx/conf.d/cloudflare-real-ip.conf на самом сервере (общий для всех +# доменов на этом VPS, не часть этого репозитория). +# +# Три бэкенда за одним доменом: +# / -> сам лендинг (Next.js, :3000) +# /cms-api/* -> PocketBase (:8090) — префикс "/cms-api" меняется на +# родной для PocketBase "/api" (см. PB_PUBLIC_URL в +# docker-compose.yml) +# /api/* -> proxy-ws (:3001) — его собственные роуты уже объявлены +# с префиксом /api (comments, speedtest), никакой замены +# префикса не нужно, только вебсокет-апгрейд заголовки +server { + listen 443 ssl; + listen [::]:443 ssl; + http2 on; + server_name 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 /cms-api/ { + proxy_pass http://127.0.0.1:8090/api/; + 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; + } + + location /api/ { + proxy_pass http://127.0.0.1:3001; + 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; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + location / { + proxy_pass http://127.0.0.1:3000; + 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; + } +}