commit d565f834909bd8e331b58c3c1e81994a4891b267 Author: tomasz-syn-grzegorza Date: Fri Jun 26 08:55:39 2026 +0000 init: static frontend for agency-ai.dev — nginx + YouTube intro video Static landing page served via nginx 1.27 Alpine container. Features: - Fullscreen background image visible from first paint - YouTube intro video overlay (iframe API, lazy loaded) - PWA manifest with favicons (48x48, 180x180, 512x512) - SEO meta tags (OG, Twitter Cards, canonical URL) - Safety timeout: falls back to static image if YouTube fails Infrastructure: - Dockerfile: nginx 1.27 Alpine with custom default.conf (gzip, cache headers, security headers X-Frame-Options/nosniff) - docker-compose.yml: local dev on FRONTEND_PORT (default 8080) - docker-compose-example/: Dokploy deployment via runtime git clone from Gitea, resource limits (256M RAM, 0.5 CPU) Files: - index.html: main page with inline CSS + JS (YouTube iframe API) - default.conf: nginx config (gzip, caching, security headers) - site.webmanifest: PWA manifest - assets/imgs/: background image + favicons - .env.example: FRONTEND_PORT template diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3fee6d0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +.dockerignore +.git +.gitignore +*.md +__pycache__/ +node_modules/ +.env +.venv/ +docker-compose-example/ diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..2bf36e0 --- /dev/null +++ b/.env.example @@ -0,0 +1,8 @@ +# Agencja AI — Environment Configuration (Local Development) +# Copy to .env and fill in your values. +# Never commit .env with real credentials to version control. + +# --- Frontend Server --- +# Port na hoście (localhost). W kontenerze nginx zawsze nasłuchuje na 80. +# Mapowanie w docker-compose.yml: ${FRONTEND_PORT}:80 +FRONTEND_PORT=8080 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..958ef40 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# Environment files +.env +*.env.local + +# Python +__pycache__/ +.venv/ +*.pyc + +# Node +node_modules/ + +# IDE +.vscode/ +.idea/ + +# OS +.DS_Store +Thumbs.db diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..442925d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM nginx:1.27-alpine AS production + +# Remove default nginx config +RUN rm /etc/nginx/conf.d/default.conf + +# Copy nginx config from project root +COPY default.conf /etc/nginx/conf.d/default.conf + +# Copy web files (index.html + assets) +COPY index.html /usr/share/nginx/html/index.html +COPY site.webmanifest /usr/share/nginx/html/site.webmanifest +COPY assets/ /usr/share/nginx/html/assets/ + +EXPOSE 80 + +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -qO- http://localhost:80/ || exit 1 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/assets/imgs/favico/180x180.png b/assets/imgs/favico/180x180.png new file mode 100644 index 0000000..e85610d Binary files /dev/null and b/assets/imgs/favico/180x180.png differ diff --git a/assets/imgs/favico/48x48.png b/assets/imgs/favico/48x48.png new file mode 100644 index 0000000..b6d6575 Binary files /dev/null and b/assets/imgs/favico/48x48.png differ diff --git a/assets/imgs/favico/512x512.png b/assets/imgs/favico/512x512.png new file mode 100644 index 0000000..b0524d8 Binary files /dev/null and b/assets/imgs/favico/512x512.png differ diff --git a/assets/imgs/www-bg-agencja-ai-com-001.jpg b/assets/imgs/www-bg-agencja-ai-com-001.jpg new file mode 100644 index 0000000..2d43c35 Binary files /dev/null and b/assets/imgs/www-bg-agencja-ai-com-001.jpg differ diff --git a/default.conf b/default.conf new file mode 100644 index 0000000..e8cb034 --- /dev/null +++ b/default.conf @@ -0,0 +1,35 @@ +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + # Gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml; + gzip_min_length 1024; + + # Main page + location / { + try_files $uri $uri/ /index.html; + } + + # Web app manifest + location = /site.webmanifest { + default_type application/manifest+json; + expires 30d; + add_header Cache-Control "public, immutable"; + } + + # Assets - long cache for images + location /assets/ { + expires 30d; + add_header Cache-Control "public, immutable"; + try_files $uri =404; + } + + # Security headers + add_header X-Frame-Options SAMEORIGIN always; + add_header X-Content-Type-Options nosniff always; +} diff --git a/docker-compose-example/.env.example b/docker-compose-example/.env.example new file mode 100644 index 0000000..739ed69 --- /dev/null +++ b/docker-compose-example/.env.example @@ -0,0 +1,9 @@ +# Agencja AI — Environment Configuration (Dokploy) +# Copy to .env before deploy if needed. +# Never commit .env with real credentials to version control. + +# --- Frontend Server --- +# Port publikowany na hoście. W kontenerze nginx zawsze nasłuchuje na 80. +# Mapowanie w docker-compose.yml: ${FRONTEND_PORT}:80 +# Dokploy/Traefik dodatkowo routuje po FQDN do wewnętrznego portu 80 kontenera. +FRONTEND_PORT=8080 diff --git a/docker-compose-example/README.md b/docker-compose-example/README.md new file mode 100644 index 0000000..6b36184 --- /dev/null +++ b/docker-compose-example/README.md @@ -0,0 +1,59 @@ +# Agencja AI - 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. + +## Struktura projektu + +``` +site-agency-ai-dev/ +├── 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-agencja-ai-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 +``` + +## 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/m3gan/.hermes/agencja-ai-com/site-agency-ai-dev/ +docker compose up -d --build +# Strona na http://localhost:${FRONTEND_PORT} (domyślnie 8080) +``` + +### 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. + +**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. `agencja-ai.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. + +## 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 + +## Modyfikacja + +- **Inny film:** zmień `VIDEO_ID` w `index.html` +- **Inny port hosta:** zmień `FRONTEND_PORT` w `.env` (nginx w kontenerze zostaje na porcie 80) diff --git a/docker-compose-example/docker-compose.yml b/docker-compose-example/docker-compose.yml new file mode 100644 index 0000000..25c0d86 --- /dev/null +++ b/docker-compose-example/docker-compose.yml @@ -0,0 +1,47 @@ +# ============================================================ +# Agencja AI - Docker Compose (Dokploy / manual) +# ============================================================ +# 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). +# +# Port hosta: FRONTEND_PORT z .env (domyślnie 8080) → nginx w kontenerze na porcie 80. +# Dokploy/Traefik routuje po FQDN do wewnętrznego portu 80 kontenera. +# ============================================================ + +services: + frontend: + image: nginx:1.27-alpine + container_name: agencja-ai-frontend + restart: unless-stopped + ports: + - "${FRONTEND_PORT:-8080}:80" + + command: > + sh -c " + apk add --no-cache git && + rm -rf /app && + git clone https://gitea.expert-it.agency-ai.dev/tomasz-syn-grzegorza/site-agency-ai-dev.git /app && + cp /app/index.html /usr/share/nginx/html/index.html && + cp /app/site.webmanifest /usr/share/nginx/html/site.webmanifest && + cp -r /app/assets /usr/share/nginx/html/assets && + rm /etc/nginx/conf.d/default.conf && + cp /app/default.conf /etc/nginx/conf.d/default.conf && + nginx -g 'daemon off;' + " + + healthcheck: + test: ["CMD", "wget", "-qO-", "http://127.0.0.1:80/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 45s + + deploy: + resources: + limits: + memory: 256M + cpus: "0.5" + reservations: + memory: 64M diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..126f58e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +# Agencja AI — lokalny development (build z Dockerfile) +# Port hosta: FRONTEND_PORT z pliku .env (domyślnie 8080) → nginx w kontenerze na porcie 80 + +services: + frontend: + build: + context: . + dockerfile: Dockerfile + container_name: agencja-ai-frontend + restart: unless-stopped + ports: + - "${FRONTEND_PORT:-8080}:80" diff --git a/index.html b/index.html new file mode 100644 index 0000000..40afa19 --- /dev/null +++ b/index.html @@ -0,0 +1,254 @@ + + + + + + Agencja AI + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+
+
+
+
+
+ + + + diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 0000000..ba5425b --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,24 @@ +{ + "name": "Agencja AI", + "short_name": "Agencja AI", + "icons": [ + { + "src": "/assets/imgs/favico/48x48.png", + "sizes": "48x48", + "type": "image/png" + }, + { + "src": "/assets/imgs/favico/180x180.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "/assets/imgs/favico/512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "display": "standalone", + "theme_color": "#000000", + "background_color": "#000000" +}