.PHONY: install dev stop sync build prod logs down pull stream stream-local stream-stop mtx mtx-stop test install: cd backend && python3 -m venv .venv && .venv/bin/pip install -r requirements.txt cd frontend && npm install test: cd backend && .venv/bin/python -m pytest -q # MediaMTX nimmt den Stream entgegen. Ohne ihn läuft der Stream-Reiter ins # Leere und OBS findet keinen Server. # Räumt immer erst auf: ein gestoppter Container von vorhin belegt sonst # den Namen, und "docker ps" sieht ihn nicht. mtx: -@docker rm -f horror-mtx-dev 2>/dev/null > /dev/null @docker run -d --rm --name horror-mtx-dev --network host \ --env-file .env \ -e MTX_AUTHINTERNALUSERS_0_PASS="$$(grep '^MTX_SENDEPASSWORT=' .env | cut -d= -f2-)" \ -v "$(PWD)/mediamtx/mediamtx.yml:/mediamtx.yml:ro" \ -v "$(PWD)/aufnahmen:/recordings" \ bluenviron/mediamtx:latest > /dev/null @echo "MediaMTX läuft: RTMP auf :1935, HLS auf :8890, Aufnahme in aufnahmen/" mtx-stop: -@docker rm -f horror-mtx-dev 2>/dev/null > /dev/null @echo "MediaMTX gestoppt." # Startet unabhängig davon, was gerade läuft. Die eckige Klammer im Muster # sorgt dafür, dass pkill nicht die eigene Zeile trifft. dev: mtx -@pkill -f "[u]vicorn app.main:app" 2>/dev/null -@pkill -f "[v]ite --port 5173" 2>/dev/null @echo "Backend: http://localhost:8000 Frontend: http://localhost:5173" @cd backend && .venv/bin/uvicorn app.main:app --reload --port 8000 --timeout-graceful-shutdown 2 & @cd frontend && npx vite --port 5173 stop: mtx-stop stream-stop -@pkill -f "uvicorn app.main:app" 2>/dev/null -@pkill -f "vite --port 5173" 2>/dev/null @echo "gestoppt." # Katalog holen und fehlende Teaser erzeugen (läuft im Betrieb täglich 4:30) sync: cd backend && .venv/bin/python -m app.sync build: cd frontend && npm run build # ── Produktion (auf dem Server ausführen, im Projektverzeichnis) ────────────── # --force-recreate: auch MediaMTX kommt neu hoch und liest die # mediamtx.yml frisch — sonst bleibt eine Konfigänderung ohne Wirkung prod: docker compose up -d --build --force-recreate @echo "horror läuft: https://horror.marha.de" # Der Sync läuft im Container, ein backend/.venv gibt es dort nicht sync-prod: docker compose exec horror python -m app.sync logs: docker compose logs -f down: docker compose down # ── Senden ─────────────────────────────────────────────────────────────────── # Der Regelfall geht an den Server. Ein anderes Ziel bei Bedarf: # make stream ZIEL=anderer.host ZIEL ?= horror.marha.de # Räumt vorher auf: ein noch laufendes OBS belegt sonst die Sendestrecke, # und der Tonweg wird sauber neu aufgebaut. # Der Stream bekommt den vollen Ton, dieser Rechner bleibt still. # Zum Mitschauen am selben Gerät: make stream MITHOEREN=1 stream: stream-stop @MITHOEREN=$(MITHOEREN) scripts/stream.sh $(ZIEL) # Zum Ausprobieren ohne Server, gegen das lokale MediaMTX stream-local: mtx @scripts/stream.sh 127.0.0.1 stream-stop: -@pkill -f "obs --profile filmabend" 2>/dev/null -@scripts/ton.sh ab @echo "OBS beendet." # ── Datenbank vom Server holen (lokal ausführen) ─────────────────────────────────── SERVER = root@178.104.67.87 REMOTE = /var/www/horror LOKAL = backend/horror.db # Eine laufende App schreibt weiter, während kopiert wird. Deshalb erst eine # in sich stimmige Kopie ziehen, statt die Datei direkt anzufassen. SICHERN = import sqlite3,sys; q=sqlite3.connect(sys.argv[1]); z=sqlite3.connect(sys.argv[2]); q.backup(z); z.close(); q.close() pull: @echo "Überschreibt deine lokale Datenbank." ssh $(SERVER) 'python3 -c "$(SICHERN)" $(REMOTE)/data/horror.db /tmp/horror-pull.db' @[ ! -f $(LOKAL) ] || cp $(LOKAL) $(LOKAL).bak scp $(SERVER):/tmp/horror-pull.db $(LOKAL) @ssh $(SERVER) 'rm -f /tmp/horror-pull.db' @echo "Fertig. Deine alte Datenbank liegt als $(LOKAL).bak daneben."