Déploie le front en production sur le VPS (photobooth.assistantaikev.eu)

Container nginx dédié, rattaché au réseau Docker de n8n pour réutiliser
Traefik/Let's Encrypt déjà en place. Config versionnée dans deploy/.
APP_BASE_URL configurée sur les Edge Functions pour le CORS. Testé en
conditions réelles : upload invité + galerie admin fonctionnels depuis
le domaine public.
This commit is contained in:
2026-09-16 13:06:36 +02:00
parent 9b1461978b
commit 2a9cdc4318
4 changed files with 100 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
# Déploiement front — VPS Hostinger
Le front (`src/e`, `src/admin`, `src/vendor`) est servi par un container
`nginx:alpine` sur le VPS existant (celui de n8n), rattaché au réseau Docker
`n8n_default` pour que Traefik (déjà en place pour n8n) puisse le router.
- **Domaine** : `photobooth.assistantaikev.eu` (DNS A → IP du VPS, cf.
`~/.claude/CLAUDE.md` pour l'IP à jour)
- **Emplacement sur le VPS** : `~/photobooth-qr/` (dossier de `kevin`, pas de
sudo requis — contrairement à `/docker/n8n/` qui est root)
- **Fichiers** :
- `docker-compose.yml` (ce dossier) — service `photobooth-front`, labels
Traefik pour le routage/SSL (réutilise le certresolver `mytlschallenge`
déjà configuré pour n8n)
- `nginx-photobooth.conf` (ce dossier) — réécriture `/e/<slug>` et
`/admin/<slug>` vers les `index.html` respectifs
- `site/` (non versionné ici, généré à partir de `src/`) — copie de
`src/e`, `src/admin`, `src/vendor`, **avec** les vrais `config.js`
(gitignorés dans le repo principal, à recréer sur le VPS à partir de
`src/e/config.example.js` / `src/admin/gallery/config.example.js`)
## Redéployer après une modification du front
Depuis la machine locale (pas besoin de sudo, `kevin` possède le dossier) :
```bash
scp -r src/e src/admin src/vendor kevin@<IP_VPS>:~/photobooth-qr/site/
# Recréer les config.js réels sur le VPS s'ils ont été écrasés par le scp
ssh kevin@<IP_VPS> "cd ~/photobooth-qr && docker compose restart photobooth-front"
```
Aucun rebuild d'image nécessaire — c'est un bind-mount, nginx sert les
fichiers directement.
+29
View File
@@ -0,0 +1,29 @@
services:
photobooth-front:
image: nginx:alpine
restart: always
labels:
- traefik.enable=true
- traefik.http.routers.photobooth.rule=Host(`photobooth.assistantaikev.eu`)
- traefik.http.routers.photobooth.tls=true
- traefik.http.routers.photobooth.entrypoints=web,websecure
- traefik.http.routers.photobooth.tls.certresolver=mytlschallenge
- traefik.http.middlewares.photobooth.headers.SSLRedirect=true
- traefik.http.middlewares.photobooth.headers.STSSeconds=315360000
- traefik.http.middlewares.photobooth.headers.browserXSSFilter=true
- traefik.http.middlewares.photobooth.headers.contentTypeNosniff=true
- traefik.http.middlewares.photobooth.headers.forceSTSHeader=true
- traefik.http.middlewares.photobooth.headers.SSLHost=assistantaikev.eu
- traefik.http.middlewares.photobooth.headers.STSIncludeSubdomains=true
- traefik.http.middlewares.photobooth.headers.STSPreload=true
- traefik.http.routers.photobooth.middlewares=photobooth@docker
- traefik.http.services.photobooth.loadbalancer.server.port=80
volumes:
- ./site:/usr/share/nginx/html:ro
- ./nginx-photobooth.conf:/etc/nginx/conf.d/default.conf:ro
networks:
- n8n_default
networks:
n8n_default:
external: true
+27
View File
@@ -0,0 +1,27 @@
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
# /e/<slug> -> page upload invité, le slug est lu côté client via
# window.location.pathname (cf. src/e/upload.js)
location /e/ {
try_files $uri $uri/ /e/index.html;
}
# /admin/<slug>?token=... -> galerie admin, slug lu côté client.
# /admin/qrcode/ reste servi tel quel (fichier réel, try_files le trouve
# avant de tomber sur le fallback ci-dessous).
location /admin/ {
try_files $uri $uri/ /admin/gallery/index.html;
}
location /vendor/ {
try_files $uri =404;
}
location = / {
return 302 /e/;
}
}
+11
View File
@@ -48,6 +48,17 @@ par Kévin.
adapté. Risque jugé faible : les slugs sont partagés via QR code, donc
non secrets par nature.
## 2026-09-16 (ter)
- **Domaine de production (V1)** : `photobooth.assistantaikev.eu`, sous-domaine
du domaine déjà utilisé pour n8n. Décision explicitement temporaire : à
déplacer vers un domaine dédié en V2/V3 si le produit est vendu sous sa
propre marque. Front servi par un container nginx sur le VPS existant
(Traefik/Let's Encrypt déjà en place pour n8n), config dans `deploy/`.
`APP_BASE_URL` configurée comme secret sur les 2 Edge Functions pour le
CORS. Déploiement testé en conditions réelles le 2026-09-16 (upload +
galerie admin fonctionnels depuis le domaine public).
## 2026-09-16 (bis)
- **Déclenchement de la purge Storage à J+7** : **option n8n retenue**