6.4 KiB
Deployment auf gemietetem Ubuntu-VPS
End-to-end Anleitung. Annahme: frischer Ubuntu 22.04/24.04 VPS, du hast root via SSH, Domain optional. Trading läuft gegen Kraken Demo (kein echtes Geld).
0. Was du brauchst
- SSH-Zugriff zum VPS als
rootoder Sudo-User - Git-Remote (GitHub/GitLab/self-hosted) für lokal↔Server-Sync
- API-Keys: Kraken Demo (https://demo-futures.kraken.com), Gemini, Anthropic, optional CryptoPanic
- Discord-Webhook-URL
- Tailscale-Account (kostenlos, https://tailscale.com)
1. Lokales Repo zu Git-Remote pushen
Auf deinem Laptop:
cd ~/code/aitrader
git init
git add .
git commit -m "initial: aitrader bot + discord notifier"
# auf GitHub: neues *privates* Repo "aitrader" anlegen, dann:
git remote add origin git@github.com:DEIN_USER/aitrader.git
git branch -M main
git push -u origin main
⚠️ Repo MUSS privat sein.
.envist via.gitignoreausgeschlossen, aber Keys gehören niemals ins Repo.
2. VPS vorbereiten
SSH zum VPS und als root:
# UFW: nur SSH öffentlich
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw enable
ufw status
3. Tailscale installieren
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up
tailscale up zeigt einen Login-Link → in Browser öffnen → mit Google/GitHub einloggen → Server taucht in deinem Tailnet auf. Schreib dir den Tailscale-Hostnamen auf (z.B. aitrader-vps), den nutzt du gleich fürs Dashboard.
tailscale ip -4 # zeigt 100.x.y.z — die private Tailnet-IP
tailscale status
Auch auf deinem Laptop und Phone Tailscale installieren und einloggen → alle drei Geräte sind im selben Mesh.
Test: Vom Laptop aus ping aitrader-vps (Magic-DNS aktiviert in Tailscale-Admin) oder ping 100.x.y.z.
4. Repo auf den VPS clonen
Als root oder Sudo-User auf dem VPS:
sudo mkdir -p /opt
cd /opt
sudo git clone https://github.com/DEIN_USER/aitrader.git aitrader
# oder mit SSH-Key:
# sudo git clone git@github.com:DEIN_USER/aitrader.git aitrader
sudo chown -R $USER:$USER /opt/aitrader
cd /opt/aitrader
Wenn du SSH-Keys für GitHub nutzen willst (für git pull ohne Passwort):
sudo -u aitrader bash -c 'ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519'
sudo cat /home/aitrader/.ssh/id_ed25519.pub
# diesen Pub-Key in GitHub → Settings → Deploy Keys (read-only) fürs Repo eintragen
(Der aitrader-User wird im nächsten Schritt vom Install-Script erstellt — Reihenfolge: erst install.sh, dann SSH-Key generieren.)
5. Install-Script ausführen
cd /opt/aitrader
sudo bash deploy/install.sh
Das macht:
- erstellt System-User
aitrader - installiert Python 3.12, uv
- legt venv unter
/opt/aitrader/.venvan, installiert dependencies - kopiert systemd-Units nach
/etc/systemd/system/
6. .env auf dem Server einrichten
sudo cp /opt/aitrader/.env.example /opt/aitrader/.env
sudo nano /opt/aitrader/.env
# Trage ein:
# KRAKEN_DEMO_KEY=...
# KRAKEN_DEMO_SECRET=...
# GEMINI_API_KEY=...
# ANTHROPIC_API_KEY=...
# DISCORD_WEBHOOK_URL=...
# CRYPTOPANIC_API_KEY= (optional)
sudo chown aitrader:aitrader /opt/aitrader/.env
sudo chmod 600 /opt/aitrader/.env
7. Smoke-Tests vor dem Start
sudo -u aitrader /opt/aitrader/.venv/bin/python /opt/aitrader/scripts/smoke_kraken.py
sudo -u aitrader /opt/aitrader/.venv/bin/python /opt/aitrader/scripts/smoke_ai.py
sudo -u aitrader /opt/aitrader/.venv/bin/python /opt/aitrader/scripts/smoke_discord.py
Jeder Test sollte ohne Fehler laufen + der Discord-Webhook sollte 2 Embeds posten.
8. Bot + Dashboard als Services starten
sudo systemctl enable --now aitrader.service
sudo systemctl enable --now aitrader-dashboard.service
sudo systemctl status aitrader aitrader-dashboard
Logs live anschauen:
sudo journalctl -u aitrader -f
sudo journalctl -u aitrader-dashboard -f
9. Dashboard via Tailscale erreichen
Auf deinem Laptop (Tailscale läuft):
http://aitrader-vps:8501
oder
http://100.x.y.z:8501
Port 8501 ist nicht öffentlich — UFW blockt ihn, Streamlit lauscht auf 0.0.0.0, aber der Tailscale-Tunnel ist der einzige Weg rein. Wenn du noch paranoider sein willst, in aitrader-dashboard.service --server.address auf die Tailscale-IP setzen.
10. Updates deployen (Workflow)
Lokal arbeiten, Änderung pushen, Server pullt + restartet:
# auf dem Laptop
cd ~/code/aitrader
# … Änderungen mit Claude Code …
git add . && git commit -m "fix: foo" && git push
# auf dem VPS
cd /opt/aitrader
sudo -u aitrader git pull
# bei Code-Änderungen reicht restart; bei neuen Dependencies erst:
# sudo -u aitrader /home/aitrader/.local/bin/uv pip install -e .
sudo systemctl restart aitrader aitrader-dashboard
sudo journalctl -u aitrader -f
Tipp: Falls du häufig deployst, leg dir lokal eine Funktion an:
# in ~/.bashrc
deploy-aitrader() {
ssh DEIN_VPS 'cd /opt/aitrader && sudo -u aitrader git pull && sudo systemctl restart aitrader aitrader-dashboard && sudo journalctl -u aitrader -n 30'
}
11. Backup
Die SQLite-DB unter /opt/aitrader/data/aitrader.db enthält alle Trades + Decisions. Backup z.B. via cron:
sudo crontab -e
# Tägliches Backup nach /root/backups
0 3 * * * cp /opt/aitrader/data/aitrader.db /root/backups/aitrader-$(date +\%F).db
Troubleshooting
| Problem | Check |
|---|---|
aitrader.service: status=1 |
journalctl -u aitrader -n 100 — meist fehlende ENV-Vars |
| Kraken-Symbol nicht gefunden | Kraken Futures nutzt PI_XBTUSD-Symbole. python -c "import ccxt; x=ccxt.krakenfutures(); x.set_sandbox_mode(True); x.load_markets(); print(list(x.symbols)[:30])" und pairs: in config.yaml anpassen |
| Dashboard nicht erreichbar | sudo ss -tlnp | grep 8501 (lauscht?), tailscale ping aitrader-vps (Mesh ok?) |
| Webhook tot | Discord rate-limit (429)? journalctl -u aitrader | grep discord |
| Bot pausiert | journalctl | grep daily_loss_limit_hit — Risk-Limit greift |
Sicherheits-Checkliste
- Repo ist privat auf GitHub
.envhatchmod 600und gehörtaitrader:aitrader- UFW: nur Port 22 öffentlich offen
- Tailscale
up, Server im Tailnet - SSH: Password-Auth aus, nur Key-Auth (
PasswordAuthentication noin/etc/ssh/sshd_config) exchange.sandbox: trueinconfig.yaml— niemals versehentlich auffalse- Discord-Webhook regelmäßig rotieren falls geleakt