Sicherheit & Best Practices

Secrets Management

# NIEMALS Secrets in Git committen!

.env Dateien immer in .gitignore

Secrets-Locations:

/home/revolt/.env # Stoat-Konfiguration /home/revolt/dreylo-profile-api/.env # Profile API (aber compose.yml hat Vorrang) /home/revolt/dreylo-bot/.env # Bot-Token

ENV-Variablen im compose.yml sind im Klartext - nur für lokalen Server OK

Zugriffsschutz

# SSH-Keys verwenden, Passwort-Login deaktivieren

/etc/ssh/sshd_config:

PasswordAuthentication no PubkeyAuthentication yes

Firewall (UFW)

ufw status ufw allow 22/tcp # SSH ufw allow 80/tcp # HTTP ufw allow 443/tcp # HTTPS ufw deny 27017/tcp # MongoDB NICHT von außen! ufw deny 6379/tcp # Redis NICHT von außen!

Docker-Sicherheit

# Container nicht als root laufen lassen (wenn möglich)

Im Dockerfile:

USER node

Ports nicht unnötig nach außen exposen

Im compose.yml: nur Caddy braucht 80/443

Alle anderen Services: KEIN ports: mapping!

MongoDB absichern

# Auth prüfen
docker exec stoat-database-1 mongosh --eval "db.adminCommand({listDatabases:1})"

Sollte auth verlangen (je nach Konfiguration)

Falls nicht: Auth aktivieren!

Regelmäßige Backups

#!/bin/bash

backup.sh - täglich via cron ausführen

DATE=$(date +%Y%m%d_%H%M)
BACKUP_DIR="/home/backup"
mkdir -p $BACKUP_DIR

MongoDB Backup

docker exec stoat-database-1 mongodump --out /tmp/mongobak docker cp stoat-database-1:/tmp/mongobak $BACKUP_DIR/mongo_$DATE docker exec stoat-database-1 rm -rf /tmp/mongobak

Komprimieren

tar -czf $BACKUP_DIR/mongo_$DATE.tar.gz -C $BACKUP_DIR mongo_$DATE rm -rf $BACKUP_DIR/mongo_$DATE

Alte Backups (>14 Tage) löschen

find $BACKUP_DIR -name "*.tar.gz" -mtime +14 -delete

echo "✅ Backup erstellt: mongo_$DATE.tar.gz"

# Cron einrichten
crontab -e

Täglich um 3 Uhr:

0 3 * /home/backup.sh >> /var/log/backup.log 2>&1

Updates

# Docker Images updaten (Stoat pre-built)
cd /home/revolt
docker compose pull

Nach Pull: Container mit neuem Image starten

docker compose up -d

Eigene Images rebuild

docker build --no-cache -t dreylo-web .