netgescon-day0/docs/DEPLOY_DOCKER_MULTISITE.md

180 lines
4.9 KiB
Markdown
Executable File

# NetGescon - Docker multisito (www + app + demo)
Questa procedura avvia:
- `www.netgescon.it`: sito presentazione (statico)
- `app.netgescon.it`: ambiente produzione NetGescon
- `demo.netgescon.it`: ambiente demo NetGescon separato
Con persistenza dati su directory host distinte per `prod` e `demo`.
## Macchina corretta da usare
Per l'operativita reale attuale valgono queste regole:
- produzione Docker multisito solo su `192.168.0.157` (`svr-netgescon`)
- questa macchina locale `.200` resta ambiente di sviluppo su `:8000` e staging su `:80/:443`
- non va ricreata qui la stack `www/app/demo` di produzione
Verifica confermata il `2026-05-18` sul nodo `192.168.0.157`:
- `http://195.110.133.78` con host `www/app/demo` risponde con redirect `307` verso HTTPS
- `https://195.110.133.78` con SNI/host `www.netgescon.it`, `app.netgescon.it`, `demo.netgescon.it` risponde `200`
- perche questo accada, il reverse proxy host-level non deve occupare `80/443`; le porte devono essere pubblicate da Traefik via Docker
## File principali
- `docker/docker-compose.multisite.yml`
- `docker/.env.multisite.example`
- `docker/nginx/prod.conf`
- `docker/nginx/demo.conf`
- `docker/www/index.html`
## Prerequisiti server
- DNS già puntati al server per:
- `www.netgescon.it`
- `app.netgescon.it`
- `demo.netgescon.it`
- Porte aperte: `80`, `443`
- Docker + Docker Compose plugin installati
## Scelta architettura consigliata
Per il tuo caso è consigliata una **VM ad hoc Ubuntu** dedicata a NetGescon.
Motivi:
- isolamento da altri container già presenti
- minor rischio di conflitti porte/reti/volumi
- rollback più semplice
- passaggio da test a produzione più controllabile
## Provisioning VM Ubuntu (rapido)
Sulla VM nuova:
```bash
cd /path/del/repo/netgescon-laravel
./scripts/provision-vm-multisite.sh
```
Poi esci/rientra nella sessione shell (gruppo docker).
## Primo avvio
1. Copia il file ambiente:
```bash
cd /home/michele/netgescon/netgescon-laravel
cp docker/.env.multisite.example docker/.env.multisite
```
1. Modifica `docker/.env.multisite` con password reali.
Nota pratica:
- se `APP_KEY` manca, `scripts/deploy-multisite.sh` la genera automaticamente e la salva in `docker/.env.multisite`
- dopo `up -d` i login `app/demo` possono restituire `502` per pochi secondi durante il warm-up iniziale di PHP-FPM; la verifica va rifatta a stack assestata
1. Avvia stack:
```bash
./scripts/deploy-multisite.sh
```
1. Verifica servizi:
```bash
docker compose --env-file docker/.env.multisite -f docker/docker-compose.multisite.yml ps
```
## Aggiornamento applicazione
Quando aggiorni il codice:
```bash
cd /home/michele/netgescon/netgescon-laravel
./scripts/update-multisite.sh
```
Per aggiornare da un branch specifico:
```bash
GIT_REF=main ./scripts/update-multisite.sh
```
Verifica operativa minima dopo update:
```bash
curl -kI --resolve app.netgescon.it:443:127.0.0.1 https://app.netgescon.it/admin-filament/login
curl -kI --resolve demo.netgescon.it:443:127.0.0.1 https://demo.netgescon.it/admin-filament/login
```
Se il nodo `.157` non riesce a fare `git fetch` da Gitea, il checkout corretto lato host resta `~/netgescon/netgescon-day0-git`; i container `prod_app` e `demo_app` non sono repository Git e non possono aggiornarsi da soli con sync interno a `/var/www`.
## Persistenza dati
Le directory host predefinite sono:
- Produzione:
- `/srv/netgescon/prod/mysql`
- `/srv/netgescon/prod/storage`
- `/srv/netgescon/prod/bootstrap-cache`
- `/srv/netgescon/prod/public`
- `/srv/netgescon/prod/redis`
- Demo:
- `/srv/netgescon/demo/mysql`
- `/srv/netgescon/demo/storage`
- `/srv/netgescon/demo/bootstrap-cache`
- `/srv/netgescon/demo/public`
- `/srv/netgescon/demo/redis`
- Certificati TLS:
- `/srv/netgescon/traefik/letsencrypt`
La preparazione automatica delle directory viene eseguita da:
```bash
./scripts/ops/netgescon-prepare-multisite-host-paths.sh --report
```
I path possono essere cambiati in `docker/.env.multisite` senza modificare il compose.
## Backup consigliato
Backup locale completo di DB e filesystem persistente:
```bash
./docker/backup-multisite.sh
```
Backup DB produzione:
```bash
docker exec netgescon_prod_db mysqldump -u root -p"$PROD_DB_ROOT_PASSWORD" "$PROD_DB_DATABASE" > backup-prod.sql
```
Backup DB demo:
```bash
docker exec netgescon_demo_db mysqldump -u root -p"$DEMO_DB_ROOT_PASSWORD" "$DEMO_DB_DATABASE" > backup-demo.sql
```
Backup incrementale documenti su Google Drive dal filesystem host:
```bash
./scripts/ops/netgescon-data-backup-incremental-gdrive.sh --env-file docker/.env.multisite
```
Sincronizzazione del mirror documentale sulla `.53` dopo push su Gitea:
```bash
./scripts/ai/sync_docs_to_53.sh --env-file docker/.env.multisite
```
## Note operative
- `demo` è separata da `prod` (DB, storage, redis diversi).
- `www` è statico e non impatta le app Laravel.
- Se vuoi usare una seconda VM per test/staging, riusa questi file cambiando solo domini e file env.