cipi app create

cipi app create supporta due tipi di app: Laravel (predefinito) e Custom (--custom). Le app Laravel ottengono un ambiente completamente isolato: utente Linux, pool PHP-FPM oppure Laravel Octane (FrankenPHP) dalla v5.0, vhost Nginx, database (MariaDB di default; PostgreSQL opzionale dalla v4.8.0), queue worker Supervisor, voce crontab, release Deployer zero-downtime, chiave deploy SSH e .env compilato automaticamente. Le app personalizzate sono più semplici — vedi app personalizzate per i dettagli.

App Laravel (predefinita — PHP-FPM)

bash
$ cipi app create

Laravel Octane (FrankenPHP)

bash
$ cipi app create --octane
$ cipi app create --octane=frankenphp   # explicit (same as --octane)

Vedi Laravel Octane per i requisiti, la conversione e come il vhost differisce da FPM.

Non interattivo (flag)

bash
$ cipi app create \
    --user=myapp \
    --domain=myapp.com \
    --repository=git@github.com:you/myapp.git \
    --branch=main \
    --php=8.5

# Laravel Octane (FrankenPHP) — v5.0+
$ cipi app create --user=myapp --domain=myapp.com \
    --repository=git@github.com:you/myapp.git --octane

# optional PostgreSQL (v4.8.0+, after cipi db install pgsql)
$ cipi app create --user=myapp --domain=myapp.com \
    --repository=git@github.com:you/myapp.git --engine=pgsql
--userNome utente Linux per l'app. Deve essere univoco, minuscolo, alfanumerico.
--domainDominio principale (es. myapp.com). Usato per il vhost Nginx e APP_URL.
--repositoryURL Git SSH (es. git@github.com:you/repo.git). Deve essere SSH, non HTTPS.
--branchBranch da deployare. Predefinito: main.
--phpVersione PHP per questa app (es. 8.5). Predefinito PHP 8.5. Deve essere una versione installata — solo 8.3, 8.4 e 8.5 sono accettate dalla v4.5.4 (Deployer 8 richiede PHP ≥ 8.3).
--octane / --octane=frankenphpServe HTTP via Laravel Octane (FrankenPHP) invece di PHP-FPM (dalla v5.0). Solo app Laravel — rifiutato con --custom. Vedi Laravel Octane.
--engineMotore database: mariadb (predefinito) o pgsql (dalla v4.8.0; richiede cipi db install pgsql). La creazione interattiva chiede quando PostgreSQL è installato. Scrive .env / URL di connessione corrispondenti.
Se è configurato un token GitHub o GitLab, Cipi aggiunge automaticamente la chiave deploy SSH e crea il webhook sul repository — nessun passaggio manuale. Vedi Git auto-setup per le istruzioni di configurazione e le opzioni di fallback quando l'auto-configurazione non è disponibile.

Laravel Octane (FrankenPHP)

Dalla v5.0, le app Laravel possono servire HTTP via Laravel Octane con il server FrankenPHP invece di un pool PHP-FPM per app. Octane e le app FPM classiche convivono sullo stesso server Cipi.

Cosa configura Cipi

  • Alloca una porta localhost in 8100–8999 e salva octane / octane_port in apps.json
  • Il vhost Nginx usa proxy_pass verso Octane e serve i file statici da current/publicnessun pool FPM per app
  • Programma Supervisor ${app}-octane accanto ai queue worker
  • Il template Deployer laravel-octane.php riavvia / ricarica Octane al deploy
  • .env: OCTANE_SERVER=frankenphp, OCTANE_HTTPS=true

Requisiti dell'app

Il tuo repository Laravel deve includere laravel/octane ed eseguire php artisan octane:install --server=frankenphp. Octane parte dopo il primo deploy riuscito.

bash
# create an Octane app
$ cipi app create --user=myapp --domain=myapp.com \
    --repository=git@github.com:you/myapp.git --octane

# convert an existing FPM app → Octane (or the reverse)
$ cipi app convert myapp --to=octane
$ cipi app convert myapp --to=fpm

# tune Octane workers (also see app limits)
$ cipi app limits myapp --octane-workers=4

cipi app convert --to=octane|fpm riscrive pool / vhost / Supervisor / template Deployer / .env e riapplica SSL quando un certificato è già presente.

Suggerimento Octane: mantieni il lavoro queue di lunga durata su cipi worker o Horizon — Octane gestisce solo HTTP. Abbinalo a Reverb per i WebSocket.

cipi app create --custom

Crea un'app personalizzata con deploy classico (senza zero-downtime): il codice viene deployato in htdocs — nessun symlink current/shared. Ideale per siti statici, SPA (Vue, React, Svelte), WordPress, altri CMS o qualsiasi progetto PHP non Laravel o framework.

Durante la creazione scegli solo la document root (predefinito /, oppure es. www, dist, public). Nginx è preconfigurato con index index.html index.php, try_files $uri $uri/ /index.php?$args e error_page 404 /404.html — nessuna richiesta per try_files o entry point.

Git opzionale (solo SFTP)

Il repository Git è opzionale per le app personalizzate. Le app Laravel richiedono ancora un repository. Se salti il repository per un'app personalizzata, Cipi crea /home/<app>/htdocs con un index.html segnaposto e non configura chiave deploy o webhook — carichi i file con SFTP (o SCP/rsync) in ~/htdocs come utente dell'app. L'output di onboarding spiega questo flusso “no repo — solo SFTP”. Se fornisci un repository, il comportamento resta invariato: usa cipi deploy <app> per scaricare il codice in htdocs.

Cosa è incluso e cosa aggiungi tu

Le app personalizzate non hanno database, nessun .env, nessun cron e nessun queue worker. Quando un repository è configurato, vengono mostrati chiave deploy e (con Git auto-setup) webhook; per le app solo SFTP, vengono omessi. Il riepilogo post-creazione elenca l'accesso SSH e i passi successivi di conseguenza.

Se la tua app personalizzata necessita di un database (es. WordPress, Drupal), creane uno con cipi db create --name=<app> dopo il deploy. Vedi cipi db per backup, restore e gestione password.

Con Git — esempio non interattivo:

bash
$ cipi app create --custom --user=mysite --domain=mysite.com \
    --repository=git@github.com:you/mysite.git --docroot=dist

Solo SFTP — ometti --repository e --branch:

bash
$ cipi app create --custom --user=mysite --domain=mysite.com --docroot=dist

Con un repository, usa cipi deploy <app> per fare il deploy; il codice viene clonato in /home/<app>/htdocs.

app list / app show / app edit / app delete

Comando Descrizione
cipi app list Elenca tutte le app con dominio, versione PHP e stato ((suspended) quando offline)
cipi app show <app> Dettagli completi: dominio, PHP, chiave deploy, worker, webhook, stato sospensione. Per app personalizzate: tipo "Custom", docroot; webhook (e chiave deploy) omessi quando solo SFTP senza repository.
cipi app edit <app> --php=8.5 Cambia versione PHP a caldo. Aggiorna pool FPM, socket Nginx, Supervisor, crontab, config Deployer e .env — zero downtime
cipi app edit <app> --branch=develop Cambia il branch di deploy
cipi app edit <app> --domain=new.example.com Rinomina il dominio principale (dalla v4.6.2). Valida formato e univocità, sposta il vecchio principale tra gli alias, rigenera il vhost Nginx, aggiorna APP_URL, aggiorna i webhook Git quando auto-configurati e riemette Let's Encrypt quando un certificato esisteva già
cipi app edit <app> --repository=<SSH-URL> Collega o cambia il repository Git (es. abilita il deploy su un'app personalizzata solo SFTP creata senza --repository). Componibile con --branch, --php e --domain
cipi app edit <app> --node-build='npm ci && npm run build' Esegue una build Node dopo i vendor Composer a ogni deploy (dalla v5.0). Deployer esegue .deployer/node-build.sh (fail-closed; il comando è validato). Rimuovi con --no-node-build
cipi app convert <app> --to=octane|fpm Converti tra PHP-FPM e Laravel Octane (dalla v5.0). Vedi Laravel Octane
cipi app env <app> Apre il file .env dell'app in nano come utente dell'app. Esce con errore per app personalizzate (nessun .env).
cipi app reset-password <app> Rigenera la password SSH dell'utente Linux dell'app. La nuova password viene mostrata a schermo — salvala subito
cipi app reset-db-password <app> Rigenera la password del database dell'app (MariaDB o PostgreSQL per engine dell'app) e aggiorna automaticamente DB_PASSWORD nel .env dell'app. Esce con errore per app personalizzate (nessun database).
cipi app delete <app> Rimuove definitivamente l'app, l'utente, il database (se Laravel), il vhost Nginx, il pool FPM e i queue worker Supervisor. Per app personalizzate, salta l'eliminazione del database (non ne è stato creato uno). Chiede conferma.
cipi app delete <app> --force Come delete ma salta la richiesta di conferma — per script, l'API del pannello e cipi-cli

cipi app reverb

Dalla v5.0, abilita Laravel Reverb per WebSocket first-party su un'app Laravel. Cipi alloca una porta localhost in 9000–9099, aggiunge il programma Supervisor ${app}-reverb, fa proxy Nginx di /app su quella porta e scrive REVERB_* in .env.

bash
$ cipi app reverb enable myapp
$ cipi app reverb status myapp
$ cipi app reverb disable myapp

cipi app clone

Dalla v5.0, clona un'app Laravel esistente in una nuova app staging (o review) con dominio proprio. Imposta cloned_from in apps.json; non copia webhook o ID git.

bash
$ cipi app clone myapp --domain=staging.myapp.com
$ cipi app clone myapp --domain=staging.myapp.com --name=myapp-stg --branch=develop --with-db
$ cipi app clone myapp --domain=staging.myapp.com --no-db
--domainObbligatorio. Dominio principale per la nuova app.
--nameNome utente Linux opzionale per il clone.
--branchBranch di deploy per il clone (predefinito: branch dell'app sorgente).
--with-dbCrea un database nuovo per il clone.
--no-dbSalta il provisioning del database per il clone.

cipi app limits

Dalla v5.0, imposta limiti di risorse per app con cap rigidi applicati da Cipi.

bash
$ cipi app limits myapp --fpm-max-children=20 --memory-limit=256M
$ cipi app limits myapp --octane-workers=4 --worker-procs=3
$ cipi app limits myapp   # show current limits
--fpm-max-childrenpm.max_children PHP-FPM per app FPM.
--memory-limitmemory_limit PHP.
--octane-workersNumero worker Octane per app FrankenPHP.
--worker-procsNumero processi queue worker Supervisor.

app suspend / app unsuspend

Disponibile dalla v4.5.8. Metti un'app offline senza eliminarla — utile per blocchi di fatturazione, finestre di manutenzione o siti staging che vuoi completamente spenti. La sospensione sostituisce il vhost Nginx con una pagina statica HTTP 503 servita da /var/www/cipi-suspended/.

bash
$ cipi app suspend myapp      # take offline (503 page)
$ cipi app unsuspend myapp    # restore normal vhost
Comando Descrizione
cipi app suspend <app> Imposta suspended: true in apps.json, ricostruisce il vhost per restituire 503 a tutte le richieste. Idempotente se già sospesa.
cipi app unsuspend <app> Rimuove il flag, ripristina il vhost Laravel/personalizzato normale e riapplica i blocchi SSL. Idempotente se già online.

Comportamento

  • HTTPS incluso — certbot clona il vhost di sospensione nel blocco :443, quindi anche HTTPS mostra la pagina offline
  • Let's Encrypt funziona ancora — il percorso /.well-known/acme-challenge/ resta pubblico così i certificati possono essere emessi o rinnovati mentre l'app è sospesa
  • Sopravvive alla rigenerazione del vhost — cambi alias, modifiche PHP e installazioni SSL rispettano il flag suspended
  • Visibile negli elenchicipi app list segna le app sospese; cipi domains aggiunge ⏸ suspended su ogni riga
Sospensione vs basic auth: cipi basicauth mostra un prompt di login ma esegue ancora la tua app. app suspend ferma PHP del tutto e serve una pagina offline statica — i visitatori non raggiungono mai Laravel. Usa suspend per “sito chiuso”; basic auth per “anteprima su invito”.

Disponibile anche via REST API (POST /api/apps/{name}/suspend), cipi-cli (apps suspend) e il modulo WHMCS (pulsanti Suspend / Unsuspend). Richiede l'abilità token apps-suspend per l'accesso API.

cipi basicauth

Disponibile dalla v4.5.2. Proteggi qualsiasi app — Laravel o personalizzata — dietro un prompt username/password Nginx. Utile per siti staging, tool interni o app non ancora pronte al traffico pubblico.

Comando Descrizione
cipi basicauth enable <app> [--user=NAME] [--password=PASS] Attiva HTTP basic auth. Le credenziali vengono generate se omesse e mostrate una sola volta a schermo — salvale subito
cipi basicauth disable <app> Rimuove il prompt e cancella le credenziali salvate
cipi basicauth status <app> Mostra se basic auth è attivo e l'utente configurato

Le credenziali sono hashate con openssl passwd -apr1 (non serve apache2-utils) e salvate in /etc/nginx/cipi-basicauth/<app>.htpasswd; lo stato attivo è in apps.json. Le direttive auth_basic sono iniettate per blocco location, quindi la protezione sopravvive alla rigenerazione del vhost (cambi alias, modifiche PHP) ed è clonata nel blocco :443 da certbot — HTTPS coperto. Le challenge ACME restano pubbliche, quindi emissione e rinnovo certificati non sono mai bloccati. Basic auth viene rimosso automaticamente con cipi app delete.

È distinto da cipi auth, che gestisce il auth.json di Composer per repository di pacchetti privati.

Gestione variabili ENV

Ogni app Laravel ha un unico file .env in /home/<app>/shared/.env. Le app personalizzate non hanno .env. Viene creato e precompilato da Cipi durante app create con credenziali database, APP_KEY, APP_URL, impostazioni cache/session/queue e token webhook. La directory shared/ è symlinkata in ogni release, quindi lo stesso .env è sempre attivo indipendentemente dalla release corrente.

Modifica interattiva via CLI

Il modo più sicuro per cambiare valori ENV è tramite Cipi — apre il file in nano come utente dell'app, con i permessi corretti:

bash
$ cipi app env myapp

Salva con Ctrl+O poi esci con Ctrl+X. Le modifiche hanno effetto immediato per le nuove richieste — nessun restart per la maggior parte dei valori. Se cambi connessione queue o driver cache, riavvia i worker:

bash
$ cipi worker restart myapp

Modifica direttamente via SSH

Puoi anche modificare il file direttamente via SSH come root o come utente dell'app:

bash
# as root
$ nano /home/myapp/shared/.env

# or switch to the app user first
$ su - myapp
$ nano ~/shared/.env

Variabili ENV chiave impostate da Cipi

Variabile Descrizione Impostata da
APP_KEY Chiave di crittografia Laravel — generata una volta alla creazione dell'app Cipi
APP_URL Aggiornata automaticamente da cipi ssl install Cipi
DB_CONNECTION mysql per MariaDB (compatibile drop-in), o pgsql quando il motore dell'app è PostgreSQL (v4.8.0+) Cipi
DB_DATABASE / DB_USERNAME / DB_PASSWORD Credenziali generate automaticamente per il database isolato dell'app Cipi
CACHE_STORE database — usa il database dell'app Cipi
SESSION_DRIVER database Cipi
QUEUE_CONNECTION database Cipi
CIPI_WEBHOOK_TOKEN Segreto HMAC per la validazione webhook cipi-agent Cipi
CIPI_APP_USER Nome utente Linux proprietario di questa app Cipi
CIPI_MCP Abilita o disabilita il server MCP integrato su /cipi/mcp Utente (true predefinito)
Non cambiare manualmente le credenziali DB. Se devi rigenerare la password del database usa cipi db password myapp (o cipi app reset-db-password myapp) — aggiorna motore e .env in modo atomico. Modificarle a mano rischia di lasciare i due fuori sincrono.

Aggiungere le tue variabili

Aggiungi qualsiasi variabile personalizzata in fondo al file come faresti normalmente in un progetto Laravel. Sono preservate tra i deploy perché il .env vive in shared/ e non viene mai sovrascritto da Deployer.

env
# your custom variables
STRIPE_KEY=sk_live_...
STRIPE_SECRET=sk_live_...
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailgun.org

cipi app logs

Segui i log applicativi in tempo reale. I log ruotano giornalmente e restano 14 giorni. Per default vengono mostrati tutti i log inclusi i log giornalieri Laravel (laravel-YYYY-MM-DD.log) da shared/storage/logs/.

bash
$ cipi app logs myapp                  # all logs (incl. Laravel daily logs)
$ cipi app logs myapp --type=nginx     # Nginx access + error
$ cipi app logs myapp --type=php       # PHP-FPM errors
$ cipi app logs myapp --type=worker    # queue worker output
$ cipi app logs myapp --type=deploy    # deploy history
$ cipi app logs myapp --type=laravel   # Laravel application logs
--type=nginxLog accesso ed errore Nginx
--type=phpLog errori PHP-FPM
--type=workerOutput Supervisor / queue worker
--type=deployOutput Deployer — cronologia deploy completa con timestamp
--type=laravelLog applicativi Laravel da shared/storage/logs/ (rotazione giornaliera laravel-YYYY-MM-DD.log)

app artisan & app tinker

Esegui comandi Artisan e Tinker come utente dell'app con la versione PHP corretta e contesto open_basedir — esattamente come girerebbero durante un deploy.

bash
$ cipi app artisan myapp migrate:status
$ cipi app artisan myapp queue:retry all
$ cipi app artisan myapp db:seed --class=ProductionSeeder
$ cipi app artisan myapp cache:clear
$ cipi app tinker myapp

SSH come utente dell'app

Ogni app gira sotto un utente Linux isolato. A volte devi lavorare direttamente nell'ambiente di quell'utente — ispezionare file, eseguire script one-off o debuggare qualcosa che si riproduce solo come utente corretto.

SSH diretto come utente dell'app (consigliato)

Gli utenti app possono fare SSH direttamente al server con la password generata alla creazione dell'app:

bash
# connect as the app user (password auth)
$ ssh myapp@your-server-ip

# you are directly inside the app user's shell
myapp@server:~$ pwd
/home/myapp

myapp@server:~$ cd ~/current
myapp@server:~$ ls

La password viene mostrata quando l'app viene creata (o usa cipi app reset-password myapp per rigenerarla). Funziona per client SFTP, sessioni remote IDE e accesso terminale.

Via cipi (percorso admin)

Se sei già connesso come cipi, puoi passare direttamente a qualsiasi utente app:

bash
$ ssh cipi@your-server-ip
cipi@server:~$ sudo su - myapp

myapp@server:~$ pwd
/home/myapp

Reimposta la password dell'utente app

Se devi rigenerare la password di un utente app (es. per SSH diretto o SFTP), usa:

bash
$ cipi app reset-password myapp

La nuova password viene mostrata a schermo — salvala subito.

Comandi utili una volta loggato come utente app

bash
# navigate to the active release
myapp@server:~$ cd ~/current

# run artisan directly with the correct PHP version
myapp@server:~$ /usr/bin/php8.5 ~/current/artisan tinker

# inspect the shared .env
myapp@server:~$ cat ~/shared/.env

# tail all logs
myapp@server:~$ tail -f ~/logs/*.log

# check active releases (ll is a built-in alias for ls -al)
myapp@server:~$ ll ~/releases/

Il .bashrc di ogni utente app definisce un comodo alias ll='ls -al' (dalla v4.5.5) per elenchi directory più rapidi via SSH, insieme alle scorciatoie deploy e composer. Le app create prima della 4.5.5 ricevono l'alias ll automaticamente al prossimo cipi self-update via la migrazione 4.5.5.

La restrizione open_basedir dell'utente app limita PHP a /home/myapp. È applicata a livello PHP-FPM, non a livello shell — puoi accedere a qualsiasi file leggibile dal tuo utente shell quando lavori nel terminale.