@jumpgroup/laravel-tools 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +59 -0
- package/README.md +378 -0
- package/bin/groups/cache.js +52 -0
- package/bin/groups/database.js +105 -0
- package/bin/groups/forge.js +272 -0
- package/bin/groups/local.js +78 -0
- package/bin/groups/media.js +110 -0
- package/bin/tools.js +23 -0
- package/docs/Changelog.md +267 -0
- package/docs/TODO.md +167 -0
- package/docs/releases/release_0.0.1.md +116 -0
- package/docs/releases/release_0.0.2.md +88 -0
- package/docs/releases/release_0.0.3.md +58 -0
- package/docs/releases/release_0.0.4.md +128 -0
- package/docs/releases/release_0.0.5.md +77 -0
- package/docs/releases/release_0.0.6.md +80 -0
- package/docs/releases/release_1.0.0.md +61 -0
- package/docs/releases/release_1.0.1.md +18 -0
- package/docs/releases/release_1.0.2.md +18 -0
- package/docs/releases/release_1.0.3.md +19 -0
- package/docs/releases/release_1.1.0.md +18 -0
- package/docs/releases/release_1.1.1.md +17 -0
- package/docs/releases/release_1.1.2.md +18 -0
- package/docs/releases/release_1.1.3.md +21 -0
- package/docs/releases/release_1.1.4.md +18 -0
- package/docs/releases/release_1.1.5.md +18 -0
- package/docs/releases/release_1.1.6.md +21 -0
- package/docs/releases/release_1.1.7.md +17 -0
- package/docs/releases/release_2.0.0.md +192 -0
- package/docs/releases/release_2.0.1.md +53 -0
- package/docs/releases/release_2.0.2.md +55 -0
- package/docs/releases/release_2.0.3.md +69 -0
- package/docs/releases/release_2.1.0.md +59 -0
- package/docs/releases/release_2.2.0.md +83 -0
- package/docs/releases/release_2.2.1.md +36 -0
- package/docs/releases/release_2.2.2.md +57 -0
- package/docs/releases/release_2.2.3.md +39 -0
- package/docs/releases/release_2.2.4.md +75 -0
- package/docs/releases/release_2.2.5.md +69 -0
- package/docs/releases/release_3.0.0.md +87 -0
- package/docs/releases/release_3.0.1.md +65 -0
- package/docs/releases/release_3.1.0.md +90 -0
- package/docs/releases/release_3.2.0.md +74 -0
- package/docs/releases/release_3.3.0.md +72 -0
- package/package.json +35 -0
- package/src/aws/bucket.js +287 -0
- package/src/aws/cloudfront.js +433 -0
- package/src/aws/config.js +39 -0
- package/src/aws/iam.js +189 -0
- package/src/cache.js +49 -0
- package/src/database.js +315 -0
- package/src/forge/client.js +43 -0
- package/src/forge/config.js +33 -0
- package/src/forge/provisioning.js +191 -0
- package/src/forge/servers.js +27 -0
- package/src/forge/sites.js +93 -0
- package/src/google/groupMembers.js +35 -0
- package/src/google/utilities.js +39 -0
- package/src/local/doctor.js +214 -0
- package/src/local/setup.js +398 -0
- package/src/media.js +143 -0
- package/src/stub/docker/mysql/my.cnf +6 -0
- package/src/stub/docker/php/local.ini +4 -0
- package/src/stub/docker/traefik/dynamic_conf.yml +4 -0
- package/src/stub/docker/traefik/traefik.yml +24 -0
- package/src/stub/docker-compose/php8.0/docker-compose.yml +78 -0
- package/src/stub/docker-compose/php8.1/docker-compose.yml +78 -0
- package/src/stub/docker-compose/php8.2/docker-compose.yml +78 -0
- package/src/stub/docker-compose/php8.3/docker-compose.yml +78 -0
- package/src/stub/docker-compose/php8.4/docker-compose.yml +78 -0
- package/src/stub/docker-compose.yml +78 -0
- package/src/utilities/command.js +137 -0
- package/src/utilities/dateUtils.js +7 -0
- package/src/utilities/fileUtils.js +36 -0
- package/src/utilities/google-drive.js +69 -0
- package/src/utilities/pathUtils.js +15 -0
- package/src/utilities/userInput.js +28 -0
- package/src/utilities/utilities.js +57 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Release 2.2.4 — Prevenzione distribuzioni CloudFront duplicate e CDN lookup robusto
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-08
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Tre fix correlati al layer CloudFront che prevengono la creazione di
|
|
10
|
+
distribuzioni duplicate e rendono il lookup di quella esistente più
|
|
11
|
+
robusto in caso di tag AWS temporaneamente non disponibili.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Fixed
|
|
16
|
+
|
|
17
|
+
- **Prevenzione duplicati CloudFront** (`getDistributionsByProjectTag`):
|
|
18
|
+
- Il metodo usava solo il tag `site` per identificare la distribuzione
|
|
19
|
+
del progetto; se il tag lookup falliva, restituiva zero risultati
|
|
20
|
+
e il tool procedeva a crearne una nuova
|
|
21
|
+
- Aggiunto fallback su `comment` (`CDN for {projectName}`) quando
|
|
22
|
+
nessun match esatto per tag viene trovato
|
|
23
|
+
- Se il fallback per comment trova risultati, stampa un avviso
|
|
24
|
+
`⚠️ Tag lookup unavailable/incomplete`
|
|
25
|
+
- Se il lookup fallisce completamente ma ci sono errori di tag listing,
|
|
26
|
+
ora lancia un errore esplicito invece di procedere silenziosamente
|
|
27
|
+
|
|
28
|
+
- **CDN lookup deterministico** (`resolveOrCreateDistributionForProject`):
|
|
29
|
+
- Il lookup ora usa `getDistributionForProjectStrict` (nuova funzione)
|
|
30
|
+
che verifica sia tag/comment *sia* il dominio dell'origine S3,
|
|
31
|
+
riducendo drasticamente la probabilità di match ambigui o falsi
|
|
32
|
+
- La funzione supporta entrambi i formati di dominio S3
|
|
33
|
+
(regionale `bucket.s3.region.amazonaws.com` e globale
|
|
34
|
+
`bucket.s3.amazonaws.com`) tramite un set di candidati
|
|
35
|
+
- Se vengono trovate più distribuzioni candidate, stampa la tabella
|
|
36
|
+
e lancia un errore che richiede risoluzione manuale
|
|
37
|
+
|
|
38
|
+
- **Fix aws-sdk `PutObjectCommand`**:
|
|
39
|
+
- Il `Body` della chiave cartella S3 era passato come stringa vuota `''`;
|
|
40
|
+
alcune versioni dell'SDK lo rifiutavano come tipo non valido
|
|
41
|
+
- Sostituito con `Buffer.alloc(0)` per garantire compatibilità
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Added
|
|
46
|
+
|
|
47
|
+
- `getBucketOriginDomainCandidates()` in `src/aws/cloudfront.js`:
|
|
48
|
+
helper che restituisce un `Set` con i due possibili formati del dominio
|
|
49
|
+
S3 origin per un bucket (regionale + globale)
|
|
50
|
+
|
|
51
|
+
- `getDistributionForProjectStrict()` in `src/aws/cloudfront.js`:
|
|
52
|
+
lookup deterministico che combina match su origin domain, comment e tag
|
|
53
|
+
con gestione esplicita dei casi ambigui (0 match → `null`,
|
|
54
|
+
1 match → oggetto, 2+ match → errore)
|
|
55
|
+
|
|
56
|
+
- Campo `originDomainNames` nei row CloudFront restituiti da
|
|
57
|
+
`distributionToRow()`, per supportare il match sull'origin S3
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Files changed
|
|
62
|
+
|
|
63
|
+
- `src/aws/cloudfront.js`
|
|
64
|
+
- `src/aws/bucket.js`
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Impact
|
|
69
|
+
|
|
70
|
+
- Eliminato il rischio di creare distribuzioni CloudFront duplicate su
|
|
71
|
+
account dove il tag listing è temporaneamente degradato
|
|
72
|
+
- Il lookup della distribuzione esistente è ora vincolato all'origin S3
|
|
73
|
+
del progetto, rendendo l'idempotenza affidabile anche su account
|
|
74
|
+
con molte distribuzioni
|
|
75
|
+
- Fix compatibilità aws-sdk per la creazione della cartella S3 iniziale
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Release 2.2.5 — Laravel health check e recovery post-setup
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-23
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Migliora la fase finale di `local setup-laravel` con un health check esplicito
|
|
10
|
+
del bootstrap Laravel e un meccanismo di recovery automatico per i casi in cui
|
|
11
|
+
l'applicazione non si avvia correttamente dopo il setup.
|
|
12
|
+
|
|
13
|
+
Aggiunge anche una nuova utility `executeCommandWithOutput` che cattura stdout/stderr
|
|
14
|
+
dai comandi Docker, rendendo gli errori diagnosticabili invece di opachi.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Added
|
|
19
|
+
|
|
20
|
+
- `executeCommandWithOutput` in `src/utilities/command.js`:
|
|
21
|
+
nuovo helper che esegue un comando con stdio in pipe, restituisce stdout in caso
|
|
22
|
+
di successo, e include stderr (o stdout come fallback) nel messaggio di errore in
|
|
23
|
+
caso di exit code non-zero
|
|
24
|
+
|
|
25
|
+
- Health check Laravel post-setup tramite `php artisan about`:
|
|
26
|
+
verifica che il bootstrap dell'applicazione sia integro prima di procedere ai seeder
|
|
27
|
+
|
|
28
|
+
- Recovery automatico senza Filament (`runNoFilamentRecovery`):
|
|
29
|
+
se il health check fallisce su un progetto senza Filament, esegue automaticamente
|
|
30
|
+
`composer install`, `package:discover`, `storage:link`, `optimize:clear` e ripete
|
|
31
|
+
il check; se fallisce di nuovo, lancia un errore con output artisan incluso
|
|
32
|
+
|
|
33
|
+
- Log di conferma `✅ Bootstrap Laravel verificato.` (e variante `dopo recovery`)
|
|
34
|
+
al termine del health check riuscito
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Changed
|
|
39
|
+
|
|
40
|
+
- `runLaravelHealthCheck` ora usa `executeCommandWithOutput` invece di `executeCommand`
|
|
41
|
+
con `stdio: pipe`: l'output di artisan è ora visibile nei messaggi di errore
|
|
42
|
+
|
|
43
|
+
- `runNoFilamentRecovery` esegue ora anche `php artisan storage:link` tra
|
|
44
|
+
`package:discover` e `optimize:clear`, coprendo un caso comune di bootstrap rotto
|
|
45
|
+
|
|
46
|
+
- Errore in caso di health check fallito con Filament installato:
|
|
47
|
+
ora è un messaggio in italiano con indicazioni operative e output artisan allegato,
|
|
48
|
+
invece di un re-throw grezzo dal processo executor
|
|
49
|
+
|
|
50
|
+
- Errore in caso di recovery fallito (senza Filament):
|
|
51
|
+
ora include l'output artisan del secondo tentativo per facilitare la diagnosi
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Files changed
|
|
56
|
+
|
|
57
|
+
- `src/utilities/command.js`
|
|
58
|
+
- `src/local/setup.js`
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Impact
|
|
63
|
+
|
|
64
|
+
- I fallimenti di bootstrap Laravel sono ora diagnosticabili: l'output di artisan
|
|
65
|
+
appare direttamente nel messaggio di errore invece di sparire nel pipe
|
|
66
|
+
- Il recovery automatico riduce i casi in cui il developer deve rilanciareil setup
|
|
67
|
+
manualmente per progetti senza Filament
|
|
68
|
+
- `storage:link` aggiunto al recovery copre un caso comune di Laravel che non trova
|
|
69
|
+
la cartella pubblica dei file
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Release 3.0.0 — Gruppo comandi `forge`
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-23
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Introduce il gruppo comandi `forge`: integrazione diretta con Laravel Forge via API,
|
|
10
|
+
senza dipendenze PHP. Permette di gestire deploy, variabili d'ambiente e log
|
|
11
|
+
direttamente dal terminale, su qualsiasi progetto Laravel gestito da Forge.
|
|
12
|
+
|
|
13
|
+
L'integrazione punta alla nuova API Forge (`/api`), evitando deliberatamente
|
|
14
|
+
la versione legacy `/api/v1` deprecata e prevista per la dismissione il 30 giugno 2026.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Added
|
|
19
|
+
|
|
20
|
+
### Comandi
|
|
21
|
+
|
|
22
|
+
| Comando | Descrizione |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `forge token set` | Salva il token Forge API in `~/.laravel-tools` |
|
|
25
|
+
| `forge servers` | Elenca tutti i server dell'account Forge |
|
|
26
|
+
| `forge deploy` | Seleziona server → sito → avvia deploy |
|
|
27
|
+
| `forge env get` | Seleziona server → sito → stampa il `.env` remoto |
|
|
28
|
+
| `forge env set` | Seleziona server → sito → sovrascrive il `.env` remoto |
|
|
29
|
+
| `forge logs` | Seleziona server → sito → stampa il log dell'ultimo deploy |
|
|
30
|
+
|
|
31
|
+
### Moduli
|
|
32
|
+
|
|
33
|
+
- `src/forge/config.js` — lettura/scrittura `~/.laravel-tools` (JSON globale per credenziali);
|
|
34
|
+
errore esplicito in italiano se il token non è configurato
|
|
35
|
+
|
|
36
|
+
- `src/forge/client.js` — wrapper `fetch` verso `https://forge.laravel.com/api`;
|
|
37
|
+
mapping completo degli errori HTTP (401, 403, 404, 422, 429) in messaggi italiani
|
|
38
|
+
|
|
39
|
+
- `src/forge/servers.js` — `listServers()` e `pickServer()` interattivo via `@inquirer/select`
|
|
40
|
+
|
|
41
|
+
- `src/forge/sites.js` — `listSites()`, `pickSite()`, `deploySite()`, `getEnv()`, `setEnv()`,
|
|
42
|
+
`getDeploymentLog()` e prompt di conferma distruttiva per `env set`
|
|
43
|
+
|
|
44
|
+
- `bin/groups/forge.js` — wiring Commander per tutti i comandi del gruppo
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Design decisions
|
|
49
|
+
|
|
50
|
+
- **Token globale in `~/.laravel-tools`**: il token Forge è per account, non per progetto.
|
|
51
|
+
Viene salvato una sola volta sulla macchina del developer e riutilizzato su tutti i progetti.
|
|
52
|
+
|
|
53
|
+
- **Server/sito sempre interattivi**: il tool è usato su progetti diversi ogni volta,
|
|
54
|
+
quindi non ha senso memorizzare IDs in `laravel-tools.yml`.
|
|
55
|
+
|
|
56
|
+
- **Nessuna dipendenza aggiuntiva**: il client HTTP usa `fetch` nativo (Node 20+,
|
|
57
|
+
già requisito del progetto). Nessun package npm aggiunto.
|
|
58
|
+
|
|
59
|
+
- **Nuova API Forge (`/api`)**: la versione legacy `/api/v1` è deprecata.
|
|
60
|
+
Partire dalla nuova API evita una migrazione forzata entro giugno 2026.
|
|
61
|
+
|
|
62
|
+
- **`forge env set` è distruttivo**: sovrascrive completamente il `.env` remoto.
|
|
63
|
+
Il prompt di conferma è esplicito e in rosso:
|
|
64
|
+
`DISTRUTTIVO: Se confermi l'env remote verrà sovrascritto! Sicuro di voler continuare?`
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Files changed
|
|
69
|
+
|
|
70
|
+
- `src/forge/config.js` (nuovo)
|
|
71
|
+
- `src/forge/client.js` (nuovo)
|
|
72
|
+
- `src/forge/servers.js` (nuovo)
|
|
73
|
+
- `src/forge/sites.js` (nuovo)
|
|
74
|
+
- `bin/groups/forge.js` (nuovo)
|
|
75
|
+
- `bin/tools.js`
|
|
76
|
+
- `package.json`
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Impact
|
|
81
|
+
|
|
82
|
+
- I developer possono avviare deploy, leggere log e gestire variabili d'ambiente
|
|
83
|
+
Forge direttamente dal terminale senza aprire la UI web
|
|
84
|
+
- Nessuna dipendenza dal package PHP `laravel/forge-sdk`: l'integrazione è
|
|
85
|
+
implementata nativamente in Node.js
|
|
86
|
+
- L'architettura è predisposta per aggiungere nuovi comandi Forge senza toccare
|
|
87
|
+
il client o la configurazione
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Release 3.0.1 — Fix server path per Forge su AWS
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-23
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Corregge il path remoto usato dai comandi `database remote-export`,
|
|
10
|
+
`database remote-import` e `cache flush-remote`.
|
|
11
|
+
|
|
12
|
+
Il path precedente (`/var/www/{APP_NAME}/current`) era derivato dalla
|
|
13
|
+
convenzione Deployer e non corrisponde alla struttura reale dei server
|
|
14
|
+
gestiti da Laravel Forge, dove il path è basato sul dominio del sito
|
|
15
|
+
(es. `/home/forge/api.goego.it`).
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Fixed
|
|
20
|
+
|
|
21
|
+
- `getServerPath` non deriva più il path dall'`APP_NAME`: legge ora
|
|
22
|
+
il campo `path` da `laravel-tools.yml` per l'ambiente selezionato
|
|
23
|
+
- Se `path` non è configurato, lancia un errore esplicito con esempio
|
|
24
|
+
di configurazione
|
|
25
|
+
- `cache flush-remote` passava `appName` a `getServerPath` invece
|
|
26
|
+
di `env` — corretto
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Changed
|
|
31
|
+
|
|
32
|
+
- `getServerPath` spostato da `src/utilities/pathUtils.js` a
|
|
33
|
+
`src/utilities/command.js`, dove vivono già `getIp` e `getSshUser`
|
|
34
|
+
(stessa fonte di configurazione: `laravel-tools.yml`)
|
|
35
|
+
- `src/database.js` e `src/cache.js` aggiornati per importare
|
|
36
|
+
`getServerPath` da `command.js`
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Migration
|
|
41
|
+
|
|
42
|
+
Aggiungere `path` a ogni ambiente in `laravel-tools.yml`:
|
|
43
|
+
|
|
44
|
+
```yaml
|
|
45
|
+
staging:
|
|
46
|
+
host: 1.2.3.4
|
|
47
|
+
user: forge
|
|
48
|
+
path: /home/forge/staging.your-site.com
|
|
49
|
+
production:
|
|
50
|
+
host: 5.6.7.8
|
|
51
|
+
user: forge
|
|
52
|
+
path: /home/forge/your-site.com
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Il valore di `path` corrisponde al nome della directory del sito
|
|
56
|
+
visibile in **Forge → Server → Sites**.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Files changed
|
|
61
|
+
|
|
62
|
+
- `src/utilities/command.js`
|
|
63
|
+
- `src/utilities/pathUtils.js`
|
|
64
|
+
- `src/database.js`
|
|
65
|
+
- `src/cache.js`
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Release 3.1.0 — `forge server create`
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-24
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Aggiunge il comando `forge server create` per provisionare un nuovo server
|
|
10
|
+
AWS Lightsail tramite Forge API direttamente dal terminale.
|
|
11
|
+
|
|
12
|
+
Il comando supporta il pattern blue/green usato in azienda: quando esiste già
|
|
13
|
+
un server con lo stesso nome, auto-incrementa il suffisso (`myapp-staging` →
|
|
14
|
+
`myapp-staging-2` → `myapp-staging-3`) e chiede conferma prima di procedere.
|
|
15
|
+
Il passaggio dell'IP statico tra le istanze rimane manuale via AWS Console.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Added
|
|
20
|
+
|
|
21
|
+
### Comando
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
laravel-tools forge server create
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Flusso interattivo
|
|
28
|
+
|
|
29
|
+
1. Recupero automatico credenziale AWS da Forge (nessuna configurazione aggiuntiva)
|
|
30
|
+
2. Lettura versione PHP da `composer.json` → conversione al formato Forge (`php84` ecc.)
|
|
31
|
+
3. Lettura `APP_NAME` da `.env.example`
|
|
32
|
+
4. Selezione ambiente (`staging` / `production`) → nome base derivato (`{APP_NAME}-{env}`)
|
|
33
|
+
5. Risoluzione nome con auto-incremento se il nome esiste già su Forge
|
|
34
|
+
6. Conferma nome server prima di procedere
|
|
35
|
+
7. Selezione regione AWS (`eu-central-1` / `us-west-2`)
|
|
36
|
+
8. Recupero piani Lightsail disponibili via Forge API (fallback su lista standard se l'API non risponde)
|
|
37
|
+
9. Selezione piano (nano / micro / small / medium / large / xlarge)
|
|
38
|
+
10. Opzione Redis (default: no)
|
|
39
|
+
11. Creazione server → polling ogni 20s fino a provisioning completo (timeout 25 min)
|
|
40
|
+
12. Output: nome, IP, PHP, Redis, hint passo successivo
|
|
41
|
+
|
|
42
|
+
### Logica di naming per blue/green
|
|
43
|
+
|
|
44
|
+
| Servers esistenti | Nome assegnato |
|
|
45
|
+
|---|---|
|
|
46
|
+
| nessuno | `myapp-staging` |
|
|
47
|
+
| `myapp-staging` | `myapp-staging-2` |
|
|
48
|
+
| `myapp-staging`, `myapp-staging-2` | `myapp-staging-3` |
|
|
49
|
+
|
|
50
|
+
Il workflow aziendale prevede: spin up nuovo server → swap IP statico Lightsail
|
|
51
|
+
(manuale via AWS Console) → backup → delete del server precedente.
|
|
52
|
+
|
|
53
|
+
### Parametri server fissi
|
|
54
|
+
|
|
55
|
+
| Parametro | Valore |
|
|
56
|
+
|---|---|
|
|
57
|
+
| Provider | `aws` |
|
|
58
|
+
| Tipo | `app` |
|
|
59
|
+
| Database | MySQL 8 (`mysql8`) |
|
|
60
|
+
| Ubuntu | 24.04 |
|
|
61
|
+
|
|
62
|
+
### Nuovo modulo
|
|
63
|
+
|
|
64
|
+
- `src/forge/provisioning.js`:
|
|
65
|
+
- `getAwsCredential()` — trova la credenziale AWS nell'account Forge
|
|
66
|
+
- `getSizesForRegion()` — recupera i piani Lightsail via API con fallback
|
|
67
|
+
- `readPhpVersionFromComposer()` — legge e converte la versione PHP
|
|
68
|
+
- `readAppName()` — legge `APP_NAME` da `.env.example`
|
|
69
|
+
- `resolveServerName()` — auto-incrementa il nome se già in uso
|
|
70
|
+
- `promptServerConfig()` — flusso interattivo completo
|
|
71
|
+
- `createServer()` — chiama `POST /servers`
|
|
72
|
+
- `pollServerReady()` — polling con progress dots fino a `is_ready`
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Files changed
|
|
77
|
+
|
|
78
|
+
- `src/forge/provisioning.js` (nuovo)
|
|
79
|
+
- `bin/groups/forge.js`
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Impact
|
|
84
|
+
|
|
85
|
+
- Il provisioning di un nuovo server staging/production richiede ora
|
|
86
|
+
un solo comando invece di navigare la UI Forge
|
|
87
|
+
- Il pattern blue/green è gestito nativamente: nessun rischio di sovrascrivere
|
|
88
|
+
un server esistente per errore di naming
|
|
89
|
+
- La versione PHP viene letta dal progetto reale, eliminando il rischio
|
|
90
|
+
di disallineamento tra ambiente locale e server remoto
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Release 3.2.0 — `forge site create`
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-24
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Aggiunge il comando `forge site create` per collegare un sito Laravel
|
|
10
|
+
a un server Forge esistente e installare il repository Git in un unico flusso.
|
|
11
|
+
|
|
12
|
+
Insieme a `forge server create` (3.1.0), copre i due passi fondamentali
|
|
13
|
+
del provisioning di un nuovo ambiente staging/production:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
forge server create → forge site create → forge env set → forge deploy
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Added
|
|
22
|
+
|
|
23
|
+
### Comando
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
laravel-tools forge site create
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Flusso interattivo
|
|
30
|
+
|
|
31
|
+
1. Lettura PHP version da `composer.json` (stesso meccanismo di `forge server create`)
|
|
32
|
+
2. Lettura `APP_NAME` da `.env.example` → suggerisce nome database (`app_name`)
|
|
33
|
+
3. Selezione server esistente su Forge
|
|
34
|
+
4. Input dominio del sito (es. `staging.myapp.com`)
|
|
35
|
+
5. Input nome database (default: `APP_NAME` con trattini → underscore)
|
|
36
|
+
6. Selezione provider Git (GitHub / GitLab / Bitbucket)
|
|
37
|
+
7. Input repository in formato `org/repo`
|
|
38
|
+
8. Input branch (default: `main`)
|
|
39
|
+
9. Creazione sito via API → polling ogni 5s fino a `status=installed` (timeout 5 min)
|
|
40
|
+
10. Installazione repository Git + `composer install` automatico
|
|
41
|
+
11. Output riepilogo + hint passi successivi (`forge env set` → `forge deploy`)
|
|
42
|
+
|
|
43
|
+
### Parametri sito fissi
|
|
44
|
+
|
|
45
|
+
| Parametro | Valore |
|
|
46
|
+
|---|---|
|
|
47
|
+
| Tipo progetto | `php` |
|
|
48
|
+
| Web directory | `/public` |
|
|
49
|
+
| PHP version | letta da `composer.json` |
|
|
50
|
+
| Composer install | `true` |
|
|
51
|
+
|
|
52
|
+
### Nuove funzioni in `src/forge/sites.js`
|
|
53
|
+
|
|
54
|
+
- `createSite(serverId, payload)` — chiama `POST /servers/{id}/sites`
|
|
55
|
+
- `pollSiteInstalled(serverId, siteId)` — polling ogni 5s fino a `status=installed`
|
|
56
|
+
- `installGitRepo(serverId, siteId, payload)` — chiama `POST /servers/{id}/sites/{id}/git`
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Files changed
|
|
61
|
+
|
|
62
|
+
- `src/forge/sites.js`
|
|
63
|
+
- `bin/groups/forge.js`
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Impact
|
|
68
|
+
|
|
69
|
+
- Il setup di un nuovo sito su un server Forge esistente richiede ora
|
|
70
|
+
un solo comando guidato invece di navigare la UI
|
|
71
|
+
- Il repository Git viene collegato e `composer install` eseguito
|
|
72
|
+
automaticamente al termine della creazione del sito
|
|
73
|
+
- Il flusso `server create` → `site create` → `env set` → `deploy`
|
|
74
|
+
copre ora l'intero ciclo di provisioning di un nuovo ambiente
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Release 3.3.0 — `forge server delete` + convenzione domini
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-24
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Aggiunge `forge server delete` per eliminare un server Forge dalla CLI,
|
|
10
|
+
introduce la convenzione domini con prefisso `api.` in tutti gli ambienti,
|
|
11
|
+
e corregge un crash in `forge site create`.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Added
|
|
16
|
+
|
|
17
|
+
### `forge server delete`
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
laravel-tools forge server delete
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- Mostra lista server → selezione interattiva
|
|
24
|
+
- Avviso in rosso con nome e IP del server da eliminare
|
|
25
|
+
- Conferma distruttiva con default `N`
|
|
26
|
+
- Chiama `DELETE /servers/{id}` via Forge API
|
|
27
|
+
|
|
28
|
+
> Nota: Forge tenta di terminare anche l'istanza EC2 sottostante, ma può fallire silenziosamente se le credenziali AWS su Forge non hanno il permesso `ec2:TerminateInstances`. In quel caso, terminare l'istanza manualmente dalla console AWS o via `aws ec2 terminate-instances`.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Changed
|
|
33
|
+
|
|
34
|
+
### Convenzione domini — prefisso `api.`
|
|
35
|
+
|
|
36
|
+
Tutti i progetti Laravel creati con laravel-tools seguono ora la convenzione:
|
|
37
|
+
|
|
38
|
+
| Ambiente | Dominio |
|
|
39
|
+
|------------|----------------------------------|
|
|
40
|
+
| Locale | `api.{appName}.test` |
|
|
41
|
+
| Staging | `api.{appName}.sitointest.it` |
|
|
42
|
+
| Production | `api.{appName}.it` |
|
|
43
|
+
|
|
44
|
+
#### Locale (`local setup-repo`)
|
|
45
|
+
|
|
46
|
+
- Certificati SSL generati per `api.{appName}.test` (era `{appName}.test`)
|
|
47
|
+
- `/etc/hosts` aggiornato con `api.{appName}.test`
|
|
48
|
+
- `APP_URL` e `ASSETS_URL` in `.env.example` impostati a `https://api.{appName}.test`
|
|
49
|
+
|
|
50
|
+
#### Forge (`forge site create`)
|
|
51
|
+
|
|
52
|
+
- Il campo dominio si pre-compila automaticamente:
|
|
53
|
+
- Server con "staging" nel nome → `api.{appName}.sitointest.it`
|
|
54
|
+
- Server production → `api.{appName}.it`
|
|
55
|
+
- L'utente può modificare il valore prima di confermare
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Fixed
|
|
60
|
+
|
|
61
|
+
- Import mancante di `select` in `bin/groups/forge.js`: causava
|
|
62
|
+
`ReferenceError: select is not defined` durante `forge site create`
|
|
63
|
+
al passo di selezione del provider Git (GitHub/GitLab/Bitbucket)
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Files changed
|
|
68
|
+
|
|
69
|
+
- `src/forge/servers.js` — aggiunto `deleteServer(serverId)`
|
|
70
|
+
- `src/local/setup.js` — convenzione `api.` per dominio locale
|
|
71
|
+
- `bin/groups/forge.js` — comando `server delete`, default dominio `forge site create`, fix import `select`
|
|
72
|
+
- `package.json` — versione `3.3.0`
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jumpgroup/laravel-tools",
|
|
3
|
+
"version": "3.3.0",
|
|
4
|
+
"description": "CLI tool for managing the full lifecycle of Laravel projects at JumpGroup",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"laravel-tools": "bin/tools.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"start": "node bin/tools.js"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@aws-sdk/client-cloudfront": "^3.924.0",
|
|
14
|
+
"@aws-sdk/client-iam": "^3.924.0",
|
|
15
|
+
"@aws-sdk/client-s3": "^3.924.0",
|
|
16
|
+
"@aws-sdk/client-sts": "^3.924.0",
|
|
17
|
+
"@aws-sdk/credential-provider-ini": "^3.924.0",
|
|
18
|
+
"@inquirer/prompts": "^1.1.3",
|
|
19
|
+
"@inquirer/select": "^1.2.6",
|
|
20
|
+
"@jumpgroup/secret-fetcher": "^2.1.0",
|
|
21
|
+
"cli-table3": "^0.6.3",
|
|
22
|
+
"commander": "^10.0.0",
|
|
23
|
+
"dotenv": "^16.0.0",
|
|
24
|
+
"glob": "^10.2.2",
|
|
25
|
+
"hostile": "^1.3.3",
|
|
26
|
+
"js-yaml": "^4.1.0",
|
|
27
|
+
"keytar": "^7.9.0"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
}
|
|
35
|
+
}
|