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:
@@ -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.
|
||||
@@ -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
|
||||
@@ -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/;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user