Erste Schritte
Cipi installieren
Cipi installiert einen kompletten Laravel-bereiten Produktionsstapel am Ubuntu 24.04 oder 26.04 mit einem einzigen
Befehl. Das Installationsprogramm dauert etwa 10 Minuten und richtet Nginx, MariaDB, PHP, Valkey ein
(optional PostgreSQL über cipi db install pgsql nach der Installation),
Supervisor, Fail2ban, UFW, Certbot, Deployer und die cipi CLI selbst.
Von Null bis zur Produktion in drei Schritten
# 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
Das ist der ganze Weg. Erstellen Sie zunächst einen SSH-Schlüssel auf Ihrem Computer (unten) und führen Sie dann das Installationsprogramm aus auf dem Server – Sie werden aufgefordert, diesen öffentlichen Schlüssel einzufügen. Alles, was danach kommt, wird in erklärt der Rest dieser Seite.
sudo. Cipi versorgt die ganze Box – es
ist nichts, was Sie von Ihrem Laptop aus auf einen Remote-Host richten.Erstellen Sie einen SSH-Schlüssel auf Ihrem Computer
Tun Sie dies auf Ihrem Laptop oder Ihrer Workstation, nicht auf dem VPS. Der Installer benötigt die
öffentlich Die Hälfte des Schlüssels, damit der Server gesperrt werden kann: Nach der Einrichtung führen Sie SSH in as aus
die cipi Benutzer mit diesem Schlüssel. Die Root-SSH-Anmeldung ist deaktiviert. Fügen Sie niemals das Private ein
Schlüssel.
Sehen Sie nach, ob Sie bereits eines haben:
ls ~/.ssh/*.pub
Wenn id_ed25519.pub oder id_rsa.pub aufgeführt ist, haben Sie bereits einen Schlüssel – überspringen
Generierung und kopieren Sie die öffentliche Datei mit dem folgenden Befehl. Wenn der Ordner leer ist oder der Befehl
Fehler, erstellen Sie einen neuen Ed25519-Schlüssel:
ssh-keygen -t ed25519 -C "you@example.com"
Drücken Sie die Eingabetaste, um den Standardpfad zu akzeptieren (~/.ssh/id_ed25519). Legen Sie eine Passphrase fest, wenn Sie
wollen (empfohlen). Führen Sie dies unter macOS und Linux im Terminal aus; Verwenden Sie unter Windows PowerShell oder WSL.
Zeigen Sie den öffentlichen Schlüssel an – dies ist die einzelne Zeile, die Sie einfügen, wenn das Installationsprogramm Sie fragt:
cat ~/.ssh/id_ed25519.pub
Es sieht so aus ssh-ed25519 AAAA… comment. Kopieren Sie die ganze Zeile:
- macOS:
pbcopy < ~/.ssh/id_ed25519.pub - Linux:
xclip -sel clip < ~/.ssh/id_ed25519.pub(oder kopieren Sie von der Terminal) - Windows (PowerShell):
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard
.pub Datei ist öffentlich. Die Datei mit dem Namen id_ed25519 (nein
Erweiterung) ist die privat Schlüssel – behalten Sie ihn auf Ihrem Computer und fügen Sie ihn niemals ein
in den Installer einfügen oder an den Server senden.Führen Sie das Installationsprogramm auf dem Server aus
SSH in die neue Ubuntu VPS als Benutzer mit sudo, dann:
wget -O - https://cipi.sh/setup.sh | bash
Der Assistent fragt nach dem öffentlichen Schlüssel bevor ein Paket installiert wird. Fügen Sie die Zeile ein
Sie haben oben kopiert (akzeptierte Formate: ssh-ed25519, ssh-rsa,
ecdsa). Cipi bereinigt Kommentare, Wagenrückläufe und zusätzliche Leerzeichen und erstellt dann
ein engagierter cipi Linux-Benutzer für Administrator-SSH-Zugriff und härtet SSH:
Root-Login deaktiviert, cipi Nur öffentlicher Schlüssel (Gruppe cipi-ssh), App-Benutzer
(Gruppe cipi-apps) kann sich mit Passwort verbinden. Anmeldeversuche sind auf 3 mit a begrenzt
20-Sekunden-Kulanzfrist; Die X11-Weiterleitung ist deaktiviert.
Das Installationsprogramm generiert außerdem eine Zufälliges 40-stelliges Root-Passwort, speichert es in
/etc/cipi/server.jsonund zeigt es in der Installationszusammenfassung an. Es ist nicht
ein SSH-Passwort: Root-SSH-Anmeldung ist deaktiviert. Es ist das, was Sie eingeben, wenn Sie bereits als angemeldet sind
cipi Benutzer mit Ihrem Schlüssel, Sie laufen su root. Bewahren Sie es in einem Passwort auf
Manager.
Nicht interaktive Installation
Für automatisierte Setups übergeben Sie Ihren öffentlichen SSH-Schlüssel über SSH_PUBKEY Umgebungsvariable
So überspringen Sie die interaktive Eingabeaufforderung:
SSH_PUBKEY="ssh-ed25519 AAAA..." wget -O - https://cipi.sh/setup.sh | bash
AWS (Root-Anmeldung standardmäßig deaktiviert)
$ ssh ubuntu@your-server-ip $ sudo -s $ wget -O - https://cipi.sh/setup.sh | bash
Am Ende der Installation sehen Sie einen Zusammenfassungsbildschirm mit den SSH-Zugriffsdetails
automatisch generiertes Root-Passwort und das MariaDB Root-Passwort.
Speichern Sie sie sofort — Sie werden nur einmal angezeigt. Anmeldeinformationen werden in gespeichert
/etc/cipi/server.json, was – wie alle Cipi Konfigurationsdateien – der Fall ist
im Ruhezustand verschlüsselt mit AES-256-CBC über den eingebauten Tresor
System. Anmeldeinformationen, SSH-Schlüssel, .env Dateien und Datenbank-Dumps sind beide geschützt
Festplatte
und während der Übertragung (via Synchronisieren verschlüsselte Archive). Cipi wird ebenfalls erzwungen
DSGVO-konforme Protokollaufbewahrung mit automatischen Rotationsrichtlinien für die Bewerbung,
Sicherheit und HTTP Protokolle – sieheLog retention für Einzelheiten.
/etc/cipi/server.json.Zugriff nach der Installation
Nach der Installation, Admin-Zugriff verwendet die Public-Key-Authentifizierung als
cipi Benutzer (Root-Anmeldung ist deaktiviert). App-Benutzer kann SSH direkt mit
ssh myapp@server-ip und das bei der App-Erstellung generierte Passwort. Laufen
cipi Wenn Sie Befehle ausführen oder Verwaltungsaufgaben ausführen möchten, stellen Sie eine Verbindung her als cipi und
dann eskalieren:
# 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
Anforderungen
- Ubuntu 24.04 oder 26.04 LTS (nur Neuinstallationen; Zwischenversionen werden nicht unterstützt)
- Root-Zugriff (bzw
sudo -sauf AWS) - Die Ports 22, 80 und 443 sind geöffnet
- Ein sauberer Server – installieren Sie Cipi nicht auf einem Server mit einem vorhandenen Web-Stack
- A öffentlicher, mit dem Internet verbundener Server mit einem routbaren öffentliches IPv4 Adresse — Nur NAT VPS, Heimnetzwerke hinter einem Router und Hosts, von denen aus sie nicht erreichbar sind Das Internet wird nicht unterstützt
- Vollständige KVM- oder Bare-Metal-Virtualisierung – nicht OpenVZ, LXC-Container oder Shared-Kernel Umgebungen (einschließlich lokaler Docker, Docker Desktop, OrbStack, Colima, WSL und ähnliches). Desktop-Container-Laufzeiten)
Cipi ist getestet und funktioniert auf: DigitalOcean, AWS EC2, Vultr, Linode / Akamai, Hetzner, Google Cloud, OVH, Scaleway und jeder KVM- oder Bare-Metal-Host, auf dem Ubuntu mit einer öffentlichen IP ausgeführt wird.
Schnellstart
1. Erstellen Sie Ihre erste App
Der interaktive Assistent fragt nach einem Benutzernamen, einer primären Domäne, einer Git-Repository-URL (SSH-Format) und
Zweig
ggf. und PHP-Version. Laravel Apps benötigen immer ein Repository; für
Brauch
Apps können Sie das Repository leer lassen, um die Site nur über SFTP zu hosten – siehe
custom apps. Seitdem v5.0, Laravel Apps können genutzt werden
klassisches PHP-FPM oder Laravel Octane (FrankenPHP) mit
--octane – siehe Laravel Octane.
$ cipi app create $ cipi app create --octane # Laravel Octane (FrankenPHP)
Oder übergeben Sie alle Flags direkt, um den interaktiven Modus zu überspringen:
$ cipi app create \
--user=myapp \
--domain=myapp.com \
--repository=git@github.com:you/myapp.git \
--branch=main \
--php=8.5
Am Ende druckt Cipi eine Zusammenfassung der Anmeldeinformationen – Speichern Sie es, es wird nur einmal angezeigt – einschließlich
die öffentliche IP-Adresse des Servers (für DNS-Konfiguration), den SSH-Bereitstellungsschlüssel, Datenbankanmeldeinformationen,
ein gebrauchsfertiges mariadb+ssh://Verbindungs-URL für GUI Clients (TablePlus, DBeaver,
Sequel Pro), webhook URL und webhook Token.
2. Fügen Sie den Bereitstellungsschlüssel zu Ihrem Git-Anbieter hinzu
Wenn Sie über einen GitHub- oder GitLab-Token konfiguriert haben cipi git, dieser Schritt ist
automatisch — Cipi fügt den Bereitstellungsschlüssel hinzu und erstellt den webhook für Sie. Siehe
Git-Auto-Setup für Einzelheiten.
Andernfalls kopieren Sie die ssh-ed25519 ... Schlüssel, der nach der App-Erstellung angezeigt wird, und fügen Sie ihn als hinzu
Stellen Sie den Schlüssel in Ihrem Repository bereit:
- GitHub: Repository → Einstellungen → Schlüssel bereitstellen → Bereitstellungsschlüssel hinzufügen
- GitLab: Repository → Einstellungen → Repository → Schlüssel bereitstellen
3. Bereiten Sie Ihr Laravel-Projekt vor
Cipi verwendet den Datenbanktreiber für Cache, Sitzungen und Warteschlangen. Führen Sie diese einmal in Ihrem Laravel aus Projektieren, Festschreiben und Pushen der generierten Migrationen:
$ php artisan cache:table $ php artisan session:table $ php artisan queue:table $ php artisan migrate
artisan migrate --force bei jedem Einsatz. Der Cache,
Sitzungs- und Warteschlangentabellen werden bei der ersten Bereitstellung erstellt, wenn Sie die Migrationen festschreiben.4. Bereitstellen
$ cipi deploy myapp
Der Deployer klont Ihr Repo in ein neuesreleases/N/ Verzeichnis, läuft
composer install --no-dev, Links .env und storage/, läuft
Migrationen, Läufe artisan optimize, schafft storage:link, tauscht die
current Symlink atomar und startet Warteschlangenarbeiter neu. Keine Ausfallzeiten.
5. Installieren Sie SSL
$ cipi ssl install myapp
Certbot stellt ein Let's Encrypt-Zertifikat bereit, konfiguriert Nginx für HTTPS und aktualisiert
APP_URL in .env. Ihre Laravel-App ist jetzt live
https://myapp.com.
Tech-Stack
Cipi bringt einen vollständigen, produktionsbereiten Stack auf Ihren Ubuntu-Server. Hier ist alles, was es gibt installiert und konfiguriert:
| Komponente | Rolle |
|---|---|
| Ubuntu | Basisbetriebssystem (24.04 oder 26.04 LTS) |
| Nginx | Webserver, Reverse-Proxy, SSL-Terminierung. Seitdem v4.5.9, Hauptlinie
nginx ab nginx.org(1.29.8+) mit max_headers 1000 für HTTP/2 Härtung – nicht Ubuntu
Archivpaket |
| PHP-FPM | Standardmäßig PHP Laufzeit pro App (8,3–8,5; ondrej/php, packets.sury.org, oder Ubuntu Haupt pro Veröffentlichung) |
| Laravel Octane | Optional FrankenPHP HTTP Server pro Laravel App (seit v5.0) —
cipi app create --octane; FPM- und Octane-Apps koexistieren auf demselben Server
|
| MariaDB | Standardmäßige relationale Datenbank (Drop-in-Ersatz für MySQL, Port 3306). Optional
PostgreSQL über cipi db install pgsql (Port 5432) seit v4.8.0 |
| Valkey | In-Memory-Speicher für Cache, Sitzungen, Warteschlangen, Broadcast (BSD-lizenzierter Redis-Fork) |
| Supervisor | Prozessmanager für Laravel Warteschlangenarbeiter, Octane, Horizon und Reverb |
| Bereitsteller | Bereitstellungstool ohne Ausfallzeiten |
| Certbot | Let's Encrypt SSL Zertifikate |
| UFW | Firewall (Ports 22, 80, 443) |
| Fail2ban | Fortschrittlicher Brute-Force-Schutz mit Wiederholungsgefängnis |
| unattended-upgrades | Automatische Sicherheitspatches |
| Composer | PHP Abhängigkeitsmanager |
| cipi CLI | Serververwaltung und Orchestrierung |
Was jede App bekommt
Jede App wird in einer vollständig isolierten Umgebung ausgeführt. Laravel ist die Standardeinstellung – keine Ausfallzeit
stellt eine eigene Datenbank, Worker, einen Scheduler und webhook bereit – optional bereitgestellt von
Octane (FrankenPHP) statt PHP-FPM. --custom ist für einfache Websites
(WordPress, statisch + PHP): ein klassischer Einsatz in htdocs, ein konfigurierbares Docroot, nein
Datenbank, Nr .env, kein cron, keine Arbeiter.
| Bereich | Was Cipi Ihnen gibt |
|---|---|
| Webserver | Nginx mit einem virtuellen Host pro App – PHP-FPM oder Octane über proxy_pass,
abgestimmt auf Laravel |
| PHP & Composer | Per App wählbar, Hot-Swap-fähig; Einstellungen verwaltet mit
cipi ini über FPM und
CLI |
| Datenbank | MariaDB standardmäßig, optional PostgreSQL – eine dedizierte Datenbank und ein Benutzer pro Laravel App |
| Warteschlangenarbeiter | Supervisor Pools pro App — queue:work oder Horizon; optional Reverb für
WebSockets |
| Bereitstellungen | Deployer – atomarer Symlink, 5 Releases, Rollback, optionaler Node-Build; klassischer Klon
hinein htdocs für benutzerdefinierte Apps |
| SSL | Let's Encrypt über Certbot – HTTP-01 standardmäßig, optional DNS-01 (Cloudflare) mit Platzhalter |
| Sicherheit | Fail2ban + UFW, ein dedizierter Linux-Benutzer, ein eigener FPM/Octane-Prozess und SSH-Schlüssel pro App |
| Gesundheitschecks | HTTP Sonden alle 5 Minuten, plus a Überprüfung nach der Bereitstellung mit optional Automatisches Rollback einer defekten Version |
| Backups | Sicherungsprofile — was, wie oft, wo, wie lange – S3 / S3-kompatibel / lokal, mit clientseitiger Verschlüsselung |
| Configuration | Optional pro Projekt cipi.yml für
Aliase, Datenbanken, Worker, Gesundheitscheck und Backups |
App Structure
When you run cipi app create, Cipi erstellt eine vollständig isolierte Umgebung für die App.
Hier ist alles, was eingerichtet wird:
/home/myapp/ ← isolierter Linux-Benutzer (chmod 750) ├── .ssh/ │ ├── id_ed25519 ← Schlüssel bereitstellen (privat) │ └── id_ed25519.pub ← Schlüssel bereitstellen (öffentlich – zu Git hinzufügen) ├── .deployer/ │ └── deploy.php ← Deployer-Konfiguration (automatisch generiert) ├── aktuell -> releases/3/ ← Symlink zur aktiven Version ├── releases/ │ ├── 1/ │ ├── 2/ │ └── 3/ ← neueste Version (letzte 5 behalten) ├── shared/ │ ├── .env ← automatisch kompiliert von Cipi │ └── storage/ ← Persistenter Speicher └── logs/ ├── nginx-access.log ├── nginx-error.log ├── php-fpm-error.log ├── worker-default.log └── deploy.log
Zusätzlich zum Home-Verzeichnis erstellt Cipi diese Systemdateien:
PHP-FPM pool: /etc/php/8.5/fpm/pool.d/meineapp.conf (user=myapp; entfällt für Octane Apps) Octane (v5+): Supervisor meineapp-octane + Nginx proxy_pass → 127.0.0.1:81xx Nginx vhost: /etc/nginx/sites-available/meineapp Supervisor: /etc/supervisor/conf.d/meineapp.conf Crontab: * * * * * php artisan schedule:run MariaDB: database 'meineapp', user 'meineapp'@'localhost'
Die .env wird automatisch mit allen Anmeldeinformationen kompiliert – Datenbankname, Passwort, webhook-Token,
und APP_KEY. Sie müssen es nie manuell anfassen, können es aber jederzeit mit bearbeiten
cipi app env myapp.