openpaw-memory-server

Installation auf dem Webspace

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.

Zielbild

Nach der Installation gibt es:

Release-Paket

Für die Installation ist der Ordner release/ gedacht. Er enthält alle Dateien, die ein Endanwender für den Webspace braucht:

Beim 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.

Voraussetzungen

Vor dem Upload prüfen oder im Webspace-Kundenbereich nachsehen:

Optional, aber nützlich:

Lokale Vorbereitung

  1. Projektordner prüfen.

    Wichtige Ordner:

    • release/public/: öffentlich erreichbare Dateien
    • release/private/: Konfiguration, Runtime-Dateien, Backups
    • release/sql/: Datenbankschema
    • release/docs/: Dokumentation
  2. Für die normale Installation müssen lokal keine Tokens und keine Config erzeugt werden. Das übernimmt der Web-Installer beim ersten Aufruf.

  3. Nur wenn der Web-Installer nicht verwendet werden kann:

    • release/private/config.example.php als release/private/config.php kopieren und ausfüllen.
    • Datenbank manuell mit release/sql/schema.mariadb.sql oder php release/tools/init-db.php einrichten.
    • API-Token und Backup-Token selbst erzeugen.
    • Passwort-Hash selbst erzeugen.

Datenbank vorbereiten

  1. Im Webspace-Kundenbereich eine MariaDB-Datenbank anlegen.
  2. Datenbankname, Benutzer, Passwort und Host notieren.
  3. Noch keine Tabellen anlegen, wenn der Web-Installer genutzt wird. Der Installer richtet die Tabelle beim ersten Aufruf ein.

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:

Die Chat-Tabellen speichern Threads und Nachrichten getrennt von den kuratierten Memory-Einträgen.

Dateien hochladen

Empfohlene Variante:

  1. Den Inhalt des Release-Pakets auf den Webspace hochladen.
  2. Den Webroot der Website auf den Ordner public/ im hochgeladenen Release-Paket zeigen lassen.
  3. Prüfen, dass private/, sql/, tools/ und docs/ nicht öffentlich erreichbar sind.

Falls der Webroot nicht auf public/ zeigen kann:

  1. Release-Paket so hochladen, dass public/index.php als Einstieg erreichbar ist.
  2. Sicherstellen, dass private/ nicht abrufbar ist.
  3. Die vorhandenen .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:

Wenn einer dieser Pfade Inhalt anzeigt, ist der Webroot oder der Verzeichnisschutz falsch eingerichtet.

Erste Prüfung im Browser

Nach dem Upload:

  1. Startseite öffnen: /
  2. Wenn noch keine Config existiert, erscheint automatisch der Installer.
  3. Datenbankdaten, Loginname und Website-Passwort eintragen.
  4. Installation starten.
  5. Den angezeigten API-Token und optionalen Backup-Token sicher speichern.
  6. Login öffnen: /login
  7. Mit dem konfigurierten Benutzer anmelden.
  8. Prüfen, ob /chat nach Login erreichbar ist.
  9. Logout testen.
  10. Prüfen, dass /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:

Wenn die Startseite funktioniert, aber Login nicht:

API testen

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:

Wenn der Health-Check 500 liefert:

Memory-Test

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 aktivieren

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 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:

Spätere Datenbank-Updates

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.

Sicherheit prüfen

Vor produktiver Nutzung:

Typische Fehler

404 bei /api/health:

401 bei API-Requests:

500 bei API-Requests:

Login schlägt immer fehl:

Nach der Installation

Wenn die Tests erfolgreich sind:

  1. API-Token in OpenPaw/Paw eintragen.
  2. API_BASE_URL mit /api verwenden.
  3. Chat unter /chat testen.
  4. Nur notwendige Clients freischalten.
  5. Backup-Strategie festlegen.