# ===================================================================== # DEV (remote VPS, тот же хост, что и netrunner-backend dev-remote: # 45.76.161.137, DNS A-record dev.netrunner-vpn.com) — тот же принцип, что # и прод: тянем готовые образы из GHCR и запускаем. В отличие от прода, # порты открыты не только на 127.0.0.1 — на dev нет reverse-proxy/TLS # перед сервисами (см. netrunner-backend/.env.dev-remote.example). # # Используем доменное имя, а не голый IP, намеренно: Telegram Login Widget # требует настоящий домен, зарегистрированный в BotFather (/setdomain) — # на IP виджет отвечает "Bot domain invalid" независимо от кода. # ===================================================================== services: # Фронтенд (Next.js) landing: image: ${IMAGE:-gitea.netrunner-vpn.com/nineap/netrunner-landing:latest} container_name: netrunner-landing-dev restart: always ports: - "3000:3000" environment: - NODE_ENV=production # PB_PUBLIC_URL — адрес PocketBase, который реально используют клиентские # компоненты (Pricing, TerminalGuestbook, docs/download/terminal-client.tsx): # он читается на сервере в соответствующих page.tsx и прокидывается пропсом # (тот же паттерн, что и ACCOUNT_ORIGIN для auth). NEXT_PUBLIC_PB_URL ниже # оставлен для остальных мест (Faq/BlogPreview/blog — серверные компоненты, # получают данные через PB_INTERNAL_URL, а NEXT_PUBLIC_PB_URL там нужен только # как дефолт/для URL картинок) — саму переменную NEXT_PUBLIC_PB_URL Next.js # зашивает в бандл на этапе сборки образа в CI и не перечитывает при старте # контейнера, поэтому она НЕ годится для рантайм-конфигурации, в отличие от # PB_PUBLIC_URL (обычная, не NEXT_PUBLIC_-переменная). - PB_PUBLIC_URL=http://dev.netrunner-vpn.com:8090/cms-api - NEXT_PUBLIC_PB_URL=http://dev.netrunner-vpn.com:8090/cms-api - NEXT_PUBLIC_PROXY_URL=http://dev.netrunner-vpn.com:3001 - PB_INTERNAL_URL=http://netrunner-cms:8090 # Единая авторизация: смотрим на dev-бэкенд через Caddy (порт 443, # настоящий TLS) — НЕ напрямую на :8080. Бэкенд на dev теперь ставит # сессионные cookie с атрибутом Secure (как в проде, раз уже есть TLS), # такую cookie браузер примет только с ответа по HTTPS; см. # netrunner-backend WEB_APP_BASE_URL/COOKIE_SECURE в .env.dev-remote.example # и Caddyfile.dev (Caddy нужен и ради Telegram Web Apps, которым обязателен # https://, и ради Telegram Login Widget, которому в браузере обязателен # именно порт 443). Без NEXT_PUBLIC_ — читаются на сервере # (app/[lang]/auth/page.tsx), поэтому реально применяются в рантайме # этого образа, а не только прод-образа, собранного с другими значениями. - ACCOUNT_ORIGIN=https://dev.netrunner-vpn.com - API_URL=https://dev.netrunner-vpn.com/api/v1 # ОБЯЗАТЕЛЬНО задать явно (без дефолта на прод-бота!) в .env на сервере — # отдельный dev-бот, заведённый через @BotFather специально под # dev.netrunner-vpn.com. Молчаливый фолбэк на прод-бота приводил ровно # к "Bot domain invalid": у прод-бота в BotFather уже прописан прод-домен. - BOT_USERNAME=${BOT_USERNAME:?"Задай BOT_USERNAME dev-бота в .env — см. комментарий выше"} depends_on: - ws-proxy networks: - netrunner-network-dev # CMS (PocketBase) — отдельные данные от прода, свой volume. netrunner-cms: image: ghcr.io/muchobien/pocketbase:latest container_name: netrunner-cms-dev restart: unless-stopped command: - serve - --http=0.0.0.0:8090 - --dir=/pb_data ports: - "8090:8090" volumes: - ./pb_data_dev:/pb_data networks: - netrunner-network-dev # Прокси-слой (Rust) ws-proxy: image: gitea.netrunner-vpn.com/nineap/netrunner-landing-proxy:latest container_name: netrunner-ws-proxy-dev restart: always ports: - "3001:3001" environment: - PB_INTERNAL_URL=http://netrunner-cms:8090 depends_on: - netrunner-cms networks: - netrunner-network-dev networks: netrunner-network-dev: driver: bridge