Karte (map.js):
- OSM Overpass API: Restaurants, Tierärzte, Parkplätze, Bänke, Wasserstellen
- Leaflet.markercluster für alle OSM-Layer
- Standort-Dot mit GPS-Genauigkeitskreis, Wake-Lock bei Aufzeichnung
- Community-Pins setzen/löschen, Meldungen, Crosshair-Placement
- Layer-Sichtbarkeit in localStorage (by_map_visible_v1)
Routen (routes.js + routen.py):
- Komoot-Stil: SVG-Track-Preview, Foto-Upload, Nearby-POIs im Detail-Modal
- Neue Felder: is_public, hunde_tauglichkeit, foto_urls
- Rate-Endpoint (POST /api/routes/{id}/rate)
- Foto-Upload (POST /api/routes/{id}/photo)
- Fix: json_extract $[-1] → $[#-1] (SQLite-kompatibler Pfad für letztes Element)
Backend (osm.py, database.py, scheduler.py):
- /api/osm/pois: OSM-Overpass-Cache mit Tile-Logik (14 Tage TTL)
- /api/osm/user-poi: Community-Marker CRUD
- /api/osm/report: Marker als ungültig melden
- Neue Tabellen: osm_pois, osm_tiles, user_map_pois, osm_reports
- Giftköder-Archiv-Job (täglich 03:00, soft-delete nach Ablauf)
- Giftköder-Archiv-Job als APScheduler-CronJob
UI: Orte-Menüpunkt entfernt (in Karte integriert), APP_VER auf 62
203 lines
7.5 KiB
Makefile
203 lines
7.5 KiB
Makefile
# ==============================================================
|
|
# BAN YARO — Makefile
|
|
# Deploy-Strategie: rsync vom Mac zur DS (kein git auf DS nötig)
|
|
# Git wird nur lokal auf dem Mac und für Forgejo-Backup genutzt.
|
|
# ==============================================================
|
|
|
|
DS_HOST := ds
|
|
DS_IP := 10.47.11.10
|
|
# Hinweis: NPM braucht 10.47.11.99 als Forward-IP (Macvlan-Shim), nicht .10
|
|
DS_SSH_PORT := 22
|
|
DS_PATH := /volume1/docker/banyaro
|
|
CONTAINER := banyaro # container_name (für docker logs/exec)
|
|
SERVICE := banyaro # service-name in docker-compose.yml (für docker compose restart)
|
|
GIT_REMOTE := origin
|
|
DOCKER := sudo /usr/local/bin/docker
|
|
|
|
# tar: was NICHT auf die DS übertragen wird
|
|
TAR_EXCLUDE := --exclude='.git' \
|
|
--exclude='./data' \
|
|
--exclude='./backend/venv' \
|
|
--exclude='./backend/__pycache__' \
|
|
--exclude='./.env' \
|
|
--exclude='./*.db' \
|
|
--exclude='./.DS_Store'
|
|
|
|
.PHONY: help deploy deploy-clean sync push restart build stop status \
|
|
logs logs-f shell db dev clean-cache check-ssh
|
|
|
|
# ----------------------------------------------------------
|
|
# SSH-Prüfung — Abhängigkeit aller DS-Befehle
|
|
# ----------------------------------------------------------
|
|
check-ssh:
|
|
@if ! nc -z -w3 $(DS_IP) $(DS_SSH_PORT) 2>/dev/null; then \
|
|
echo ""; \
|
|
echo " ✗ DS nicht erreichbar ($(DS_IP):$(DS_SSH_PORT))"; \
|
|
echo ""; \
|
|
echo " SSH-Port $(DS_SSH_PORT) ist geschlossen oder DS offline."; \
|
|
echo " → Port in Fritz!Box / DS-Firewall öffnen, dann erneut versuchen."; \
|
|
echo ""; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# ----------------------------------------------------------
|
|
# Hilfe
|
|
# ----------------------------------------------------------
|
|
help:
|
|
@echo ""
|
|
@echo " Ban Yaro — verfügbare Befehle:"
|
|
@echo ""
|
|
@echo " make deploy Sync + Rebuild + Neustart (mit Layer-Cache, häufigster Befehl)"
|
|
@echo " make deploy-clean Wie deploy, aber --no-cache (bei requirements-Änderungen)"
|
|
@echo " make sync Nur Dateien zur DS übertragen (ohne Rebuild)"
|
|
@echo " make push Nur Git push zu Forgejo (Backup/Versionierung)"
|
|
@echo " make restart Container neustarten (kein Rebuild)"
|
|
@echo " make build Docker neu bauen (ohne Neustart)"
|
|
@echo " make stop Container stoppen"
|
|
@echo " make status Container-Status anzeigen"
|
|
@echo ""
|
|
@echo " make logs Letzte 100 Zeilen"
|
|
@echo " make logs-f Live-Log-Stream"
|
|
@echo " make shell Bash im Container"
|
|
@echo " make db SQLite-Shell"
|
|
@echo ""
|
|
@echo " make dev Lokaler Dev-Server auf Mac (Port 8001)"
|
|
@echo " make clean-cache SW-Cache-Version erhöhen + restart"
|
|
@echo ""
|
|
|
|
# ----------------------------------------------------------
|
|
# DEPLOY — der Haupt-Befehl
|
|
# 1. Git push (Backup)
|
|
# 2. rsync zum DS
|
|
# 3. Docker rebuild + restart
|
|
# ----------------------------------------------------------
|
|
deploy: check-ssh
|
|
@echo "→ Git push (Backup)..."
|
|
@git push $(GIT_REMOTE) main
|
|
@echo "→ Sync zu DS..."
|
|
@COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(DS_PATH)/"
|
|
@echo "→ Docker rebuild + restart (mit Layer-Cache)..."
|
|
@ssh $(DS_HOST) " \
|
|
cd $(DS_PATH) && \
|
|
$(DOCKER) compose down && \
|
|
$(DOCKER) compose build && \
|
|
$(DOCKER) compose up -d"
|
|
@echo ""
|
|
@echo " ✓ Deploy fertig. Letzte Logs:"
|
|
@ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER) --tail=15"
|
|
|
|
# ----------------------------------------------------------
|
|
# DEPLOY-CLEAN — erzwingt Neuaufbau ohne Layer-Cache
|
|
# Nötig wenn: requirements.txt geändert, System-Pakete aktualisiert,
|
|
# oder nach einem kaputten Image-State
|
|
# ----------------------------------------------------------
|
|
deploy-clean: check-ssh
|
|
@echo "→ Git push (Backup)..."
|
|
@git push $(GIT_REMOTE) main
|
|
@echo "→ Sync zu DS..."
|
|
@COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(DS_PATH)/"
|
|
@echo "→ Docker rebuild (--no-cache) + restart..."
|
|
@ssh $(DS_HOST) " \
|
|
cd $(DS_PATH) && \
|
|
$(DOCKER) compose down && \
|
|
$(DOCKER) compose build --no-cache && \
|
|
$(DOCKER) compose up -d"
|
|
@echo ""
|
|
@echo " ✓ Deploy fertig. Letzte Logs:"
|
|
@ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER) --tail=15"
|
|
|
|
# ----------------------------------------------------------
|
|
# SYNC — nur Dateien zur DS übertragen, kein Docker-Rebuild
|
|
# ACHTUNG: ALLE Dateien (CSS/JS/HTML/Python) sind ins Image gebacken!
|
|
# sync+restart reicht für NICHTS — immer: make deploy
|
|
# ----------------------------------------------------------
|
|
sync: check-ssh
|
|
@echo "→ Sync zu DS..."
|
|
@COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(DS_PATH)/"
|
|
@echo " ✓ Sync fertig."
|
|
|
|
# ----------------------------------------------------------
|
|
# PUSH — nur Git, ohne DS-Deploy
|
|
# ----------------------------------------------------------
|
|
push:
|
|
git push $(GIT_REMOTE) main
|
|
|
|
# ----------------------------------------------------------
|
|
# RESTART — kein Rebuild, nur Container neu starten
|
|
# Reicht nur für Umgebungsvariablen-Änderungen (.env)
|
|
# ----------------------------------------------------------
|
|
restart: check-ssh
|
|
@ssh $(DS_HOST) " \
|
|
cd $(DS_PATH) && \
|
|
$(DOCKER) compose restart $(SERVICE)"
|
|
@echo " ✓ Neugestartet."
|
|
|
|
# ----------------------------------------------------------
|
|
# BUILD — nur Docker-Image neu bauen (mit Layer-Cache)
|
|
# ----------------------------------------------------------
|
|
build: check-ssh
|
|
@ssh $(DS_HOST) " \
|
|
cd $(DS_PATH) && \
|
|
$(DOCKER) compose build"
|
|
|
|
# ----------------------------------------------------------
|
|
# STOP
|
|
# ----------------------------------------------------------
|
|
stop: check-ssh
|
|
@ssh $(DS_HOST) "cd $(DS_PATH) && $(DOCKER) compose down"
|
|
@echo " ✓ Gestoppt."
|
|
|
|
# ----------------------------------------------------------
|
|
# STATUS
|
|
# ----------------------------------------------------------
|
|
status: check-ssh
|
|
@ssh $(DS_HOST) "$(DOCKER) ps \
|
|
--filter name=$(CONTAINER) \
|
|
--format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'"
|
|
|
|
# ----------------------------------------------------------
|
|
# LOGS
|
|
# ----------------------------------------------------------
|
|
logs: check-ssh
|
|
@ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER) --tail=100"
|
|
|
|
logs-f: check-ssh
|
|
@ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER) -f"
|
|
|
|
# ----------------------------------------------------------
|
|
# SHELL im Container
|
|
# ----------------------------------------------------------
|
|
shell: check-ssh
|
|
@ssh -t $(DS_HOST) "$(DOCKER) exec -it $(CONTAINER) bash"
|
|
|
|
# ----------------------------------------------------------
|
|
# SQLite
|
|
# ----------------------------------------------------------
|
|
db: check-ssh
|
|
@ssh -t $(DS_HOST) "$(DOCKER) exec -it $(CONTAINER) \
|
|
sqlite3 /data/banyaro.db"
|
|
|
|
# ----------------------------------------------------------
|
|
# DEV — lokaler Server auf Mac (kein Docker, kein DS)
|
|
# ----------------------------------------------------------
|
|
dev:
|
|
@cd backend && \
|
|
test -d venv || python3 -m venv venv && \
|
|
. venv/bin/activate && \
|
|
pip install -q -r requirements.txt && \
|
|
KI_MODE=off ENV=development \
|
|
JWT_SECRET=dev-secret \
|
|
DB_PATH=./dev.db \
|
|
uvicorn main:app --reload --port 8001
|
|
|
|
# ----------------------------------------------------------
|
|
# CACHE leeren — SW-Version erhöhen, dann restart
|
|
# Nach größeren CSS/JS-Änderungen wenn SW gecacht hat
|
|
# ----------------------------------------------------------
|
|
clean-cache: check-ssh
|
|
@NEW_VER="by-v$$(date +%s)"; \
|
|
ssh $(DS_HOST) " \
|
|
sed -i \"s/by-v[0-9]*/$$NEW_VER/g\" \
|
|
$(DS_PATH)/backend/static/sw.js"
|
|
@$(MAKE) restart
|
|
@echo " ✓ Cache-Version erhöht."
|