From 02d7f09824048b4a062ebf601c23531d19213509 Mon Sep 17 00:00:00 2001 From: tomasz-syn-grzegorza Date: Sat, 27 Jun 2026 15:07:36 +0200 Subject: [PATCH] Fix Dokploy deploy: support private Gitea repo and document exit 128. Add GITEA_REPO_URL for authenticated clone, improve startup logging, default FRONTEND_PORT to 8082, and update deployment README. Co-authored-by: Cursor --- docker-compose-example/.env.example | 11 +++ docker-compose-example/README.md | 106 +++++++++++++--------- docker-compose-example/docker-compose.yml | 23 +++-- 3 files changed, 91 insertions(+), 49 deletions(-) diff --git a/docker-compose-example/.env.example b/docker-compose-example/.env.example index 76087ed..93de0be 100644 --- a/docker-compose-example/.env.example +++ b/docker-compose-example/.env.example @@ -3,8 +3,14 @@ # Never commit .env with real credentials to version control. # --- Frontend Server --- +# Uwaga: 8080 może być zajęty (np. agencja-ai). Użyj wolnego portu, np. 8082. FRONTEND_PORT=8082 +# --- Gitea (opcjonalnie — tylko gdy repo jest prywatne) --- +# Domyślnie clone używa publicznego URL bez auth. +# Dla prywatnego repo ustaw URL z tokenem (Deploy Token lub PAT w Gitea): +# GITEA_REPO_URL=https://oauth2:TWÓJ_TOKEN@gitea.expert-it.agency-ai.dev/tomasz-syn-grzegorza/site-slavic-pulse-com.git + # --- Strona (meta, SEO, PWA) --- SITE_TITLE="Slavic Pulse" SITE_SHORT_NAME="Slavic Pulse" @@ -20,10 +26,15 @@ FAVICON_180=/assets/imgs/favico/180x180.png FAVICON_512=/assets/imgs/favico/512x512.png # --- YouTube --- +# Short FHD 16:9 (landscape / szeroki viewport) VIDEO_ID_FHD=kujXXtoHUbc POST_VIDEO_REDIRECT_URL_FHD=https://www.youtube.com/watch?v=kujXXtoHUbc +# Short vertical 9:16 (portrait / wąski viewport) VIDEO_ID_VERTICAL=YOUR_VERTICAL_SHORT_ID POST_VIDEO_REDIRECT_URL_VERTICAL=https://www.youtube.com/shorts/YOUR_VERTICAL_SHORT_ID +# Zachowanie po zakończeniu intro: +# true = przekieruj na POST_VIDEO_REDIRECT_URL_* +# false = zostaw miniaturkę YouTube jako tło strony POST_VIDEO_REDIRECT_ENABLED=true # POST_VIDEO_REDIRECT_ENABLED_FHD=true # POST_VIDEO_REDIRECT_ENABLED_VERTICAL=false diff --git a/docker-compose-example/README.md b/docker-compose-example/README.md index 8050ee6..0fd326c 100644 --- a/docker-compose-example/README.md +++ b/docker-compose-example/README.md @@ -1,59 +1,83 @@ # Slavic Pulse - Frontend (Dokploy Deployment) -Strona internetowa ze statycznym obrazem tła od pierwszej klatki i krótkim intro wideo streamowanym z YouTube (bez widocznych ramek playera) po załadowaniu. +Statyczna strona z intro YouTube (short FHD 16:9 lub vertical 9:16 — wybór po formacie viewportu). Tło przed filmem to miniaturka z YouTube. Konfiguracja w `.env`, HTML generowany przy starcie kontenera. ## Struktura projektu ``` site-slavic-pulse-com/ -├── docker-compose.yml # Lokalny dev (build: context .) -├── Dockerfile # Kontener nginx 1.27 Alpine -├── default.conf # Konfiguracja nginx -├── index.html # Strona ze streamem YouTube -├── assets/imgs/www-bg-slavic-pulse-com-001.jpg # Obraz tła (367 KB) -├── assets/imgs/favico/ # Favicony (48, 180, 512 px) -├── site.webmanifest # Manifest PWA / Android -├── .dockerignore # Ignorowane pliki przy budowie -├── .gitignore # Git ignore -└── docker-compose-example/ # Pliki deploymentowe Dokploy - ├── docker-compose.yml # Dokploy: image + git clone - ├── .env # Wymagany przez Dokploy (pusty) - └── README.md # Ten plik +├── docker-compose.yml # Lokalny dev (build z Dockerfile) +├── Dockerfile +├── default.conf +├── index.html.template # Szablon strony +├── generate-from-env.sh # Generator HTML z .env +├── assets/imgs/favico/ # Favicony +├── site.webmanifest.template +└── docker-compose-example/ # Pliki deploymentowe Dokploy + ├── docker-compose.yml + ├── .env.example + └── README.md ``` -## Dwa podejścia do deployu - -### 1. Lokalny development (docker-compose.yml w root) - -Używa `build:` z Dockerfile — buduje obraz lokalnie. Port hosta ustawiasz w `.env`: - -```bash -cp .env.example .env # opcjonalnie zmień FRONTEND_PORT -cd /home/tomasz-syn-grzegorza/Pulpit/cursor/site-slavic-pulse-com/ -docker compose up -d --build -# Strona na http://localhost:${FRONTEND_PORT} (domyślnie 8082) -``` - -### 2. Dokploy deployment (docker-compose-example/) - -Używa `image:` + runtime git clone — nie wymaga lokalnego build contextu, bo Dokploy kopiuje tylko `docker-compose.yml` i `.env` na serwer. +## Dokploy deployment **Kroki w Dokploy UI:** -1. Nowa aplikacja → wklej zawartość `docker-compose-example/docker-compose.yml` -2. Wklej `.env` z tego samego katalogu (ustaw `FRONTEND_PORT` jeśli potrzebny) -3. Ustaw FQDN w UI (np. `slavic-pulse.com`) +1. Nowa aplikacja → wklej `docker-compose-example/docker-compose.yml` +2. Wklej `.env` (na podstawie `.env.example`) — ustaw `VIDEO_ID_*`, opisy SEO, port +3. Ustaw FQDN (np. `slavic-pulse.com`) 4. Deploy -**Porty:** `FRONTEND_PORT` z `.env` mapuje port hosta na nginx w kontenerze (`${FRONTEND_PORT}:80`). Wewnątrz kontenera nginx zawsze nasłuchuje na porcie 80 (`default.conf`). Dokploy/Traefik routuje po FQDN do tego samego wewnętrznego portu 80. +**Porty:** `${FRONTEND_PORT}:80` (domyślnie `8082:80`). Traefik routuje po FQDN do portu 80 kontenera. ## Jak to działa -1. **Obraz tła od startu** - Lokalny JPG widoczny od pierwszej klatki; loader znika po załadowaniu obrazka -2. **Intro wideo YouTube** - Standardowy embed YouTube (`kujXXtoHUbc`) jako nakładka po załadowaniu playera -3. **Po zakończeniu filmu** - Warstwa wideo znika, obraz JPG zostaje -4. **Safety timeout 15s** - Jeśli YouTube nie załaduje się w czasie → strona zostaje na obrazku tła +1. **Start kontenera** — `git clone` repozytorium z Gitea +2. **`generate-from-env.sh`** — buduje `index.html` i `site.webmanifest` ze zmiennych `.env` +3. **Tło** — miniaturka YouTube (`img.youtube.com`) dopasowana do FHD/vertical +4. **Intro wideo** — YouTube IFrame API, autoplay +5. **Po filmie** — przekierowanie (jeśli `POST_VIDEO_REDIRECT_ENABLED=true`) lub tło z miniaturki -## Modyfikacja +## Konfiguracja (.env) -- **Inny film:** zmień `VIDEO_ID` w `index.html` -- **Inny port hosta:** zmień `FRONTEND_PORT` w `.env` (nginx w kontenerze zostaje na porcie 80) +| Zmienna | Opis | +|---------|------| +| `FRONTEND_PORT` | Port hosta (np. `8082`; unikaj konfliktu z `8080`) | +| `GITEA_REPO_URL` | Opcjonalnie — URL clone z tokenem dla prywatnego repo | +| `VIDEO_ID_FHD` / `VIDEO_ID_VERTICAL` | ID shortów YouTube | +| `POST_VIDEO_REDIRECT_URL_*` | URL po zakończeniu filmu | +| `POST_VIDEO_REDIRECT_ENABLED` | `true` = redirect, `false` = zostaje tło | + +## Rozwiązywanie problemów + +### Kontener `Restarting (128)`, brak portów w `docker ps` + +**Przyczyna:** `git clone` nie może pobrać repozytorium (najczęściej **prywatne repo** bez credentials). + +**Diagnostyka na serwerze:** +```bash +docker logs slavic-pulse-com-frontend --tail 50 +``` + +Typowy błąd: +``` +fatal: could not read Username for 'https://gitea.expert-it.agency-ai.dev': No such device or address +``` + +**Rozwiązanie A (najprostsze):** ustaw repozytorium jako **Public** w Gitea → Settings → Repository → Make Repository Public → redeploy. + +**Rozwiązanie B (repo prywatne):** w Gitea utwórz Deploy Token / PAT i dodaj do `.env` w Dokploy: +```env +GITEA_REPO_URL=https://oauth2:TWÓJ_TOKEN@gitea.expert-it.agency-ai.dev/tomasz-syn-grzegorza/site-slavic-pulse-com.git +``` + +### Konflikt portu 8080 + +Na serwerze `8080` może być zajęty (np. `agencja-ai-frontend`). Ustaw w `.env`: +```env +FRONTEND_PORT=8082 +``` + +### Zmiana konfiguracji po deployu + +1. Edytuj `.env` w Dokploy +2. Redeploy / restart kontenera (przy starcie ponownie klonuje repo i generuje HTML) diff --git a/docker-compose-example/docker-compose.yml b/docker-compose-example/docker-compose.yml index a157008..057b98a 100644 --- a/docker-compose-example/docker-compose.yml +++ b/docker-compose-example/docker-compose.yml @@ -3,11 +3,13 @@ # ============================================================ # Dokploy-compatible pattern: uses pre-built image + runtime git clone. # Dokploy only copies docker-compose.yml + .env to the server, so local -# build context with a Dockerfile does not work. This approach matches -# other working apps on our servers (e.g. wdj-hermes-frontend-matrix). +# build context with a Dockerfile does not work. # -# Port hosta: FRONTEND_PORT z .env (domyślnie 8080) → nginx w kontenerze na porcie 80. +# Port hosta: FRONTEND_PORT z .env (domyślnie 8082) → nginx w kontenerze na porcie 80. # Dokploy/Traefik routuje po FQDN do wewnętrznego portu 80 kontenera. +# +# WAŻNE: repozytorium Gitea musi być publiczne LUB ustaw GITEA_REPO_URL z tokenem w .env +# (patrz README — bez tego git clone kończy się exit 128 i kontener restartuje w pętli). # ============================================================ services: @@ -16,21 +18,26 @@ services: container_name: slavic-pulse-com-frontend restart: unless-stopped ports: - - "${FRONTEND_PORT:-8080}:80" + - "${FRONTEND_PORT:-8082}:80" env_file: - .env command: > - sh -c " + sh -ce " + echo '[slavic-pulse] Installing git + gettext...' && apk add --no-cache git gettext && + echo '[slavic-pulse] Cloning repo...' && rm -rf /app && - git clone https://gitea.expert-it.agency-ai.dev/tomasz-syn-grzegorza/site-slavic-pulse-com.git /app && + git clone --depth 1 \"$${GITEA_REPO_URL:-https://gitea.expert-it.agency-ai.dev/tomasz-syn-grzegorza/site-slavic-pulse-com.git}\" /app && + echo '[slavic-pulse] Generating index.html from .env...' && chmod +x /app/generate-from-env.sh && TEMPLATE_DIR=/app /app/generate-from-env.sh /usr/share/nginx/html && + echo '[slavic-pulse] Copying assets and nginx config...' && cp -r /app/assets /usr/share/nginx/html/assets && - rm /etc/nginx/conf.d/default.conf && + rm -f /etc/nginx/conf.d/default.conf && cp /app/default.conf /etc/nginx/conf.d/default.conf && + echo '[slavic-pulse] Starting nginx...' && nginx -g 'daemon off;' " @@ -39,7 +46,7 @@ services: interval: 30s timeout: 10s retries: 3 - start_period: 45s + start_period: 60s deploy: resources: