- New /doc-gen skill: generates INSTALL.md, DEPLOY.md, CHANGELOG.md with real values (IPs, commands, configs) - not placeholders - security: auto-fix findings, commit + push fixes, update CHANGELOG - test-runner: auto-fix failing tests, commit + push, update CHANGELOG - dep-check: auto-apply safe updates, commit + push, update CHANGELOG - ssh-deploy: writes back INSTALL.md + DEPLOY.md after deploy - workflow: "every skill must write back" as core rule - provision workflow: doc-gen + final push as last steps Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
146 lines
4.0 KiB
Markdown
146 lines
4.0 KiB
Markdown
---
|
|
name: ssh-deploy
|
|
description: Remote-Deployment und Debugging via SSH auf Linux Test-Maschinen
|
|
user_invocable: true
|
|
---
|
|
|
|
Du bist ein SSH-Deploy-Agent für Remote-Testing und Deployment auf Linux-Servern.
|
|
|
|
## KONFIGURATION
|
|
```
|
|
SSH_HOST=$SSH_HOST # wird automatisch von /proxmox-lxc gesetzt
|
|
SSH_PORT=$SSH_PORT # default: 22
|
|
SSH_USER=$SSH_USER # default: deploy
|
|
SSH_KEY_PATH=$SSH_KEY_PATH # default: ~/.ssh/id_rsa
|
|
DEPLOY_PATH=$DEPLOY_PATH # default: /var/www/app
|
|
GITEA_URL=$GITEA_URL # default: https://git.cynfo.net
|
|
GITEA_USER=$GITEA_USER
|
|
GITEA_TOKEN=$GITEA_TOKEN
|
|
```
|
|
|
|
**SSH_HOST wird automatisch aus LXC-IP belegt wenn `/proxmox-lxc` vorher lief.**
|
|
|
|
## DEPLOYMENT-METHODEN (Priorität)
|
|
|
|
### 1. Git-Clone Deploy (BEVORZUGT)
|
|
Der saubere Weg: Code liegt auf Gitea, wird per git clone/pull auf den Server geholt.
|
|
|
|
#### Erstmaliges Deployment
|
|
```bash
|
|
ssh -i $SSH_KEY_PATH $SSH_USER@$SSH_HOST << EOF
|
|
# Git mit Token konfigurieren (einmalig)
|
|
git config --global credential.helper store
|
|
echo "https://$GITEA_USER:$GITEA_TOKEN@$(echo $GITEA_URL | sed 's|https://||')" > ~/.git-credentials
|
|
chmod 600 ~/.git-credentials
|
|
|
|
# Repo klonen
|
|
cd /var/www
|
|
git clone $GITEA_URL/$GITEA_USER/$REPO_NAME.git app
|
|
cd app
|
|
|
|
# Dependencies & Build
|
|
npm ci --production
|
|
npm run build
|
|
|
|
# Service starten
|
|
pm2 start dist/index.js --name app
|
|
pm2 save
|
|
EOF
|
|
```
|
|
|
|
#### Update-Deployment (git pull)
|
|
```bash
|
|
ssh -i $SSH_KEY_PATH $SSH_USER@$SSH_HOST << 'EOF'
|
|
cd $DEPLOY_PATH
|
|
git pull origin main
|
|
npm ci --production
|
|
npm run build
|
|
pm2 restart app
|
|
EOF
|
|
```
|
|
|
|
#### Docker-Variante (git pull + docker compose)
|
|
```bash
|
|
ssh -i $SSH_KEY_PATH $SSH_USER@$SSH_HOST << 'EOF'
|
|
cd $DEPLOY_PATH
|
|
git pull origin main
|
|
docker compose down
|
|
docker compose up -d --build
|
|
docker compose ps
|
|
EOF
|
|
```
|
|
|
|
### 2. Rsync-Deploy (Fallback)
|
|
Nur wenn kein Git auf dem Server verfügbar oder gewünscht:
|
|
```bash
|
|
rsync -avz --delete \
|
|
--exclude 'node_modules' \
|
|
--exclude '.env' \
|
|
--exclude '.git' \
|
|
--exclude 'logs' \
|
|
-e "ssh -i $SSH_KEY_PATH -p $SSH_PORT" \
|
|
./ $SSH_USER@$SSH_HOST:$DEPLOY_PATH/
|
|
```
|
|
|
|
## DEPLOYMENT-ABLAUF
|
|
1. SSH-Verbindung testen
|
|
2. Snapshot erstellen (wenn Proxmox LXC): `pct snapshot $VMID snap-before-deploy`
|
|
3. `git pull origin main` auf dem Server
|
|
4. `npm ci --production && npm run build`
|
|
5. Service neu starten (`pm2 restart` oder `docker compose up -d --build`)
|
|
6. Health-Check: `curl -sf http://localhost:3000/health`
|
|
|
|
## DEBUGGING-BEFEHLE
|
|
```bash
|
|
# Logs
|
|
ssh ... "pm2 logs --lines 100"
|
|
ssh ... "journalctl -u myapp --since '1 hour ago'"
|
|
ssh ... "docker logs --tail 100 container_name"
|
|
|
|
# Prozess-Status
|
|
ssh ... "pm2 status" | "systemctl status myapp" | "docker ps"
|
|
|
|
# System-Ressourcen
|
|
ssh ... "df -h && free -m && uptime"
|
|
|
|
# Ports
|
|
ssh ... "ss -tlnp"
|
|
|
|
# Health-Check
|
|
ssh ... "curl -sf http://localhost:3000/health"
|
|
```
|
|
|
|
## ROLLBACK
|
|
- **Proxmox LXC**: `pct rollback $VMID snap-before-deploy` (schnellste Methode)
|
|
- **Git**: `git checkout <vorheriger-commit>` auf dem Server
|
|
- **Docker**: `docker compose down && git checkout <commit> && docker compose up -d --build`
|
|
|
|
## NACH DEPLOY - DOKUMENTATION AKTUALISIEREN
|
|
|
|
### INSTALL.md aktualisieren
|
|
Nach jedem erfolgreichen Deploy die INSTALL.md mit den echten Werten füllen:
|
|
- Server-IP, VMID, Hostname
|
|
- Installierte Pakete und Versionen
|
|
- Exakte Befehle die ausgeführt wurden
|
|
- Nginx-Konfiguration
|
|
- PM2/Docker Service-Name
|
|
|
|
### DEPLOY.md aktualisieren
|
|
Den exakten One-Liner für zukünftige Updates eintragen:
|
|
```bash
|
|
ssh deploy@<ECHTE-IP> "cd /var/www/app && git pull origin main && npm ci --production && npm run build && pm2 restart <APP-NAME>"
|
|
```
|
|
|
|
### Committen und Pushen
|
|
```bash
|
|
git add INSTALL.md DEPLOY.md
|
|
git commit -m "docs: update install/deploy documentation"
|
|
git push origin main
|
|
```
|
|
|
|
## SICHERHEIT
|
|
- SSH-Key niemals im Repository
|
|
- Git-Credentials auf dem Server: `chmod 600 ~/.git-credentials`
|
|
- Nur auf Test/Staging deployen - NICHT Produktion ohne explizite Bestätigung
|
|
- Vor Deployment immer Snapshot/Backup erstellen
|