From 3a9db6d109fd2075c1594257a187a867d2f012c0 Mon Sep 17 00:00:00 2001 From: Andrea Manzi Date: Sun, 1 Nov 2026 10:44:58 +0100 Subject: [PATCH] =?UTF-8?q?Il=20deploy=20passa=20dal=20registry=20di=20Git?= =?UTF-8?q?ea:=20make=20deploy=20costruisce=20l'immagine=20dal=20tag=20del?= =?UTF-8?q?la=20versione,=20la=20spinge=20su=20git.manzolo.it/manzolo/legg?= =?UTF-8?q?enda-regolo:vX.Y.Z=20e=20:latest,=20scrive=20il=20tag=20nel=20c?= =?UTF-8?q?ompose=20del=20VPS=20e=20l=C3=AC=20fa=20pull=20e=20up;=20tolto?= =?UTF-8?q?=20docker=20save/load.=20Il=20compose=20di=20produzione=20si=20?= =?UTF-8?q?chiama=20docker-compose.deploy.yml.=20Nel=20README=20il=20downl?= =?UTF-8?q?oad=20dagli=20zip=20dei=20tag,=20in=20CLAUDE.md=20il=20nuovo=20?= =?UTF-8?q?flusso=20(Andrea)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T --- CLAUDE.md | 3 ++ Makefile | 52 +++++++++++++++++++++-------------- README.md | 6 ++-- docker-compose.deploy.yml | 15 ++++++++++ docker-compose.homeserver.yml | 13 --------- 5 files changed, 53 insertions(+), 36 deletions(-) create mode 100644 docker-compose.deploy.yml delete mode 100644 docker-compose.homeserver.yml diff --git a/CLAUDE.md b/CLAUDE.md index 2d6fb85..1b6aece 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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. diff --git a/Makefile b/Makefile index b649962..660df0b 100644 --- a/Makefile +++ b/Makefile @@ -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; } diff --git a/README.md b/README.md index 7e08cd4..1772da6 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/docker-compose.deploy.yml b/docker-compose.deploy.yml new file mode 100644 index 0000000..50dff24 --- /dev/null +++ b/docker-compose.deploy.yml @@ -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 diff --git a/docker-compose.homeserver.yml b/docker-compose.homeserver.yml deleted file mode 100644 index 516cd3e..0000000 --- a/docker-compose.homeserver.yml +++ /dev/null @@ -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