# TacForce Pro — Betriebs- & KI-Onboarding

> Diese Datei wird von Claude Code / KI-Agenten beim Betreten des Ordners automatisch gelesen.
> Sie erklärt in Kürze **was das ist**, **wie es läuft** und **was du NICHT kaputt machen darfst**.
> Menschliche Doku: [README.md](README.md) · [ARCHITECTURE.md](ARCHITECTURE.md) · [PLAN.md](PLAN.md).

## Was ist das?

**TacForce Pro** — Discord-Bot-SaaS (Tickets & Bewerbungen). Zwei Teile, die sich **eine Datenbank** teilen:

| Ordner | Was | Läuft als |
|--------|-----|-----------|
| `laravel-app/` | Website + Discord-Login + Dashboard + Admin-Panel (PHP/Laravel 11) | Apache/XAMPP, Docroot = `laravel-app/public` |
| `bot-worker/` | Discord-Bot (Node.js + discord.js), multi-bot-fähig | vom **Supervisor** gestartet |
| `bots/kotsch-tech/` | **KOTSCH Assistant** — Python-Bot des kotsch.tech-Discord (extern verwaltet, Bot #2 in DB) | vom **Supervisor** gestartet |
| `supervisor/` | Prozess-Wächter: Autostart, Auto-Neustart, E-Mail-Alarm, DB-Heartbeat → [SUPERVISOR.md](SUPERVISOR.md) | Aufgabenplanung (SYSTEM, bei Boot) |
| `design-mockups/` | 10 Design-Richtungen (gewählt: 04 Minimal Slate) | statisches HTML |

Dashboard **schreibt** Config in die DB, der Bot **liest** sie. Ergebnisse (Tickets, Bewerbungen, Logs) schreibt der Bot zurück, das Dashboard zeigt sie an.

## Live-Status (Stand: Deployment)

- **Website läuft:** https://tacforce.pro (Cloudflare-Tunnel) · Origin lokal http://127.0.0.1:98 — Apache-vHost `ServerName tacforce.pro`.
- **Datenbank:** SQLite — eine Datei: `laravel-app/database/database.sqlite`.
- **Bots:** Bot #2 „KOTSCH Assistant" (`bots/kotsch-tech/`, Python, `managed=external`) läuft LIVE über den Supervisor. Bot #1 „TacForce Operator" inaktiv (kein Token). Der Node-Worker läuft mit (idlet) und startet künftige `managed=worker`-Bots.
- **Supervisor:** hält alles am Laufen (Boot-Autostart, Auto-Neustart, Mail-Alarm an ALERT_MAIL_TO) → [SUPERVISOR.md](SUPERVISOR.md). **Bot-Prozesse nie manuell doppelt starten!**
- **Admin-Login:** https://tacforce.pro/admin/login (E-Mail+Passwort+2FA-Mail; getrennt vom Discord-Login).
- **APP_KEY** ist in `laravel-app/.env` **und** `bot-worker/.env` identisch (Pflicht für Token-Entschlüsselung).

## ⚠️ KRITISCH — dieser Server hostet MEHRERE Live-Sites

Dieser XAMPP-Apache bedient noch andere produktive Websites (Ports 80, 81, 8081–8084 …).
**Ein Apache-Konfigurationsfehler legt ALLE Sites lahm.** Regeln:

1. **`Listen <port>` nur mit Vorsicht ändern.** Windows-`mpm_winnt` reagiert empfindlich auf zusätzliche Listen-Sockets — zusammen mit einem *graceful* Reload gab es schon `AH00404: Child: Unable to read socket data from parent` → Apache-Totalabsturz. TacForce läuft auf **Port 98** (eigenes `Listen 98`). Listen-Ports **immer** mit vollem `net stop/start` (nie graceful) und vorheriger `-t`-Prüfung ändern.
2. **NIE `httpd -k restart` (graceful)** auf dieser Box — der neue Generationswechsel kann Sockets nicht rebinden. Immer **voller** Neustart:
   ```
   net stop Apache2.4 && net start Apache2.4
   ```
3. **Vor jedem Apache-Neustart Config prüfen:** `C:\xampp\apache\bin\httpd.exe -t`  → muss „Syntax OK" sagen.
4. TacForce-vHost steht in `C:\xampp\apache\conf\extra\httpd-vhosts.conf` (Block „TacForce Pro").

## Häufige Aufgaben

**Website nach Code-Änderung neu laden:** nichts nötig — PHP wird pro Request ausgeführt. Nur nach `.env`-Änderungen:
```
cd laravel-app
php artisan config:clear      # oder config:cache im Produktivbetrieb
```

**DB ansehen / ändern (SQLite):**
```
cd laravel-app
php artisan tinker --execute="echo DB::table('tickets')->count();"
php artisan migrate:status
```

**Bot starten (erst wenn ein Token hinterlegt ist):** `START-BOT.bat` (Doppelklick) oder:
```
cd bot-worker && npm start
```

**Einen Bot einbinden:** exakte Schritt-für-Schritt-Anleitung → [BOT-EINBINDEN.md](BOT-EINBINDEN.md).

**Apache/Website prüfen:**
```
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:98/     # erwartet 200
C:\xampp\apache\bin\httpd.exe -t                                 # Config-Syntax
```

## Wichtige Dateien

| Datei | Zweck |
|-------|-------|
| `laravel-app/.env` | App-Config: APP_KEY, DB, Discord-OAuth, Admin-IDs |
| `laravel-app/routes/web.php` | alle Web-Routen |
| `laravel-app/app/Http/Controllers/` | Controller (Pages, Auth, Dashboard, Admin) |
| `laravel-app/resources/views/` | Blade-Templates (Design 04 Minimal Slate) |
| `laravel-app/database/migrations/` | Schema |
| `bot-worker/.env` | Bot-Config: **gleicher** APP_KEY, DB, Poll-Intervall |
| `bot-worker/src/manager.js` | Multi-Bot-Loader (liest `bots`-Tabelle) |
| `bot-worker/src/modules/` | Ticket-, Bewerbungs-, Welcome-, Log-Logik |
| `C:\xampp\apache\conf\extra\httpd-vhosts.conf` | Apache-vHost (Port 98) |

## Sicherheit & Policy (nicht verhandelbar)

- **Keine Secrets in den Code / ins Frontend.** Tokens nur in `.env` bzw. verschlüsselt in der DB.
- **APP_KEY in beiden `.env` identisch** halten — sonst kann der Bot DB-Tokens nicht entschlüsseln.
- **Keine policy-verletzenden Bot-Funktionen** (keine Fake-Member/Boosts, kein Spam/Mass-DM, keine Selfbots, kein Scraping). Siehe [PLAN.md](PLAN.md) §12.
- **Andere Sites nicht anfassen** (siehe KRITISCH oben).

## Fernzugriff

Du bist vermutlich per SSH hier. Details, Schlüssel-Verwaltung und Zugriff entziehen: [FERNZUGRIFF.md](FERNZUGRIFF.md).
Einrichten/prüfen: `REMOTE-ACCESS.bat` (Doppelklick, mit Adminrechten).
