Diese Anleitung beschreibt, wie das fertige Projekt später auf einem klassischen PHP-Webspace installiert werden kann. Sie richtet sich an Anwender, die mit Webspace, FTP/SFTP, Datenbanken und PHP-Grundbegriffen vertraut sind, aber keine Serveradministration machen möchten.
Es wird nichts automatisch hochgeladen. Zugangsdaten, Tokens, Domains und konkrete Webspace-Pfade gehören nicht ins Repository.
Für Backups mit Bilddaten muss die PHP-Erweiterung ZipArchive verfügbar sein.
Nach der Installation gibt es:
//login/chat/apiFür die Installation ist der Ordner release/ gedacht. Er enthält alle Dateien,
die ein Endanwender für den Webspace braucht:
release/public/: öffentlicher Webrootrelease/private/: Beispielconfig und privater Bereichrelease/sql/: Datenbankschemarelease/tools/: Skripte für Datenbankeinrichtung und spätere Updatesrelease/docs/: DokumentationBeim Upload sollte der Inhalt von release/ verwendet werden, nicht der ganze
Entwicklungsordner.
Vor einem Upload sollte das Paket aus dem aktuellen Projektstand neu erstellt werden:
scripts/build-release.sh
Das Skript erzeugt zusätzlich ein ZIP-Paket unter dist/. Dieses ZIP kann auf
dem Webspace hochgeladen und dort entpackt werden.
Vor dem Upload prüfen oder im Webspace-Kundenbereich nachsehen:
pdo_mysql ist aktiv.fileinfo und GD mit JPEG-, PNG- und
WebP-Unterstützung aktiv..htaccess und Rewrite-Regeln werden unterstützt.public/ zeigen.public/ zeigen kann, muss private/ sicher vor
Webzugriff geschützt sein.Optional, aber nützlich:
Projektordner prüfen.
Wichtige Ordner:
release/public/: öffentlich erreichbare Dateienrelease/private/: Konfiguration, Runtime-Dateien, Backupsrelease/sql/: Datenbankschemarelease/docs/: DokumentationFür die normale Installation müssen lokal keine Tokens und keine Config erzeugt werden. Das übernimmt der Web-Installer beim ersten Aufruf.
Nur wenn der Web-Installer nicht verwendet werden kann:
release/private/config.example.php als release/private/config.php
kopieren und ausfüllen.release/sql/schema.mariadb.sql oder
php release/tools/init-db.php einrichten.Alternative ohne Web-Installer:
php release/tools/init-db.php
Das Schema legt die Tabellen memories, chat_threads und chat_messages an.
memories enthält unter anderem:
metadatakindimportancescopesourcesource_refobserved_atDie Chat-Tabellen speichern Threads und Nachrichten getrennt von den kuratierten Memory-Einträgen.
Empfohlene Variante:
public/ im hochgeladenen
Release-Paket zeigen lassen.private/, sql/, tools/ und docs/ nicht öffentlich
erreichbar sind.Falls der Webroot nicht auf public/ zeigen kann:
public/index.php als Einstieg erreichbar
ist.private/ nicht abrufbar ist..htaccess-Dateien schützen zusätzlich, ersetzen aber keine
sorgfältige Prüfung.Nicht hochladen oder nicht öffentlich erreichbar machen:
Nach dem Upload müssen diese Pfade mit 403 oder 404 antworten und dürfen
keinen Dateiinhalt anzeigen:
/private/config.php/private/config.example.php/tools/init-db.php/sql/schema.mariadb.sql/docs/INSTALL.md/.git//release//VERSIONWenn einer dieser Pfade Inhalt anzeigt, ist der Webroot oder der Verzeichnisschutz falsch eingerichtet.
Nach dem Upload:
//login/chat nach Login erreichbar ist./install danach nur noch „Bereits installiert“ zeigt.Wichtig: Den Web-Installer nicht unbeaufsichtigt öffentlich online lassen. Nach dem Upload direkt installieren oder den Webspace bis zur Installation geschützt halten. Der Installer ist zwar rate-limitiert und nach erfolgreicher Installation gesperrt, sollte aber nicht über längere Zeit offen im Netz stehen.
Wenn der Installer keine Config schreiben kann:
private/config.php speichern.Wenn die Startseite funktioniert, aber Login nicht:
site.enabled prüfen.site.username prüfen.Die API liegt unter /api.
Health-Check:
export BASE_URL='<base-url>'
export API_BASE_URL="${BASE_URL}/api"
export OPENPAW_MEMORY_TOKEN='<token>'
curl -fsS \
-H "Authorization: Bearer ${OPENPAW_MEMORY_TOKEN}" \
"${API_BASE_URL}/health"
Erwartung:
{"ok":true,"service":"openpaw-memory","version":"0.3.0","database":"mariadb"}
Wenn der Health-Check 401 liefert:
Authorization: Bearer ... prüfen.Wenn der Health-Check 500 liefert:
private/config.php prüfen.pdo_mysql aktiv ist.Eine Test-Erinnerung speichern:
curl -fsS \
-H "Authorization: Bearer ${OPENPAW_MEMORY_TOKEN}" \
-H 'Content-Type: application/json' \
-d '{"text":"Installations-Test","tags":["test"],"kind":"note","scope":"system","source":"manual"}' \
"${API_BASE_URL}/memories"
Danach auflisten:
curl -fsS \
-H "Authorization: Bearer ${OPENPAW_MEMORY_TOKEN}" \
"${API_BASE_URL}/memories?limit=5"
Backups erst aktivieren, wenn Website und API funktionieren.
In private/config.php:
'backup' => [
'enabled' => true,
'token' => 'replace-with-separate-backup-token',
'dir' => __DIR__ . '/backups',
],
Wichtig:
backup.token muss gesetzt sein.backup.token darf nicht dem normalen API-Token entsprechen.ZipArchive muss verfügbar sein.Backup manuell auslösen:
export OPENPAW_MEMORY_BACKUP_TOKEN='<backup-token>'
curl -fsS \
-X POST \
-H "Authorization: Bearer ${OPENPAW_MEMORY_TOKEN}" \
-H "X-Backup-Token: ${OPENPAW_MEMORY_BACKUP_TOKEN}" \
"${API_BASE_URL}/backups"
Backups auflisten:
curl -fsS \
-H "Authorization: Bearer ${OPENPAW_MEMORY_TOKEN}" \
-H "X-Backup-Token: ${OPENPAW_MEMORY_BACKUP_TOKEN}" \
"${API_BASE_URL}/backups"
Restore prüfen:
curl -fsS \
-X POST \
-H "Authorization: Bearer ${OPENPAW_MEMORY_TOKEN}" \
-H "X-Backup-Token: ${OPENPAW_MEMORY_BACKUP_TOKEN}" \
-H 'Content-Type: application/json' \
-d '{"file":"openpaw-memory-YYYYMMDD-HHMMSS-xxxxxxxx.zip","mode":"upsert","dry_run":true}' \
"${API_BASE_URL}/backups/restore"
Restore ausführen:
curl -fsS \
-X POST \
-H "Authorization: Bearer ${OPENPAW_MEMORY_TOKEN}" \
-H "X-Backup-Token: ${OPENPAW_MEMORY_BACKUP_TOKEN}" \
-H 'Content-Type: application/json' \
-d '{"file":"openpaw-memory-YYYYMMDD-HHMMSS-xxxxxxxx.zip","mode":"upsert","dry_run":false}' \
"${API_BASE_URL}/backups/restore"
Hinweise:
file muss ein Dateiname aus GET /backups sein.mode: "upsert" aktualisiert vorhandene IDs und fügt fehlende ein.mode: "insert_only" überspringt vorhandene IDs.dry_run: true prüft den Restore ohne Schreibzugriff.id, Inhalte, observed_at, created_at und updated_at werden aus dem
Backup übernommen.Wenn es später neue SQL-Updates gibt, liegen sie als .sql-Dateien in
release/sql/migrations/. Danach dieses Skript ausführen:
php release/tools/update-db.php
Das Skript merkt sich angewendete Updates in der Tabelle schema_migrations.
Für All-Inkl-Webspace mit oder ohne SSH steht ein genauer Ablauf in
docs/ALLINKL.md.
Wenn die Website bereits läuft, kann die Datenbank nach dem Upload auch über
die geschützte Browser-Routine /update aktualisiert werden.
Vor produktiver Nutzung:
private/config.php ist nicht öffentlich abrufbar.private/backups/ ist nicht öffentlich abrufbar.private/config.php.backup.enabled bleibt aus, bis Backups wirklich gebraucht werden.404 bei /api/health:
.htaccess wird eventuell nicht ausgewertet.401 bei API-Requests:
500 bei API-Requests:
private/config.php fehlt oder enthält Platzhalter.memories wurde nicht angelegt.pdo_mysql fehlt.Login schlägt immer fehl:
site.enabled ist nicht aktiv.Wenn die Tests erfolgreich sind:
API_BASE_URL mit /api verwenden./chat testen.