© 2026 phis.dev. Alle Rechte vorbehalten.
Brand logo
phis.dev
  • Startseite
  • Dokumentation
Ein Terminal mit einer Eingabeaufforderung, auf der der Cursor wartet
Erste Schritte

Installieren Sie phis

Vom Debian-Paket bis zur ersten Website: der Server, seine Datenbank, der erste Betreiber und eine Website, die Seiten bereitstellt.
Auf dieser Seite
1. Voraussetzungen
2. Installieren Sie den Server und konfigurieren Sie das physische Root-Verzeichnis
3. Erstellen Sie das Datenbankschema
4. Starten Sie den Server und legen Sie den ersten Bediener an
5. Eine Website erstellen
6. Errichten Sie ein Gerüst auf der Baustelle
7. Die Website installieren, erstellen und ausführen
8. Webserver und Serviceeinheiten
9. Module hinzufügen
10. Add-ons hinzufügen
11. Spätere Aktualisierung
phis.dev
Schnellzugriff
AGB
Kontakt

Installation von phis

Diese Schritt-für-Schritt-Anleitung führt Sie Schritt für Schritt von einem neuen Linux-Host zu einem lauffähigen @phis/server mit einer Website. Jeder Befehl wird in der Datei CLI.md beschrieben; die Konfigurationsschlüssel sind in der Datei README.md aufgeführt.
In den Beispielen wird Folgendes verwendet:
PlatzhalterBeispiel
phis-Stamm (Bühne)/srv/phis/stages/prod
Serveradressehttp://127.0.0.1:5301 (die Portierung des Debian-Pakets; verwenden Sie bitte Ihre eigene)
Standortschlüsselacme
Quellpfad der Website/opt/phis/sources/acme
Pfad zur Website-Instanz/var/www/phis/sites/acme
Führen Sie phis mit der Option --root /srv/phis/stages/prod aus oder exportieren Sie einmalig PHIS_ROOT=/srv/phis/stages/prod; die nachstehenden Beispiele gehen davon aus, dass die Variable exportiert ist.
  1. 1.
    Voraussetzungen
  2. 2.
    Installieren Sie den Server und konfigurieren Sie das physische Root-Verzeichnis
  3. 3.
    Erstellen Sie das Datenbankschema
  4. 4.
    Starten Sie den Server und legen Sie den ersten Operator an
  5. 5.
    Eine Website erstellen
  6. 6.
    Die Baustelle mit Gerüsten ausstatten
  7. 7.
    Installieren, erstellen und starten Sie die Website
  8. 8.
    Webserver und Serviceeinheiten
  9. 9.
    Module hinzufügen
  10. 10.
    Add-ons hinzufügen
  11. 11.
    Wird später aktualisiert

1. Voraussetzungen

  • Node.js 24.21.0 oder höher für den Server, die CLI und jede Site. Frühere Versionen verursachen Speicherlecks beim React-Flight-Rendering und stoßen unter Last an ihre Speichergrenzen. @phis/server deklariert "engines": {"node": ">=24.21.0"} ; eine generierte Site tut dasselbe; das Debian-Paket hängt von nodejs (>= 24.21.0) ab, und die Einrichtungsseite des Servers schlägt bei einer Node-Version unterhalb dieser Grenze bei der Node-Prüfung fehl. Weder Debian 13 (trixie) noch Ubuntu 24.04 (noble) liefern Node 24 in ihrem eigenen Archiv mit; installieren Sie es daher zunächst über NodeSource , dessen nodejs -Paket diese Abhängigkeit erfüllt. Ohne dieses Paket bricht apt install phis aufgrund der nicht erfüllten Abhängigkeit ab, da das in „noble“ enthaltene nodejs die Version 18 hat; auf einem Host, dessen NodeSource-Node älter als 24.21 ist, wird dieser zusammen mit dem Paket aktualisiert, und Dienste, die bereits auf dem alten Node laufen, behalten diesen bis zu ihrem Neustart bei.
  • Es gibt keinen Paketmanager für den Server selbst, wenn dieser über das Debian-Paket oder den Paket-Tarball installiert wird: Der Server und die phis-CLI laufen ausschließlich auf Node. pnpm wird nur benötigt, um den Server aus dem Quellcode zu kompilieren (die Release-Version wird mit pnpm 11 kompiliert; @phis/server gibt pnpm in devEngines an, weshalb npm sich weigert, die eigenen Skripte des Repositorys auszuführen).
  • Ein Paketmanager für jede Site, über den die Befehle phis init und phis update im Verzeichnis der Site ausgeführt werden: Standardmäßig npm für eine neue Site oder „yarn“, „bun“ oder „pnpm“, falls die Site einen dieser Paketmanager verwendet; siehe Paketmanager.
  • PostgreSQL mit der Erweiterung pg_trgm (Debian: Bestandteil des Pakets postgresql ). Da pg_trgm eine vertrauenswürdige Erweiterung ist, kann sie von einer Rolle installiert werden, die über die Berechtigung CREATE für die Datenbank verfügt.
  • Ein Reverse-Proxy (nginx oder Apache) für TLS und öffentliche Hostnamen.
  • Ein Systemkonto, unter dem die Dienste ausgeführt werden, z. B. phis, das Eigentümer des „phis“-Stammverzeichnisses, des Stammverzeichnisses für lokale Medien und der Verzeichnisse der Standortinstanzen ist.
  • Vom Server aus erreichbarer SMTP-Relay-Server für den ausgehenden Datenverkehr (email.smtp.targets), falls die Websites E-Mails versenden.
Legen Sie die beiden Datenbankrollen und die Datenbank an. Die Rolle „serving“ ist Eigentümerin des Core-Schemas phis; die Rolle „migration“ ist Eigentümerin der Schemata der Server-Add-ons. Beide benötigen die Berechtigung CREATE für die Datenbank.
phis db bootstrap does this, once the server is installed — step 2 below, after which:
phis db bootstrap --admin-uri postgres://<admin>@<host>:5432/postgres --name prod
Es legt die Tabellen phis_prod, phis_prod_user und phis_prod_migrator an, generiert für jede davon ein Passwort und schreibt beide Verbindungszeichenfolgen in die Datei config/phis-runtime.json, sodass die Tabelle in Schritt 2 diese nicht erneut abfragt (CLI.md). --admin-uri ist eine Verbindung, die zum Anlegen von Datenbanken und Rollen berechtigt ist und einen Host angeben muss; es muss sich dabei nicht um einen Superuser handeln.
Von Hand, entsprechend:
CREATE ROLE phis_prod_user LOGIN PASSWORD '<serving password>';
CREATE ROLE phis_prod_migrator LOGIN PASSWORD '<migration password>';
CREATE DATABASE phis_prod OWNER phis_prod_user;
GRANT CREATE ON DATABASE phis_prod TO phis_prod_migrator;

2. Installieren Sie den Server und konfigurieren Sie das physische Root-Verzeichnis

Aus der Quelle

Das Repository wird als eigenständiges Paket erstellt, so wie es im Release-Workflow vorgesehen ist (.github/workflows/release.yml). Es enthält weder eine Lockdatei noch eine pnpm-workspace.yaml; seine einzige Abhängigkeit, @phis/contracts, wird von npm in der in der package.json angegebenen Version bezogen. Es benötigt Node 24.21 oder höher sowie pnpm 11. Erstellen Sie die vom Release-Workflow generierte Workspace-Datei – diese ermöglicht die nativen Build-Skripte und befreit die @phis-Pakete von der Mindestveröffentlichungsdauer von pnpm – und installieren Sie anschließend den Server, erstellen Sie ihn und bündeln Sie die CLI:
git clone https://github.com/phis-dev/phis-server.git && cd phis-server
printf 'allowBuilds:\n  argon2: true\n  esbuild: true\n  sharp: true\n  unrs-resolver: true\nminimumReleaseAgeExclude:\n  - "@phis/*"\n' > pnpm-workspace.yaml
pnpm install --no-frozen-lockfile
pnpm build                                     # next build
pnpm build:cli                                 # dist/phis.mjs, which ./phis prefers
Führen Sie die Befehlszeilenschnittstelle mit dem Befehl pnpm phis ... oder ./phis ... aus dem Verzeichnis phis-server aus (CLI.md).

Aus dem Debian-Paket

Das Paket wird im apt-Repository unter apt.phisys.com für Debian 13 (trixie) und Ubuntu 24.04 (noble) auf den Architekturen amd64 und arm64 veröffentlicht. Jede neue Version wird zunächst im testing-Kanal bereitgestellt; der stable-Kanal erhält eine Version, sobald diese hochgestuft wurde. Fügen Sie das Repository und dessen Signaturschlüssel hinzu und führen Sie anschließend die Installation durch:
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://apt.phisys.com/repo-signing-key.asc \
  | sudo gpg --dearmor -o /etc/apt/keyrings/phisys-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/phisys-archive-keyring.gpg] https://apt.phisys.com/testing $(. /etc/os-release && echo "$VERSION_CODENAME") main" \
  | sudo tee /etc/apt/sources.list.d/phisys.list
sudo apt update
sudo apt install phis
Jeder GitHub-Release sind dieselben Pakete beigefügt, und zwar im Format phis_<version>-<revision>+<distribution>_<arch>.deb (beispielsweise phis_0.2.7-1+trixie_amd64.deb), für einen Host, auf dem die Installation ohne Repository erfolgt (sudo apt install ./phis_<...>.deb). Debian 12 (bookworm) wird nicht unterstützt: Die dortige glibc-Version ist älter als die, auf deren Basis das Paket erstellt wurde.
Das Paket installiert den Server unter /usr/lib/phis/server, die Befehlszeilenschnittstelle unter /usr/bin/phis, legt den Benutzer phis an und erstellt die Stufe /srv/phis/stages/prod mit einer leeren Datei config/phis-runtime.json, einem Verweis auf die im Paket enthaltene Datei phis-config.json (/usr/share/phis/phis-config.json) sowie der Datei .env, die die Einträge PORT=5301, HOSTNAME=127.0.0.1 und einen generierten NEXT_SERVER_ACTIONS_ENCRYPTION_KEY enthält. Der Dienst lautet phis@prod.service. Die Serveradresse lautet dann http://127.0.0.1:5301. /usr/bin/phis arbeitet in /srv/phis/stages/prod, sofern nicht --root oder PHIS_ROOT eine andere Stufe angibt (CLI.md).
Das Paket legt die Dateien config/phis-runtime.json und .env mit den Berechtigungen 0600 an, deren Eigentümer phis:phis ist, und setzt diese bei jedem Upgrade erneut, da beide geheime Daten enthalten. Ein normaler Benutzer kann die CLI daher nicht auf der „stage“-Umgebung ausführen: Führen Sie sie als Dienstkonto aus (sudo -u phis phis ... ) oder als Root. Ein Schreibvorgang als Root behält den Eigentümer und die Gruppe der Datei bei, sodass der Server sie anschließend weiterhin lesen kann; die CLI legt die Datei mit dem Modus 0600 an, unabhängig davon, wer sie ausführt. Fahren Sie mit der folgenden Konfiguration fort.

Aus dem Paket-Tarball

@phis/server ist nicht auf npm verfügbar; das Debian-Paket stellt die offizielle Version dar (README, „Distribution“). Der Tarball pnpm package:pack, der erstellt wird, enthält denselben eigenständigen Server, dieselbe Operator-CLI und dieselbe Schemadatei wie das Debian-Paket, wobei die Laufzeitabhängigkeiten von npm aufgelöst werden, anstatt neben den Dateien kopiert zu werden. Es wurde noch nicht auf einem echten Host installiert. Was es nicht enthält, ist die Maschineneinrichtung: kein Dienstkonto, keine Stage, keine Service-Einheit, keine Proxy-Konfiguration und kein generierter NEXT_SERVER_ACTIONS_ENCRYPTION_KEY – was für den Produktivbetrieb erforderlich ist und von jeder Instanz einer Installation gemeinsam genutzt werden muss. Entnehmen Sie diese aus dem Verzeichnis debian/, sofern die Installation sie benötigt.
npm install -g ./phis-server-<version>.tgz
phis --help                          # the bin wrapper names the application root the CLI reads
Der Server ist die eigenständige Datei server.js im Paketverzeichnis:
PHIS_ROOT=/srv/phis/stages/prod PORT=5301 HOSTNAME=127.0.0.1 \
  NEXT_SERVER_ACTIONS_ENCRYPTION_KEY=... \
  node "$(npm root -g)/@phis/server/server.js"
npm install gibt eine Warnung aus, dass das Installationsskript von „argon2“ nicht ausgeführt wurde. Dies ist jedoch nicht erforderlich: Beide nativen Pakete enthalten vorgefertigte Binärdateien, und die Hash-Berechnung sowie die Bildverarbeitung funktionieren mit dem installierten Tarball in seiner aktuellen Form einwandfrei. Fahren Sie mit der folgenden Konfiguration fort.

Die Phis-Wurzel

Das „phis“-Stammverzeichnis ist das Verzeichnis, aus dem der Server und die CLI den Ordner config/ lesen. Der Server bezieht diesen Wert aus PHIS_ROOT; in der Produktionsumgebung wird standardmäßig auf /srv/phis/stages/prod zurückgegriffen. Erstellen Sie dieses Verzeichnis, dessen Eigentümer das Dienstkonto ist:
install -d -o phis -g phis /srv/phis/stages/prod/config
DateiMaßnahme
config/phis-config.jsonKopieren Sie die Datei aus dem Verzeichnis phis-server/config/phis-config.json und passen Sie sie an. Unter Debian handelt es sich um einen symbolischen Link zur im Paket enthaltenen Datei /usr/share/phis/phis-config.json, die bei einem Upgrade überschrieben wird: Nehmen Sie eine Änderung in der Datei phis-runtime.json vor, deren Werte die ursprüngliche Datei überschreiben, oder ersetzen Sie den Link durch eine eigene Kopie, die das Paket dann unberührt lässt.
config/phis-runtime.jsonErstellen Sie die Datei; beginnen Sie mit phis-server/config/phis-runtime.example.json (Debian: /usr/share/doc/phis/examples/). Die Datei enthält vertrauliche Daten: Berechtigung 0600, Eigentümer ist das Dienstkonto.
config/phis-addons.jsonOptional; mit dem Befehl phis addon install wird es erstellt.
config/phis-modules.jsonOptional; phis module add creates it.
Überprüfen Sie in der Datei phis-config.json mindestens Folgendes:
SchlüsselWarum
translation.supportedLocales, translation.sourceLocalephis site add accepts only supported locales.
sites.sourcePathRoot, sites.instancePathRoot, sites.basePortStandardpfad zur Website, Instanzpfad und Port (basePort + site id).
media.local.rootDirAn dem Ort, an dem das lokale Speicherprofil Mediendateien schreibt, erstellen Sie dieses Profil, dessen Eigentümer das Dienstkonto ist.
email.from, email.fromName, email.smtp.targetsAusgehende Post.
bootstrap.enabledtrue stellt die Einrichtungsseiten unter /setup bereit (Schritt 4); false blendet sie aus.
Legen Sie in der Datei phis-runtime.json die vom Server benötigten Werte fest. Generieren Sie jeden 64-Zeichen-Hexadezimalwert mit dem Befehl openssl rand -hex 32:
{
  "database": {
    "uri": "postgresql://phis_prod_user:<serving password>@127.0.0.1:5432/phis_prod",
    "migrationUri": "postgresql://phis_prod_migrator:<migration password>@127.0.0.1:5432/phis_prod"
  },
  "api": {
    "internalToken": "<random token>"
  },
  "auth": {
    "transactionEncryptionKey": "<64 hex>"
  },
  "registration": {
    "intentEncryptionKey": "<64 hex>"
  }
}
Die Beispieldatei ist in ihrer jetzigen Form gültig, enthält jedoch Platzhalter und lässt die beiden 64-stelligen Hexadezimal-Schlüssel (auth.transactionEncryptionKey, registration.intentEncryptionKey) außer Acht, da ein Platzhalter an dieser Stelle nicht gültig wäre; fügen Sie diese wie oben beschrieben hinzu.
Geben Sie anschließend den geheimen Speicherschlüssel ein und überprüfen Sie ihn:
phis secret init-key          # writes secrets.encryptionKey; every instance needs the same file
phis config validate
api.internalToken is what Sites authenticate with. The /setup finish step generates one if it is missing; phis init (step 6) copies it into the Site and refuses to run while it is unset. operator.sessionSecret signs the operator session cookies and is written by the same finish step, or by phis operator add; it is deliberately not the internal token, which every Site holds.
In der Produktionsumgebung benötigt der Server zudem die Umgebungsvariable NEXT_SERVER_ACTIONS_ENCRYPTION_KEY (Base64-Kodierung mit 32 Byte: `head -c 32 /dev/urandom | base64`) und weigert sich, ohne diese zu starten. Instanzen einer Installation teilen sich diesen Wert. Weitere Server-Umgebungsvariablen (PORT, HOSTNAME, TRUST_PROXY, PHIS_INSTANCE_ID) sind in der Datei README.md beschrieben.

3. Erstellen Sie das Datenbankschema

phis schema apply
phis schema check
apply erstellt das phis-Schema, dessen Tabellen sowie pg_trgm als Serving-Rolle und erteilt der Rolle „migration“ die Berechtigungen, die für Add-on-Migrationen erforderlich sind. Der Befehl ist idempotent und wird nach jedem Server-Upgrade erneut ausgeführt (CLI.md).

4. Starten Sie den Server und legen Sie den ersten Bediener an

Starten Sie den Server mit dem physischen Root-Verzeichnis und einer Loopback-Bindung:
# from source, in the phis-server checkout
PHIS_ROOT=/srv/phis/stages/prod NEXT_SERVER_ACTIONS_ENCRYPTION_KEY=<key> \
  pnpm exec next start -H 127.0.0.1 -p 5301

# Debian package
systemctl enable --now phis@prod.service
Der Server wurde mit der Option output: "standalone" erstellt, sodass next start eine Warnung ausgibt, dass er mit dieser Einstellung nicht funktioniert, und die Verwendung der Datei „standaloneserver.js“ empfiehlt. Das Debian-Paket führt die Datei „standalone server.js“ aus (siehe debian/rules für die Dateien, die es aus dem Verzeichnis .next/standalone übernimmt).
Bevor ein Serverprozess beendet wird, entzieht phis instance drain dessen Bereitschaftsstatus; die Debian-Unit führt diesen Vorgang in ExecStop durch.
Legen Sie den ersten Plattformbetreiber an, das Konto der Betreiber-Benutzeroberfläche unter /operator:
phis operator add --email ops@example.com --password '<password>' --name 'Operations'
Der Server speichert die Konfiguration bis zu vier Stunden lang im Cache: Starten Sie ihn nach diesem Befehl neu, da sich der neue Operator andernfalls noch nicht anmelden kann. Dasselbe gilt für jeden nachfolgenden CLI-Befehl, der die Datei phis-runtime.json ändert (andere operator-Befehle, site add, site config set|add|del, secret init-key ), sowie für die manuelle Bearbeitung der Datei.

Alternative: die Einstellungsseiten

Wenn bootstrap.enabled: true gesetzt ist, stellt der Server /setup bereit, einen geführten Ablauf: Laufzeitprüfungen, erster Operator (nur solange noch keiner vorhanden ist), Übersetzungsmodus, Datenbankverbindung (schreibt database.uri), Schema (dasselbe Skript wie bei phis schema apply), eine optionale erste Site und Abschluss, wobei api.internalToken geschrieben wird, falls es fehlt, und bootstrap.enabled: false in phis-runtime.json gesetzt wird. Die Einrichtungsseiten erfordern keine Anmeldung; solange bootstrap.enabled auf true gesetzt ist, darf der Server nur für den Operator erreichbar sein (Loopback-Bindung, SSH- Tunnel). Sie schreiben weder database.migrationUri, secrets.encryptionKey, auth.transactionEncryptionKey noch registration.intentEncryptionKey; legen Sie diese Werte wie in Schritt 2 fest. Eine dort erstellte Site erhält weder sites.overrides.<key>.sourceLocale (ihre Quellsprache ist translation.sourceLocale) noch einen Administrator; fahren Sie in Schritt 5 mit dem phis site admin fort.

5. Eine Website erstellen

phis site add --key acme --name 'ACME' --hostname www.acme.example \
  --public-base-url https://www.acme.example \
  --source-locale en --default-locale en --available-locales en,de \
  --support-email support@acme.example
Dadurch wird die Zeile „Site“ eingefügt und der unveränderliche Eintrag sites.overrides.acme.sourceLocale in die Datei phis-runtime.json geschrieben; starten Sie den Server neu, damit er die Überschreibung übernimmt. Alle Sprachversionen müssen in translation.supportedLocales enthalten sein. Der Schlüssel muss dem Muster [a-z0-9][a-z0-9._-]{0,63} entsprechen (CLI.md ).
Weisen Sie der Website ihren ersten Administrator zu, der sich auf der Website selbst anmeldet:
phis site admin --site acme --email admin@acme.example --password '<password>' \
  --first-name Ada --last-name Admin
Without --password the account gets an unknown random password; set one with phis site user --site acme --email admin@acme.example --password '<password>' --overwrite (CLI.md).
phis site config runtime --key acme shows the Site's derived source path, instance path and port.

6. Errichten Sie ein Gerüst auf der Baustelle

phis init acme --path /opt/phis/sources/acme --api-base-url http://127.0.0.1:5301
  • Die Zeile „Site“ muss vorhanden sein, und das Ziel darf nicht vorhanden sein oder ein leeres Verzeichnis sein; andernfalls verwenden Sie bitte phis reconcile.
  • api.internalToken must be set in the phis root (step 2); init refuses otherwise.
  • --path defaults to <sites.sourcePathRoot>/<site key>.
  • --api-base-url is required: the address the Site's server-side code uses to reach @phis/server, as seen from the host the Site runs on. The Debian package serves on http://127.0.0.1:5301. Only init writes it into config/site-runtime.json.
  • --package-manager defaults to npm for a new Site.
Was init ausgibt (Scaffold-Version 3):
PfadInhalt
package.jsonSkripte: dev, build, start, typecheck; next, react, antd, @phis/ui und „types“; engines.node >=24.21.0; packageManager.
tsconfig.json, next.config.tsoutput: "standalone" – der In-Memory-Render-Cache-Handler aus @phis/ui/next/cache-handler; transpilePackages mit @phis/ui sowie die installierten Modulpakete aus src/generated/site-module-packages.json. Die Konfiguration wird mit withPhiNextConfig aus @phis/ui/next/config umschlossen, wodurch die Ant-Design-Struktur auf Basis des auf der Website installierten Ant Design generiert wird.
.gitignoreIgnoriert node_modules/, .next/, die Build-Ergebnisse, .phis/releases/ und config/site-runtime.json.
config/site-runtime.jsonsite.key, site.publicUrl, phis.apiBaseUrl, phis.internalToken (aus api.internalToken), network.internalApiTimeoutMs (
config/site-runtime.example.jsonDie gleichen Schlüssel, wobei die Felder site.publicUrl, phis.apiBaseUrl und phis.internalToken leer sind.
src/proxy.tsAnfrageweiterleitung (@phis/ui/next/site-proxy).
src/app/(site)/Routengruppe für alle Elemente, die die Anfrage verarbeiten: Root-Layout, Indexseite, not-found, forbidden, unauthorized; den öffentlichen Bereich unter [root]/ sowie die Bereiche accounting, admin, app, builder und editor, jeweils mit einem (root)- und einem (pages)-Zweig sowie deren Regions-Slots; builder/api/[[...path]].
src/app/(static)/static-render/[marker]/[mode]/[root]/Routengruppe für die anonyme Darstellung des öffentlichen Bereichs, die pro Seite, Sprachversion und Farbschema zwischengespeichert wird.
src/app/api/{auth,site,addons,hooks}/[[...path]]/route.tsSchlanke Proxys zu @phis/server.
src/app/global-error.tsxDie Seite, auf die im Falle eines Fehlers, den die Root-Layouts auslösen, als letztes zurückgegriffen wird; sie rendert ein eigenes Dokument aus @phis/ui/next/global-error und stellt keine Abfragen an das CMS.
src/app/sitemap.xml/route.ts, src/app/robots.txt/route.tsDie Crawler-Dateien. Die Asset-Bytes werden über den Proxy /api/site übertragen.
src/app/globals.cssStylesheet der leeren Website.
src/runtime-modules/Bereichs-Hosts, die die Modul-Projektion empfangen.
src/generated/site-modules.ts, site-modules-client-<area>.ts, site-modules-authoring-client.ts, site-modules-fonts.ts, site-module-packages.jsonDie Projektion „Module“ ist bis zum Befehl phis module add leer. Build-Status, der von Git ignoriert wird.
.phis/scaffold-manifest.jsonScaffold-Version, Site-Schlüssel und der SHA-256-Hash jeder geschriebenen Datei. reconcile nutzt diese Informationen.
config/site-runtime.json, .gitignore and the src/generated/ files belong to the Site after init: reconcile leaves them as they are.
src/generated/ is ignored by git as well. The projection is what the operator installed, and its source is the desired state in the phis root (config/phis-modules.json), not the Site's history: a fresh clone gets the empty files from reconcile and the installed Modules from phis module sync. Every other file is canonical and is overwritten by reconcile. Put Site-specific code in new files, not in canonical ones.
config/site-runtime.json is ignored by git, so a fresh clone of the Site has none: create it from config/site-runtime.example.json on every host that builds or runs the Site. reconcile does not create it.
Die kanonischen Dateien sind schlanke Wrapper: Routen, Proxy- und Area-Hosts greifen auf @phis/ui zu und enthalten keine eigene CMS-, Medien-, Ländereinstellungs- oder Proxy-Logik. Eine Änderung an diesem gemeinsamen Verhalten wirkt sich auf eine Website aus, indem @phis/uiaktualisiert und neu kompiliert wird. Das Scaffold enthält keine optionalen Feature-Pakete; Module werden erst mit phis module add (Schritt 9) hinzugefügt, und reconcile sorgt für deren Beibehaltung.
Führen Sie einen Commit für das Repository durch.

7. Die Website installieren, erstellen und ausführen

phis update acme --path /opt/phis/sources/acme
update reconciles the scaffold, runs the Site's package manager (install, typecheck, build), and copies the standalone build with .next/static and public/ into /opt/phis/sources/acme/.phis/releases/<release id>/. The printed release id is the directory name. Next nests the app inside .next/standalone when the Site is built inside a workspace; update finds it there and writes a server.js at the top of the release that starts it, so every release starts the same way. Equivalent by hand: npm install && npm run typecheck && npm run build in the Site directory, without the release copy.
Die Version enthält keine Kopie von config/site-runtime.json und somit auch kein internes Token. Die Datei config/site-runtime.json ist ein relativer Verweis auf /opt/phis/sources/acme/config/site-runtime.json, die die Version beim Start einliest. Eine auf einen anderen Host kopierte Version benötigt anstelle dieses Verweises die eigene Datei des jeweiligen Hosts.
@phis/ui and the other dependencies must be resolvable by the package manager, from a registry or a workspace.
Führen Sie die Version über den Instanzpfad aus:
ln -sfn /opt/phis/sources/acme/.phis/releases/<release id> /var/www/phis/sites/acme
cd /var/www/phis/sites/acme
NODE_ENV=production HOSTNAME=127.0.0.1 PORT=52001 node server.js
  • Der Port lautet sites.basePort + site id (dieser Wert wird mit dem Befehl phis site config runtime --key acme ausgegeben).
  • Die Website liest die Datei config/site-runtime.json einmal pro Prozess über den Release-Link aus dem Verzeichnis /opt/phis/sources/acme/config/ ein. Starten Sie die Website nach einer Änderung an der Datei neu; ein neuer Release ist nicht erforderlich.
  • Gerenderte Seiten des öffentlichen Bereichs werden im Arbeitsspeicher des Prozesses gespeichert; standardmäßig stehen pro Prozess 128 MB zur Verfügung. Legen Sie PHIS_RENDER_CACHE_MB fest, um diesen Wert zu ändern und den Arbeitsspeicher des Hosts für alle Site-Prozesse anzupassen (siehe STATIC_RENDERING.md in @phis/ui). Instanzen nutzen den Cache nicht gemeinsam.
  • Der Befehl npm start (next start) im Quellverzeichnis dient ebenfalls dem Build, es wird jedoch darauf hingewiesen, dass er mit der Scaffold-output: "standalone" nicht funktioniert; verwenden Sie in der Produktionsumgebung server.js.
Für die Entwicklung wird npm run dev im Verzeichnis „Site“ ausgeführt, wodurch next dev gestartet wird.

8. Webserver und Serviceeinheiten

phis site config prints snippets; it writes nothing (CLI.md).
phis site config systemd --key acme > /etc/systemd/system/phis-site-acme.service
phis site config nginx   --key acme > /etc/nginx/sites-available/acme.conf
Die systemd-Einheit führt /usr/bin/node server.js als phis im Instanzpfad mit den folgenden Einstellungen aus: NODE_ENV=production, HOSTNAME=127.0.0.1, PORT=<port> und Restart=always. Die Zeile #Environment=PHIS_RENDER_CACHE_MB=128 ist auskommentiert; entfernen Sie das Kommentarzeichen und passen Sie den Wert an, falls der Standardwert nicht passend ist. Überprüfen Sie den Node-Pfad und gehen Sie anschließend wie folgt vor:
systemctl daemon-reload
systemctl enable --now phis-site-acme.service
Eine Site mit mehreren Instanzen (phis site config add ) erhält eine Unit pro Instanz: phis site config systemd --key acme --instance <n> , die in phis-site-acme-<n>.service gespeichert wird und entsprechend der Reihenfolge nummeriert ist, in der phis site config runtime --key acme sie auflistet. Eine Site-Unit verfügt über keinen Drain-Schritt; phis instance drain ist für Server-Instanzen vorgesehen.
Die Nginx-Datei gehört in den http-Kontext von Nginx; dort fügt Debian sites-enabled/* einbindet. Sie enthält eine map, die Connection nur für Upgrade-Anfragen auf upgrade setzt, einen upstream für jede Instanz der Site, keepalive 64 und keepalive_timeout 4s, sowie einen server-Block auf Port 80 für den Hostnamen der Site mit client_max_body_size 2g, proxy_http_version 1.1, Host $http_host und den Weiterleitungs-Headern. Halten Sie keepalive_timeout beim Bearbeiten unter dem Keep-Alive-Timeout von Node von 5 s: Andernfalls verwendet nginx Verbindungen wieder, die Node geschlossen hat, und POST-Anfragen schlagen mit dem Status 502 fehl (die README-Datei von phis-host, Abschnitt „Webserver vor mehreren Instanzen“, enthält die Details sowie das Apache-Äquivalent). Fügen Sie TLS hinzu (einen listen 443 ssl-Block und Zertifikate), aktivieren Sie es und laden Sie Nginx neu. Der Proxy der Website leitet /api/auth, /api/site, /api/addons und /api/hooks intern an den Server weiter, sodass der Server selbst keinen öffentlichen Hostnamen für die Website benötigt. Machen Sie die Operator-Benutzeroberfläche (/operator) nur für Operatoren zugänglich.
Die gleiche Keep-Alive-Regel gilt für einen Proxy, der vor mehreren Serverinstanzen geschaltet ist. Die Vorlagen, die das Paket installiert (/usr/share/phis/templates/nginx/phis.conf und .../apache2/phis.conf, die von postinst nach sites-available/phis.conf kopiert werden), enthalten diese Regel: einen upstream phis-Pool mit den Instanzen, die das Paket ausführt – phis@prod.service unter 127.0.0.1:5301:5301 und eine auskommentierte Zeile für eine zweite Instanz – keepalive 64, keepalive_timeout 4s, die Connection-Zuordnung und Host $http_host. Fügen Sie eine weitere Instanz derselben Stufe als zusätzliche Zeile in diesen Pool ein. Eine weitere Stufe entspricht einer weiteren Installation mit eigener Datenbank: Weisen Sie ihr einen eigenen upstream- und server-Block zu, niemals eine Zeile in diesem. Die Apache- Vorlage ist ein balancer://phis mit ttl=4 pro Mitglied, was der gleichen Regel auf dieser Seite entspricht.

Ein Übersetzungsspiegel

Eine Installation, von der andere Installationen globale Übersetzungen abrufen – mit translation.cdnBaseUrl auf ihrer Seite und cdn+deepl als Modus –, wird anders veröffentlicht als eine Website oder ein Operator-Host. Sie erfordert die Angabe von api.publicToken und die Aktivierung von translation.allowPublicReads, und ihr Hostname bedient zwei Pfade und nichts anderes:
server {
    listen 443 ssl;
    server_name cdn.example.test;

    # certificates, HSTS

    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location = /api/v1/tr {
        proxy_pass http://127.0.0.1:5301;
    }

    location = /api/v1/locales {
        proxy_pass http://127.0.0.1:5301;
    }

    location / {
        return 404;
    }
}
Es handelt sich um exakte Übereinstimmungen, daher ist auch /api/v1/tr/anything kein Zugang. Der 404-Fehler ist der Kern des Problems: Die location /-Adresse, die in den oben genannten Vorlagen enthalten ist, würde die Betreiber-Benutzeroberfläche, die Einrichtungsseiten und jede interne /api/v1-Route unter diesem Hostnamen ebenfalls veröffentlichen. Sie weisen Aufrufer ohne das interne Token zurück, sodass ein ungefilterter Mirror eher eine öffentliche Schnittstelle als eine Sicherheitslücke darstellt; die Einrichtungsseiten verfügen jedoch über keine eigene Anmeldung. Ein Mirror wird niemals über die Proxy-Routen einer Site veröffentlicht – diese setzen das interne Token, wodurch jeder Aufrufer zu einem vertrauenswürdigen wird; TRANSLATIONS.md, „Wie ein Mirror bereitgestellt wird“, enthält die Begründung sowie die Vorgaben, die ein davor geschalteter Edge-Cache beachten müsste.

9. Module hinzufügen

Ein Site-Modul ist ein Paket, das im Site-Build enthalten ist.
phis module add --site acme --package @phis/marketplace --spec 0.1.0 --path /opt/phis/sources/acme
phis update acme --path /opt/phis/sources/acme
module add trägt das Modul in die Datei config/phis-modules.json ein, fügt die Abhängigkeit hinzu, wenn --spec angegeben wird, und schreibt die Dateien unter src/generated/site-modules*.ts neu – einschließlich site-modules-fonts.ts, in der die installierten Pakete aufgelistet sind, die ./fonts exportieren, sowie site-module-packages.json, die von next.config.ts ausgelesen wird, damit Next jedes installierte Modulpaket kompiliert. Ein Paket, das vor der Installation hinzugefügt wurde, ist noch nicht lesbar; führen Sie daher nach der Installation phis module sync --site acme --path /opt/phis/sources/acme aus, um die darin enthaltenen Schriftarten zu übernehmen. update installiert und erstellt eine neue Version; stellen Sie diese bereit (Schritt 7) und starten Sie den Site-Dienst neu. Aktivieren Sie anschließend das Modul für einen Bereich im Builder. phis module check --site acme überprüft die installierten Pakete (CLI.md).

10. Add-ons hinzufügen

A server Add-on is one addon.mjs artifact, installed once per phis root and activated per Site.
phis addon install   --artifact ./dist/addon.mjs
phis addon reconcile
phis addon migrate   --addon @acme/status
phis addon enable    --addon @acme/status
phis addon reconcile
Falls das Add-on über ein zugehöriges Modul verfügt (mit demselben Paketnamen), fügen Sie dieses zunächst zur Website hinzu (Schritt 9) und aktivieren Sie anschließend das Add-on für die Website:
phis addon site   --addon @acme/status --site acme --enable
phis addon config --addon @acme/status --site acme                  # list settings
phis addon config --addon @acme/status --site acme --name <setting> --value <value>
Die vom Add-on deklarierten Geheimnisse werden mit dem Befehl phis secret set --addon @acme/status --site acme --name <name> (Wert über stdin) gespeichert. Rollen werden mit dem Befehl phis addon role (CLI.md ) zugewiesen.
Core plant nichts ein. Ein Add-on, das Jobs deklariert (mit dem Befehl phis addon list --json werden die einzelnen Manifeste angezeigt, einschließlich der darin enthaltenen jobs), führt diese nur aus, wenn phis addon job aufgerufen wird; der Benachrichtigungs-Ausgang wird nur von phis mail drain erneut abgefragt, und die Bereinigungsaufgaben von Core werden mit phis maintain ausgeführt. Auf einem systemd-Host weisen Sie jedem einen One-Shot-Dienst und einen Timer zu: SERVER_ADDONS.md enthält ein Beispiel für einen Job, und dasselbe Paar von Einheiten mit einem anderen `ExecStart=`-Eintrag bedient die beiden anderen.

11. Spätere Aktualisierung

Server

Installieren Sie die neue Server-Version – sudo apt update && sudo apt install phis aus dem Debian-Paket – oder laden Sie den Checkout (Schritt 2) aus dem Quellcode herunter und kompilieren Sie ihn neu. Das Debian-Paket startet jede laufende phis@<stage>-Instanz nach der Installation der neuen Version nacheinander selbst neu; bei der Installation aus dem Quellcode müssen Sie den unten beschriebenen Neustart selbst durchführen. Anschließend:
phis schema apply
phis addon check
phis addon migrate
phis addon reconcile
Starten Sie die Serverinstanzen von der Quelle aus nacheinander neu (führen Sie zunächst phis instance drain aus). Überprüfen Sie anschließend phis instance list und führen Sie für jede Site den Befehl phis site check --key acme aus.

Standort

phis update acme --path /opt/phis/sources/acme
update runs reconcile first, which:
  • schreibt die kanonischen Scaffold-Dateien in das aktuelle Scaffold um (die von der Website vorgenommenen Änderungen gehen dabei verloren);
  • Fügt der Datei package.json die Elemente hinzu, die das Scaffold benötigt und die in der Site fehlen, wobei alle Versionen, Skripte und Felder, über die die Site bereits verfügt, beibehalten werden; lediglich engines.node wird auf >=24.21.0 gesetzt. Um auf eine neuere Version von @phis/ui oder Next umzusteigen, erhöhen Sie die Version in der Site (npm install @phis/ui@<version>) und führen Sie anschließend update aus;
  • behält die zur Website gehörenden Dateien (PHI_SITE_OWNED_AFTER_INIT: config/site-runtime.json, .gitignore, src/generated/site-modules*.ts) unverändert bei;
  • entfernt Dateien, die von einem früheren Scaffold erstellt wurden und vom aktuellen nicht mehr erstellt werden, sofern deren Inhalt unverändert ist, und meldet bearbeitete Dateien als kept (beibehalten), die Sie manuell verschieben oder löschen;
  • verwendet den eigenen Paketmanager der Website und löscht keine Sperrdatei, es sei denn, mit --package-manager wird ein anderer angegeben.
Bei einem Repository, das zuvor unter .phis/releases/ erstellt wurde und Teil der generierten .gitignore-Datei ist, muss diese Zeile manuell hinzugefügt werden; reconcile schreibt die .gitignore-Datei nicht neu.
Überprüfen Sie die Änderungen (mit dem Befehl phis reconcile acme --json werden alle Dateien mit der jeweiligen Aktion aufgelistet, und mit git diff werden diese angezeigt), stellen Sie anschließend die neue Version bereit (Schritt 7) und starten Sie den Site-Dienst neu. Um die Serveradresse oder das Token einer bestehenden Site zu ändern, bearbeiten Sie die Datei config/site-runtime.json selbst; reconcile schreibt diese nicht neu.