Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72a1260546 | ||
|
|
76166669ae | ||
|
|
0ff39ca740 | ||
|
|
43c6a926a2 |
No files matched your search
@@ -1,4 +1,4 @@
|
||||
# TeamVis — Self-Hosting-Bundle (v0.56.2)
|
||||
# TeamVis — Self-Hosting-Bundle (v0.59.0)
|
||||
|
||||
Dieses Bundle enthält alles zum **Betreiben** von TeamVis auf eigener
|
||||
Infrastruktur — **keinen** App-Quellcode. Die App selbst kommt als fertiges
|
||||
@@ -36,4 +36,4 @@ Vollständige Schritt-für-Schritt-Anleitung (von der nackten VM bis live):
|
||||
| `supabase/migrations/` | Datenbank-Schema (DDL) |
|
||||
| `docs/` | Anleitungen |
|
||||
|
||||
Stand: TeamVis 0.56.2.
|
||||
Stand: TeamVis 0.59.0.
|
||||
@@ -35,3 +35,7 @@ TEAMVIS_SMTP_FROM_NAME=TeamVis
|
||||
|
||||
# Optional: zusätzliche next/image-Hosts (i.d.R. leer lassen).
|
||||
SUPABASE_IMAGE_HOSTS=
|
||||
|
||||
# Update-Hinweis im Admin (ab 0.57): ruft höchstens alle 6 Stunden eine
|
||||
# öffentliche Datei bei git.zfx.services ab. Abschalten mit:
|
||||
# TEAMVIS_UPDATE_CHECK=off
|
||||
@@ -67,6 +67,13 @@ POSTGRES_DB="${POSTGRES_DB:-postgres}"
|
||||
PGPW="$(grep -E '^POSTGRES_PASSWORD=' "$INSTANCE/.env" 2>/dev/null | cut -d= -f2- || true)"
|
||||
dbsql() { ( cd "$INSTANCE" && docker compose exec -T -e PGPASSWORD="$PGPW" db psql -v ON_ERROR_STOP=1 -U supabase_admin -d "$POSTGRES_DB" "$@" ); }
|
||||
|
||||
if [ -n "${TEAMVIS_UPDATE_REEXEC:-}" ]; then
|
||||
# Zweiter Durchlauf nach dem Selbst-Neustart (siehe Ende von Schritt 2):
|
||||
# Sicherung und git pull sind schon erledigt.
|
||||
OLD="$TEAMVIS_UPDATE_OLD"
|
||||
NEW="$(git rev-parse HEAD)"
|
||||
ok "Neue Fassung von update.sh übernommen — weiter ab Schritt 3."
|
||||
else
|
||||
# ── 1. Pre-Update-Backup (nur Modus 2 — lokale DB) ────────────────────
|
||||
if [ "$MODE2" = "1" ]; then
|
||||
head "1) Datenbank-Backup"
|
||||
@@ -95,6 +102,15 @@ else
|
||||
ok "Aktualisiert: ${OLD:0:8} → ${NEW:0:8}"
|
||||
fi
|
||||
|
||||
# Hat der Pull update.sh selbst geändert, läuft ab hier die NEUE Fassung
|
||||
# weiter — sonst griffen Korrekturen am Skript erst beim nächsten Update
|
||||
# (Okt. 2026: Instanzen mussten update.sh deshalb mehrfach starten).
|
||||
if [ "$OLD" != "$NEW" ] && ! git diff --quiet "$OLD" "$NEW" -- deploy/selfhost/update.sh; then
|
||||
say "update.sh wurde mit aktualisiert — die neue Fassung übernimmt."
|
||||
exec env TEAMVIS_UPDATE_REEXEC=1 TEAMVIS_UPDATE_OLD="$OLD" bash "$BUNDLE/deploy/selfhost/update.sh" "$INSTANCE"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── 3. Fehlende Migrationen einspielen ────────────────────────────────
|
||||
head "3) Migrationen"
|
||||
if [ "$MODE2" = "1" ]; then
|
||||
@@ -149,10 +165,26 @@ fi
|
||||
|
||||
# ── 4. Neues Image ziehen + Container neu starten ─────────────────────
|
||||
head "4) App aktualisieren"
|
||||
# Image-Version: Steht in der .env eine feste, ältere Version (frühere
|
||||
# Installer, oder bewusst gepinnt), zöge `docker compose pull` immer wieder
|
||||
# dasselbe alte Image — die App bliebe trotz neuer Migrationen stehen (RZHAS,
|
||||
# 10.10.2026). Daher auf die Version des Bundles heben. `latest` bleibt
|
||||
# `latest`, eine bewusst neuere Version bleibt unangetastet.
|
||||
# (Kein `| head` in diesem Skript: head() ist oben als Überschriften-Funktion
|
||||
# definiert und überdeckt den Befehl — daher grep -m1.)
|
||||
BUNDLE_VERSION="$(grep -m1 -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' "$BUNDLE/package.json" | sed 's/.*"\([^"]*\)"$/\1/')"
|
||||
CUR_VERSION="$(grep -E '^TEAMVIS_VERSION=' "$INSTANCE/.env" 2>/dev/null | cut -d= -f2- || true)"
|
||||
if [ -n "$CUR_VERSION" ] && [ -n "$BUNDLE_VERSION" ] && [ "$CUR_VERSION" != "latest" ] && [ "$CUR_VERSION" != "$BUNDLE_VERSION" ] \
|
||||
&& [ "$(printf '%s\n%s\n' "$CUR_VERSION" "$BUNDLE_VERSION" | sort -V | tail -1)" = "$BUNDLE_VERSION" ]; then
|
||||
sed -i "s/^TEAMVIS_VERSION=.*/TEAMVIS_VERSION=$BUNDLE_VERSION/" "$INSTANCE/.env"
|
||||
ok "Image-Version in .env: $CUR_VERSION → $BUNDLE_VERSION"
|
||||
fi
|
||||
grep -q 'teamvis:\${TEAMVIS_VERSION' "$INSTANCE/docker-compose.yml" \
|
||||
|| warn "Das App-Image steht fest in docker-compose.yml (ohne \${TEAMVIS_VERSION}) — bitte dort von Hand auf ${BUNDLE_VERSION:-die neue Version} setzen."
|
||||
( cd "$INSTANCE" && docker compose pull && docker compose up -d )
|
||||
ok "Container neu gestartet."
|
||||
|
||||
head "Fertig 🎉"
|
||||
SITE_URL="$(grep -E '^SITE_URL=|^NEXT_PUBLIC_SITE_URL=' "$INSTANCE/.env" 2>/dev/null | head -1 | cut -d= -f2-)"
|
||||
SITE_URL="$(grep -m1 -E '^SITE_URL=|^NEXT_PUBLIC_SITE_URL=' "$INSTANCE/.env" 2>/dev/null | cut -d= -f2- || true)"
|
||||
[ -n "$SITE_URL" ] && say " $SITE_URL"
|
||||
say " Bei Problemen Logs prüfen: ( cd $INSTANCE && docker compose logs -f app )"
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "teamvis-selfhost",
|
||||
"version": "0.56.2",
|
||||
"version": "0.59.0",
|
||||
"private": true,
|
||||
"description": "Self-Hosting-Bundle für TeamVis (Installer + Migrationen, ohne App-Quellcode).",
|
||||
"type": "module",
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": "0.59.0",
|
||||
"released": "2026-10-14",
|
||||
"security": true,
|
||||
"summary": "Neuer KI-Anbieter mit eigener Adresse (OpenAI-kompatibel), etwa für einen Hoster mit Sitz und Verarbeitung in der EU. Zwei KI-Funktionen im Portal folgen jetzt dem Modul „KI“. Eine optionale Migration (0071), keine neuen Pflicht-Variablen."
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
-- KI-Anbieter mit OpenAI-kompatibler Schnittstelle und eigener Adresse
|
||||
-- ====================================================================
|
||||
-- Ergänzt die drei festen Anbieter aus 0038 um einen vierten, dessen
|
||||
-- Adresse die Verwaltung selbst einträgt — z. B. ein Hoster mit Sitz und
|
||||
-- Verarbeitung in der EU oder ein selbst betriebenes Modell. Nur additiv:
|
||||
-- neue Spalten und eine erweiterte Prüfregel.
|
||||
|
||||
alter table public.site_settings
|
||||
add column if not exists ai_compatible_name text,
|
||||
add column if not exists ai_compatible_base_url text,
|
||||
add column if not exists ai_compatible_key text,
|
||||
add column if not exists ai_compatible_model text;
|
||||
|
||||
-- Die Prüfregel aus 0038 hat einen automatisch vergebenen Namen; sie wird
|
||||
-- über ihre Definition gefunden und mit 'compatible' neu angelegt.
|
||||
do $$
|
||||
declare c record;
|
||||
begin
|
||||
for c in
|
||||
select conname
|
||||
from pg_constraint
|
||||
where conrelid = 'public.site_settings'::regclass
|
||||
and contype = 'c'
|
||||
and pg_get_constraintdef(oid) like '%ai_active_provider%'
|
||||
loop
|
||||
execute format('alter table public.site_settings drop constraint %I', c.conname);
|
||||
end loop;
|
||||
end $$;
|
||||
|
||||
alter table public.site_settings
|
||||
add constraint site_settings_ai_active_provider_check
|
||||
check (ai_active_provider in ('anthropic', 'openai', 'openrouter', 'compatible'));
|
||||
|
||||
-- Nur verschlüsselte Verbindungen: Über die Schnittstelle gehen
|
||||
-- personenbezogene Daten.
|
||||
alter table public.site_settings drop constraint if exists site_settings_ai_compatible_base_url_https;
|
||||
alter table public.site_settings
|
||||
add constraint site_settings_ai_compatible_base_url_https
|
||||
check (ai_compatible_base_url is null or ai_compatible_base_url ~ '^https://');
|
||||
Reference in new issue
Block a user