- CLAUDE.md: Comprehensive documentation for core infrastructure - docs-src: Cleaned 316MB junk, kept only markdown docs - mkdocs.yml: Updated nav for core-only content - nginx: Docs proxy targets split (3002->lehrer, 3007->compliance) - docker-compose: Fixed docs port mapping (8009:80), added INSTALL_LOCK - .claude/rules: testing, documentation, open-source-policy, night-scheduler Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
298 lines
7.6 KiB
Markdown
298 lines
7.6 KiB
Markdown
# Night Scheduler - Entwicklerdokumentation
|
|
|
|
**Status:** Produktiv
|
|
**Letzte Aktualisierung:** 2026-02-09
|
|
**URL:** https://macmini:3002/infrastructure/night-mode
|
|
**API:** http://macmini:8096
|
|
|
|
---
|
|
|
|
## Uebersicht
|
|
|
|
Der Night Scheduler ermoeglicht die automatische Nachtabschaltung der Docker-Services:
|
|
- Zeitgesteuerte Abschaltung (Standard: 22:00)
|
|
- Zeitgesteuerter Start (Standard: 06:00)
|
|
- Manuelle Sofortaktionen (Start/Stop)
|
|
- Dashboard-UI zur Konfiguration
|
|
|
|
---
|
|
|
|
## Architektur
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Admin Dashboard (Port 3002) │
|
|
│ /infrastructure/night-mode │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ API Proxy: /api/admin/night-mode │
|
|
│ - GET: Status abrufen │
|
|
│ - POST: Konfiguration speichern │
|
|
│ - POST /execute: Sofortaktion (start/stop) │
|
|
│ - GET /services: Service-Liste │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ night-scheduler (Port 8096) │
|
|
│ - Python/FastAPI Container │
|
|
│ - Prueft jede Minute ob Aktion faellig │
|
|
│ - Fuehrt docker compose start/stop aus │
|
|
│ - Speichert Config in /config/night-mode.json │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Dateien
|
|
|
|
| Pfad | Beschreibung |
|
|
|------|--------------|
|
|
| `night-scheduler/scheduler.py` | Python Scheduler mit FastAPI |
|
|
| `night-scheduler/Dockerfile` | Container mit Docker CLI |
|
|
| `night-scheduler/requirements.txt` | Dependencies |
|
|
| `night-scheduler/config/night-mode.json` | Konfigurationsdatei |
|
|
| `night-scheduler/tests/test_scheduler.py` | Unit Tests |
|
|
| `admin-v2/app/api/admin/night-mode/route.ts` | API Proxy |
|
|
| `admin-v2/app/api/admin/night-mode/execute/route.ts` | Execute Endpoint |
|
|
| `admin-v2/app/api/admin/night-mode/services/route.ts` | Services Endpoint |
|
|
| `admin-v2/app/(admin)/infrastructure/night-mode/page.tsx` | UI Seite |
|
|
|
|
---
|
|
|
|
## API Endpoints
|
|
|
|
### GET /api/night-mode
|
|
Status und Konfiguration abrufen.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"config": {
|
|
"enabled": true,
|
|
"shutdown_time": "22:00",
|
|
"startup_time": "06:00",
|
|
"last_action": "startup",
|
|
"last_action_time": "2026-02-09T06:00:00",
|
|
"excluded_services": ["night-scheduler", "nginx"]
|
|
},
|
|
"current_time": "14:30:00",
|
|
"next_action": "shutdown",
|
|
"next_action_time": "22:00",
|
|
"time_until_next_action": "7h 30min",
|
|
"services_status": {
|
|
"backend": "running",
|
|
"postgres": "running"
|
|
}
|
|
}
|
|
```
|
|
|
|
### POST /api/night-mode
|
|
Konfiguration aktualisieren.
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"enabled": true,
|
|
"shutdown_time": "23:00",
|
|
"startup_time": "07:00",
|
|
"excluded_services": ["night-scheduler", "nginx", "vault"]
|
|
}
|
|
```
|
|
|
|
### POST /api/night-mode/execute
|
|
Sofortige Aktion ausfuehren.
|
|
|
|
**Request:**
|
|
```json
|
|
{
|
|
"action": "stop" // oder "start"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Aktion 'stop' erfolgreich ausgefuehrt fuer 25 Services"
|
|
}
|
|
```
|
|
|
|
### GET /api/night-mode/services
|
|
Liste aller Services abrufen.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"all_services": ["backend", "postgres", "valkey", ...],
|
|
"excluded_services": ["night-scheduler", "nginx"],
|
|
"status": {
|
|
"backend": "running",
|
|
"postgres": "running"
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Konfiguration
|
|
|
|
### Config-Format (night-mode.json)
|
|
|
|
```json
|
|
{
|
|
"enabled": true,
|
|
"shutdown_time": "22:00",
|
|
"startup_time": "06:00",
|
|
"last_action": "startup",
|
|
"last_action_time": "2026-02-09T06:00:00",
|
|
"excluded_services": ["night-scheduler", "nginx"]
|
|
}
|
|
```
|
|
|
|
### Umgebungsvariablen
|
|
|
|
| Variable | Default | Beschreibung |
|
|
|----------|---------|--------------|
|
|
| `COMPOSE_PROJECT_NAME` | `breakpilot-pwa` | Docker Compose Projektname |
|
|
|
|
---
|
|
|
|
## Ausgeschlossene Services
|
|
|
|
Diese Services werden NICHT gestoppt:
|
|
|
|
1. **night-scheduler** - Muss laufen, um Services zu starten
|
|
2. **nginx** - Optional, fuer HTTPS-Zugriff
|
|
|
|
Weitere Services koennen ueber die Konfiguration ausgeschlossen werden.
|
|
|
|
---
|
|
|
|
## Docker Compose Integration
|
|
|
|
```yaml
|
|
night-scheduler:
|
|
build: ./night-scheduler
|
|
container_name: breakpilot-pwa-night-scheduler
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
- ./night-scheduler/config:/config
|
|
- ./docker-compose.yml:/app/docker-compose.yml:ro
|
|
environment:
|
|
- COMPOSE_PROJECT_NAME=breakpilot-pwa
|
|
ports:
|
|
- "8096:8096"
|
|
networks:
|
|
- breakpilot-pwa-network
|
|
restart: unless-stopped
|
|
```
|
|
|
|
---
|
|
|
|
## Tests ausfuehren
|
|
|
|
```bash
|
|
# Im Container
|
|
docker exec -it breakpilot-pwa-night-scheduler pytest -v
|
|
|
|
# Lokal (mit Dependencies)
|
|
cd night-scheduler
|
|
pip install -r requirements.txt
|
|
pytest -v tests/
|
|
```
|
|
|
|
---
|
|
|
|
## Deployment
|
|
|
|
```bash
|
|
# 1. Dateien synchronisieren
|
|
rsync -avz night-scheduler/ macmini:.../night-scheduler/
|
|
|
|
# 2. Container bauen
|
|
ssh macmini "docker compose -f .../docker-compose.yml build --no-cache night-scheduler"
|
|
|
|
# 3. Container starten
|
|
ssh macmini "docker compose -f .../docker-compose.yml up -d night-scheduler"
|
|
|
|
# 4. Testen
|
|
curl http://macmini:8096/health
|
|
curl http://macmini:8096/api/night-mode
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Problem: Services werden nicht gestoppt/gestartet
|
|
|
|
1. Pruefen ob Docker Socket gemountet ist:
|
|
```bash
|
|
docker exec breakpilot-pwa-night-scheduler ls -la /var/run/docker.sock
|
|
```
|
|
|
|
2. Pruefen ob docker compose CLI verfuegbar ist:
|
|
```bash
|
|
docker exec breakpilot-pwa-night-scheduler docker compose version
|
|
```
|
|
|
|
3. Logs pruefen:
|
|
```bash
|
|
docker logs breakpilot-pwa-night-scheduler
|
|
```
|
|
|
|
### Problem: Konfiguration wird nicht gespeichert
|
|
|
|
1. Pruefen ob /config beschreibbar ist:
|
|
```bash
|
|
docker exec breakpilot-pwa-night-scheduler touch /config/test
|
|
```
|
|
|
|
2. Volume-Mount pruefen in docker-compose.yml
|
|
|
|
### Problem: API nicht erreichbar
|
|
|
|
1. Container-Status pruefen:
|
|
```bash
|
|
docker ps | grep night-scheduler
|
|
```
|
|
|
|
2. Health-Check pruefen:
|
|
```bash
|
|
curl http://localhost:8096/health
|
|
```
|
|
|
|
---
|
|
|
|
## Sicherheitshinweise
|
|
|
|
- Der Container benoetigt Zugriff auf den Docker Socket
|
|
- Nur interne Services koennen gestoppt/gestartet werden
|
|
- Keine Authentifizierung (internes Netzwerk)
|
|
- Keine sensitiven Daten in der Konfiguration
|
|
|
|
---
|
|
|
|
## Dependencies (SBOM)
|
|
|
|
| Package | Version | Lizenz |
|
|
|---------|---------|--------|
|
|
| FastAPI | 0.109.0 | MIT |
|
|
| Uvicorn | 0.27.0 | BSD-3-Clause |
|
|
| Pydantic | 2.5.3 | MIT |
|
|
| pytest | 8.0.0 | MIT |
|
|
| pytest-asyncio | 0.23.0 | Apache-2.0 |
|
|
| httpx | 0.26.0 | BSD-3-Clause |
|
|
|
|
---
|
|
|
|
## Aenderungshistorie
|
|
|
|
| Datum | Aenderung |
|
|
|-------|-----------|
|
|
| 2026-02-09 | Initiale Implementierung |
|
|
|