fix: 403-Schutz + Selbstheilung fuer geloeschte Preview-Config

- runDeploy schreibt Platzhalter-index.html, wenn das Deploy-Verzeichnis
  keine index.html enthaelt (leergeraeumtes Repo/Fehlbuild) -> nie mehr
  nginx 403 Forbidden, Subdomain bleibt erreichbar.
- deployStatic: Fallback auf Repo-Wurzel bei fehlendem index-Unterordner,
  .git wird nicht mehr mit ausgeliefert.
- Webhook: fehlt .webklar-preview.json im Repo, wird die Hosting-Config aus
  dem Appwrite-Projektstand rekonstruiert, ins Repo zurueckgeschrieben und
  normal deployt (ensureRepoPreviewConfig).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-07-12 18:05:00 +00:00
parent 07ebcc7e62
commit 1b4262b09f
3 changed files with 125 additions and 3 deletions

View File

@@ -8,6 +8,7 @@ import {
runDeploy,
buildPreviewUrl,
} from '../../services/previewDeploy.js'
import { ensureRepoPreviewConfig } from '../../services/giteaAdmin.js'
import { createGitPushWorksheet } from '../../services/gitWorksheet.js'
import { ensureProjectTicket } from '../../services/ticketAdmin.js'
import { invalidateProjectCache } from '../../services/projectInsights.js'
@@ -55,7 +56,19 @@ router.post('/gitea', async (req, res) => {
const branch = ref.replace('refs/heads/', '') || 'main'
try {
const previewConfigFile = await fetchPreviewConfig(repoFullName, branch)
let previewConfigFile = await fetchPreviewConfig(repoFullName, branch)
// Selbstheilung: Wurde .webklar-preview.json im Repo geloescht (z.B. beim
// Leerraeumen/Ueberarbeiten der Seite), aber das Projekt ist in Appwrite als
// gehostet bekannt, dann Config aus dem gespeicherten Stand wiederherstellen
// (Datei ins Repo zurueckschreiben) und normal weiter-deployen.
if (!previewConfigFile) {
try {
const restored = await ensureRepoPreviewConfig(repoFullName, branch)
if (restored) previewConfigFile = restored
} catch (err) {
console.error('[webhook] preview-config-Wiederherstellung fehlgeschlagen:', err.message)
}
}
const previewConfig = previewConfigFile || defaultPreviewConfig(repoFullName)
const hasPreview = Boolean(previewConfigFile?.enabled !== false && previewConfigFile)
// Nur Projekte mit aktivierter Preview bekommen eine Subdomain zugewiesen -