Commencer
Installation de Cipi
Cipi installe une pile de production complète prête pour Laravel sur Ubuntu 24.04 ou 26.04 avec un seul
commande. Le programme d'installation prend environ 10 minutes et configure Nginx, MariaDB, PHP, Valkey
(en option PostgreSQL viacipi db install pgsql après l'installation),
Supervisor, Fail2ban, UFW, Certbot, Deployer et le cipi CLI lui-même.
De zéro à la production en trois étapes
# 1 — on a fresh Ubuntu 24.04 / 26.04 VPS, over SSH, as a user with sudo wget -O - https://cipi.sh/setup.sh | bash # 2 — create the app (Laravel by default) cipi app create # 3 — deploy it and put it behind HTTPS cipi deploy myapp cipi ssl install myapp
C'est tout le chemin. Créez d’abord une clé SSH sur votre ordinateur (ci-dessous), puis exécutez le programme d’installation sur le serveur – il vous demandera de coller cette clé publique. Tout ce qui suit est expliqué dans le reste de cette page.
sudo. Cipi provisionne toute la boîte — elle
n'est pas quelque chose que vous pointez vers un hôte distant depuis votre ordinateur portable.Créez une clé SSH sur votre ordinateur
Fais ceci sur votre ordinateur portable ou votre poste de travail, pas sur le VPS. L'installateur a besoin du
publique la moitié de la clé pour qu'il puisse verrouiller le serveur : après la configuration, vous vous connectez en SSH en tant que
le cipi utilisateur avec cette clé. La connexion racine SSH est désactivée. Ne collez jamais le privé
clé.
Vérifiez si vous en avez déjà un :
ls ~/.ssh/*.pub
Si id_ed25519.pub ou id_rsa.pub est répertorié, vous avez déjà une clé – ignorer
génération et copiez le fichier public avec la commande ci-dessous. Si le dossier est vide ou si la commande
erreurs, créez une nouvelle clé Ed25519 :
ssh-keygen -t ed25519 -C "you@example.com"
Appuyez sur Entrée pour accepter le chemin par défaut (~/.ssh/id_ed25519). Définissez une phrase secrète si vous
souhaitez (recommandé). Sur macOS et Linux, exécutez-le dans Terminal ; sous Windows, utilisez PowerShell ou WSL.
Afficher la clé publique : il s'agit de la ligne unique que vous collerez lorsque le programme d'installation vous demandera :
cat ~/.ssh/id_ed25519.pub
On dirait ssh-ed25519 AAAA… comment. Copiez toute la ligne :
- macOS :
pbcopy < ~/.ssh/id_ed25519.pub - Linux :
xclip -sel clip < ~/.ssh/id_ed25519.pub(ou une copie du borne) - Windows (PowerShell) :
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard
.pub le fichier est public. Le fichier nommé id_ed25519 (non
extension) est le privé clé - conservez-la sur votre ordinateur et ne la collez jamais
dans le programme d'installation ou envoyez-le au serveur.Exécutez le programme d'installation sur le serveur
SSH dans le nouveau Ubuntu VPS en tant qu'utilisateur avec sudo, alors :
wget -O - https://cipi.sh/setup.sh | bash
L'assistant demande la clé publique avant qu'un paquet ne soit installé. Collez la ligne
vous avez copié ci-dessus (formats acceptés : ssh-ed25519, ssh-rsa,
ecdsa). Cipi nettoie les commentaires, les retours chariot et les espaces supplémentaires, puis crée
un dédié cipi Utilisateur Linux pour accès administrateur SSH et renforce SSH :
connexion root désactivée, cipi clé publique uniquement (groupe cipi-ssh), les utilisateurs de l'application
(groupe cipi-apps) peut se connecter avec un mot de passe. Les tentatives de connexion sont limitées à 3 avec un
Délai de grâce de 20 secondes ; Le transfert X11 est désactivé.
Le programme d'installation génère également un mot de passe root aléatoire de 40 caractères, le stocke dans
/etc/cipi/server.json, et l'affiche dans le résumé de l'installation. C'est pas
un mot de passe SSH : la connexion root SSH est désactivée. C'est ce que vous tapez lorsque vous êtes déjà connecté en tant que
cipi utilisateur avec votre clé, vous exécutez su root. Gardez-le dans un mot de passe
gérant.
Installation non interactive
Pour les configurations automatisées, transmettez votre clé publique SSH via le SSH_PUBKEY variable d'environnement
pour ignorer l'invite interactive :
SSH_PUBKEY="ssh-ed25519 AAAA..." wget -O - https://cipi.sh/setup.sh | bash
AWS (connexion root désactivée par défaut)
$ ssh ubuntu@your-server-ip $ sudo -s $ wget -O - https://cipi.sh/setup.sh | bash
A la fin de l'installation, vous verrez un écran récapitulatif avec les détails d'accès SSH, le
le mot de passe root généré automatiquement et le mot de passe root MariaDB.
Enregistrez-les immédiatement — ils ne sont affichés qu'une seule fois. Les informations d'identification sont stockées dans
/etc/cipi/server.json, qui — comme tous les fichiers de configuration Cipi — est
chiffré au repos en utilisant AES-256-CBC via le Coffre-fort
système. Identifiants, clés SSH, .env les fichiers et les sauvegardes de base de données sont protégés à la fois sur
disque
et pendant le transfert (via Synchroniser archives cryptées). Cipi applique également
Conservation des journaux conforme au RGPD avec des politiques de rotation automatique pour les candidatures,
sécurité et HTTP journaux — voir Conservation des journaux pour plus de détails.
/etc/cipi/server.json.Accès post-installation
Après l'installation, accès administrateur utilise l'authentification par clé publique comme
cipi utilisateur (la connexion root est désactivée). Utilisateurs de l'application peut SSH directement avec
ssh myapp@server-ip et le mot de passe généré lors de la création de l'application. Pour courir
cipi commandes ou effectuer toute tâche administrative, connectez-vous en tant que cipiet
puis escalader :
# 1. connect to the server (key-based auth only) $ ssh cipi@your-server-ip # 2. escalate to root to run cipi commands cipi@server:~$ sudo -s # 3. now you can use all cipi commands root@server:~# cipi status root@server:~# cipi app list # 4. to work as an app user, switch with su root@server:~# su - myapp
Exigences
- Ubuntu 24.04 ou 26.04 LTS (nouvelles installations uniquement ; les versions intermédiaires ne sont pas prises en charge)
- Accès root (ou
sudo -ssur AWS) - Ports 22, 80 et 443 ouverts
- Un serveur propre — n'installez pas Cipi sur un serveur avec une pile Web existante
- A serveur public accessible sur Internet avec un routable IPv4 publique adresse— NAT uniquement VPS, réseaux domestiques derrière un routeur et hôtes inaccessibles depuis Internet n'est pas pris en charge
- Virtualisation KVM complète ou bare metal — pas Conteneurs OpenVZ, LXC ou noyau partagé environnements (y compris locaux Docker, Docker Desktop, OrbStack, Colima, WSL et similaires) environnements d'exécution de conteneurs de bureau)
Cipi est testé et fonctionne sur : DigitalOcean, AWS EC2, Vultr, Linode/Akamai, Hetzner, Google Cloud, OVH, Scaleway et tout hôte KVM ou bare metal exécutant Ubuntu avec une IP publique.
Démarrage rapide
1. Créez votre première application
L'assistant interactif demande un nom d'utilisateur, un domaine principal, l'URL du référentiel Git (format SSH) et
branche
le cas échéant, et version PHP. Les applications Laravel nécessitent toujours un référentiel ; pour
personnalisé
applications, vous pouvez laisser le référentiel vide pour héberger le site via SFTP uniquement - voirapplications personnalisées. Depuis v5.0, Laravel applications peuvent utiliser
classique PHP-FPM ou Laravel Octane (FrankenPHP) avec
--octane — voir Laravel Octane.
$ cipi app create $ cipi app create --octane # Laravel Octane (FrankenPHP)
Ou passez tous les indicateurs directement pour ignorer le mode interactif :
$ cipi app create \
--user=myapp \
--domain=myapp.com \
--repository=git@github.com:you/myapp.git \
--branch=main \
--php=8.5
À la fin, Cipi imprime un résumé des informations d'identification — enregistrez-le, affiché une seule fois — y compris
l'adresse IP publique du serveur (pour la configuration DNS), la clé de déploiement SSH, les identifiants de la base de données,
un prêt à l'emploi mariadb+ssh:// URL de connexion pour GUI clients (TablePlus, DBeaver,
Sequel Pro), webhook URL et webhook jeton.
2. Ajoutez la clé de déploiement à votre fournisseur Git
Si vous avez configuré un token GitHub ou GitLab via cipi git, cette étape est
automatique — Cipi ajoute la clé de déploiement et crée le webhook pour vous. Voir
Configuration automatique de Git pour plus de détails.
Sinon, copiez le ssh-ed25519 ... clé affichée après la création de l'application et ajoutez-la en tant que
Déployez Key dans votre référentiel :
- GitHub : Référentiel → Paramètres → Clés de déploiement → Ajouter une clé de déploiement
- GitLab : Référentiel → Paramètres → Référentiel → Clés de déploiement
3. Préparez votre projet Laravel
Cipi utilise le pilote de base de données pour le cache, les sessions et les files d'attente. Exécutez-les une fois dans votre Laravel projetez, validez et poussez les migrations générées :
$ php artisan cache:table $ php artisan session:table $ php artisan queue:table $ php artisan migrate
artisan migrate --force à chaque déploiement. La cache,
session et les tables de file d'attente seront créées lors du premier déploiement si vous validez les migrations.4. Déployer
$ cipi deploy myapp
Le déployeur clone votre dépôt dans un nouveau releases/N/ répertoire, s'exécute
composer install --no-dev, liens .env et storage/, court
migrations, exécutions artisan optimize, crée storage:link, échange le
currentlien symbolique de manière atomique et redémarre les travailleurs de file d'attente. Zéro temps d'arrêt.
5. Installez SSL
$ cipi ssl install myapp
Certbot fournit un certificat Let's Encrypt, configure Nginx pour HTTPS et met à jour
APP_URL dans .env. Votre application Laravel est désormais disponible
https://myapp.com.
Pile technologique
Cipi apporte une pile complète et prête pour la production à votre serveur Ubuntu. Voici tout ce qui obtient installé et configuré :
| Composant | Rôle |
|---|---|
| Ubuntu | Système d'exploitation de base (24.04 ou 26.04 LTS) |
| Nginx | Serveur Web, proxy inverse, terminaison SSL. Depuis v4.5.9, ligne principale
nginx à partir de nginx.org
(1.29.8+) avec max_headers 1000 pour un durcissement HTTP/2 — pas le Ubuntu
paquet d'archives |
| PHP-FPM | PHP runtime par défaut par application (8.3–8.5 ; ondrej/php, packages.sury.org ou Ubuntu main par libération) |
| Laravel Octane | Serveur FrankenPHP HTTP en option par Laravel application (depuis v5.0) —
cipi app create --octane; Les applications FPM et Octane coexistent sur le même serveur
|
| MariaDB | Base de données relationnelle par défaut (remplacement instantané MySQL, port 3306). Facultatif
PostgreSQL via cipi db install pgsql (port 5432) depuis la v4.8.0 |
| Valkey | Stockage en mémoire pour le cache, les sessions, les files d'attente et la diffusion (fork Redis sous licence BSD) |
| Supervisor | Gestionnaire de processus pour Laravel files d'attente, Octane, Horizon et Reverb |
| Déployeur | Outil de déploiement sans temps d'arrêt |
| Bot certifié | Let's Encrypt SSL certificats |
| UFW | Pare-feu (ports 22, 80, 443) |
| Échec2ban | Protection progressive contre la force brute avec prison récidivante |
| mises à niveau sans surveillance | Correctifs de sécurité automatiques |
| Composer | PHP gestionnaire de dépendances |
| cipi CLI | Gestion et orchestration des serveurs |
Ce que chaque application obtient
Chaque application s'exécute dans un environnement entièrement isolé. Laravel est la valeur par défaut : zéro temps d'arrêt
déploie, sa propre base de données, ses Workers, son planificateur et webhook — éventuellement servis par
Octane (FrankenPHP) au lieu de PHP-FPM. --custom est pour les sites simples
(WordPress, static + PHP) : un déploiement classique dans htdocs, un docroot configurable, non
base de données, non .env, pas de cron, pas de travailleurs.
| Zone | Ce que Cipi vous apporte |
|---|---|
| Serveur Web | Nginx avec un hôte virtuel par application — PHP-FPM ou Octane via proxy_pass,
réglé pour Laravel |
| PHP et Composer | Sélectionnable par application, remplaçable à chaud ; paramètres gérés avec
cipi ini à travers FPM et
CLI |
| Base de données | MariaDB par défaut, PostgreSQL en option — une base de données et un utilisateur dédiés par Laravel application |
| Travailleurs de file d'attente | Supervisor pools par application — queue:work ou Horizon ; Reverb en option pour
WebSockets |
| Déploiements | Déployeur - lien symbolique atomique, 5 versions, restauration, construction de nœud facultative ; clone classique
dans htdocs pour les applications personnalisées |
| SSL | Let's Encrypt via Certbot — HTTP-01 par défaut, en option DNS-01 (Cloudflare) avec caractères génériques |
| Sécurité | Fail2ban + UFW, un utilisateur Linux dédié, son propre processus FPM/Octane et une clé SSH par application |
| Bilans de santé | HTTP sondes toutes les 5 minutes, plus un vérification post-déploiement avec en option restauration automatique d'une version cassée |
| Sauvegardes | Profils de sauvegarde — quoi, à quelle fréquence, où, combien de temps — compatible S3 / S3 / local, avec cryptage côté client |
| Configuration | Facultatif par projet cipi.yml pour
alias, bases de données, travailleurs, contrôle de santé et sauvegardes |
Structure de l'application
Quand tu cours cipi app create, Cipi crée un environnement entièrement isolé pour l'application.
Voici tout ce qui est mis en place :
/home/myapp/ ← utilisateur Linux isolé (chmod 750) ├── .ssh/ │ ├── id_ed25519 ← clé de déploiement (privée) │ └── id_ed25519.pub ← clé de déploiement (publique — ajouter à Git) ├── .deployer/ │ └── deploy.php ← Configuration du déployeur (générée automatiquement) ├── courant -> releases/3/ ← lien symbolique vers la version active ├── releases/ │ ├── 1/ │ ├── 2/ │ └── 3/ ← dernière version (les 5 dernières conservées) ├── shared/ │ ├── .env ← compilé automatiquement par Cipi │ └── storage/ ← stockage persistant └── logs/ ├── nginx-access.log ├── nginx-error.log ├── php-fpm-error.log ├── worker-default.log └── deploy.log
En plus du répertoire personnel, Cipi crée ces fichiers système :
PHP-FPM pool: /etc/php/8.5/fpm/pool.d/monapplication.conf (user=myapp ; omis pour Octane applications) Octane (v5+): Supervisor monapplication-octane + Nginx proxy_pass → 127.0.0.1:81xx Nginx vhost: /etc/nginx/sites-available/monapplication Supervisor: /etc/supervisor/conf.d/monapplication.conf Crontab: * * * * * php artisan schedule:run MariaDB: database 'monapplication', user 'monapplication'@'localhost'
Le .env est automatiquement compilé avec toutes les informations d'identification : nom de la base de données, mot de passe, jeton webhook,
et APP_KEY. Vous n'avez jamais besoin de le toucher manuellement, mais vous pouvez toujours le modifier avec
cipi app env myapp.