Files
infrastructure/REDEPLOY.md
T

4.7 KiB

VM Redeployment Guide

This guide covers rebuilding all apps from scratch on a new VM after a total loss of 192.168.16.130.

What you need before starting:

  • Access to your Gitea server (git.yoda.ddnsgeek.com)
  • The latest backup archive from /opt/backups/vm-apps/ on the VPS
  • The backup encryption password (if you set one)
  • A fresh Ubuntu VM

Step 1 — Prepare the new VM

# Install Docker
sudo apt-get update
sudo apt-get install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
# Log out and back in after this
# Install Git
sudo apt-get install -y git

# Create app directories
sudo mkdir -p /opt/rv50x-manager /opt/switch-config-manager /opt/lldp-mapper /opt/stunnel
sudo chown $USER:$USER /opt/rv50x-manager /opt/switch-config-manager /opt/lldp-mapper /opt/stunnel

Step 2 — Set up SSH key for Gitea

ssh-keygen -t ed25519 -C "new-vm" -f ~/.ssh/id_ed25519 -N ""
cat ~/.ssh/id_ed25519.pub

Add the public key to Gitea: https://git.yoda.ddnsgeek.com/user/settings/keys

Add the SSH config:

cat >> ~/.ssh/config << 'EOF'
Host git.yoda.ddnsgeek.com
    HostName git.yoda.ddnsgeek.com
    User git
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
EOF

Test:

ssh -T git@git.yoda.ddnsgeek.com
# Should print: Hi there, dcstephenson! You've successfully authenticated...

Step 3 — Clone all repositories

cd /opt/rv50x-manager
git clone git@git.yoda.ddnsgeek.com:dcstephenson/rv50x-manager.git .

cd /opt/switch-config-manager
git clone git@git.yoda.ddnsgeek.com:dcstephenson/switch-config-manager.git .

cd /opt/lldp-mapper
git clone git@git.yoda.ddnsgeek.com:dcstephenson/lldp-mapper.git .

cd /opt/stunnel
git clone git@git.yoda.ddnsgeek.com:dcstephenson/stunnel.git .

Step 4 — Restore from backup

Copy the latest backup archive from the VPS:

scp root@git.yoda.ddnsgeek.com:/opt/backups/vm-apps/vm-apps-backup_YYYYMMDD_HHMMSS.tar.gz.enc /tmp/

Decrypt and extract:

# If encrypted:
openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 \
    -in  /tmp/vm-apps-backup_YYYYMMDD_HHMMSS.tar.gz.enc \
    -out /tmp/vm-apps-backup.tar.gz \
    -pass pass:"YOUR_BACKUP_PASSWORD"

# Extract
mkdir /tmp/restore
tar -xzf /tmp/vm-apps-backup.tar.gz -C /tmp/restore

Restore secrets:

cp /tmp/restore/secrets/rv50x-manager.env              /opt/rv50x-manager/.env
cp /tmp/restore/secrets/switch-config-manager-config.py /opt/switch-config-manager/config.py
cp /tmp/restore/secrets/lldp-mapper-config.py           /opt/lldp-mapper/config.py
mkdir -p /opt/rv50x-manager/certs
cp /tmp/restore/secrets/cert.pem  /opt/rv50x-manager/certs/
cp /tmp/restore/secrets/key.pem   /opt/rv50x-manager/certs/

Restore rv50x-manager runtime data:

cp /tmp/restore/rv50x-manager/rv50x.db        /opt/rv50x-manager/
cp /tmp/restore/rv50x-manager/at_presets.json  /opt/rv50x-manager/
cp -r /tmp/restore/rv50x-manager/xml_templates /opt/rv50x-manager/

Restore switch configs:

cp -r /tmp/restore/switch-config-manager/configs /opt/switch-config-manager/

Restore lldp-mapper topology data:

cp -r /tmp/restore/lldp-mapper/data /opt/lldp-mapper/

Step 5 — Start the rv50x stack and restore NocoDB database

cd /opt/rv50x-manager

# Start postgres and nocodb only (not the app yet)
docker compose up -d postgres
# Wait for postgres to be healthy
docker compose up -d nocodb

Restore the PostgreSQL dump:

docker exec -i rv50x-postgres psql -U nocodb nocodb < /tmp/restore/rv50x-manager/nocodb_postgres.sql

Start the full stack:

docker compose up -d

Verify:

docker compose ps
# All three containers should be running/healthy

Step 6 — Start remaining apps

cd /opt/switch-config-manager
docker compose up -d --build

cd /opt/lldp-mapper
docker compose up -d --build

cd /opt/stunnel
docker compose up -d --build

Step 7 — Verify everything is working

App URL
rv50x-manager http://NEW-VM-IP:8002
rv50x-nocodb http://NEW-VM-IP:8090
switch-config-manager http://NEW-VM-IP:8003
lldp-mapper http://NEW-VM-IP:5000
stunnel https://NEW-VM-IP:4500 (through to first switch)

Check rv50x-manager loads devices from NocoDB — if devices appear, the Postgres restore worked.


Step 8 — Clean up

rm -rf /tmp/restore /tmp/vm-apps-backup*

Backup location on VPS

Backups are stored at:

root@git.yoda.ddnsgeek.com:/opt/backups/vm-apps/

The last 7 backups are kept. To list them:

ssh root@git.yoda.ddnsgeek.com "ls -lht /opt/backups/vm-apps/"

Running a backup

On this VM:

/opt/backup.sh