From a7d10c4e905e1d4974e8eb78d46fe7d95538f8a9 Mon Sep 17 00:00:00 2001 From: Jiri Uhlir Date: Thu, 28 May 2026 08:45:14 +0200 Subject: [PATCH] Delete apps from database --- scripts/delete-app.sh | 81 +++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 46 deletions(-) diff --git a/scripts/delete-app.sh b/scripts/delete-app.sh index d39874a..19b0097 100755 --- a/scripts/delete-app.sh +++ b/scripts/delete-app.sh @@ -1,24 +1,23 @@ #!/usr/bin/env bash set -euo pipefail +CONFIG_FILE="/opt/appfactory/config/appfactory.env" +source "$CONFIG_FILE" + APP_ID="${1:-}" +DB_FILE="/opt/appfactory/data/appfactory/appfactory.db" +TOOLS_DIR="$WORKSPACE_DIR/appfactory-tools" + if [ -z "$APP_ID" ]; then echo "Usage: ./delete-app.sh " exit 1 fi -CONFIG_FILE="/opt/appfactory/config/appfactory.env" -source "$CONFIG_FILE" - -COMPOSE_FILE="$APPFACTORY_DIR/deploy/apps-compose.yml" -CATALOG_FILE="$APPFACTORY_DIR/apps/catalog.yml" -CADDY_FILE="$APPFACTORY_DIR/gateway/Caddyfile" -TOOLS_DIR="$WORKSPACE_DIR/appfactory-tools" - echo "Deleting app: $APP_ID" echo "Deleting Gitea repository..." + curl -sS -X DELETE \ "$GITEA_URL/api/v1/repos/$GITEA_ORG/$APP_ID" \ -H "Authorization: token $GITEA_TOKEN" || true @@ -27,60 +26,50 @@ echo "Stopping container..." docker rm -f "$APP_ID" || true echo "Removing image..." -docker rmi -f "$APP_ID:latest" || true +docker image rm "$APP_ID:latest" || true echo "Removing workspace..." rm -rf "$WORKSPACE_DIR/$APP_ID" -python3 - "$APP_ID" "$COMPOSE_FILE" "$CATALOG_FILE" "$CADDY_FILE" <<'PY' +echo "Removing app from database..." + +python3 - "$DB_FILE" "$APP_ID" <<'PY' +import sqlite3 import sys -from pathlib import Path -app_id = sys.argv[1] -compose_file = Path(sys.argv[2]) -catalog_file = Path(sys.argv[3]) -caddy_file = Path(sys.argv[4]) +db_file = sys.argv[1] +app_id = sys.argv[2] -def remove_block(lines, predicate): - out = [] - i = 0 - while i < len(lines): - line = lines[i] - if predicate(line): - indent = len(line) - len(line.lstrip()) - i += 1 - while i < len(lines): - next_line = lines[i] - if next_line.strip(): - next_indent = len(next_line) - len(next_line.lstrip()) - if next_indent <= indent: - break - i += 1 - continue - out.append(line) - i += 1 - return out +con = sqlite3.connect(db_file) -if compose_file.exists(): - lines = compose_file.read_text().splitlines() - lines = remove_block(lines, lambda l: l.startswith(f" {app_id}:")) - compose_file.write_text("\n".join(lines).rstrip() + "\n") +con.execute( + "DELETE FROM deployments WHERE app_id = ?", + (app_id,) +) -if catalog_file.exists(): - lines = catalog_file.read_text().splitlines() - lines = remove_block(lines, lambda l: l.strip() == f"- id: {app_id}") - catalog_file.write_text("\n".join(lines).rstrip() + "\n") +con.execute( + "DELETE FROM apps WHERE id = ?", + (app_id,) +) -if caddy_file.exists(): - lines = caddy_file.read_text().splitlines() - lines = remove_block(lines, lambda l: f"/apps/{app_id}/*" in l) - caddy_file.write_text("\n".join(lines).rstrip() + "\n") +con.commit() +con.close() PY echo "Regenerating generated files..." +"$TOOLS_DIR/scripts/generate-catalog.sh" "$TOOLS_DIR/scripts/generate-apps-compose.sh" "$TOOLS_DIR/scripts/generate-caddyfile.sh" "$TOOLS_DIR/scripts/generate-apps-page.sh" +echo "Reloading Caddy..." + +docker exec appfactory-caddy caddy validate \ + --config /etc/caddy/Caddyfile + +docker exec appfactory-caddy caddy reload \ + --config /etc/caddy/Caddyfile + +echo "" echo "DONE"