restructure
This commit is contained in:
8
.gitignore
vendored
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
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"
|
|
||||||
|
0
apps/backend/migrations/env.py
Normal file
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
|
3616
apps/frontend/package-lock.json
generated
Normal file
3616
apps/frontend/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user