© 2026 phis.dev. Alle Rechte vorbehalten.
Brand logo
phis.dev
  • Startseite
  • Dokumentation
Ein Terminal voller Zeilen, von denen eine hervorgehoben ist
Quelle

Der Befehl „phis“

Websites, Module, Erweiterungen, Operatoren und die Datenbank: alles, was für den Betrieb einer Installation erforderlich ist – Befehl für Befehl.
Auf dieser Seite
Ausführen der Befehlszeilenschnittstelle
Globale Flags, Ausgabe- und Beendigungscodes
Umgebungsvariablen
Das Verzeichnis „phis“ und die darin enthaltenen Dateien
Was ein Befehl benötigt
config
db
Schema
Website
init, reconcile, update (Site-Scaffold)
Modul (Website-Module)
Add-on (Server-Add-ons)
Speicherung (Speicherprofile)
Geheimnis
auth
Operator
Medien
pflegen
E-Mail
Lizenzen
Beispiel
Häufige Aufgaben
Zahlungsprofile
phis.dev
Schnellzugriff
AGB
Kontakt

phis-Befehlsübersicht

phis is the operator CLI of @phis/server. It edits the configuration files of one phis root, writes to the PostgreSQL database that root names, scaffolds and builds Site repositories, and manages server Add-ons and Site Modules. This file lists every command the dispatcher in src/cli/phis.mts accepts.
Bei einer Erstinstallation lesen Sie bitte stattdessen die Datei INSTALL.md; darin werden diese Befehle der Reihe nach ausgeführt.
  • Ausführen der Befehlszeilenschnittstelle
  • Globale Flags, Ausgabe- und Beendigungscodes
  • Umgebungsvariablen
  • Das Verzeichnis „phis“ und die darin enthaltenen Dateien
  • Was ein Befehl benötigt
  • config
  • db
  • Schema
  • Website
  • init, reconcile, update (Site-Scaffold)
  • Modul (Website-Module)
  • Add-on (Server-Add-ons)
  • Speicherung (Speicherprofile)
  • Geheimnis
  • auth
  • Operator
  • Medien
  • pflegen
  • E-Mail
  • Lizenzen
  • Beispiel
  • Häufige Aufgaben
  • Zahlungsprofile

Ausführen der Befehlszeilenschnittstelle

WoWie
Quellcode auscheckenpnpm phis <command> (führt src/cli/phis.mts mit node --experimental-strip-types aus) oder ./phis <command>
Im Lieferumfang enthaltenpnpm build:cli schreibt dist/phis.mjs; pnpm phis:dist <command> oder ./phis <command> führt das Programm aus
Debian-Paket/usr/bin/phis, ein Skript, das /usr/lib/phis/server/phis ausführt
Der Wrapper ./phis führt dist/phis.mjs aus, sofern diese Datei vorhanden ist, und greift andernfalls auf die TypeScript-Quelldatei zurück. Sind PHIS_ROOT und PHIS_APP_ROOT nicht gesetzt, legt der Wrapper beide Variablen auf das eigene Verzeichnis des Wrappers fest. ./phis bevorzugt dist/phis.mjs, selbst wenn die Quelldatei neuer ist; führen Sie nach einer Änderung der CLI den Befehl pnpm build:cli aus oder verwenden Sie pnpm phis.
Im Debian-Paket setzt /usr/bin/phis die Variable PHIS_ROOT=/srv/phis/stages/prod, sofern diese noch nicht gesetzt ist; dabei handelt es sich um die vom Paket erstellte Stufe und das Stammverzeichnis, das der Server im Produktionsbetrieb verwendet. Geben Sie --root an oder setzen Sie PHIS_ROOT, um eine andere Stufe zu verwenden.
pnpm phis wird mit dem Paketverzeichnis als Arbeitsverzeichnis ausgeführt; ohne PHIS_ROOT oder --root greift es daher auf das Verzeichnis config/ des Checkouts selbst zu.

Globale Flags, Ausgabe- und Beendigungscodes

FlaggeBedeutung
--json, -jGeben Sie das Ergebnis als ein JSON-Dokument über stdout aus.
--root <path>, -r <path>Das phis-Stammverzeichnis. Standard: $PHIS_ROOT, andernfalls das aktuelle Arbeitsverzeichnis.
--help, -h, helpGeben Sie den Hilfetext aus. Wird nur als erstes Argument erkannt; an anderer Stelle steht -h für --hostname.
--version, -vGibt die Paketversion aus ({"version": ...} mit --json). Dies ist nur in einer Zeile ohne Befehl möglich; innerhalb eines Befehls kann -v der Wert eines Schaltworts sein.
Regeln für die Auswertung von Optionszeichen. Jeder Befehl verfügt über eine festgelegte Liste von Optionszeichen (PHIS_COMMAND_FLAGS in src/cli/argv.mts), und jedes Optionszeichen nimmt entweder einen Wert an oder ist ein Schalter:
  • Ein Flag, das einen Wert entgegennimmt, übernimmt das nächste Argument, unabhängig davon, womit dieses beginnt: --password -x1 übergibt -x1. --name=value funktioniert ebenfalls und ist die übersichtlichere Form für solche Werte.
  • Eine leere Zeichenkette ist ein Wert: --value "" und --value= übergeben "".
  • Ein Wert-Flag am Zeilenende führt zu einer Fehlermeldung: --<flag> needs a value.
  • Ein Schalter (--force, --json, --install, …) nimmt keinen Wert an; --force=yes wird nicht akzeptiert.
  • Ein Flag, das der Befehl nicht erkennt, wird abgelehnt: phis <command> does not take --<flag>. Dies umfasst Flags, die zu einem anderen Befehl gehören, z. B. --api-base-url bei reconcile.
  • Derselbe Name kann je nach Befehl unterschiedliche Bedeutungen haben: site admin --revoke ist ein Schalter, während addon role --revoke <role> einen Wert erwartet.
  • Kurzbefehle: -e --email, -u --public-base-url, -h --hostname, -k --key, -l --locale, -p --password, -n --name, -d --disabled, -j --json, -r --root. Alle anderen Optionen mit einem einzigen Bindestrich werden mit der Meldung Unknown flag abgelehnt.
  • Eine Zeile, die keinem Befehl entspricht, wird an den Dispatcher weitergeleitet, der mit der Meldung Unknown command antwortet.
Ausgabe- und Beendigungscodes:
  • Bei erfolgreicher Ausführung gibt der Befehl eine für Menschen lesbare Zeile aus – oder JSON bei Verwendung von --json – und beendet den Prozess mit dem Status 0.
  • Im Fehlerfall wird die Meldung an stderr ausgegeben, zusammen mit einer strukturierten Protokollzeile ({"level":"error","service":"cli","event":"cli.command.failed",...}), und das Programm beendet sich mit dem Status 1. Bei Verwendung von --json wird über stderr zusätzlich {"ok": false, "error": "<message>"} ausgegeben.
  • Einige Befehle werden ohne Auslösung eines Fehlers beendet, geben jedoch dennoch den Exit-Code 1 zurück, da sie ein Problem festgestellt haben; diese sind nachstehend aufgeführt (config validate, schema check, site check, module add|check, addon list|check, addon job, secret check, media check, maintain, mail drain,

Umgebungsvariablen

VariableGelesen vonWirkung
PHIS_ROOTBefehlszeilenschnittstelle (CLI), ServerDas phis-Stammverzeichnis, wenn --root nicht angegeben wird. Der Server greift bei /srv/phis/stages/prod auf NODE_ENV=production zurück, andernfalls auf das Anwendungsstammverzeichnis.
PHIS_APP_ROOTBefehlszeilenschnittstelle (CLI), ServerDas Anwendungsstammverzeichnis, aus dem die Datei scripts/sql/001_create_phis.pgsql gelesen wird (schema check, schema apply). Standard: zwei Verzeichnisse über dem CLI-Modul. Der Wrapper legt diesen Pfad fest; legen Sie ihn selbst fest, wenn Sie dist/phis.mjs direkt ausführen, da sich das Bundle ein Verzeichnis unterhalb des Anwendungsstammverzeichnisses befindet.
PHIS_INSTANCE_IDBefehlszeilenschnittstelle (CLI), ServerIdentität einer Serverinstanz in phis.server_instances. Standard: <hostname>:<root>. instance drain verwendet diese Angabe, wenn --id nicht angegeben wird.
PHIS_SKIP_VERSION_CHECKCLIJeder nicht leere Wert überspringt die Überprüfung der Stammversion (siehe unten).
Mit dem Befehl update wird die Umgebungsvariable an den Paketmanager übergeben und der Wert NEXT_TELEMETRY_DISABLED=1 hinzugefügt.

Überprüfung der Root-Version

Mit Ausnahme der Befehle help und --version vergleicht jeder Befehl die CLI-Version mit <root>/config/phis-instance.json ({"formatVersion": 1, "phisVersion": "..."}):
  • kein Stempel oder eine CLI, die neuer ist als der Stempel: Der Befehl wird ausgeführt und der Stempel wird auf die CLI-Version überschrieben (eine neuere CLI gibt zunächst folgende Meldung aus: Note: <root> was last operated by phis <old>, this is <new>.);
  • CLI-Version älter als die angegebene: Der Befehl wird abgelehnt. Verwenden Sie die CLI, die zum Root-Benutzer gehört, oder setzen Sie PHIS_SKIP_VERSION_CHECK=1.
Der Eintrag wird nur dann geschrieben, wenn das Stammverzeichnis die Datei config/phis-config.json oder config/phis-runtime.json enthält; ein fehlgeschlagener Schreibvorgang wird ignoriert.

Das Verzeichnis „phis“ und die darin enthaltenen Dateien

Alle Pfade beziehen sich auf das Stammverzeichnis.
DateiVerfasst vonInhalt
config/phis-config.jsonder BetreiberStatische Konfiguration: sites.*-Pfadstämme und Basisport, translation, media, email, forms, bootstrap.enabled.
config/phis-runtime.jsonder Befehl /setup und die CLIBereitstellungswerte und Geheimnisse: database.uri, database.migrationUri, api.internalToken, secrets.encryptionKey, auth.transactionEncryptionKey, registration.intentEncryptionKey, operator.sessionSecret, platformSuperUsers, sites.overrides. Die hier angegebenen Werte haben Vorrang vor phis-config.json.
config/phis-instance.jsondie CLIDer oben angegebene Versionsstempel.
config/phis-addons.jsonaddon-BefehleGewünschter Status der Server-Add-ons. „Fehlt“ bedeutet „keine vorhanden“.
config/phis-modules.json`module adddel`
addons/<scope>/<name>/<version>/addon.mjs`Add-on installieren„Upgrade“
Die CLI schreibt die Datei phis-runtime.json über eine temporäre Datei und eine Umbenennung. Ein laufender Server speichert die zusammengeführte Konfiguration bis zu vier Stunden lang im Cache; starten Sie ihn neu, nachdem Sie einen CLI-Befehl ausgeführt haben, der die Datei phis-runtime.json ändert (db bootstrap, operator add|passwd|enable|disable|del, site add|del und site config set|add|del für sites.overrides, secret init-key, auth import-secrets), andernfalls behält der laufende Server die alten Werte bis zu vier Stunden lang bei.

Was ein Befehl benötigt

BedürfnisseBefehle
Eine übergebene Verbindung zur Verwaltungsdatenbankdb bootstrap – es erstellt das, was jede nachfolgende Zeile bereits als vorhanden erwartet
Nur Konfigurationsdateienconfig, operator, secret init-key, module list, `addon list
database.uri (Serverrolle)`Schema-Prüfung`
database.migrationUri (Migrationsrolle)schema drop --force, addon migrate, addon purge
secrets.encryptionKey`Geheimnis-Set`
api.internalTokeninit (in die Website kopiert), site check (Website wird ausgeführt), addon job und mail drain (Server wird ausgeführt)
Es gibt keine Ausweichlösung von database.migrationUri zu database.uri.

config

phis config

Gibt die zusammengeführte Konfiguration (integrierte Standardwerte, anschließend phis-config.json, dann phis-runtime.json) als JSON aus. Die Ausgabe enthält Datenbank-URIs, Tokens und Schlüssel; fügen Sie sie nirgendwo ein.

phis config paths

Gibt den Stammordner sowie die absoluten Pfade der statischen und der Laufzeit-Konfigurationsdateien aus ({root, static, runtime} mit --json).

phis config validate

Analysiert beide Dateien und überprüft die zusammengeführte Konfiguration: Typen von sites.*, platformSuperUsers (E-Mail-Adresse und passwordHash vorhanden, keine Duplikate), 64-stellige Hex-Schlüssel (auth.transactionEncryptionKey, secrets.encryptionKey), media, translation (die Quell- Sprachversionen müssen in translation.supportedLocales enthalten sein), forms.timeouts sowie das Vorhandensein des nicht mehr verwendeten Feldes auth.secrets. Beendet den Vorgang bei 1, sobald ein Problem auftritt. JSON: {ok, staticError, runtimeError, issues}.
Es wird nicht überprüft, ob die erforderlichen Werte vorhanden sind; ein fehlender database.uri-Eintrag wird von dem ersten Befehl gemeldet, der diesen benötigt.

db

phis db bootstrap --admin-uri <postgres uri>

Erstellt die Datenbank, auf die diese Installation angewendet wird, sowie die beiden Rollen, denen Teile davon gehören, und schreibt beide Verbindungszeichenfolgen in die Datei phis-runtime.json. Dies ist der Schritt vor der schema apply-Anwendung und der einzige, der eine eigene Verbindung benötigt: --admin-uri ist eine Verbindung, die zum Erstellen von Datenbanken und Rollen berechtigt ist, wobei es sich nicht um eine der beiden zu erstellenden Rollen handelt.
Die Namen werden aus dem Parameter --name abgeleitet, sodass die drei Namen einer Installation erkennbar miteinander in Verbindung stehen: --name prod ergibt die Datenbank phis_prod, die Serverrolle phis_prod_user und die Migrationsrolle phis_prod_migrator. Ohne --name lauten sie phis, phis_user und phis_migrator. Die Parameter --database, --role und --migration-role benennen jeden der drei Namen direkt und werden als eingegeben und nicht als zusammengefasst interpretiert. Passwörter werden generiert, sofern nicht über --password oder --migration-password eines angegeben wird.
Es gibt zwei Rollen, da die Zuständigkeiten aufgeteilt sind: Die „serving“-Rolle ist für das Core-Schema-phis verantwortlich, die „migration“-Rolle ist für die Schemata der Server-Add-ons zuständig, und keine der beiden Rollen kann das löschen, was die andere erstellt hat. schema apply gewährt der „migration“-Rolle die für Add-on-Migrationen erforderlichen Berechtigungen, wobei der Name aus database.migrationUri ausgelesen wird.
Der Befehl „create“ ist idempotent und gibt lediglich zurück, was er vorgefunden hat, anstatt selbst etwas zu erstellen. --force schützt die Konfiguration, nicht die Datenbank: Bei einer bereits vorhandenen Rolle ist das Passwort bereits festgelegt – es wird kein Passwort zurückgegeben –, sodass ein zweiter Lauf ohne --force abgelehnt wird, anstatt einem laufenden Server Verbindungszeichenfolgen zu übergeben, die dieser nicht verwendet.
--admin-uri muss einen Host angeben. Eine lokale Socket-Verbindung (postgresql:///postgres?host=...) enthält keinen Host, und die daraus geschriebenen Verbindungszeichenfolgen müssen so gestaltet sein, dass die CLI sie wieder auswerten kann.
Ist die administrative Verbindung kein Superuser – typischerweise bei einer verwalteten Datenbank –, gewährt sich der Befehl zunächst selbst das Recht, die Rolle des Servers zu übernehmen, da dies für den Befehl CREATE DATABASE ... OWNER erforderlich ist und PostgreSQL 16 die Verwaltung einer Rolle von deren Übernahme getrennt hat. Ein Superuser bleibt davon unberührt.
Die Datei enthält zwei Passwörter. Der Befehl ändert weder den Modus noch den Eigentümer der Datei: Bei Ausführung als „root“ gegenüber einer Remote-Datenbank gehört die Datei „root“, während der Server unter einem anderen Konto läuft. Legen Sie den Modus 0600 fest und setzen Sie den Eigentümer auf das Konto, unter dem der Server läuft.

Schema

phis schema check

Stellt eine Verbindung zur Datenbank database.uri her und vergleicht die in der Datei scripts/sql/001_create_phis.pgsql deklarierten Tabellen mit den Tabellen im Schema phis. Zeigt die fehlenden Tabellen an und gibt den Status 1 zurück, falls welche fehlen. Außerdem listet es die vom Skript erstellten Erweiterungen (pg_trgm) auf, die nicht installiert sind. Nur-Lese-Modus.

phis schema apply

Führt 001_create_phis.pgsql mit database.uri aus. Das Skript ist idempotent (CREATE ... IF NOT EXISTS), sodass eine Wiederholung unbedenklich ist; es handelt sich um den Schritt, der nach jedem Server-Upgrade ausgeführt werden muss. Es wird bewusst als „serving“-Rolle ausgeführt: Die Kern-Tabellen gehören zu dieser Rolle. Die Rolle benötigt die Berechtigung zum Anlegen des Schemas phis und der Erweiterung pg_trgm; andernfalls muss ein Superuser die Erweiterung zuvor anlegen.
Wenn database.migrationUri festgelegt ist, werden der Migrationsrolle zudem die Berechtigungen erteilt, die für Add-on-Migrationen erforderlich sind (USAGE-Berechtigung für phis-Tabellen, REFERENCES-Berechtigung für die Core-Tabellen, auf die Add-ons verweisen können, Lese-/Schreibberechtigung für die Add-on- Katalogtabellen sowie einige weitere, eng gefasste Berechtigungen). Zeigt die erstellten Tabellen und den Berechtigungsempfänger an.

phis schema drop [--force]

Zerstörerisch. Ohne die Option --force werden lediglich die zu löschenden Elemente angezeigt, ohne dass Änderungen vorgenommen werden. Mit der Option --force werden alle in phis.server_addons gespeicherten Add-on-Schemas (mit database.migrationUri, zu der sie gehören) gelöscht und anschließend DROP SCHEMA phis CASCADE (mit database.uri) ausgeführt. Alle Kerndaten gehen dabei verloren. Für den Testlauf ist lediglich database.uri erforderlich; für die Option --force ist zusätzlich database.migrationUri erforderlich. Führen Sie phis schema apply aus, um ein leeres Schema neu zu erstellen.

Website

Alle site-Befehle benötigen die Datenbank. Site-Schlüssel und Hostnamen werden in Kleinbuchstaben geschrieben. Ein Site-Schlüssel muss dem Muster [a-z0-9][a-z0-9._-]{0,63} (nach Umwandlung in Kleinbuchstaben) entsprechen – dies ist die Regel für ein Segment einer geheimen Referenz, zu der der Schlüssel gehört; der Befehl site add lehnt jeden anderen Schlüssel ab.

phis site list [--key <site key>]

Listet Standorte auf (key, enabled, hostname, name), optional einen. Die JSON-Datei enthält alle Spalten, die die CLI ausliest, sowie die aufgelöste sourceLocale.

phis site add

phis site add --key <site key> --name <site name> --hostname <hostname> --public-base-url <url>
              --source-locale <locale> --default-locale <locale> [--available-locales <csv>]
              --support-email <email>
Erstellt eine Website.
FlaggeErforderlichAnmerkungen
--key, -kJaEindeutiger Standortschlüssel.
--name, -nJaAnzeigename; zugleich der Name des E-Mail-Absenders.
--hostname, -hJaDer Host, auf dem die Website gehostet wird.
--public-base-url, -uJaAbsolute URL, z. B. https://www.example.com.
--source-localeJaDer Inhalt der Sprachdatei wird erstellt. Nach dem Speichern ist er unveränderlich.
--default-localeJaWird stets zu den verfügbaren Sprachumgebungen hinzugefügt.
--available-localesneinDurch Kommas getrennte zusätzliche Sprachumgebungen.
--support-email, -eJa--email wird als Alias akzeptiert.
Jede Sprachversion muss in translation.supportedLocales aufgeführt sein (Standard: ["en"]).
Nebenwirkungen: Schreibt zunächst sites.overrides.<key>.sourceLocale in die Datei phis-runtime.json und fügt anschließend die Zeile phis.sites (E-Mail-Absender no-reply@<hostname>, Kontaktempfänger = Support-E-Mail-Adresse, ein zufälliges Formular-Sicherheitskennwort) sowie eine leere Zeile phis.site_auth_config in einer einzigen Transaktion ein. Sollte das Einfügen fehlschlagen, wird die Laufzeitdatei wiederhergestellt. Der Vorgang wird abgebrochen, wenn für den Schlüssel bereits eine Überschreibung mit einer sourceLocale existiert.

phis site set --key <site key> [--name] [--hostname] [--public-base-url] [--support-email]

Aktualisiert die angegebenen Felder; mindestens eines davon ist erforderlich. Außerdem werden der E-Mail-Absender (no-reply@<hostname>), der Absendername und der Kontaktempfänger anhand der resultierenden Werte neu geschrieben.

phis site enable|disable --key <site key>

Setzt das Aktivitätskennzeichen der Website.

phis site del --key <site key>

Destruktiv. Löscht die Zeile phis.sites (sowie alle daraus resultierenden Einträge in der Datenbank) und entfernt sites.overrides.<key> aus der Datei phis-runtime.json. Das Quellverzeichnis der Website, Release-Artefakte, unter site:<key>:... gespeicherte Geheimnisse sowie die Konfiguration des Webservers und der Dienste bleiben davon unberührt. Es erfolgt keine Bestätigungsabfrage.

phis site locale add --key <site key> --locale <locale>

Fügt den verfügbaren Sprachumgebungen der Website eine weitere Sprachumgebung hinzu. Die Sprachumgebung muss in translation.supportedLocales enthalten sein.

phis site admin

phis site admin --site <site key> --email <email> [--password <pw>] [--first-name <n>] [--last-name <n>]
phis site admin --site <site key> --list
phis site admin --site <site key> --email <email> --revoke
  • Grant (Standard): Weist dem Konto die Administratorrolle auf der Website zu und erstellt das Konto sowie dessen Mitgliedschaft, sofern die E-Mail-Adresse neu ist. Ein Passwort wird nur für ein Konto festgelegt, das durch diesen Aufruf erstellt wird; ohne den Parameter --password wird ein zufälliges Passwort vergeben, das niemand kennt, und der Befehl enthält Anweisungen zum Festlegen eines Passworts. Das Passwort eines bereits bestehenden Kontos wird niemals geändert. Der Befehl kann für mehrere Administratoren ausgeführt werden.
  • --list: Listet Konten auf, die die Rolle „Admin“ innehaben (E-Mail-Adresse, Benutzer-ID, Rollenkennzeichen, Name, Angabe, ob ein Passwort festgelegt ist).
  • --revoke: Entfernt die Rolle „Admin“; das Konto und seine übrigen Rollen bleiben erhalten.

phis site user --site <site key> --email <email> --password <pw> [--overwrite]

Legt das Passwort eines bestehenden Kontos fest, das Mitglied der Site ist. Der Befehl wird abgelehnt, wenn das Konto bereits über ein Passwort verfügt, es sei denn, die Option --overwrite wird angegeben. Die Anmeldedaten gehören zum Konto, nicht zur Site, sodass dadurch jede Site geöffnet wird, deren Mitglied das Konto ist; der Befehl gibt an, wie viele dies sind.

phis site check --key <site key> [--url <base url>]

Fragt eine laufende Site ab, welche ihrer Module deaktiviert sind, weil eine Serverfunktion fehlt: GET <base url>/api/site/module-diagnostics mit dem Header api.internalToken. Die Basis-URL ist standardmäßig http://<host>:<port> der ersten konfigurierten Instanz der Site (siehe site config). Gibt den Wert 1 zurück, wenn ein Modul deaktiviert ist. Erfordert api.internalToken und eine erreichbare Site. Führen Sie den Befehl nach Server- oder Site-Updates aus.

phis site config

Die Standorte der Instanzen werden aus der Datei phis-config.json abgeleitet, sofern sie nicht in sites.overrides.<key> der Datei phis-runtime.json überschrieben werden:
WertStandard
Quellpfad<sites.sourcePathRoot>/<key>; der Standardwert für sites.sourcePathRoot lautet /opt/phis/sources
Instanzpfad<sites.instancePathRoot>/<key>, Standard-Stammverzeichnis /var/www/phis/sites
Hafen<sites.basePort> + <site id>; der Standardwert für sites.basePort ist 52000
Gastgeberlocalhost
Der Quellpfad ist zugleich der Standardwert für --path, init, reconcile, update und module.
phis site config set source --key <site key> [--source-host <host> --source-port <port> --source-path <path>]
Schreibt sites.overrides.<key>.source in die Datei phis-runtime.json. Alle drei Flags zusammen aktivieren diese Einstellung; kein einziges deaktiviert sie. Wird von site config nginx --source verwendet, um als Proxy für einen Entwicklungsserver zu fungieren.
phis site config add --key <site key> --instance-host <host> [--instance-port <port>] --instance-path <path>
Fügt eine Instanz zu sites.overrides.<key>.instances hinzu. Sobald eine Instanz dort aufgeführt ist, wird die abgeleitete Standardinstanz nicht mehr verwendet.
phis site config del --key <site key> --instance-host <host>
Entfernt alle aufgeführten Instanzen auf diesem Host.
phis site config nginx|apache|systemd|docker-compose|runtime --key <site key>
phis site config nginx   --key <site key> [--source]
phis site config systemd --key <site key> [--instance <n>]
Gibt einen Konfigurationsausschnitt auf stdout aus. Es wird nichts geschrieben oder installiert. Mit der Option --json befindet sich der Ausschnitt in der Datei config neben dem Site-Eintrag; die Option runtime --json gibt die strukturierte Zusammenfassung aus.
  • nginx: Eine Datei für den http-Kontext von nginx (unter Debian: /etc/nginx/sites-available/<key>.conf , mit einem Symlink aus dem Verzeichnis sites-enabled/ verknüpft, die von nginx.conf innerhalb von http {} eingebunden wird). Sie enthält in folgender Reihenfolge:
    • map $http_upgrade $phis_site_<key>_connection: upgrade, wenn die Anfrage ein Protokoll-Upgrade erfordert, andernfalls leer;
    • upstream phis_site_<key> mit einer server-Zeile für jede Instanz (127.0.0.1:<port> für einen lokalen Host, andernfalls <host>:<port>), keepalive 64 und keepalive_timeout 4s;
    • ein serverblock für server_name <hostname> auf Port 80 mit client_max_body_size 2g, der den location / an den Upstream weiterleitet, mit proxy_http_version 1.1, Host $http_host, Upgrade $http_upgrade, Connection $phis_site_<key>_connection sowie den Weiterleitungs-Headern (X-Forwarded-Host $http_host).
    keepalive_timeout bleibt unter dem Keep-Alive-Timeout von Node von 5 s; andernfalls verwendet nginx eine Verbindung wieder, die Node geschlossen hat, und ein POST -Aufruf schlägt mit dem Fehler 502 fehl. Host $http_host behält einen nicht standardmäßigen Port bei, den das Formular-Relay der Website mit dem Referer vergleicht. Namen enthalten den Site-Schlüssel (Zeichen, die keine Buchstaben, Ziffern oder _ sind, werden zu _ ), sodass die Dateien mehrerer Sites gemeinsam eingebunden werden können. Mit der Option --source ist der Upstream stattdessen die Quell-Überschreibung, und es wird ein Verzeichnis /_next/webpack-hmr für einen Entwicklungsserver hinzugefügt. Kein TLS.
  • apache: ein VirtualHost *:80 mit ProxyPass / http://127.0.0.1:<port>/ für die primäre Instanz (die erste lokale Instanz, andernfalls die erste).
  • systemd: Eine Unit für eine Instanz, die /usr/bin/node server.js als Benutzer phis im Instanzpfad ausführt, mit NODE_ENV=production, HOSTNAME=127.0.0.1, PORT=<port>, Restart=always, sowie einer auskommentierten Einstellung Environment=PHIS_RENDER_CACHE_MB=128 (die prozessspezifische Speicherbegrenzung des Render-Caches ). HOSTNAME bindet die Site an den Loopback-Adressraum, sodass nur der Proxy darauf zugreifen kann. Ohne --instance gilt die Einheit für die primäre Instanz; --instance <n> wählt die n-te (ab 0) Instanz, wie sie in der site config runtime-Liste aufgeführt sind, sodass eine Site mit mehreren Instanzen jeweils eine Einheit erhält. Die Einheit verfügt über kein ExecStop: phis instance drain gilt für Serverinstanzen, und eine Site meldet keine Betriebsbereitschaft.
  • docker-compose: Ein Dienst-Grundgerüst mit einem Platzhalter-Image.
  • runtime: the Site row and its resolved source and instance locations.

init, reconcile, update (Site-Scaffold)

phis init      <site key> --api-base-url <url> [--path <dir>] [--package-manager pnpm|npm|yarn|bun] [--install]
phis reconcile <site key> [--path <dir>] [--package-manager pnpm|npm|yarn|bun] [--install]
phis update    <site key> [--path <dir>] [--package-manager pnpm|npm|yarn|bun]
Die Zeile „Site“ muss vorhanden sein (Befehl: phis site add). Der Site-Schlüssel ist positionsabhängig.
FlaggeStandardAnmerkungen
--path<sites.sourcePathRoot>/<key> (or the source override path)Das Site-Repository.
--package-managerdie eigene WebsiteSiehe Paketmanager.
--api-base-urlkeine, erforderlichinit only. The address the Site's server-side code uses to reach @phis/server, written to config/site-runtime.json. The phis root does not record where the server listens (that is PORT and HOSTNAME in its environment), so there is no default: the Debian package serves on http://127.0.0.1:5301, the development server on http://127.0.0.1:3101.
--installausFührt die Installation des Paketmanagers nach init oder reconcile aus. update führt stets eine Installation durch.
Das Scaffold (Version 3) wird von der Datei src/lib/site-scaffold.mts generiert.
Paketmanager
Ohne die Option --package-manager verwendet init npm, während reconcile und update den site-eigenen Manager verwenden: den in package.json unter packageManager angegebenen Manager oder andernfalls den Manager, dessen Lockfile die Site enthält (pnpm-lock.yaml, package-lock.json, yarn.lock, bun.lock/bun.lockbb). Eine Site, die weder über eines noch über das andere verfügt oder Lockfiles mehrerer Manager enthält, wird abgelehnt, bis mit der Option --package-manager ein Manager angegeben wird. Es wird kein Lockfile gelöscht.
Bei Verwendung von --package-manager wird dieser Manager verwendet, die Sperrdateien der anderen Manager werden gelöscht, und packageManager wird auf <manager>@<version> gesetzt, sofern ein anderer Manager angegeben wurde.

phis init <site key> --api-base-url <url>

Erstellt ein neues Site-Repository. Schlägt fehl, wenn das Ziel bereits existiert und kein leeres Verzeichnis ist (Site target ... already exists; use phis reconcile), wenn --api-base-url fehlt oder keine HTTP(S)-URL ist und wenn api.internalToken im phis-Stammverzeichnis nicht gesetzt ist. Schreibt jede Scaffold-Datei sowie die Datei .phis/scaffold-manifest.json (Scaffold-Version, Site-Schlüssel, SHA-256-Hash jeder geschriebenen Datei). Eine Liste der Dateien finden Sie in der Datei INSTALL.md.
In der Datei config/site-runtime.json werden site.key, site.publicUrl (die öffentliche Basis-URL der Website, andernfalls https://<hostname>), phis.apiBaseUrl, phis.internalToken (api.internalToken) und network.internalApiTimeoutMs (8000) gespeichert. Diese Datei wird ausschließlich von init geschrieben.

phis reconcile <site key>

Überträgt ein vorhandenes Site-Repository in das aktuelle Scaffold:
  • Fehlende kanonische Dateien werden erstellt, Dateien, die Abweichungen aufweisen, werden überschrieben (und repaired). Änderungen, die an diesen Dateien vorgenommen wurden, gehen verloren.
  • Im Stammverzeichnis der Website muss sich eine Datei package.json befinden (ansonsten gilt: No Site at ...).
  • package.json wird durch Hinzufügen und nicht durch Zurücksetzen zusammengeführt: Eine Abhängigkeit (in dependencies oder devDependencies), ein Skript oder ein Feld auf oberster Ebene, das das Scaffold benötigt und in der Site fehlt, wird mit dem Wert des Scaffolds hinzugefügt; alles, was die Site bereits enthält, behält den Wert der Site bei, einschließlich Versionsbereiche wie beispielsweise @phis/ui. Zwei Ausnahmen: engines.node wird auf den Wert des Scaffolds >=24.21.0 gesetzt (andere engines-Schlüssel bleiben unverändert), und packageManager ändert sich nur bei expliziter Angabe von --package-manager (siehe oben).
  • Dateien, die zur Website gehören (PHI_SITE_OWNED_AFTER_INIT), werden, sofern vorhanden, unverändert belassen: .gitignore, die Modulprojektion src/generated/site-modules.ts, site-modules-client-<area>.ts (eine pro Bereich), site-modules-authoring-client.ts, site-modules-fonts.ts, site-module-packages.json und config/site-runtime.json. Eine fehlende .gitignore- oder Projektionsdatei wird mit ihrem ursprünglichen Inhalt neu erstellt. Eine fehlende config/site-runtime.json-Datei hingegen nicht: reconcile kennt weder die Serveradresse noch das Token. Erstellen Sie diese Datei anhand von config/site-runtime.example.json.
  • Dateien, die vom vorherigen Scaffold (gemäß dem alten Manifest) erstellt wurden und die vom aktuellen Scaffold nicht mehr geschrieben werden, werden gelöscht, wenn ihr Inhalt unverändert ist (removed), und an Ort und Stelle belassen, wenn die Website sie bearbeitet hat (kept). Verzeichnisse, die durch eine Entfernung geleert wurden, werden entfernt. Dateien, die der Website gehören, werden auf diese Weise niemals entfernt.
  • Das Manifest wird neu geschrieben.
Die JSON-Ausgabe listet jede Datei mit der entsprechenden Aktion auf: created, repaired, unchanged, removed und kept. Überprüfen Sie die als kept gekennzeichneten Einträge manuell; eine beibehaltene Routendatei kann an ihrem neuen Speicherort zu Konflikten führen.

phis update <site key>

reconcile (mit derselben package.json-Regel: Versionen bleiben erhalten), anschließend im Site-Verzeichnis: install (pnpm install --no-frozen-lockfile, npm install, yarn install, bun install), run typecheck, run build und anschließend eine Version in .phis/releases/<release id>/ verpacken. update erhöht die Versionen der Abhängigkeiten nicht; ändern Sie diese zunächst im Site-Verzeichnis (z. B. npm install @phis/ui@<version>), und führen Sie anschließend update aus.
Die Pressemitteilung:
  • ist eine Kopie von .next/standalone. Die darin enthaltenen Links werden als Links kopiert, sodass eine Version nicht von .next/standalone abhängt, das durch den nächsten Build ersetzt wird.
  • findet die Datei server.js dort, wo Next sie abgelegt hat: am Anfang von .next/standalone für eine Site, die eine eigene Tracing-Root darstellt, oder verschachtelt unter dem Pfad der Site relativ zur Tracing-Root (eine Site innerhalb eines pnpm- Arbeitsbereichs: .next/standalone/<site dir>/server.js, wobei sich node_modules ganz oben befindet). Schlägt fehl, wenn keine vorhanden ist. Bei einem verschachtelten Build startet eine server.js-Datei an der obersten Ebene der Release-Struktur den verschachtelten Build, sodass jeder Release mit dem Befehl node server.js in seinem Verzeichnis gestartet wird.
  • ruft .next/static und public/ neben dieser server.js-Datei ab.
  • enthält keine Datei config/site-runtime.json. Der Dateitracer von Next kopiert die Datei in das Verzeichnis .next/standalone; dabei werden alle Dateien mit diesem Namen ausgelassen. Stattdessen erhält das App-Verzeichnis config/site-runtime.json als relativen Verweis auf die Datei „config/site-runtime.json“ im Stammverzeichnis der Website config/site-runtime.json. Der eigenständige Server wechselt in sein eigenes Verzeichnis, bevor er die Datei liest; daher liest ein Release-Lauf, bei dem update die Datei erstellt hat, die aktuelle Datei der Site. Ein Release, das auf einen anderen Host kopiert wird, benötigt die Datei dieses Hosts unter <release>/config/site-runtime.json (ersetzen Sie den Link).
  • enthält die Datei release.json (releaseId, scaffoldVersion, buildId, appDirectory, createdAt).
update prints a note when the Site root has no config/site-runtime.json. Nothing is deployed or restarted; the release directory is what an instance path points at. The scaffold's .gitignore ignores .phis/releases/; a Site created before that entry was added needs it added by hand, because reconcile does not rewrite .gitignore.
Eine laufende Site liest die Datei config/site-runtime.json einmal pro Prozess; starten Sie die Site nach einer Änderung an dieser Datei neu.

Modul (Website-Module)

Ein Site-Modul ist ein Paket, das der Site-Build über die generierte Projektion src/generated/site-modules*.ts importiert. Der gewünschte Zustand ist die Datei config/phis-modules.json im phis-Stammverzeichnis. module-Befehle laden niemals Pakete herunter und führen niemals einen Build durch.
Die Projektion besteht aus folgenden Dateien: site-modules.ts (Server), je eine site-modules-client-<area>.ts-Datei pro Bereich, site-modules-authoring-client.ts, site-modules-fonts.ts und site-module-packages.json. Die Namen der installierten Pakete, die in der next.config.ts-Datei des Scaffolds aufgeführt sind, werden in transpilePackages übernommen – ein Paket aus einem Tarball oder einer Registry wird nur dann kompiliert, wenn es dort aufgeführt ist, und der Bereich ./fonts lädt andernfalls nichts . Alles, was sich nicht im gewünschten Zustand befindet, wird aus dem Manifest des jeweiligen Pakets im Verzeichnis node_modules der Website ausgelesen, da kein Befehl ein Modul ausführt: Die Bereiche in der Datei package.json#phis (modules[].eligibleAreas) werden als Platzierungen in die Server-Datei geschrieben und legen fest, welche Bereichsdateien die Client-Schnittstelle des Pakets importieren; die exports entscheiden, ob die „fonts“-Datei ./fonts importiert – dieser Bereich ruft next/font/local auf und wird außerhalb eines Next-Builds abgebrochen. Ein noch nicht installiertes Paket hat keine der beiden Antworten: Es verbleibt in der Server-Datei, wo der Build der Site es anhand seines Namens ablehnt, und add sowie sync weisen an, sync auszuführen, sobald es installiert ist.
--path (default: the Site source path as for init) selects the Site repository for every command except list. Those commands refuse to run when the directory holds no package.json (No Site at <path>), so a wrong --path does not record a Module for a directory no build reads.

phis module list [--site <site key>]

Listet die installierten Module pro Standort auf (packageName, origin, spec). Liest ausschließlich den gewünschten Status aus.

phis module add --site <site key> --package <@scope/name> [--spec <spec>] [--path <dir>]

Registriert das Modul und schreibt die Projektion neu. Mit --spec (einem Versionsbereich oder workspace:*) wird das Paket zudem zu den Abhängigkeiten in der Datei package.json der Site hinzugefügt (resolved nach Ursprung); ohne diese Angabe muss das Paket bereits auflösbar sein (local nach Ursprung). Anschließend wird das installierte Paket überprüft und es werden etwaige Probleme angezeigt oder der Hinweis not installed yet, falls das Paket vor dem Ausführen des Paketmanagers noch nicht installiert war. Das Programm beendet sich mit dem Status 1, wenn bei der Überprüfung Probleme festgestellt werden. Als Nächstes: Abhängigkeiten installieren, die Website neu erstellen, das Modul für einen Bereich im Builder aktivieren. Falls das Paket noch nicht installiert war, führen Sie nach der Installation zusätzlich phis module sync aus: Die Schriftprojektion wird aus dem installierten Paket gelesen; ohne diesen Befehl bleiben die Schriftarten eines Moduls aus dem Build ausgeschlossen.

phis module del --site <site key> --package <@scope/name> [--force] [--path <dir>]

Entfernt das Modul aus dem gewünschten Zustand, seine Abhängigkeit aus der Datei package.json und schreibt die Projektion neu. Der Vorgang wird abgelehnt, wenn Blöcke, die zu diesem Paket gehören, noch auf veröffentlichten Seiten dargestellt werden, und listet diese nach Bereichen auf; mit dem Parameter --force wird das Modul dennoch entfernt (die Blöcke verbleiben auf ihren Seiten, werden jedoch nicht mehr dargestellt). Erstellen Sie die Website anschließend neu.

phis module sync --site <site key> [--path <dir>]

Schreibt die Projektion ausgehend vom gewünschten Zustand neu, beispielsweise nach einem Scaffold, einer manuellen Bearbeitung oder der Installation, die auf ein add folgte. Die installierten Pakete werden erneut eingelesen, sodass eine ./fonts-Grenze, die mit der Installation eingespielt wurde, hier in site-modules-fonts.ts ankommt. Führen Sie anschließend einen Neuaufbau durch.

phis module check --site <site key> [--package <@scope/name>] [--path <dir>]

Überprüft die installierten Modulpakete im Verzeichnis node_modules der Website anhand des Modulvertrags. Schlägt fehl, wenn unter dem Pfad keine package.json-Datei vorhanden ist; gibt den Exit-Code 1 zurück, wenn bei einem Paket Probleme auftreten.

Add-on (Server-Add-ons)

Ein Server-Add-on entspricht einem addon.mjs-Artefakt. config/phis-addons.json gibt den gewünschten Zustand an, die Datenbankregistrierung dient als Grundlage für die Verteilung durch den Server, und reconcile sorgt für die Synchronisierung zwischen beiden. Die erfasste Release-ID entspricht der Paketversion der CLI. Der Lebenszyklus wird in ADDON_HOWTO.md beschrieben.
Fehlt die Datei config/phis-addons.json, wird dies als „Keine Add-ons installiert“ interpretiert; das erste addon installiert diese Datei.

phis addon list

Listet installierte Add-ons auf (addonId, enabled, package@version). Einträge, die nicht mehr mit dieser Version kompatibel sind, werden zuerst aufgeführt; beendet den Prozess mit dem Status 1, sobald solche Einträge vorhanden sind. Nur Dateien.

phis addon check

Überprüft jeden Eintrag: Manifest-Prüfsumme, Vorhandensein des Artefakts und Übereinstimmung mit dessen Prüfsumme; es dürfen keine zwei Add-ons denselben Dienstanbieter beanspruchen. Meldet Suchanfragen ohne Textindex. Beendet den Vorgang mit dem Status 1, wenn ein Eintrag nicht gültig ist, und gibt die weitere Vorgehensweise aus (upgrade oder remove). Nur Dateien.

phis addon install --artifact <path>

Importiert das Artefakt einmal, um dessen Manifest zu lesen und zu validieren, kopiert es nach addons/<scope>/<name>/<version>/addon.mjs und vermerkt es als deaktiviert. Lehnt eine Add-on-ID oder einen Paketnamen ab, der bereits installiert ist. Nächste Schritte: reconcile, migrate, enable, reconcile.

phis addon upgrade --addon <@scope/name> --artifact <path> [--repackage]

Installiert ein neueres (oder ein Artefakt derselben Version, das sich jedoch in den Bytes unterscheidet) neben dem alten und verweist den Eintrag neu darauf; der aktivierte Status bleibt erhalten. Eine andere Add-on-ID, eine niedrigere Schemaversion, das identische Artefakt und einen geänderten Paketnamen werden abgelehnt, sofern nicht --repackage angegeben wurde. Bis zum nächsten reconcile (und migrate , falls die Schemaversion erhöht wurde) gibt das Add-on den Status 503 zurück. Das Zurücksetzen erfolgt durch ein upgrade mit dem älteren Artefakt.

phis addon migrate [--addon <@scope/name>]

Leitet das Schema eines Add-ons oder aller installierten Add-ons mit database.migrationUri ab und wendet es an, wobei der servierenden Rolle (dem Benutzer unter database.uri) Zugriff gewährt wird. Unverändert Add-ons melden sich already at schema version. Eine Wiederholung ist unbedenklich.

phis addon enable|disable --addon <@scope/name>

Änderungen werden nur im gewünschten Zustand enabled. Sie werden erst nach dem Befehl phis addon reconcile wirksam.

phis addon reconcile

Schreibt den gewünschten Zustand für diese Version in die Registrierung, erfasst den aktuellen Status jedes Add-ons auf den Websites, die es angefordert haben (available oder disabled), und erstellt Gruppen, die in einem Manifest für Websites deklariert sind, auf denen das Add-on aktiviert ist. Gruppen werden hier niemals deaktiviert. Benötigt die Datenbank.

phis addon remove --addon <@scope/name>

Wird abgelehnt, solange das Add-on aktiviert ist. Löscht alle Installationsverzeichnisse des Add-ons sowie dessen Eintrag im gewünschten Status. Die Daten bleiben erhalten; siehe purge.

phis addon purge --addon <@scope/name>

Zerstörerisch und irreversibel. Wird ausgeführt, solange das Add-on noch installiert ist. Mit database.migrationUri wird das Schema des Add-ons gelöscht und jeder Datensatz daraus entfernt (Site-Zuordnungen, angewandte Migrationen, Katalogzeile, gespeicherte Geheimnisse); die zugehörigen Medienobjekte werden zur Entfernung durch die betreibende Instanz markiert und anschließend die Objekte aus den Site-spezifischen Speichern gelöscht.

phis addon forget --addon <@scope/name>

Entfernt den Eintrag aus der Datei phis-addons.json, ohne ihn zu validieren, um einen gewünschten Zustand zu erreichen, der nicht mehr mit dieser Version kompatibel ist. Das Artefakt verbleibt auf der Festplatte. Gilt nur für Dateien.

phis addon site

phis addon site --addon <@scope/name>
phis addon site --addon <@scope/name> --site <site key> --enable [--without-module]
phis addon site --addon <@scope/name> --site <site key> --disable
  • Ohne --enable/--disable: Listet die Websites auf, für die das Add-on aktiviert ist (Website-ID, angefordert, Konfigurationsstatus, Gültigkeitsstatus).
  • --enable: Fordert das Add-on für die Site an, ermittelt den Konfigurationsstatus anhand der angegebenen Einstellungen und erstellt die darin deklarierten Gruppen. Falls das Add-on über einen Modul-Teil verfügt (mit demselben Paketnamen), den die Site nicht in der Datei phis-modules.json enthält, wird der Vorgang abgelehnt; führen Sie zunächst phis module add aus und erstellen Sie die Konfiguration neu, oder übergeben Sie den Parameter --without-module, um nur den Server-Teil zu aktivieren.
  • --disable: Zieht die Anfrage zurück und löscht die Gruppen des Add-ons auf dieser Website. Die Ausführung wird verweigert, wenn das Add-on dort nie aktiviert wurde.

phis addon config --addon <@scope/name> --site <site key> [--name <setting> [--value <value>]]

  • Ohne --name: Listet die deklarierten Einstellungen mit dem gespeicherten Wert oder dem Standardwert auf.
  • --name with --value: validates and stores the value. An empty value (--value "" or --value=) is a value and is validated like any other.
  • --name without --value: clears the stored value, so the declared default applies.
Die Ausführung wird verweigert, wenn das Add-on für die Website nicht aktiviert ist (führen Sie zunächst den Befehl addon site --enable aus).

phis addon role

phis addon role --site <site key> [--addon <@scope/name>]
phis addon role --site <site key> --user <user id>
phis addon role --site <site key> --addon <@scope/name> --user <user id> --grant <role>
phis addon role --site <site key> --addon <@scope/name> --user <user id> --revoke <role>
  • Ohne --user: Listet die Rollen auf, die jedes installierte Add-on (bzw. das angegebene Add-on) definiert, sowie die Personen, die diese Rollen vergeben dürfen.
  • Nur --user: Listet die Add-on-Rollen auf, die der Benutzer auf der Website innehat.
  • --grant/--revoke: Erteilt oder widerruft eine deklarierte Rolle. Der Operator unterliegt nicht der grantableBy-Regel der Rolle.

phis addon owner --addon <@scope/name> --site <site key> [--from <user id>|none] --to <user id>

Überträgt die Eigentumsrechte an den Zeilen des Add-ons auf dieser Site von einem Konto auf ein anderes. Ohne das Argument --from (oder mit dem Wert none) werden die Zeilen übertragen, für die niemand die Eigentumsrechte besitzt. Das Ziel muss ein Mitglied der Site sein. Tabellen ohne eine „Site“-Spalte werden übersprungen und aufgelistet.

phis addon storage

phis addon storage --addon <@scope/name> --site <site key> [--quota-bytes <n>] [--max-objects <n>]
                   [--unlimited] [--sweep] [--recount]
Zeigt die Speicherauslastung des Add-ons auf der Website an (Bytes und Objekte im Verhältnis zu ihren Obergrenzen) und optional:
FlaggeWirkung
--quota-bytes <n>Legt die Byte-Obergrenze fest (ganze Zahl; der Wert 0 ist zulässig und bedeutet, dass keine Daten gespeichert werden dürfen).
--max-objects <n>Legt die Obergrenze für die Anzahl der Objekte fest.
--unlimitedHebt beide Obergrenzen auf.
--sweepLöscht Medienelemente im Bereich des Add-ons, auf die keine Verweise bestehen, sowie abgelaufene Reservierungen und entfernt anschließend die entsprechenden Objekte aus dem Speicher.
--recountZeigt das Speicherpräfix an und schreibt die Nutzungszähler entsprechend der tatsächlich gespeicherten Werte neu. Dies kostet einen vollständigen Abruf.
Das Festlegen einer Obergrenze wird abgelehnt, wenn das Add-on für die Website nicht aktiviert ist. --sweep wird vor --recount ausgeführt. Beide greifen direkt auf den Speicher zu; dies funktioniert sowohl für den integrierten lokalen Speicher als auch für Anbieter aus installierten Add-ons.

phis addon job --addon <@scope/name> --job <job id> --site <site key> --api-base-url <url>

Fordert den laufenden Server auf, einen deklarierten Job für eine Site auszuführen: POST <api base url>/api/v1/addons/jobs unter Verwendung des internen Tokens. --api-base-url ist erforderlich; dabei handelt es sich um die Adresse des Servers, wie sie von dem Ort aus erreichbar ist, an dem die CLI ausgeführt wird (Debian-Paket: http://127.0.0.1:5301); es gibt keinen Standardwert. Beendet den Vorgang mit dem Status 1, wenn der Server die Anfrage ablehnt. Erfordert api.internalToken und einen laufenden Server.

Speicherung (Speicherprofile)

Ein Speicherprofil verknüpft einen Standort mit einem Medien-Speicheranbieter unter Angabe dessen Konfiguration und einer Referenz auf Anmeldedaten. Der integrierte Anbieter ist der lokale Speicher von Core; weitere Anbieter stammen aus installierten Add-ons. Siehe GROUPS_AND_STORAGE.md.
--site wird wie bei jedem anderen Befehl in Kleinbuchstaben geschrieben.

phis storage list --site <site key>

Listet die Profile der Website auf und gibt an, in welches Profil die einzelnen Medienbereiche neue Uploads schreiben.

phis storage add --site <site key> --key <profile key> --provider <provider id> [--config <json|@file>] [--secret-name <name>|--secret-reference <ref>]

Überprüft die Konfiguration anhand der provider-eigenen Factory (für „Local“: rootDir absolut, storageKeyPrefix relativ), fügt das Profil ein, testet es und schreibt die CORS-Regeln jedes Profils. --config @file liest JSON aus einer Datei, die relativ zum „phis“-Stammverzeichnis aufgelöst wird. --secret-name erstellt die Referenz site:<site>:addon:<provider add-on>:<name> (oder ...:core:<name>); --secret-reference akzeptiert eine vollständige Referenz. Speichern Sie das Geheimnis zunächst mit phis secret set.

phis storage set --site <site key> --key <profile key> [--config <json|@file>] [--replace] [--secret-name|--secret-reference]

Fügt --config in die gespeicherte Konfiguration ein (--replace ersetzt diese), ändert optional den Verweis auf die Anmeldedaten, führt eine Validierung durch, führt erneut einen Test durch und schreibt die CORS-Regeln neu.

phis storage use --site <site key> --key <profile key>

Legt den Site-Speicherbereich (nicht den Benutzer- oder Gruppen-Speicherbereich) im Profil für neue Uploads fest. Vorhandene Assets verbleiben an ihrem bisherigen Speicherort. Der Vorgang schlägt fehl, wenn der Site-Speicherbereich noch nicht existiert; er wird erst angelegt, wenn zum ersten Mal Medien verwendet werden.

phis storage del --site <site key> --key <profile key>

Löscht das Profil. Der Vorgang wird abgelehnt, solange ein Raum oder ein Objekt dieses Profil noch nutzt.

phis storage cors

Schreibt die CORS-Regel jedes externen Speichers aus dem Site-Register (den öffentlichen Basis-URLs der Sites). Führen Sie diesen Vorgang aus, nachdem Sie die öffentliche Basis-URL einer Site geändert haben.

phis storage probe --site <site key> [--key <profile key>]

Prüft jedes externe Profil (Schreibbarkeit, verifizierte Prüfsummenalgorithmen) und protokolliert das Ergebnis sowie den Prüfsummenalgorithmus des Profils. Der lokale Anbieter wird nicht geprüft.

Geheimnis

Geheimnisse werden verschlüsselt in phis.server_secrets unter Verwendung von secrets.encryptionKey gespeichert. Ein Verweis lautet [site:<site key>:](core|addon:<@scope/name>):<name>; Namen bestehen aus Kleinbuchstaben, [a-z0-9._-] und dürfen bis zu 64 Zeichen lang sein.

phis secret init-key

Schreibt einen neuen zufälligen secrets.encryptionKey (Version 1) in die Datei phis-runtime.json. Der Vorgang wird abgebrochen, wenn bereits ein Schlüssel vorhanden ist, da dessen Ersetzung dazu führt, dass alle gespeicherten Geheimnisse unlesbar werden. Jede Serverinstanz benötigt denselben Schlüssel.

phis secret set --name <name> [--site <site key>] [--addon <@scope/name>] [--value <value>]

Speichert oder ersetzt ein Geheimnis. Der Wert wird aus stdin eingelesen (ein abschließendes Zeilenendezeichen wird entfernt); stdin darf kein Terminal sein. Die Option --value funktioniert zwar, es wird jedoch eine Warnung ausgegeben, da der Wert in der Prozessliste und im Shell-Verlauf sichtbar ist. Ein leeres --value wird nicht akzeptiert.
printf '%s' "$SMTP_PASSWORD" | phis secret set --name smtp-password --site acme

phis secret check --name <name> [--site] [--addon]

configured, missing oder unreadable (gespeichert, aber mit dem aktuellen Schlüssel nicht entschlüsselbar) Ausdrucke ohne den Wert auszudrucken. Bei unreadablen Ergebnissen wird der Exit-Code 1 zurückgegeben.

phis secret list [--site <site key>] [--addon <@scope/name>]

Listet Referenzen, Schlüsselversionen und Aktualisierungszeitpunkte auf. Niemals Werte.

phis secret del --name <name> [--site] [--addon]

Löscht das Geheimnis.

auth

phis auth restore-preset --site <site key>

Stellt die Benutzeroberfläche für die First-Party-Authentifizierung (@phis/ui/modules/auth) als Authentifizierungsanbieter in den öffentlichen, App- und Admin-Bereichen der Website wieder her, deaktiviert dort ein Modul eines fremden Authentifizierungsanbieters und löscht die durch Seitenvoreinstellungen vorgenommenen Überschreibungen der Authentifizierungsseiten. Idempotent; gibt pro Bereich aus, ob sich etwas geändert hat und welches Modul für „public“/login“ zuständig ist. Verwenden Sie diese Funktion, wenn sich eine Website durch die Auswahl ihres Authentifizierungsmoduls selbst ausgesperrt hat.

phis auth import-secrets

Verschiebt die nicht mehr verwendete Klartext-auth.secrets-Zuordnung aus der Datei phis-runtime.json in den verschlüsselten Speicher, schreibt gespeicherte Verweise in die neue Form um und entfernt auth.secrets aus der Datei, sobald alle Daten importiert wurden. Erfordert secrets.encryptionKey.

Operator

Plattformbetreiber sind die Konten der Betreiber-Benutzeroberfläche (/operator). Sie sind in platformSuperUsers der Datei phis-runtime.json (argon2-Passwort-Hashes) gespeichert, nicht in der Datenbank. Der Server speichert diese Datei bis zu vier Stunden lang im Cache: Starten Sie ihn nach jedem operator-Befehl neu, der Änderungen bewirkt, da sich sonst ein neuer Operator nicht anmelden kann, während ein entfernter oder deaktivierter Operator dies weiterhin kann, bis der Cache abläuft.
BefehlWirkung
phis operator list [--email <email>]Listet Operatoren auf (E-Mail, aktiviert, Name).
phis operator add --email <email> --password <pw> [--name <display name>] [--disabled]Fügt einen Mitarbeiter hinzu; lehnt eine doppelte E-Mail-Adresse ab.
phis operator passwd --email <email> --password <pw>Ersetzt das Passwort und beendet die Sitzungen des Benutzers.
`phis-Operator aktivieren`deaktivieren --email `
phis operator del --email <email>Entfernt den Operator. Der letzte kann entfernt werden.
phis operator secretSchreibt operator.sessionSecret, falls dieser fehlt. Jeder der oben genannten „operator“-Schreibvorgänge führt dasselbe aus; dies gilt für eine Installation, bei der der Schlüssel noch nicht vorhanden war und die daher keine Operator-Sitzungen aufweist, bis er festgelegt wird.
Operator-Sitzungs-Cookies werden ausschließlich mit operator.sessionSecret signiert – und mit nichts anderem, also nicht mit api.internalToken, über das jede Site-Laufzeitumgebung verfügt.
Die Cookies sind zustandslos; was also eine Sitzung beendet, ist die sessionGeneration des Operators in platformSuperUsers: Jedes Cookie enthält den Wert, mit dem es signiert wurde, und bei jeder Anfrage wird dieser mit der Laufzeitdatei abgeglichen. Das Abmelden und der Befehl phis operator passwd erhöhen den Zählwert, wodurch jede Sitzung des Operators beendet wird – einschließlich eines kopierten Cookies. Die Sitzungen eines entfernten oder deaktivierten Operators enden auf dieselbe Weise, und zwar bei deren nächster Anfrage.
Passwörter, die über die Befehlszeile eingegeben werden, sind in der Prozessliste und im Shell-Verlauf sichtbar. Ein Passwort, das mit einem Bindestrich (-) beginnt, wird unverändert weitergegeben (--password -x1 oder --password=-x1).

Medien

phis media check [--fix]

Für jedes rootDir eines lokalen Speicherprofils wird das Verzeichnis durchlaufen und es werden Einträge gemeldet, die nicht dem Eigentümer des Stammverzeichnisses selbst (dem Konto, unter dem der Server läuft) gehören. Beendet das Programm mit dem Status 1, wenn Funde vorliegen und --fix nicht angegeben wurde. --fix setzt die Eigentumsrechte zurück (chown), wofür ein Benutzer erforderlich ist, der dazu berechtigt ist, in der Regel root. Fehlende root-Rechte werden gemeldet.

pflegen

phis maintain [--list] [--task <id>] [--dry-run]

Führt begrenzte, idempotente Bereinigungsaufgaben in der unten angegebenen Reihenfolge aus. Mit --list werden diese angezeigt. Aufgaben:
IdWirkung
paymentsStimmt bis zu 100 Zahlungen ab, die als abzustimmen gekennzeichnet sind oder bei denen der Vorgang noch als reserved, pending oder indeterminate gekennzeichnet ist: Das Programm fragt den Zahlungsanbieter nach dem aktuellen Status und protokolliert diesen; ein Finanzbefehl wird dabei niemals erneut ausgeführt. Benötigt secrets.encryptionKey, um auf die Anmeldedaten des Anbieters zugreifen zu können. Mit der Option --dry-run werden lediglich die Kandidaten gezählt, ohne dass ein Aufruf des Anbieters erfolgt.
upload-sessionsLöscht abgelaufene Upload-Sitzungen und gibt die dafür reservierten Bytes an die jeweiligen Media Spaces zurück.
addon-assetsLöscht die Zeilen der Medienelemente in Add-on-Bereichen, auf die kein Link mehr verweist. Die gespeicherten Objekte werden nicht entfernt; der Befehl phis addon storage --sweep entfernt sie pro Add-on und Website. Mit der Option --dry-run wird lediglich angezeigt, wie viele Bereiche überprüft würden.
hook-deliveriesLöscht die Datensätze zu verifizierten Hook-Zustellungen (`phis.addon_hook_deliveries`, die zur Erkennung eines erneut versendeten Webhooks dienen), die älter als 30 Tage sind und damit weit außerhalb des Wiederholungsfensters des jeweiligen Absenders liegen.
addon-storageListet jeden Add-on-Speicher jeder Website auf und schreibt dessen Byte- und Objektzähler entsprechend der tatsächlich gespeicherten Daten neu – genau wie der Befehl phis addon storage --recount für alle Speicher. Pro Speicher fallen die Kosten für eine vollständige Auflistung an; Speicher, auf die dieser Prozess nicht zugreifen kann, werden namentlich genannt und übersprungen. Mit der Option --dry-run wird lediglich gemeldet, wie viele Speicher aufgelistet würden.
support-requester-windowSchließt gelöste Support-Tickets, bei denen der Anfragende nicht innerhalb des Zeitfensters geantwortet hat (entweder das des Ticket-Typs oder das der Website; der Wert 0 deaktiviert diese Funktion), und protokolliert dabei ein Schließereignis. Maximal 500 pro Durchlauf, wobei die ältesten Lösungen zuerst berücksichtigt werden; Tickets, die von einem anderen Bearbeiter gesperrt wurden, werden auf den nächsten Durchlauf verschoben. Bei Abfragen werden solche Tickets bereits als geschlossen angezeigt, sodass hier lediglich die gespeicherte Zeile angepasst wird.
--task führt eine Aufgabe aus, --dry-run gibt eine Meldung aus, ohne etwas zu ändern. Eine fehlgeschlagene Aufgabe wird gemeldet, und die anderen werden weiterhin ausgeführt; der Exit-Code beträgt 1, wenn eine Aufgabe fehlgeschlagen ist. Die Ausführung über einen Timer ist unbedenklich.

E-Mail

phis mail drain [--limit <rows>] --api-base-url <url>

Versendet die noch ausstehenden Benachrichtigungen aus dem Benachrichtigungs-Ausgang (phis.notification_outbox). Eine Benachrichtigung wird einmal von der Anfrage versucht, die sie erstellt hat; dieser Befehl dient als Wiederholungsversuch und ist dafür vorgesehen, über einen Timer ausgeführt zu werden. Er sendet eine Anfrage an <api base url>/api/v1/notifications/drain mit dem internen Token, sodass der Drain im Serving-Prozess ausgeführt wird, in dem sich die E-Mail-Konfiguration, der Übersetzungscache und der Transport befinden.
--api-base-url is required, the server's address as reached from where the CLI runs (Debian package: http://127.0.0.1:5301); there is no default. --limit is the number of rows to claim in one run, a positive whole number; the server takes 100 when it is not given and never more than 1000. The command prints how many rows it claimed, sent, dropped and failed, or the server's JSON answer with --json. It exits 1 when the server refuses or fails the request. Requires api.internalToken and a running server.

Lizenzen

phis licenses check [--package <directory>]

Überprüft die installierten Produktions- und Entwicklungsabhängigkeiten eines Pakets (Standard: @phis/server selbst) und meldet nicht zulässige Lizenzen. Ein in der Produktion festgestellter Verstoß, der in src/cli/licenses.mts nicht berücksichtigt ist, wirkt blockierend und führt dazu, dass der Befehl mit dem Exit-Code 1 beendet wird. Es ist weder eine phis-Root-Konfiguration noch die Datenbank erforderlich.

Beispiel

Jeder Serverprozess schreibt eine Heartbeat-Zeile in die Tabelle phis.server_instances (Release-ID, Add-on-Digest, Bereitschaftsstatus).

phis instance list [--stale-after <seconds>]

Listet Instanzen auf; eine Instanz gilt nur dann als bereit, wenn sie sich innerhalb von --stale-after Sekunden (Standard: 90) als bereit gemeldet hat. Meldet, wenn mehrere Releases oder Add-on-Sets gleichzeitig bereitgestellt werden, was bedeutet, dass ein Rollout noch nicht abgeschlossen ist, und beendet in diesem Fall den Prozess mit dem Status 1, sodass ein Bereitstellungsskript darauf warten kann.

phis instance drain [--id <instance id>]

Markiert die Instanz als nicht bereit, sodass ein Load Balancer keine Anfragen mehr an sie weiterleitet; die Zeile bleibt erhalten. Die ID lautet standardmäßig PHIS_INSTANCE_ID, andernfalls <hostname>:<root>. Führen Sie diesen Befehl aus, bevor Sie einen Serverprozess beenden; die Debian-Einheit phis@.service führt ihn als ExecStop aus.

phis instance prune [--forget-after <seconds>]

Löscht Zeilen mit Instanzen, die länger als --forget-after Sekunden inaktiv waren (Standardwert: 2592000, 30 Tage).

Häufige Aufgaben

AufgabeBefehle
ErstinstallationINSTALL.md
Den Server aktualisierenInstallieren Sie die neue Version, führen Sie phis schema apply, phis addon check, phis addon migrate, phis addon reconcile aus, starten Sie das System neu und führen Sie phis site check --key <site> aus.
Eine Website erstellenphis site add, phis site admin, phis init, phis update (INSTALL.md)
Aktualisieren Sie eine Website auf ein neues Scaffold oder @phis/uiAktualisieren Sie die Version auf der Website (npm install @phis/ui@<version>), führen Sie phis update <site> aus, stellen Sie die neue Version bereit und starten Sie den Dienst neu (INSTALL.md)
Ein Modul zu einer Website hinzufügenphis module add, phis update <site>, deploy, activate in the Builder (INSTALL.md)
Ein Add-on installierenphis addon install, reconcile, migrate, enable, reconcile, phis addon site --enable (INSTALL.md)
Ein Add-on entfernenphis addon site --disable per Site, addon disable, addon reconcile, addon remove, then addon purge to discard data
Ein vergessenes Passwort für den Website-Administrator zurücksetzenphis site user --site <site> --email <email> --password <pw> --overwrite
Ein Bedienerpasswort zurücksetzenphis operator passwd --email <email> --password <pw>, restart the server
Eine Serverinstanz aus dem Rotationsplan nehmenphis instance drain --id <id>

Zahlungsprofile

Core verwaltet Händlerprofile und explizite Verbraucherberechtigungen. Die CLI verwendet ausschließlich installierte Provider-Artefakte; keine Profildatei kann einen Paketimport auswählen oder einen Anmeldewert bereitstellen.
Vor dem ersten Profil: Wenden Sie das Core-Schema mit dem Befehl phis schema apply an. Dadurch werden die „Payment“-Tabellen angelegt; bereits vorhandene Tabellen werden jedoch nicht geändert. Daher müssen in einer Datenbank, in der die Tabelle phis.addon_event_outbox bereits vor „Payments“ existierte, die neuen Spalten und Einschränkungen dieser Tabelle manuell hinzugefügt werden, bevor ein „Payment“-Consumer zugelassen wird (DB.md). Installieren und aktivieren Sie anschließend das Provider-Add-on, aktivieren Sie es für die Website, die Zahlungen entgegennehmen soll (`phis addon site --enable`), und speichern Sie die Anmeldedaten mit `phis secret set`, wobei Sie den Wert über die Standard-Eingabe (stdin) statt über die Befehlszeile übergeben.
phis payment profile list --site demo
phis payment profile add --site demo --file /protected/path/stripe-sandbox.json
phis payment profile set --site demo --file /protected/path/stripe-sandbox.json
phis payment profile probe --site demo --key stripe-sandbox --currency CHF
phis payment profile enable --site demo --key stripe-sandbox --currency CHF
phis payment profile retire --site demo --key stripe-sandbox
phis maintain --task payments --dry-run
phis maintain --task payments
Datei hinzufügen/festlegen (nur Referenzen; die darin enthaltenen Richtliniennamen müssen im installierten Consumer-Manifest vorhanden sein):
{
  "key": "stripe-sandbox",
  "providerKey": "@phis/stripe/stripe",
  "mode": "test",
  "credentialReferences": {
    "apiKey": "site:demo:addon:@phis/stripe:stripe-sandbox-api",
    "webhookSecret": "site:demo:addon:@phis/stripe:stripe-sandbox-webhook"
  },
  "grants": [{
    "consumerAddonId": "@example/shop",
    "operations": ["read", "create", "complete", "refresh", "capture", "cancel", "refund"],
    "merchantActions": {
      "capture": { "roles": [], "jobs": [], "events": [] },
      "cancel": { "roles": [], "jobs": [], "events": [] },
      "refund": { "roles": [], "jobs": [], "events": [] }
    }
  }]
}
Der Verbraucher muss payments:v1 anfordern und payment.changed deklarieren. Leere Händlerrichtlinien erlauben nur einem authentifizierten Betreiber oder Site-Administrator innerhalb dieser Verbraucher-/Profilberechtigung. „Add“ ist zunächst deaktiviert; „Set“ behält den festgelegten Händler/Anbieter/Modus bei, erhöht die Revisionsnummer und deaktiviert die Neuanlage, bis „reprobed/enabled“ erfolgt ist. Das Ändern von Anbieter, Konto oder Modus erfordert einen neuen Schlüssel. Ausgelaufene Schlüssel werden nicht wiederverwendet, aber vorhandene Zahlungsnachweise und Abrechnungen bleiben verfügbar. Es wird keine Profil-Löschung oder finanzielle Bereinigung angeboten. Durch das Entziehen der Berechtigung werden vorhandene Datensätze für diesen Verbraucher ausgeblendet, ohne dass finanzielle Nachweise gelöscht werden.
Die Probe ist gegenüber dem PSP schreibgeschützt und erfasst Merkmale wie Händleridentität, Modus und Zahlungsmethode; bei einem geänderten Händler oder Modus schlägt der Vorgang fehl. Aktivieren Sie die Probes erneut und stellen Sie sicher, dass jede bereite Serverinstanz (innerhalb des bestehenden 90-Sekunden-Bereitheitsfensters) die installierte Provider-Version und die Core-Payment-Funktionen enthält. Es kann nicht festgestellt werden, ob ein Webhook-Endpunkt erreichbar ist. Konfigurieren Sie das separate Signaturgeheimnis für den Stripe-Endpunkt und überprüfen Sie die tatsächliche Zustellung von Benachrichtigungen, bevor Sie sich auf die Abwicklung verlassen.
Die Wartungsaufgabe wählt höchstens 100 offene Zahlungen aus, gleicht gespeicherte Fernbefehle ab und meldet nicht verfügbare bzw. gleichzeitig auftretende Forderungen. Ein Testlauf bewirkt keine Änderungen und führt keine Anrufe beim Anbieter durch. Bei Wiederholungsversuchen erfolgt weder ein Wechsel des Anbieters oder des Kontos noch die Generierung von Ersatzbefehlen für Finanztransaktionen. Es wird kein Abfrage-Timer hinzugefügt.