Compare commits
	
		
			2 Commits
		
	
	
		
			541ecb48f2
			...
			6735658a4b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6735658a4b | |||
| 0608d352bd | 
							
								
								
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -32,9 +32,11 @@ $RECYCLE.BIN/
 | 
				
			|||||||
**/.parcel-cache/
 | 
					**/.parcel-cache/
 | 
				
			||||||
**/dist/
 | 
					**/dist/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# --- Rust ---
 | 
					# --- Python ---
 | 
				
			||||||
**/target/
 | 
					**/__pycache__/*
 | 
				
			||||||
# (Keep Cargo.lock in repo for binaries; default is tracked)
 | 
					**/*.py[cod]
 | 
				
			||||||
 | 
					**/*.pyo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# --- IDEs / project files ---
 | 
					# --- IDEs / project files ---
 | 
				
			||||||
.vscode/
 | 
					.vscode/
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										141
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						@@ -1,123 +1,40 @@
 | 
				
			|||||||
# ========= Bacchus Monorepo Makefile (ohne Docker) =========
 | 
					# ---- Variablen ----
 | 
				
			||||||
# Variablen (bei Bedarf per "make VAR=wert ..." überschreiben)
 | 
					BACKEND_DIR=apps/backend
 | 
				
			||||||
DB_HOST ?= localhost
 | 
					FRONTEND_DIR=apps/frontend
 | 
				
			||||||
DB_PORT ?= 5432
 | 
					VENV=$(BACKEND_DIR)/.venv
 | 
				
			||||||
DB_NAME ?= bacchus
 | 
					 | 
				
			||||||
DB_USER ?= bacchus
 | 
					 | 
				
			||||||
DB_PASS ?= bacchus
 | 
					 | 
				
			||||||
SUPERUSER ?= postgres           # Postgres-Superuser zum Anlegen von User/DB
 | 
					 | 
				
			||||||
PGPASSWORD_SUPER ?=             # Passwort des SUPERUSER (leer, wenn nicht benötigt)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
DB_URL := postgres://$(DB_USER):$(DB_PASS)@$(DB_HOST):$(DB_PORT)/$(DB_NAME)
 | 
					PYTHON=$(VENV)/Scripts/python.exe
 | 
				
			||||||
 | 
					PIP=$(VENV)/Scripts/pip.exe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Pfade
 | 
					# ---- Setup ----
 | 
				
			||||||
BACKEND := apps/backend
 | 
					.PHONY: venv install
 | 
				
			||||||
FRONTEND := apps/frontend
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# ------------------------------------------------------------
 | 
					venv:
 | 
				
			||||||
# Hilfs-Target: Hilfe ausgeben
 | 
						python -m venv $(VENV)
 | 
				
			||||||
# ------------------------------------------------------------
 | 
					 | 
				
			||||||
.PHONY: help
 | 
					 | 
				
			||||||
help: ## Zeigt diese Hilfe
 | 
					 | 
				
			||||||
	@echo "Bacchus Makefile – Targets:"
 | 
					 | 
				
			||||||
	@awk 'BEGIN {FS":.*##"; printf "\n"} /^[a-zA-Z0-9_%-]+:.*##/ { printf "  \033[36m%-22s\033[0m %s\n", $$1, $$2 } /^## / { printf "\n\033[1m%s\033[0m\n", substr($$0,4)}' $(MAKEFILE_LIST)
 | 
					 | 
				
			||||||
	@echo "\nDB_URL = $(DB_URL)"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## --- Umgebung/Envs ----------------------------------------------------
 | 
					install:
 | 
				
			||||||
.PHONY: env-backend
 | 
						$(PIP) install -r $(BACKEND_DIR)/requirements.txt
 | 
				
			||||||
env-backend: ## apps/backend/.env aus Beispiel erzeugen (falls fehlt)
 | 
					 | 
				
			||||||
	@test -f $(BACKEND)/.env || cp $(BACKEND)/.env.example $(BACKEND)/.env
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: env-frontend
 | 
					# ---- Datenbank ----
 | 
				
			||||||
env-frontend: ## apps/frontend/.env.local aus Beispiel erzeugen (falls fehlt)
 | 
					.PHONY: migrate upgrade
 | 
				
			||||||
	@test -f $(FRONTEND)/.env.local || cp $(FRONTEND)/.env.local.example $(FRONTEND)/.env.local
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## --- Datenbank einrichten ---------------------------------------------
 | 
					migrate:
 | 
				
			||||||
.PHONY: db-create-user
 | 
						cd $(BACKEND_DIR) && $(PYTHON) -m alembic revision -m "manual migration"
 | 
				
			||||||
db-create-user: ## DB-User $(DB_USER) anlegen (mit SUPERUSER)
 | 
					 | 
				
			||||||
	@PGPASSWORD=$(PGPASSWORD_SUPER) psql -U $(SUPERUSER) -h $(DB_HOST) -p $(DB_PORT) -tc "SELECT 1 FROM pg_roles WHERE rolname='$(DB_USER)';" | grep -q 1 || \
 | 
					 | 
				
			||||||
	PGPASSWORD=$(PGPASSWORD_SUPER) psql -U $(SUPERUSER) -h $(DB_HOST) -p $(DB_PORT) -c "CREATE USER $(DB_USER) WITH PASSWORD '$(DB_PASS)';"
 | 
					 | 
				
			||||||
	@echo "✔ User $(DB_USER) ok"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: db-create-db
 | 
					upgrade:
 | 
				
			||||||
db-create-db: ## Datenbank $(DB_NAME) anlegen (Owner=$(DB_USER))
 | 
						cd $(BACKEND_DIR) && $(PYTHON) -m alembic upgrade head
 | 
				
			||||||
	@PGPASSWORD=$(PGPASSWORD_SUPER) psql -U $(SUPERUSER) -h $(DB_HOST) -p $(DB_PORT) -tc "SELECT 1 FROM pg_database WHERE datname='$(DB_NAME)';" | grep -q 1 || \
 | 
					 | 
				
			||||||
	PGPASSWORD=$(PGPASSWORD_SUPER) psql -U $(SUPERUSER) -h $(DB_HOST) -p $(DB_PORT) -c "CREATE DATABASE $(DB_NAME) OWNER $(DB_USER);"
 | 
					 | 
				
			||||||
	@echo "✔ DB $(DB_NAME) ok"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: db-setup
 | 
					# ---- Server ----
 | 
				
			||||||
db-setup: db-create-user db-create-db ## User & DB anlegen (idempotent)
 | 
					.PHONY: backend frontend run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: db-psql
 | 
					backend:
 | 
				
			||||||
db-psql: ## Mit psql auf DB verbinden
 | 
						cd $(BACKEND_DIR) && $(PYTHON) -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
 | 
				
			||||||
	psql "$(DB_URL)"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: db-drop-db
 | 
					frontend:
 | 
				
			||||||
db-drop-db: ## Datenbank $(DB_NAME) löschen (Vorsicht!)
 | 
						cd $(FRONTEND_DIR) && npm run dev
 | 
				
			||||||
	@PGPASSWORD=$(PGPASSWORD_SUPER) psql -U $(SUPERUSER) -h $(DB_HOST) -p $(DB_PORT) -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='$(DB_NAME)';" || true
 | 
					 | 
				
			||||||
	@PGPASSWORD=$(PGPASSWORD_SUPER) psql -U $(SUPERUSER) -h $(DB_HOST) -p $(DB_PORT) -c "DROP DATABASE IF EXISTS $(DB_NAME);"
 | 
					 | 
				
			||||||
	@echo "✖ DB $(DB_NAME) dropped"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: db-drop-user
 | 
					# ---- Komfort ----
 | 
				
			||||||
db-drop-user: ## DB-User $(DB_USER) löschen (Vorsicht!)
 | 
					run:
 | 
				
			||||||
	@PGPASSWORD=$(PGPASSWORD_SUPER) psql -U $(SUPERUSER) -h $(DB_HOST) -p $(DB_PORT) -c "DROP OWNED BY $(DB_USER) CASCADE;" || true
 | 
						@echo "Starte Backend und Frontend (in separaten Prozessen)..."
 | 
				
			||||||
	@PGPASSWORD=$(PGPASSWORD_SUPER) psql -U $(SUPERUSER) -h $(DB_HOST) -p $(DB_PORT) -c "DROP ROLE IF EXISTS $(DB_USER);"
 | 
						@start cmd /k "cd $(BACKEND_DIR) && $(PYTHON) -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000"
 | 
				
			||||||
	@echo "✖ User $(DB_USER) dropped"
 | 
						@start cmd /k "cd $(FRONTEND_DIR) && npm run dev"
 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: db-reset
 | 
					 | 
				
			||||||
db-reset: db-drop-db db-create-db migrate seed ## DB leeren & neu aufsetzen (Migrate+Seed)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## --- Migrations (sqlx-cli benötigt) -----------------------------------
 | 
					 | 
				
			||||||
.PHONY: migrate
 | 
					 | 
				
			||||||
migrate: ## Migrationen ausführen
 | 
					 | 
				
			||||||
	cd $(BACKEND) && DATABASE_URL=$(DB_URL) sqlx migrate run
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: migrate-new
 | 
					 | 
				
			||||||
migrate-new: ## Neue Migration anlegen: make migrate-new name=add_table
 | 
					 | 
				
			||||||
	@test -n "$(name)" || (echo "Bitte mit name=... aufrufen"; exit 1)
 | 
					 | 
				
			||||||
	cd $(BACKEND) && sqlx migrate add -r $(name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: sqlx-prepare
 | 
					 | 
				
			||||||
sqlx-prepare: ## SQLx offline-data erzeugen (schnellere Builds)
 | 
					 | 
				
			||||||
	cd $(BACKEND) && DATABASE_URL=$(DB_URL) cargo sqlx prepare
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## --- Seeds -------------------------------------------------------------
 | 
					 | 
				
			||||||
.PHONY: seed
 | 
					 | 
				
			||||||
seed: ## Beispiel-Daten einspielen
 | 
					 | 
				
			||||||
	psql "$(DB_URL)" -f scripts/seed.sql
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## --- Backend -----------------------------------------------------------
 | 
					 | 
				
			||||||
.PHONY: dev-backend
 | 
					 | 
				
			||||||
dev-backend: env-backend ## Backend starten (Axum)
 | 
					 | 
				
			||||||
	cd $(BACKEND) && RUST_LOG=bacchus=debug,axum=info DATABASE_URL=$(DB_URL) cargo run
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: fmt
 | 
					 | 
				
			||||||
fmt: ## Rust & Frontend format/lint
 | 
					 | 
				
			||||||
	cd $(BACKEND) && cargo fmt --all
 | 
					 | 
				
			||||||
	@cd $(FRONTEND) && npm run lint || true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: clippy
 | 
					 | 
				
			||||||
clippy: ## Rust Lint (clippy)
 | 
					 | 
				
			||||||
	cd $(BACKEND) && cargo clippy -- -D warnings
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: test
 | 
					 | 
				
			||||||
test: ## Rust Tests
 | 
					 | 
				
			||||||
	cd $(BACKEND) && cargo test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## --- Frontend ----------------------------------------------------------
 | 
					 | 
				
			||||||
.PHONY: dev-frontend
 | 
					 | 
				
			||||||
dev-frontend: env-frontend ## Frontend Dev-Server starten (Next.js)
 | 
					 | 
				
			||||||
	cd $(FRONTEND) && npm install && npm run dev
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## --- Convenience --------------------------------------------------------
 | 
					 | 
				
			||||||
.PHONY: dev
 | 
					 | 
				
			||||||
dev: ## Hinweis: Backend & Frontend in separaten Terminals starten (dev-backend, dev-frontend)
 | 
					 | 
				
			||||||
	@echo "Starte getrennt:"
 | 
					 | 
				
			||||||
	@echo "  make dev-backend   # API auf http://localhost:8080"
 | 
					 | 
				
			||||||
	@echo "  make dev-frontend  # UI  auf http://localhost:3000"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: clean
 | 
					 | 
				
			||||||
clean: ## Build-Artefakte entfernen
 | 
					 | 
				
			||||||
	cargo clean || true
 | 
					 | 
				
			||||||
	rm -rf $(FRONTEND)/.next $(FRONTEND)/node_modules || true
 | 
					 | 
				
			||||||
	@echo "✔ Clean"
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
| 
		 Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB  | 
| 
		 Before Width: | Height: | Size: 205 KiB After Width: | Height: | Size: 205 KiB  | 
| 
		 Before Width: | Height: | Size: 3.8 MiB After Width: | Height: | Size: 3.8 MiB  | 
| 
		 Before Width: | Height: | Size: 212 B After Width: | Height: | Size: 212 B  | 
| 
		 Before Width: | Height: | Size: 2.6 MiB After Width: | Height: | Size: 2.6 MiB  | 
| 
		 Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB  | 
| 
		 Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB  | 
| 
		 Before Width: | Height: | Size: 896 KiB After Width: | Height: | Size: 896 KiB  | 
							
								
								
									
										0
									
								
								apps/backend/migrations/env.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -1 +1,93 @@
 | 
				
			|||||||
 | 
					alembic==1.16.4
 | 
				
			||||||
 | 
					annotated-types==0.7.0
 | 
				
			||||||
 | 
					anyio==4.9.0
 | 
				
			||||||
 | 
					bcrypt==4.0.1
 | 
				
			||||||
 | 
					capstone==6.0.0a3
 | 
				
			||||||
 | 
					certifi==2025.1.31
 | 
				
			||||||
 | 
					cffi==1.17.1
 | 
				
			||||||
 | 
					charset-normalizer==3.4.1
 | 
				
			||||||
 | 
					click==8.2.1
 | 
				
			||||||
 | 
					colorama==0.4.6
 | 
				
			||||||
 | 
					colored-traceback==0.4.2
 | 
				
			||||||
 | 
					cryptography==44.0.1
 | 
				
			||||||
 | 
					dnspython==2.7.0
 | 
				
			||||||
 | 
					ecdsa==0.19.1
 | 
				
			||||||
 | 
					email_validator==2.2.0
 | 
				
			||||||
 | 
					fastapi==0.116.0
 | 
				
			||||||
 | 
					fastapi-cli==0.0.8
 | 
				
			||||||
 | 
					fastapi-cloud-cli==0.1.2
 | 
				
			||||||
 | 
					greenlet==3.2.3
 | 
				
			||||||
 | 
					h11==0.16.0
 | 
				
			||||||
 | 
					httpcore==1.0.9
 | 
				
			||||||
 | 
					httptools==0.6.4
 | 
				
			||||||
 | 
					httpx==0.28.1
 | 
				
			||||||
 | 
					idna==3.10
 | 
				
			||||||
 | 
					intervaltree==3.1.0
 | 
				
			||||||
 | 
					itsdangerous==2.2.0
 | 
				
			||||||
 | 
					Jinja2==3.1.6
 | 
				
			||||||
 | 
					Mako==1.3.9
 | 
				
			||||||
 | 
					markdown-it-py==3.0.0
 | 
				
			||||||
 | 
					MarkupSafe==3.0.2
 | 
				
			||||||
 | 
					mdurl==0.1.2
 | 
				
			||||||
 | 
					mpmath==1.3.0
 | 
				
			||||||
 | 
					Naked==0.1.32
 | 
				
			||||||
 | 
					orjson==3.10.18
 | 
				
			||||||
 | 
					packaging==24.2
 | 
				
			||||||
 | 
					paramiko==3.5.1
 | 
				
			||||||
 | 
					passlib==1.7.4
 | 
				
			||||||
 | 
					pdfminer.six==20250506
 | 
				
			||||||
 | 
					pdfplumber==0.11.7
 | 
				
			||||||
 | 
					pillow==11.3.0
 | 
				
			||||||
 | 
					plumbum==1.9.0
 | 
				
			||||||
 | 
					psutil==7.0.0
 | 
				
			||||||
 | 
					psycopg2==2.9.10
 | 
				
			||||||
 | 
					psycopg2-binary==2.9.10
 | 
				
			||||||
 | 
					pwn==1.0
 | 
				
			||||||
 | 
					pwntools==4.14.0
 | 
				
			||||||
 | 
					pyasn1==0.6.1
 | 
				
			||||||
 | 
					pycparser==2.22
 | 
				
			||||||
 | 
					pycryptodome==3.21.0
 | 
				
			||||||
 | 
					pydantic==2.11.7
 | 
				
			||||||
 | 
					pydantic-extra-types==2.10.5
 | 
				
			||||||
 | 
					pydantic-settings==2.10.1
 | 
				
			||||||
 | 
					pydantic_core==2.33.2
 | 
				
			||||||
 | 
					pyelftools==0.32
 | 
				
			||||||
 | 
					Pygments==2.19.1
 | 
				
			||||||
 | 
					PyNaCl==1.5.0
 | 
				
			||||||
 | 
					pypdfium2==4.30.0
 | 
				
			||||||
 | 
					pyserial==3.5
 | 
				
			||||||
 | 
					PySocks==1.7.1
 | 
				
			||||||
 | 
					python-dateutil==2.9.0.post0
 | 
				
			||||||
 | 
					python-dotenv==1.1.1
 | 
				
			||||||
 | 
					python-jose==3.5.0
 | 
				
			||||||
 | 
					python-multipart==0.0.20
 | 
				
			||||||
 | 
					pywin32==308
 | 
				
			||||||
 | 
					PyYAML==6.0.2
 | 
				
			||||||
 | 
					requests==2.32.3
 | 
				
			||||||
 | 
					rich==14.0.0
 | 
				
			||||||
 | 
					rich-toolkit==0.14.8
 | 
				
			||||||
 | 
					rignore==0.5.1
 | 
				
			||||||
 | 
					ROPGadget==7.6
 | 
				
			||||||
 | 
					rpyc==6.0.1
 | 
				
			||||||
 | 
					rsa==4.9.1
 | 
				
			||||||
 | 
					sentry-sdk==2.32.0
 | 
				
			||||||
 | 
					shellescape==3.8.1
 | 
				
			||||||
 | 
					shellingham==1.5.4
 | 
				
			||||||
 | 
					six==1.17.0
 | 
				
			||||||
 | 
					sniffio==1.3.1
 | 
				
			||||||
 | 
					sortedcontainers==2.4.0
 | 
				
			||||||
 | 
					SQLAlchemy==2.0.41
 | 
				
			||||||
 | 
					starlette==0.46.2
 | 
				
			||||||
 | 
					sympy==1.13.3
 | 
				
			||||||
 | 
					typer==0.16.0
 | 
				
			||||||
 | 
					typing-inspection==0.4.1
 | 
				
			||||||
 | 
					typing_extensions==4.14.1
 | 
				
			||||||
 | 
					tzdata==2025.2
 | 
				
			||||||
 | 
					ujson==5.10.0
 | 
				
			||||||
 | 
					unicorn==2.1.2
 | 
				
			||||||
 | 
					unix-ar==0.2.1
 | 
				
			||||||
 | 
					urllib3==2.3.0
 | 
				
			||||||
 | 
					uvicorn==0.35.0
 | 
				
			||||||
 | 
					watchfiles==1.1.0
 | 
				
			||||||
 | 
					websockets==15.0.1
 | 
				
			||||||
 | 
					zstandard==0.23.0
 | 
				
			||||||