From f4e8a40cdfd9b0f7e3e3c77db26b71d7b28ec788 Mon Sep 17 00:00:00 2001 From: michael Date: Tue, 3 Jun 2025 16:39:17 +0200 Subject: [PATCH] feat: Initiale Furt API-Gateway Projektstruktur MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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. --- .env.example | 26 ++ .gitea/issue_template/architecture.yml | 46 ++ .gitea/issue_template/bug_report.yml | 49 ++ .gitea/issue_template/service_request.yml | 53 +++ .gitignore | 59 +++ LICENSE | 7 + README.md | 38 +- furt_setup_repo.sh | 516 ++++++++++++++++++++++ go.mod | 3 + 9 files changed, 796 insertions(+), 1 deletion(-) create mode 100644 .env.example create mode 100644 .gitea/issue_template/architecture.yml create mode 100644 .gitea/issue_template/bug_report.yml create mode 100644 .gitea/issue_template/service_request.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100755 furt_setup_repo.sh create mode 100644 go.mod diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..fb5827c --- /dev/null +++ b/.env.example @@ -0,0 +1,26 @@ +# 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 diff --git a/.gitea/issue_template/architecture.yml b/.gitea/issue_template/architecture.yml new file mode 100644 index 0000000..da0e7e5 --- /dev/null +++ b/.gitea/issue_template/architecture.yml @@ -0,0 +1,46 @@ +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" diff --git a/.gitea/issue_template/bug_report.yml b/.gitea/issue_template/bug_report.yml new file mode 100644 index 0000000..9e74f39 --- /dev/null +++ b/.gitea/issue_template/bug_report.yml @@ -0,0 +1,49 @@ +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 diff --git a/.gitea/issue_template/service_request.yml b/.gitea/issue_template/service_request.yml new file mode 100644 index 0000000..0b07b98 --- /dev/null +++ b/.gitea/issue_template/service_request.yml @@ -0,0 +1,53 @@ +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" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f48e84 --- /dev/null +++ b/.gitignore @@ -0,0 +1,59 @@ +# 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 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6d5fbb8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +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] diff --git a/README.md b/README.md index 42061c0..1510e48 100644 --- a/README.md +++ b/README.md @@ -1 +1,37 @@ -README.md \ No newline at end of file +# 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. diff --git a/furt_setup_repo.sh b/furt_setup_repo.sh new file mode 100755 index 0000000..14d4bd9 --- /dev/null +++ b/furt_setup_repo.sh @@ -0,0 +1,516 @@ +#!/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 "$@" \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..4f8e1c1 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module furt + +go 1.24.3