VPS Setup Doku
1. System Update
Bash
sudo apt update && sudo apt upgrade -y2. User erstellen
Bash
sudo adduser michu
sudo usermod -aG sudo michu
sudo mkdir -p /home/michu/.ssh
sudo cp ~/.ssh/authorized_keys /home/michu/.ssh/authorized_keys
sudo chown -R michu:michu /home/michu/.ssh
sudo chmod 700 /home/michu/.ssh
sudo chmod 600 /home/michu/.ssh/authorized_keysBash
# Neues Terminal öffnen und ssh michu@ip testen
sudo whoami
# muss root zeigenBash
#erst dann
sudo usermod -L -s /sbin/nologin ubuntu3. SSH härten
Bash
sudo nano /etc/ssh/sshd_configBash
#werte
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
MaxAuthTries 3
MaxSessions 2Bash
sudo sshd -t #sollte nichts anzeigenBash
# Neues Terminal öffnen und Login neues Login testen.
# Wenn es geht, in alter Session:
sudo systemctl restart ssh4. Fail2Ban einrichten
Bash
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.localBash
#werte ganz unten in sshd sektion
[sshd]
enabled = true
port = ssh
filter = sshd
maxretry = 3
bantime = 86400
findtime = 600
logpath = %(sshd_log)s
backend = %(sshd_backend)sBash
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban5. Automatische Updates
Bash
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades6. Audit Logging
Bash
sudo apt install auditd audispd-plugins -y
sudo systemctl enable auditd
sudo systemctl start auditdBash
#audit abfragen
sudo ausearch -ts todayBash
#live audit abfragen
sudo tail -f /var/log/audit/audit.log7. Shared Memory sichern
Bash
sudo nano /etc/fstabBash
#wert am ende anfügen
tmpfs /run/shm tmpfs defaults,noexec,nosuid 0 0Bash
sudo systemctl daemon-reload
sudo mount -o remount /dev/shm
# prüfen, ob gesichert
mount | grep /dev/shm8. Sysctl Network Hardening
Bash
sudo nano /etc/sysctl.confBash
#am ende anfügen
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0Bash
sudo sysctl -p9. Swap einrichten
Bash
#beispiel mit kleinem vps mit 2gb ram
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabBash
#4GB Ram
sudo fallocate -l 2G /swapfile
#8GB Ram
sudo fallocate -l 4G /swapfile
#16GB Ram
sudo fallocate -l 4G /swapfile
#32GB Ram
sudo fallocate -l 4G /swapfile10. Timezone manuell setzen
Bash
sudo timedatectl set-timezone Europe/Zurich
11. rclone installieren
Bash
curl https://rclone.org/install.sh | sudo bash
mkdir -p ~/.config/rcloneBash
#rclone.conf einrichten
# 1. Im Infomaniak Manager → Swiss Backup → Gerät → rclone.conf herunterladen
# 2. Auf VPS hochladen (vom Mac):
scp ~/Downloads/rclone.conf michu@IP:~/.config/rclone/rclone.conf
# 3. Passwort neu generieren in Infomaniak Manager Gerät:
nano ~/.config/rclone/rclone.conf
# key = [password] → durch generiertes Passwort ersetzen
# 4. Verbindung testen:
rclone lsd <remote-name>:
# remote-name steht in der rclone.conf, z.B. sb_project_SBI-XXXXXXBash
#dropbox einrichten
# Auf VPS:
rclone config
# → n → Name: dropbox → Storage: dropbox → client_id: leer → client_secret: leer
# → advanced: n → web browser: n
# Auf Mac (neues Terminal lokal):
rclone authorize "dropbox"
# Browser öffnet sich → Dropbox autorisieren → Token kopieren
# Token auf VPS einfügen (alles zwischen und mit {}) → y → q
#verbindung testen
rclone lsd dropbox:12. Docker installieren
Bash
sudo apt install -y docker.io docker-compose
sudo systemctl enable docker
sudo systemctl start docker13. Backup Skript
Bash
nano ~/backup.sh
#!/bin/bash
DATE=$(date +%d-%m-%Y)
REMOTE="sb_project_SBI-MG301561"
DROPBOX="dropbox:BACKUPS/INFOMANIAK-VPS/VPS-LITE"
BACKUP_DIR="/tmp/vps-lite-$DATE"
RCLONE_CONFIG="/home/michu/.config/rclone/rclone.conf"
mkdir -p "$BACKUP_DIR"
echo "📦 App sichern..."
tar czf "$BACKUP_DIR/app.tar.gz" /home/michu/app
echo "📦 /etc sichern..."
sudo tar czf "$BACKUP_DIR/etc.tar.gz" /etc 2>/dev/null
echo "📦 Forgejo Volume sichern..."
sudo docker run --rm \
-v docker_forgejo:/data \
-v "$BACKUP_DIR":/backup \
alpine tar czf /backup/forgejo.tar.gz /data
echo "📦 Uptime-Kuma Volume sichern..."
sudo docker run --rm \
-v uptime-kuma:/data \
-v "$BACKUP_DIR":/backup \
alpine tar czf /backup/uptime-kuma.tar.gz /data
echo "☁️ Upload zu Swiss Backup..."
rclone --config "$RCLONE_CONFIG" --progress sync "$BACKUP_DIR" "$REMOTE:default/vps-lite-$DATE"
echo "☁️ Upload zu Dropbox..."
rclone --config "$RCLONE_CONFIG" --progress sync "$BACKUP_DIR" "$DROPBOX/vps-lite-$DATE"
echo "🧹 Alte Backups löschen (älter als 7 Tage)..."
rclone --config "$RCLONE_CONFIG" delete --min-age 7d "$REMOTE:default/"
rclone --config "$RCLONE_CONFIG" rmdirs "$REMOTE:default/"
rclone --config "$RCLONE_CONFIG" delete --min-age 7d "$DROPBOX/"
rclone --config "$RCLONE_CONFIG" rmdirs "$DROPBOX/"
echo "🧹 Aufräumen..."
sudo rm -rf "$BACKUP_DIR"
echo "✅ Backup vps-lite-$DATE abgeschlossen."
chmod +x ~/backup.shBash
#backup.sh ausführen
sudo ~/backup.sh14. Cronjob einrichten
Bash
sudo crontab -e
# nano wählen (1) und enter drücken
0 2 * * * /home/michu/backup.sh >> /var/log/backup.log 2>&115. Backup Restore Skripts
Bash
#restore von swiss-backup
cat > ~/restore-swiss.sh << 'EOF'
#!/bin/bash
DATE=$1
REMOTE="sb_project_SBI-MG301561"
RCLONE_CONFIG="/home/michu/.config/rclone/rclone.conf"
RESTORE_DIR="/tmp/restore-$DATE"
if [ -z "$DATE" ]; then
echo "❌ Datum angeben: ./restore-swiss.sh 12-05-2026"
exit 1
fi
mkdir -p "$RESTORE_DIR"
echo "⬇️ Download von Swiss Backup..."
rclone --config "$RCLONE_CONFIG" --progress sync "$REMOTE:default/vps-lite-$DATE" "$RESTORE_DIR"
echo "📦 /etc wiederherstellen..."
sudo tar xzf "$RESTORE_DIR/etc.tar.gz" -C /
echo "📦 App wiederherstellen..."
tar xzf "$RESTORE_DIR/app.tar.gz" -C /
echo "📦 Forgejo Volume wiederherstellen..."
sudo docker volume create docker_forgejo
sudo docker run --rm \
-v docker_forgejo:/data \
-v "$RESTORE_DIR":/backup \
alpine tar xzf /backup/forgejo.tar.gz -C /
echo "📦 Uptime-Kuma Volume wiederherstellen..."
sudo docker volume create uptime-kuma
sudo docker run --rm \
-v uptime-kuma:/data \
-v "$RESTORE_DIR":/backup \
alpine tar xzf /backup/uptime-kuma.tar.gz -C /
echo "🧹 Aufräumen..."
rm -rf "$RESTORE_DIR"
echo "✅ Restore $DATE abgeschlossen."
echo "👉 Docker starten: cd ~/app && sudo docker-compose up -d"
EOF
chmod +x ~/restore-swiss.shBash
#restore von dropbox
cat > ~/restore-dropbox.sh << 'EOF'
#!/bin/bash
DATE=$1
DROPBOX="dropbox:BACKUPS/INFOMANIAK-VPS/VPS-LITE"
RCLONE_CONFIG="/home/michu/.config/rclone/rclone.conf"
RESTORE_DIR="/tmp/restore-$DATE"
if [ -z "$DATE" ]; then
echo "❌ Datum angeben: ./restore-dropbox.sh 12-05-2026"
exit 1
fi
mkdir -p "$RESTORE_DIR"
echo "⬇️ Download von Dropbox..."
rclone --config "$RCLONE_CONFIG" --progress sync "$DROPBOX/vps-lite-$DATE" "$RESTORE_DIR"
echo "📦 /etc wiederherstellen..."
sudo tar xzf "$RESTORE_DIR/etc.tar.gz" -C /
echo "📦 App wiederherstellen..."
tar xzf "$RESTORE_DIR/app.tar.gz" -C /
echo "📦 Forgejo Volume wiederherstellen..."
sudo docker volume create docker_forgejo
sudo docker run --rm \
-v docker_forgejo:/data \
-v "$RESTORE_DIR":/backup \
alpine tar xzf /backup/forgejo.tar.gz -C /
echo "📦 Uptime-Kuma Volume wiederherstellen..."
sudo docker volume create uptime-kuma
sudo docker run --rm \
-v uptime-kuma:/data \
-v "$RESTORE_DIR":/backup \
alpine tar xzf /backup/uptime-kuma.tar.gz -C /
echo "🧹 Aufräumen..."
rm -rf "$RESTORE_DIR"
echo "✅ Restore $DATE abgeschlossen."
echo "👉 Docker starten: cd ~/app && sudo docker-compose up -d"
EOF
chmod +x ~/restore-dropbox.shBash
# ausführen mit datum
sudo ~/restore-swiss.sh 12-05-2026
# oder
sudo ~/restore-dropbox.sh 12-05-2026Bash
cd ~/app && sudo docker-compose up -d
# ab hier läuft alles wieder