Compare commits

...
1 Commits
5 changed files with 53 additions and 36 deletions
+3
View File
@@ -22,3 +22,6 @@ i suoi ricordi: non inventare persone, luoghi o fatti del paese al posto suoi; p
- Prompt delle immagini in `prompts/` e fogli grezzi in `assets/raw/`: esclusi da git.
- Sfondi nuovi: li genera **Codex** con il suo strumento immagini integrato, gratis e senza chiave API
(`codex exec`, ricetta in `docs/GENERAZIONE_SFONDI.md`, «Generare con Codex»). Si lancia da qui, senza chiedere la chiave ad Andrea.
- **Pubblicare (dal 2026-11-01)**: origin è https://git.manzolo.it/manzolo/leggenda-del-regolo, pubblico: prima `make check-public`, poi `git push origin main --tags`, solo se Andrea lo chiede.
`make deploy` costruisce l'immagine dal tag della versione, la spinge su `git.manzolo.it/manzolo/leggenda-regolo:vX.Y.Z` (e `:latest`); sul VPS il compose fissa quel tag e fa `docker compose pull && up -d`.
Per tornare indietro: sul VPS (`Workspaces/docker/leggenda-regolo/docker-compose.yml`) si rimette il tag precedente e si rifà pull e up.
+31 -21
View File
@@ -121,40 +121,50 @@ image-size: ## Dimensione dell'immagine
## ------------------------------------------------------------ deploy su un server proprio
# Host e indirizzo stanno in deploy.local.mk, fuori da git, per esempio:
# DEPLOY_HOST = root@mio-server
# DEPLOY_URL = https://gioco.esempio
# DEPLOY_DIR = docker/leggenda-regolo (la cartella del compose sul server)
# Host e cartella stanno in deploy.local.mk, fuori da git, per esempio:
# DEPLOY_HOST = root@mio-server
# DEPLOY_URL = https://gioco.esempio
# DEPLOY_DIR = docker/leggenda-regolo (la cartella del compose sul server)
# DEPLOY_IMAGE = registry.esempio/utente/leggenda-regolo
-include deploy.local.mk
DEPLOY_DIR ?= /root/leggenda-regolo
DEPLOY_TMP := $(shell mktemp -d -u /tmp/regolo-deploy.XXXXXX)
DEPLOY_DIR ?= /root/leggenda-regolo
DEPLOY_IMAGE ?= git.manzolo.it/manzolo/leggenda-regolo
DEPLOY_TMP := $(shell mktemp -d -u /tmp/regolo-deploy.XXXXXX)
# La versione dell'ultimo commit (non della cartella di lavoro): il tag git, dell'immagine e del compose.
DEPLOY_VER := v$(shell git show HEAD:src/version.js 2>/dev/null | sed -n "s/.*VERSION = '\([^']*\)'.*/\1/p")
# Si pubblica l'ultimo commit (git archive HEAD), mai la cartella di lavoro: un'altra sessione può avere modifiche a
# metà. Test su quella copia, immagine costruita e provata qui, poi spedita già pronta (docker save | docker load):
# sul server non si compila niente.
# Si pubblica il tag della versione dichiarata dall'ultimo commit (git archive vX.Y.Z, quello di make bump), mai la
# cartella di lavoro: un'altra sessione può avere modifiche a metà, e i commit dopo il tag aspettano la versione dopo.
# Test su quella copia, immagine costruita e provata qui, spinta sul registry di Gitea come :vX.Y.Z e :latest; il
# VPS la scarica con il tag scritto nel suo compose (preso da HEAD, docker-compose.deploy.yml).
SMOKE_PORT ?= 18737
deploy: ## Pubblica l'ultimo commit: test, immagine costruita e provata qui, spedita al server e riavviata
deploy: ## Pubblica la versione dell'ultimo commit: test, immagine provata qui, push sul registry, pull e riavvio sul server
@test -n "$(DEPLOY_HOST)" || { echo "manca DEPLOY_HOST: scrivilo in deploy.local.mk"; exit 2; }
mkdir -p $(DEPLOY_TMP) && git archive HEAD | tar -x -C $(DEPLOY_TMP)
@git rev-parse -q --verify 'refs/tags/$(DEPLOY_VER)' >/dev/null || { echo "manca il tag $(DEPLOY_VER): prima make bump"; exit 2; }
mkdir -p $(DEPLOY_TMP) && git archive $(DEPLOY_VER) | tar -x -C $(DEPLOY_TMP)
cd $(DEPLOY_TMP) && $(NODE) --test tests/*.test.mjs
docker build -q -t $(IMAGE):latest -t $(IMAGE):$$(git rev-parse --short HEAD) $(DEPLOY_TMP)
docker build -q -t $(DEPLOY_IMAGE):$(DEPLOY_VER) -t $(DEPLOY_IMAGE):latest $(DEPLOY_TMP)
@docker rm -f $(IMAGE)-prova >/dev/null 2>&1 || true
docker run -d --rm --name $(IMAGE)-prova -p 127.0.0.1:$(SMOKE_PORT):80 $(IMAGE):latest >/dev/null
docker run -d --rm --name $(IMAGE)-prova -p 127.0.0.1:$(SMOKE_PORT):80 $(DEPLOY_IMAGE):$(DEPLOY_VER) >/dev/null
@ok=1; sleep 1; for u in / /src/main.js /assets/voices/index.json /assets/audio/cartello.mp3; do \
c=$$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:$(SMOKE_PORT)$$u); echo " prova $$u → $$c"; [ "$$c" = 200 ] || ok=0; done; \
docker rm -f $(IMAGE)-prova >/dev/null; [ $$ok = 1 ] || { echo "l'immagine non risponde come deve: non la spedisco"; exit 1; }
ssh $(DEPLOY_HOST) 'mkdir -p $(DEPLOY_DIR)'
scp -q $(DEPLOY_TMP)/docker-compose.homeserver.yml $(DEPLOY_HOST):$(DEPLOY_DIR)/docker-compose.yml
docker save $(IMAGE):latest | gzip | ssh $(DEPLOY_HOST) 'gunzip | docker load -q && cd $(DEPLOY_DIR) && docker compose up -d && docker image prune -f >/dev/null'
docker push -q $(DEPLOY_IMAGE):$(DEPLOY_VER)
docker push -q $(DEPLOY_IMAGE):latest
git show HEAD:docker-compose.deploy.yml | sed 's|$(DEPLOY_IMAGE):VERSIONE|$(DEPLOY_IMAGE):$(DEPLOY_VER)|' | \
ssh $(DEPLOY_HOST) 'mkdir -p $(DEPLOY_DIR) && cat > $(DEPLOY_DIR)/docker-compose.yml'
ssh $(DEPLOY_HOST) 'cd $(DEPLOY_DIR) && docker compose pull -q && docker compose up -d && \
docker image ls $(DEPLOY_IMAGE) --format "{{.Repository}}:{{.Tag}}" | grep -v -x -e $(DEPLOY_IMAGE):$(DEPLOY_VER) | xargs -r docker image rm >/dev/null; \
docker image prune -f >/dev/null'
rm -rf $(DEPLOY_TMP)
@# Sul server il prune toglie l'immagine vecchia; qui restano solo latest e quella appena pubblicata.
@docker image ls $(IMAGE) --format '{{.Tag}}' | grep -v -x -e latest -e $$(git rev-parse --short HEAD) | \
xargs -r -I{} docker image rm -f $(IMAGE):{} >/dev/null
@# Qui restano solo latest e la versione appena pubblicata.
@docker image ls $(DEPLOY_IMAGE) --format '{{.Tag}}' | grep -v -x -e latest -e $(DEPLOY_VER) | \
xargs -r -I{} docker image rm -f $(DEPLOY_IMAGE):{} >/dev/null
@# L'indirizzo pubblico deve servire la versione appena spedita.
@v=$$(grep -o "VERSION = '[^']*'" src/version.js); \
@v=$$(git show $(DEPLOY_VER):src/version.js | grep -o "VERSION = '[^']*'"); \
for i in 1 2 3 4 5; do curl -s $(DEPLOY_URL)/src/version.js | grep -qF "$$v" && break; sleep 2; done; \
curl -s $(DEPLOY_URL)/src/version.js | grep -qF "$$v" || { echo "$(DEPLOY_URL) non serve $$v"; exit 1; }
@echo "→ $(DEPLOY_URL) ($$(git log -1 --format='%h %s'))"
@echo "→ $(DEPLOY_URL) ($(DEPLOY_IMAGE):$(DEPLOY_VER), $$(git log -1 --format='%h %s' $(DEPLOY_VER)))"
deploy-logs: ## Log del container sul server di deploy
@test -n "$(DEPLOY_HOST)" || { echo "manca DEPLOY_HOST: scrivilo in deploy.local.mk"; exit 2; }
+4 -2
View File
@@ -23,7 +23,9 @@ Si gioca online su **https://50037.manzolo.it** (50037 è il CAP di San Piero),
## Giocare in locale
Niente da installare e niente da compilare: HTML, CSS e moduli JavaScript ES.
Il gioco si scarica da **https://git.manzolo.it/manzolo/leggenda-del-regolo**: nella pagina dei
[tag](https://git.manzolo.it/manzolo/leggenda-del-regolo/tags) c'è lo zip di ogni versione (l'ultima è quella online).
Niente da installare e niente da compilare: HTML, CSS e moduli JavaScript ES. Dentro la cartella scompattata:
```zsh
python3 -m http.server 8000 # poi http://localhost:8000
@@ -49,7 +51,7 @@ Oppure `make up` (Docker, su http://localhost:8080). Non aprire `index.html` con
make verify # sintassi, test, prova nel browser: quello che gira prima di ogni versione
make voci # le voci delle battute nuove (XTTS-v2 su GPU)
make bump # nuova versione: verifica, commit e tag
make deploy # pubblica l'ultimo commit (immagine Docker spedita al server)
make deploy # pubblica la versione: immagine sul registry di Gitea, il server la scarica
```
## Chi ha fatto cosa
+15
View File
@@ -0,0 +1,15 @@
# Il compose del VPS (make deploy lo copia in DEPLOY_DIR con il tag della versione al posto di VERSIONE).
# L'immagine viene dal registry di Gitea; niente porte esposte: il container sta sulla rete esterna nginx-net,
# dove Nginx Proxy Manager del VPS lo pubblica col suo nome (50037.manzolo.it → leggenda-regolo:80).
# Per tornare indietro: sul VPS si rimette il tag precedente qui sotto e si rifà `docker compose pull && docker compose up -d`.
services:
leggenda-regolo:
image: git.manzolo.it/manzolo/leggenda-regolo:VERSIONE
container_name: leggenda-regolo
restart: unless-stopped
networks:
- nginx-net
networks:
nginx-net:
external: true
-13
View File
@@ -1,13 +0,0 @@
# Deploy dietro un reverse proxy (make deploy): l'immagine arriva già costruita dal PC (docker load), niente porte esposte, il container sta sulla rete esterna nginx-net,
# dove Nginx Proxy Manager del VPS lo pubblica col suo nome (50037.manzolo.it → leggenda-regolo:80).
services:
leggenda-regolo:
image: leggenda-regolo:latest
container_name: leggenda-regolo
restart: unless-stopped
networks:
- nginx-net
networks:
nginx-net:
external: true