#!/bin/bash set -e # Load environment variables if [ -f .env ]; then export $(cat .env | grep -v '^#' | xargs) else echo "❌ .env file not found!" echo "📋 Copy .env.example to .env and configure it first" exit 1 fi # Validate required variables if [ -z "$GITEA_URL" ] || [ -z "$REPO_OWNER" ] || [ -z "$REPO_NAME" ] || [ -z "$GITEA_TOKEN" ]; then echo "❌ Missing required environment variables in .env" echo "📋 Check .env.example for required variables" exit 1 fi # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # Check repo check_repo() { if [ ! -d ".git" ]; then log_error "Not in a Git repository!" exit 1 fi log_success "Repository check passed" } # Create directory structure for API Gateway project create_directory_structure() { log_info "Creating Furt API Gateway directory structure..." # Core Go project structure mkdir -p cmd/{furt-gateway,services/{formular2mail,sagjan}} mkdir -p internal/{gateway,services/{formular2mail,sagjan},shared/{auth,config,logging}} mkdir -p pkg/client # Configuration and deployment mkdir -p configs/{services,examples} mkdir -p scripts/{build,deploy,development} mkdir -p tools/service-generator # Documentation mkdir -p docs/{api,installation,services} mkdir -p devdocs mkdir -p examples/{hugo,nginx,apache,docker} # Testing mkdir -p tests/{unit,integration,e2e} # Gitea specific mkdir -p .gitea/{issue_template,workflows} log_success "Furt directory structure created" } # Create issue templates for API project create_issue_templates() { log_info "Creating Furt-specific issue templates..." # Service Request Template cat > .gitea/issue_template/service_request.yml << 'TEMPLATE_EOF' name: 🔧 Neuer Service für API-Gateway description: Anfrage für einen neuen Service im Furt-Gateway title: "[SERVICE] " labels: ["service-request", "enhancement"] body: - type: input id: service_name attributes: label: "🏷️ Service-Name" description: "Wie soll der neue Service heißen?" placeholder: "z.B. newsletter, shop, calendar" validations: required: true - type: textarea id: service_description attributes: label: "📝 Service-Beschreibung" description: "Was soll der Service tun?" placeholder: "Detaillierte Beschreibung der gewünschten Funktionalität" validations: required: true - type: input id: service_port attributes: label: "🔌 Gewünschter Port" description: "Auf welchem Port soll der Service laufen?" placeholder: "z.B. 8083, 8084" - type: dropdown id: priority attributes: label: "⚡ Priorität" description: "Wie dringend wird der Service benötigt?" options: - "🔥 Hoch - wird sofort benötigt" - "📊 Mittel - geplante Entwicklung" - "📝 Niedrig - nice to have" validations: required: true - type: checkboxes id: integration_needs attributes: label: "🔗 Integration-Anforderungen" description: "Welche Integrationen werden benötigt?" options: - label: "Hugo-Shortcode" - label: "OpenAPI-Dokumentation" - label: "Admin-Interface" - label: "E-Mail-Benachrichtigungen" - label: "Datenbank-Speicherung" TEMPLATE_EOF # Bug Report Template cat > .gitea/issue_template/bug_report.yml << 'TEMPLATE_EOF' name: 🐛 Bug Report description: Problem mit Gateway oder Service melden title: "[BUG] " labels: ["bug"] body: - type: dropdown id: component attributes: label: "🎯 Betroffene Komponente" description: "Welcher Teil des Systems ist betroffen?" options: - "Gateway (Routing, Auth, etc.)" - "Service: formular2mail" - "Service: sagjan" - "Konfiguration" - "Deployment/Scripts" - "Dokumentation" validations: required: true - type: textarea id: bug_description attributes: label: "📝 Bug-Beschreibung" description: "Was ist das Problem?" placeholder: "Detaillierte Beschreibung des Bugs" validations: required: true - type: textarea id: steps_to_reproduce attributes: label: "🔄 Schritte zur Reproduktion" description: "Wie kann der Bug reproduziert werden?" placeholder: | 1. Gehe zu ... 2. Klicke auf ... 3. Führe aus ... 4. Fehler tritt auf validations: required: true - type: textarea id: expected_behavior attributes: label: "✅ Erwartetes Verhalten" description: "Was sollte stattdessen passieren?" validations: required: true TEMPLATE_EOF # Architecture Discussion Template cat > .gitea/issue_template/architecture.yml << 'TEMPLATE_EOF' name: 🏗️ Architektur-Diskussion description: Diskussion über technische Entscheidungen und Architektur title: "[ARCH] " labels: ["architecture", "discussion"] body: - type: input id: topic attributes: label: "🎯 Thema" description: "Welcher Architektur-Aspekt soll diskutiert werden?" placeholder: "z.B. Service-Discovery, Auth-Strategy, Database-Choice" validations: required: true - type: textarea id: current_situation attributes: label: "📊 Aktuelle Situation" description: "Wie ist es momentan gelöst?" - type: textarea id: proposed_change attributes: label: "💡 Vorgeschlagene Änderung" description: "Was soll geändert/diskutiert werden?" validations: required: true - type: textarea id: alternatives attributes: label: "🔄 Alternativen" description: "Welche anderen Ansätze gibt es?" - type: checkboxes id: impact_areas attributes: label: "📈 Betroffene Bereiche" description: "Welche Teile des Systems sind betroffen?" options: - label: "Gateway-Performance" - label: "Service-Integration" - label: "Sicherheit" - label: "Skalierbarkeit" - label: "Wartbarkeit" - label: "Deployment" TEMPLATE_EOF log_success "Furt issue templates created" } # Create labels for API Gateway project create_labels() { log_info "Creating Furt-specific labels via Gitea API..." declare -a labels=( "gateway,0052CC,API-Gateway Kern-Funktionalität" "service-formular2mail,2188FF,Formular-zu-E-Mail Service" "service-sagjan,34D058,Sagjan Kommentarsystem Integration" "service-request,0E8A16,Anfrage für neuen Service" "architecture,6F42C1,Architektur und Design-Entscheidungen" "security,D73A49,Sicherheit und Authentifizierung" "performance,F66A0A,Performance und Optimierung" "documentation,D1D5DA,Dokumentation schreiben/verbessern" "testing,28A745,Tests und Qualitätssicherung" "deployment,FBCA04,Build, Deploy und DevOps" "configuration,008672,Konfiguration und Setup" "bug,DC143C,Fehler und Probleme" "enhancement,32CD32,Verbesserung oder neue Funktion" "question,87CEEB,Frage oder Hilfe benötigt" "help-wanted,FF69B4,Community-Input erwünscht" "good-first-issue,98FB98,Gut für neue Mitwirkende" "breaking-change,FF4500,Breaking Change - Version Bump nötig" "low-tech,8B4513,Im Einklang mit Low-Tech-Prinzipien" "digital-sovereignty,4B0082,Fördert digitale Souveränität" ) for label_data in "${labels[@]}"; do IFS=',' read -r name color description <<< "$label_data" response=$(curl -s -w "\n%{http_code}" -X POST \ "$GITEA_URL/api/v1/repos/$REPO_OWNER/$REPO_NAME/labels" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"name\": \"$name\", \"color\": \"$color\", \"description\": \"$description\" }") http_code=$(echo "$response" | tail -n1) if [ "$http_code" = "201" ]; then log_success "Label '$name' created" elif [ "$http_code" = "409" ]; then log_warning "Label '$name' already exists" else log_error "Failed to create label '$name' (HTTP: $http_code)" fi done } # Create .env.example for API project create_env_example() { log_info "Creating .env.example for Furt..." cat > .env.example << 'ENV_EOF' # Gitea-Konfiguration für Issue-Management GITEA_URL=https://your-gitea-instance.com REPO_OWNER=your-username REPO_NAME=furt GITEA_TOKEN=your-gitea-token-here # Optional: Default-Assignee für Issues DEFAULT_ASSIGNEE=your-username # Gateway-Konfiguration (für Entwicklung) GATEWAY_PORT=8080 GATEWAY_LOG_LEVEL=info # Service-Ports (für lokale Entwicklung) FORMULAR2MAIL_PORT=8081 SAGJAN_PORT=8082 # SMTP-Konfiguration (für formular2mail) SMTP_HOST=localhost SMTP_PORT=25 SMTP_FROM=no-reply@dragons-at-work.de SMTP_TO=admin@dragons-at-work.de # API-Schlüssel (generiere sichere Schlüssel für Produktion!) HUGO_API_KEY=change-me-in-production ADMIN_API_KEY=change-me-in-production ENV_EOF log_success ".env.example created" } # Update .gitignore for Go project update_gitignore() { log_info "Creating Go-specific .gitignore..." cat > .gitignore << 'GITIGNORE_EOF' # Environment variables (NEVER commit!) .env # Go build artifacts *.exe *.exe~ *.dll *.so *.dylib furt-gateway formular2mail-service sagjan-service /build/ /dist/ # Go test files *.test *.out coverage.txt coverage.html # Go modules /vendor/ # OS generated files .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes ehthumbs.db Thumbs.db # Editor files .vscode/ .idea/ *.swp *.swo *~ # Temporary files *.tmp *.temp *.log # Development files _personal/ _drafts/ _notes/ debug.log # Database files (for testing) *.db *.sqlite *.sqlite3 # Configuration files with secrets config.local.yaml config.production.yaml GITIGNORE_EOF log_success ".gitignore updated for Go project" } # Create initial Go module create_go_module() { log_info "Initializing Go module..." if [ ! -f "go.mod" ]; then go mod init furt log_success "Go module initialized" else log_warning "go.mod already exists" fi } # Create basic project files create_basic_files() { log_info "Creating basic project files..." # README.md cat > README.md << 'README_EOF' # Furt API Gateway Ein Low-Tech API-Gateway für selbst-gehostete Services im Einklang mit digitaler Souveränität. ## Überblick Furt ist ein minimalistischer API-Gateway, der verschiedene Services unter einer einheitlichen API vereint. Der Name "Furt" (germanisch für "Durchgang durch Wasser") symbolisiert die Gateway-Funktion: Alle Requests durchqueren die API-Furt um zu den dahinterliegenden Services zu gelangen. ## Philosophie - **Low-Tech-Ansatz**: Einfachheit vor Komplexität - **Digitale Souveränität**: Vollständige Kontrolle über die eigene Infrastruktur - **Native Deployment**: Go-Binaries ohne externe Abhängigkeiten - **Ressourcenschonend**: Minimaler Speicher- und CPU-Verbrauch - **Open Source**: Transparent und gemeinschaftlich entwickelt ## Status 🚧 **In Entwicklung** - Grundgerüst wird implementiert ## Geplante Services - **formular2mail**: Kontaktformulare zu E-Mail weiterleiten - **sagjan**: Selbst-gehostetes Kommentarsystem - **Weitere**: Shop, Newsletter, Terminbuchung, etc. ## Installation *Dokumentation folgt mit erstem Release* ## Entwicklung Siehe `devdocs/` für Entwicklungsrichtlinien und Architektur-Dokumentation. ## Lizenz Apache License 2.0 - Siehe [LICENSE](LICENSE) für Details. README_EOF # LICENSE cat > LICENSE << 'LICENSE_EOF' Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION [Complete Apache 2.0 license text would go here] LICENSE_EOF log_success "Basic project files created" } # Git commit and push commit_and_push() { log_info "Committing initial Furt structure..." git add . git commit -m "feat: Initiale Furt API-Gateway Projektstruktur - Go-Projektstruktur nach Low-Tech-Prinzipien - Issue-Templates für Service-Requests und Bug-Reports - Konfiguration für sichere Entwicklung (.env.example) - Scripts-Verzeichnis für Build und Deployment - Dokumentationsstruktur für Dev und User Docs - Apache 2.0 Lizenz für Open-Source-Entwicklung Furt (Durchgang) vereint Services unter einheitlicher API für vollständige digitale Souveränität." if git remote get-url origin > /dev/null 2>&1; then git push origin main log_success "Changes committed and pushed" else log_warning "No remote 'origin' configured - changes committed locally" fi } # Main function main() { log_info "🚀 Starting Furt API Gateway repository setup" echo check_repo create_directory_structure create_issue_templates create_env_example update_gitignore create_basic_files create_go_module commit_and_push create_labels echo log_success "🎯 Furt repository setup complete!" echo echo "Next steps:" echo "1. Copy .env.example to .env and configure it" echo "2. Create devdocs/KONZEPT.md with project philosophy" echo "3. Implement Gateway basic structure in cmd/furt-gateway/" echo "4. Create first service: formular2mail" echo "5. Test with Hugo integration" echo log_info "Ready to build the Furt! 🌊" } main "$@"