From 8bed6e2984bfb71000383293b3413c6a9887461f Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Wed, 20 May 2026 21:17:12 +0200 Subject: [PATCH] KI-AGENT: Lade Selfhost Setup ohne Repo Checkout --- README.md | 45 +++++++++++------------ scripts/selfhost-install.sh | 72 ++++++++++++++++++++++--------------- scripts/selfhost-setup.sh | 20 +++++++---- 3 files changed, 80 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index c68b4b8..2bf1825 100644 --- a/README.md +++ b/README.md @@ -89,13 +89,16 @@ Wenn du MinIO verwendest, setze zusatzlich: ## Deploy-Struktur -Deploye den Stack direkt aus einem geklonten Checkout dieses Repositories, weil die Selfhost-Compose-Datei die lokalen Build-Kontexte `./frontend` und `./backend` verwendet. +Deploye den Stack in einem eigenen Betriebsverzeichnis. Der Selfhost-Installer lädt dafür nur die benötigten Betriebsdateien und klont nicht das komplette Repository. -Beispiel: +Beispiel für die manuelle Vorbereitung: ```bash -git clone /opt/fedeo -cd /opt/fedeo +mkdir -p /opt/fedeo/scripts +curl -fsSL https://git.federspiel.tech/flfeders/FEDEO/raw/branch/dev/docker-compose.selfhost.yml -o /opt/fedeo/docker-compose.selfhost.yml +curl -fsSL https://git.federspiel.tech/flfeders/FEDEO/raw/branch/dev/.env.example -o /opt/fedeo/.env.example +curl -fsSL https://git.federspiel.tech/flfeders/FEDEO/raw/branch/dev/scripts/selfhost-setup.sh -o /opt/fedeo/scripts/selfhost-setup.sh +chmod +x /opt/fedeo/scripts/selfhost-setup.sh ``` Die Verzeichnisstruktur sollte dann mindestens so aussehen: @@ -104,8 +107,7 @@ Die Verzeichnisstruktur sollte dann mindestens so aussehen: /opt/fedeo/ docker-compose.selfhost.yml .env - backend/ - frontend/ + scripts/ traefik/ letsencrypt/ logs/ @@ -138,7 +140,7 @@ Alternativ kannst du die Konfiguration geführt erzeugen lassen: bash scripts/selfhost-setup.sh ``` -Auf einem frischen Server kannst du den Checkout und die Konfiguration direkt per One-Liner vorbereiten: +Auf einem frischen Server kannst du die Betriebsdateien und die Konfiguration direkt per One-Liner vorbereiten: ```bash curl -fsSL https://git.federspiel.tech/flfeders/FEDEO/raw/branch/dev/scripts/selfhost-install.sh | bash @@ -150,7 +152,7 @@ Der schnelle One-Liner mit direktem Stack-Start: curl -fsSL https://git.federspiel.tech/flfeders/FEDEO/raw/branch/dev/scripts/selfhost-install.sh | bash -s -- --simple --start ``` -Der Installer prüft Basispakete, installiert Docker auf Wunsch über das offizielle Docker-Installationsscript, klont oder aktualisiert FEDEO nach `/opt/fedeo` und startet anschließend den geführten Setup-Assistenten. +Der Installer prüft Basispakete, installiert Docker auf Wunsch über das offizielle Docker-Installationsscript, lädt nur die Selfhost-Dateien nach `/opt/fedeo` und startet anschließend den geführten Setup-Assistenten. Für den schnellen Standardpfad: @@ -336,8 +338,7 @@ services: - internal backend: - build: - context: ./backend + image: git.federspiel.tech/flfeders/fedeo/backend:dev container_name: fedeo-backend restart: unless-stopped depends_on: @@ -392,8 +393,7 @@ services: - internal frontend: - build: - context: ./frontend + image: git.federspiel.tech/flfeders/fedeo/frontend:dev container_name: fedeo-frontend restart: unless-stopped depends_on: @@ -446,8 +446,7 @@ Hinweis: Das Backend nutzt `forcePathStyle: true`. Das funktioniert sauber mit M Im Deploy-Verzeichnis: ```bash -docker compose -f docker-compose.selfhost.yml build -docker compose -f docker-compose.selfhost.yml up -d +docker compose --env-file /opt/fedeo/.env -f /opt/fedeo/docker-compose.selfhost.yml up -d ``` Synapse erzeugt `matrix/synapse/homeserver.yaml` beim ersten Start automatisch und aktualisiert die für FEDEO relevanten Werte aus der `.env`. `MATRIX_REGISTRATION_SHARED_SECRET` muss in der `.env` gesetzt und geheim bleiben, weil FEDEO damit Matrix-Nutzer provisioniert. @@ -455,15 +454,15 @@ Synapse erzeugt `matrix/synapse/homeserver.yaml` beim ersten Start automatisch u Danach Status prufen: ```bash -docker compose -f docker-compose.selfhost.yml ps -docker compose -f docker-compose.selfhost.yml logs -f traefik -docker compose -f docker-compose.selfhost.yml logs -f backend +docker compose --env-file /opt/fedeo/.env -f /opt/fedeo/docker-compose.selfhost.yml ps +docker compose --env-file /opt/fedeo/.env -f /opt/fedeo/docker-compose.selfhost.yml logs -f traefik +docker compose --env-file /opt/fedeo/.env -f /opt/fedeo/docker-compose.selfhost.yml logs -f backend ``` Wenn du Migrationen manuell ausführen möchtest: ```bash -docker compose -f docker-compose.selfhost.yml run --rm backend npm run migrate +docker compose --env-file /opt/fedeo/.env -f /opt/fedeo/docker-compose.selfhost.yml run --rm backend npm run migrate ``` ## Funktionsprufung @@ -487,14 +486,16 @@ Wenn der Bootstrap aktiviert ist, kannst du dich danach mit `FEDEO_BOOTSTRAP_ADM Bei neuen Versionen: ```bash -git pull -docker compose -f docker-compose.selfhost.yml build -docker compose -f docker-compose.selfhost.yml up -d +curl -fsSL https://git.federspiel.tech/flfeders/FEDEO/raw/branch/dev/docker-compose.selfhost.yml -o /opt/fedeo/docker-compose.selfhost.yml +curl -fsSL https://git.federspiel.tech/flfeders/FEDEO/raw/branch/dev/.env.example -o /opt/fedeo/.env.example +curl -fsSL https://git.federspiel.tech/flfeders/FEDEO/raw/branch/dev/scripts/selfhost-setup.sh -o /opt/fedeo/scripts/selfhost-setup.sh +chmod +x /opt/fedeo/scripts/selfhost-setup.sh +docker compose --env-file /opt/fedeo/.env -f /opt/fedeo/docker-compose.selfhost.yml up -d ``` Der Backend-Container wendet Datenbankmigrationen beim Start automatisch an. Bei kritischen Updates sollte vorher ein Backup von `./postgres` und `./minio` erstellt werden. -Falls du statt lokaler Builds vorgebaute Images verwenden willst, kannst du in der Compose-Datei `build:` durch passende `image:`-Eintrage ersetzen. Erst dann ist ein vorgelagertes `docker compose pull` sinnvoll. +Die Selfhost-Compose-Datei nutzt vorgebaute Images. Dadurch braucht der Server keinen Repository-Checkout und keine lokalen Build-Kontexte. ## Backup-Empfehlung diff --git a/scripts/selfhost-install.sh b/scripts/selfhost-install.sh index f60f9fe..1f9f013 100755 --- a/scripts/selfhost-install.sh +++ b/scripts/selfhost-install.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash set -euo pipefail -FEDEO_REPO_URL="${FEDEO_REPO_URL:-https://git.federspiel.tech/flfeders/FEDEO.git}" FEDEO_REF="${FEDEO_REF:-dev}" +FEDEO_RAW_BASE_URL="${FEDEO_RAW_BASE_URL:-https://git.federspiel.tech/flfeders/FEDEO/raw/branch/${FEDEO_REF}}" FEDEO_DIR="${FEDEO_DIR:-/opt/fedeo}" SETUP_ARGS=("$@") FEDEO_USE_SUDO_DOCKER="${FEDEO_USE_SUDO_DOCKER:-false}" @@ -17,9 +17,6 @@ SUDO="" if [[ "$(id -u)" -ne 0 ]]; then if command -v sudo >/dev/null 2>&1; then SUDO="sudo" - else - echo "Dieses Script braucht Schreibrechte für $FEDEO_DIR oder sudo." >&2 - exit 1 fi fi @@ -36,8 +33,8 @@ Mit Optionen für den Setup-Assistenten: Umgebung: FEDEO_DIR=/opt/fedeo - FEDEO_REPO_URL=https://git.federspiel.tech/flfeders/FEDEO.git FEDEO_REF=dev + FEDEO_RAW_BASE_URL=https://git.federspiel.tech/flfeders/FEDEO/raw/branch/dev USAGE } @@ -77,7 +74,7 @@ have() { install_base_packages() { local missing=() - for binary in git curl openssl; do + for binary in curl openssl; do if ! have "$binary"; then missing+=("$binary") fi @@ -93,9 +90,15 @@ install_base_packages() { exit 1 fi + if [[ "$(id -u)" -ne 0 && -z "$SUDO" ]]; then + echo "Fehlende Programme: ${missing[*]}" >&2 + echo "Ohne root oder sudo kann der Installer sie nicht automatisch installieren." >&2 + exit 1 + fi + echo "Installiere Basispakete: ${missing[*]}" $SUDO apt-get update - $SUDO apt-get install -y ca-certificates curl git openssl + $SUDO apt-get install -y ca-certificates curl openssl } ensure_docker() { @@ -117,6 +120,10 @@ ensure_docker() { fi if yes_no "Docker jetzt über das offizielle Docker-Installationsscript installieren?" "j"; then + if [[ "$(id -u)" -ne 0 && -z "$SUDO" ]]; then + echo "Ohne root oder sudo kann Docker nicht automatisch installiert werden." >&2 + exit 1 + fi curl -fsSL https://get.docker.com | $SUDO sh else echo "Bitte Docker Engine inkl. Compose Plugin installieren und den Installer erneut starten." >&2 @@ -140,32 +147,39 @@ ensure_docker() { fi } -prepare_checkout() { +download_file() { + local source="$1" + local target="$2" + local temp_file="${target}.tmp" + + mkdir -p "$(dirname "$target")" + curl -fsSL "$source" -o "$temp_file" + mv "$temp_file" "$target" +} + +download_selfhost_files() { echo echo "Zielverzeichnis: $FEDEO_DIR" - echo "Repository: $FEDEO_REPO_URL" - echo "Version/Branch: $FEDEO_REF" + echo "Quelle: $FEDEO_RAW_BASE_URL" + + if ! mkdir -p "$FEDEO_DIR/scripts" 2>/dev/null; then + if [[ -z "$SUDO" ]]; then + echo "Keine Schreibrechte für $FEDEO_DIR und sudo ist nicht verfügbar." >&2 + exit 1 + fi + $SUDO mkdir -p "$FEDEO_DIR/scripts" + $SUDO chown "$(id -u):$(id -g)" "$FEDEO_DIR" "$FEDEO_DIR/scripts" + fi if [[ -d "$FEDEO_DIR/.git" ]]; then - echo "Bestehenden FEDEO-Checkout aktualisieren..." - git -C "$FEDEO_DIR" fetch --prune origin - git -C "$FEDEO_DIR" checkout "$FEDEO_REF" - git -C "$FEDEO_DIR" pull --ff-only origin "$FEDEO_REF" - return + echo "Hinweis: In $FEDEO_DIR liegt noch ein alter Git-Checkout. Der Installer aktualisiert nur die Selfhost-Dateien und lässt Daten, .env und Checkout unangetastet." fi - if [[ -e "$FEDEO_DIR" ]]; then - echo "$FEDEO_DIR existiert bereits, ist aber kein Git-Checkout." >&2 - echo "Bitte FEDEO_DIR auf ein leeres Ziel setzen oder das Verzeichnis prüfen." >&2 - exit 1 - fi - - $SUDO mkdir -p "$FEDEO_DIR" - if [[ -n "$SUDO" ]]; then - $SUDO chown "$(id -u):$(id -g)" "$FEDEO_DIR" - fi - - git clone --branch "$FEDEO_REF" "$FEDEO_REPO_URL" "$FEDEO_DIR" + echo "Lade Selfhost-Dateien..." + download_file "$FEDEO_RAW_BASE_URL/docker-compose.selfhost.yml" "$FEDEO_DIR/docker-compose.selfhost.yml" + download_file "$FEDEO_RAW_BASE_URL/.env.example" "$FEDEO_DIR/.env.example" + download_file "$FEDEO_RAW_BASE_URL/scripts/selfhost-setup.sh" "$FEDEO_DIR/scripts/selfhost-setup.sh" + chmod +x "$FEDEO_DIR/scripts/selfhost-setup.sh" } main() { @@ -180,14 +194,14 @@ FEDEO Selfhost Installer Dieser Installer bringt die typische Serverstruktur mit: - prüft Basispakete - installiert Docker optional automatisch - - klont oder aktualisiert FEDEO nach /opt/fedeo + - lädt nur die Selfhost-Dateien nach /opt/fedeo - startet danach den geführten Selfhost-Assistenten EOF install_base_packages ensure_docker - prepare_checkout + download_selfhost_files echo echo "Starte Selfhost-Assistent..." diff --git a/scripts/selfhost-setup.sh b/scripts/selfhost-setup.sh index 957214b..2e23317 100755 --- a/scripts/selfhost-setup.sh +++ b/scripts/selfhost-setup.sh @@ -32,6 +32,18 @@ compose() { fi } +compose_stack() { + compose --env-file "$ENV_FILE" -f "$COMPOSE_FILE" "$@" +} + +compose_start_command() { + if [[ "${FEDEO_USE_SUDO_DOCKER:-false}" == "true" ]]; then + echo "sudo docker compose --env-file $ENV_FILE -f $COMPOSE_FILE up -d" + else + echo "docker compose --env-file $ENV_FILE -f $COMPOSE_FILE up -d" + fi +} + usage() { cat <<'USAGE' FEDEO Selfhost Setup @@ -481,15 +493,11 @@ main() { fi if [[ "$START_STACK" == "yes" ]]; then - compose -f "$COMPOSE_FILE" up -d + compose_stack up -d else echo echo "Start später mit:" - if [[ "${FEDEO_USE_SUDO_DOCKER:-false}" == "true" ]]; then - echo " sudo docker compose -f $COMPOSE_FILE up -d" - else - echo " docker compose -f $COMPOSE_FILE up -d" - fi + echo " $(compose_start_command)" fi }