Sebyone S.r.l. — https://sebyone.it · proprietary, © 2026 Sebyone S.r.l. Version 3.6.2 · Author: Paolo Lo Giacco p.logiacco@sebyone.it
Strumento di deploy parametrico per gli ambienti di test, stage e locale: un solo script bash pubblica molti progetti, prendendo il codice dalla loro repository GitHub di sviluppo. Ogni progetto è un file di configurazione, e l'estensione decide il runtime:
| Config | Modalità | Runtime |
|---|---|---|
.deps/<progetto>.dep |
bare | app sul server (nginx + PHP-FPM / systemd) |
.deps/<progetto>.ddep |
docker | app in container (Docker Compose) |
Pubblica con
fetch+reset --hardsu un ramo: porta sull'ambiente lo stato corrente del ramo, non un artefatto versionato e riproducibile. È quello che serve per provare in fretta un branch su un ambiente di prova.La produzione si installa dai pacchetti di rilascio: una build produce un artefatto versionato, è quello a essere testato e approvato, e sono gli stessi byte a finire su ogni macchina.
sudo mkdir -p /opt/deployer/.deps
cd /opt/deployer
sudo wget -O deployer.sh \
https://raw.githubusercontent.com/sebyone/devops-deployer/main/linux/debian/deployer.sh
sudo chmod +x deployer.sh
./deployer.sh --versionNel repository lo script sta in
linux/debian/: il percorso dichiara la piattaforma. Sul server non si replica —deployer.shva in/opt/deployercon.deps/accanto. Dettagli, prerequisiti per stack e aggiornamento: INSTALL.md.
La via rapida è --new: chiede nome, modalità, repository, ramo, chiave SSH,
percorso di destinazione, stack e owner, poi scrive uno scheletro commentato
(mode 600). Non sovrascrive mai una config esistente.
cd /opt/deployer
sudo ./deployer.sh --newIn alternativa, partendo dai template:
cd /opt/deployer/.deps
# scarica i template una volta sola
sudo wget -O example.dep \
https://raw.githubusercontent.com/sebyone/devops-deployer/main/linux/debian/.deps/example.dep
sudo wget -O example.ddep \
https://raw.githubusercontent.com/sebyone/devops-deployer/main/linux/debian/.deps/example.ddep
sudo cp example.dep progetto.dep # bare → .dep
# sudo cp example.ddep progetto.ddep # docker → .ddep
sudo nano progetto.dep # REPO_SSH_URL, TARGET_PATH, STACK, POST_INSTALL…
sudo chmod 600 progetto.dep # è codice privilegiato: eseguito come rootCampi minimi — bare: REPO_SSH_URL, TARGET_PATH, STACK. docker:
PROJECT_ROOT (assoluto), SERVICE, un COMPOSE_FILE esistente.
In modalità bare STACK sceglie il profilo del progetto: riempie i passi e
le cartelle scrivibili di default, che la config può sempre sovrascrivere.
| Il progetto è… | STACK | composer | nginx | scrivibili |
|---|---|---|---|---|
| app Laravel su nginx + PHP-FPM | php-laravel |
sì | sì | storage bootstrap/cache |
| PHP generico su nginx + PHP-FPM | php-nginx |
sì | sì | storage vendor |
| sito statico | static-nginx |
no | sì | (nessuna) |
| SvelteKit + Spring Boot dietro proxy | node-spring-nginx |
no | sì | (nessuna) |
| servizio Python con unit systemd | python-nginx |
no¹ | sì | (nessuna) |
| nessuna delle precedenti | none |
no | no | (nessuna) |
¹ python-nginx non usa composer ma crea il virtualenv e installa i
requirements.txt (DO_VENV, VENV_PATH, VENV_REQUIREMENTS).
Uno STACK non previsto è un errore fatale, non un default silenzioso. Dettagli
di ogni profilo, prerequisiti e come sovrascrivere i default: Parte I della
guida.
.depsinizia con un punto:lsnon la mostra, servels -a.
Ogni passo verifica il precedente:
cd /opt/deployer
./deployer.sh --list # lo strumento vede la config?
sudo ./deployer.sh progetto --dry-run # valida config e pre-flight, non cambia nulla
sudo ./deployer.sh progetto --init # primo checkout: clona e si ferma
# → predisponi vhost nginx / unit systemd / .env
sudo ./deployer.sh progetto --no-db # primo deploy, database intatto
sudo ./deployer.sh progetto # deploy completoIl --no-db separato distingue «il codice non si costruisce / i permessi sono
sbagliati» da «la migrazione fallisce».
Una config può dichiarare due campi facoltativi:
MIN_DEPLOYER_VERSION="3.6.0" # versione minima dello script che le serve
CONF_REVISION="3" # revisione di questo file, registrata nello storicoOgni comando con un esempio d'uso. <progetto> è il nome base della config in
.deps/.
sudo ./deployer.sh shareforces # deploy completo
sudo ./deployer.sh shareforces --no-db # solo codice: salta i comandi 'db:'
sudo ./deployer.sh shareforces --db:seed # dei 'db:', esegue solo il set "seed"
sudo ./deployer.sh shareforces --dry-run # stampa i passi, non cambia nulla
sudo ./deployer.sh shareforces --no-git # pubblica il codice già su disco
sudo ./deployer.sh shareforces --bare # forza .dep se esiste anche .ddepI set
db:con label sono opt-in: senza--db:gira solodefault. Un seed non parte a ogni deploy solo perché è dichiarato nella config.
In modalità docker (.ddep):
sudo ./deployer.sh altroprogetto # build + up + POST_UP
sudo ./deployer.sh altroprogetto --no-build # riavvia senza ricostruire l'immagine
sudo ./deployer.sh altroprogetto --docker # forza .ddep se esiste anche .depsudo ./deployer.sh shareforces --init # primo checkout: clona e si ferma
sudo ./deployer.sh shareforces --checkout # aggiorna l'albero alla punta di BRANCH
sudo ./deployer.sh shareforces --env-refresh # ricostruisce gli .env dagli exampleNessuno dei tre esegue build, migrazioni o reload, e nessuno viene registrato
nello storico. --init clona solo se l'albero manca; --checkout aggiorna
anche quello esistente.
--env-refresh ricostruisce ogni .env del checkout con la struttura del
suo .env.example e i valori di quello esistente. Le chiavi non più previste
vengono scartate, ma restano nel backup datato.
./deployer.sh shareforces --history # i deploy registrati
sudo ./deployer.sh shareforces --rollback # torna al deploy precedente
sudo ./deployer.sh shareforces --no-rollback # su errore NON ripristina da solosudo ./deployer.sh --new # crea una config da zero (interattivo)
sudo ./deployer.sh shareforces --import # importa quella versionata nel progetto
sudo ./deployer.sh --import-all /opt/www/mono # tutte quelle che una repo espone
./deployer.sh --list # i progetti configurati
./deployer.sh shareforces --list-db # i set 'db:' dichiarati dalla configL'import prende dal progetto i passi del deploy (STACK, POST_INSTALL,
VERIFY, CONF_REVISION) e conserva ciò che descrive questa macchina:
TARGET_PATH, TARGET_USER/GROUP, REPO_SSH_KEY, NGINX_VHOST, SITE_URL
(in docker: PROJECT_ROOT, ENV_FILE, DOCKER_NETWORK). La copia nel progetto
resta intatta.
Prima di sovrascrivere salva un backup con timestamp
(progetto.dep.2026-10-31T09-14-22.bak) che si accumula, più un .bak
semplice che punta all'ultima versione. --import-all non pubblica: le config
arrivano, poi decidi tu cosa pubblicare.
cd /opt/deployer && sudo ./deployer.sh --update # aggiorna, poi verifica le config
./deployer.sh --check # verifica le config, senza aggiornare
./deployer.sh --help # riferimento completo
./deployer.sh --version # stampa la versione| Comando | Effetto |
|---|---|
<progetto> |
Pubblica il progetto |
<progetto> --init |
Primo checkout: clona la repo e si ferma, senza eseguire nulla |
<progetto> --checkout |
Aggiorna il codice e basta: porta l'albero alla punta di BRANCH |
<progetto> --env-refresh |
Ricostruisce gli .env dai rispettivi example, conservando i valori in uso |
<progetto> --rollback |
Ripubblica il commit del deploy precedente |
<progetto> --history |
Deploy registrati e target di --rollback |
<progetto> --list-db |
Elenca i set db: dichiarati dalla config |
<progetto> --import |
Importa la config versionata nel progetto, conservando i valori di questa macchina |
--new |
Crea una configurazione da zero, interattivo |
--import-all <checkout> |
Importa tutte le config che una repo espone (monorepo) |
--list |
Progetti configurati, con la loro modalità |
--update |
Aggiorna lo script, poi verifica le config |
--check |
Verifica le config contro la versione installata |
--help, -h |
Riferimento completo |
--version, -v |
Stampa la versione |
Si combinano e stanno in qualunque posizione.
| Opzione | Modalità | Effetto |
|---|---|---|
--bare / --docker |
entrambe | Forza .dep / .ddep: serve se esistono entrambi per lo stesso nome |
--no-db |
entrambe | Solo codice: salta i comandi marcati db: (migrazioni, seed) |
--db:<label> |
entrambe | Esegue solo i set db: indicati; ripetibile. Senza questa flag gira solo il set default: i set con label sono opt-in |
--no-git |
entrambe | Pubblica il codice già su disco, senza fetch |
--no-rollback |
entrambe | In caso di errore lascia l'albero alla versione fallita |
--dry-run |
entrambe | Stampa i passi senza cambiare nulla |
--no-build |
docker | Riavvia i container senza ricostruire l'immagine |
Se un progetto ha sia
<nome>.depsia<nome>.ddepla modalità è ambigua: lo strumento si ferma finché non scegli con--bareo--docker.
--rollbackripristina solo il codice: le migrazioni non si annullano rieseguendole, vanno dichiarate inROLLBACK_CMDS. Un secondo--rollbackva un passo più indietro, non torna al commit difettoso.
| Codice | Significato |
|---|---|
0 |
Operazione riuscita |
1 |
Errore: passo fallito, opzione sconosciuta, config non trovata o ambigua |
2 |
Invocazione senza progetto (stampa l'uso breve) |
| Variabile | Default | Significato |
|---|---|---|
DEPLOYER_CONF_DIR |
<script-dir>/.deps |
Cartella delle configurazioni |
DEPLOYER_STATE_DIR |
<script-dir>/.state |
Storico dei deploy (serve a --rollback) |
DEPLOYER_UPDATE_URL |
…/main/linux/debian/deployer.sh |
Sorgente di --update, es. un URL con token |
Lo strumento è generico: non contiene logica di un progetto specifico.
devops-deployer/
├── linux/debian/ lo strumento per Debian (la piattaforma è nel percorso)
│ ├── deployer.sh lo script (unica versione, entrambe le modalità)
│ └── .deps/ le configurazioni (nascosta: serve `ls -a`)
│ ├── example.dep template bare
│ └── example.ddep template docker
├── docs/DEPLOYER.md la guida: lo strumento + onboarding di un progetto
├── docs/tools-specs.md sviluppare i tool postdeploy / testenv
├── INSTALL.md installazione su Linux
├── CHANGELOG.md storico delle versioni
├── AI-facing.md istruzioni per agenti AI
└── README.md
Ogni progetto fornisce, nel proprio repository: la configurazione
(<progetto>.dep/.ddep), i tool richiamati dalla config (tipicamente
tools/postdeploy.sh e tools/testenv.php), e i vhost nginx (bare) o
Dockerfile/docker-compose.yml (docker).
Regola pratica: se un file sa cos'è il progetto → sta nel repo del progetto. Se è la meccanica del deploy uguale per tutti → sta qui.
AI-facing.md è il contratto in forma operativa: struttura da creare, modelli di configurazione, le sei regole che i tool devono rispettare e una checklist verificabile. È scritto per essere dato a un agente, non letto da una persona.
Primo passo: mettiglielo in mano. Il repository è privato, quindi l'agente non può scaricarlo da solo: copia il file nel repo del progetto, oppure incollane il contenuto nel prompt.
# dal repo del progetto da adeguare
curl -fsSL -o AI-facing.md \
https://raw.githubusercontent.com/sebyone/devops-deployer/main/AI-facing.mdSostituisci <progetto> e l'URL della repo. Il resto è deliberato: chiede
un'analisi prima delle modifiche, e la checklist come criterio di completamento.
Leggi AI-facing.md: è il contratto dello strumento di deploy `deployer.sh`
che pubblicherà questo progetto su un ambiente di test.
Adegua QUESTO repository a quel contratto.
1. Prima analizza il progetto e dimmi cosa hai dedotto, senza modificare nulla:
modalità (bare o docker), STACK, se serve una build, se c'è uno schema DB,
cosa scrive l'app a runtime. Motiva ogni deduzione con i file che l'hanno
suggerita.
2. Aspetta la mia conferma.
3. Poi crea la struttura e i file: la configurazione in
tools/devops/.deps/<progetto>.dep (o .ddep), il tool postdeploy e il
self-test testenv, seguendo le sei regole della sezione 4.
4. Chiudi verificando la checklist della sezione 7, voce per voce, e dimmi
quali punti non puoi soddisfare e perché.
Dati del progetto:
- nome: <progetto>
- repo: git@github.com:<org>/<progetto>.git
- ambiente di destinazione: test
Perché il passo 2. Le deduzioni della sezione 1 (modalità, STACK) decidono
tutto il resto: correggerle dopo significa rifare il lavoro. Se sbaglia lì, il
resto sarà coerentemente sbagliato.
Quando il progetto è già adeguato e vuoi solo un controllo:
Leggi AI-facing.md. Verifica questo repository contro la checklist della
sezione 7, voce per voce, senza modificare nulla. Per ogni voce rispondi
OK / NON CONFORME / NON APPLICABILE, e per le non conformi indica il file,
la riga e la correzione minima.
Leggi AI-facing.md, sezione 4 (contratto dei tool) e sezione 5 (idempotenza).
Rivedi tools/postdeploy.sh: deve uscire non-zero sui fallimenti, propagare
l'exit code dei processi figli e usare percorsi relativi alla root.
Non toccare altro.
L'agente non ha accesso al server: la prova finale resta manuale.
/opt/deployer/deployer.sh <progetto> --list-db # i set db: sono quelli attesi
sudo /opt/deployer/deployer.sh <progetto> --dry-run
sudo /opt/deployer/deployer.sh <progetto> --init
sudo /opt/deployer/deployer.sh <progetto> --no-dbTre cose che l'agente non deve fare, e che AI-facing.md gli dice esplicitamente: copiare
deployer.shdentro il progetto quando esiste già un'installazione centralizzata, inventare parametri di configurazione, far scrivere al deploy i vhost nginx o le unit systemd. Se le vedi nel risultato, il file non è stato letto.
- INSTALL.md — installare, configurare, aggiornare, disinstallare.
- docs/DEPLOYER.md — la guida in due parti: lo strumento
(parametri,
STACK, prerequisiti, troubleshooting) e rendere compatibile un progetto (struttura, toolpostdeploy/testenv, il contratto che devono rispettare). - docs/tools-specs.md — manuale per sviluppare i tool
postdeployetestenv: forma, helper, sottocomandi e le specificità di ogniSTACK. - CHANGELOG.md — storico delle versioni e note di migrazione.
- AI-facing.md — istruzioni per agenti AI che devono rendere un progetto conforme al contratto: struttura, config, tool, checklist verificabile.
./deployer.sh --help— sempre allineato alla versione installata.