Archive every app under /opt
Read-onlycd /opt && tar -czf ~/apps-$(date +%F).tar.gz $(ls -d npm zoraxy komari uptime-kuma diun rustdesk 2>/dev/null)Expect: For a consistent copy of databases, stop the apps first (see each app below).
03 / AFTER INSTALLATION
Each app lives in /opt/<app> on the Docker network proxy. Here is how to open it, add a domain, back up, update, and remove it.
Shown for Nginx Proxy Manager; Zoraxy takes the same values (a new HTTP proxy rule targeting container:port). The proxy and the apps share the proxy network, so use container names, not IPs.
| App | Forward Hostname | Port | Websockets |
|---|---|---|---|
| Komari | komari | 25774 | On |
| Uptime Kuma | uptime-kuma | 3001 | On |
Certificate request failed? See Why a certificate request fails. Port unreachable? See A port you cannot reach.
Container apps keep their data under /opt/<app>, so one command archives them all.
cd /opt && tar -czf ~/apps-$(date +%F).tar.gz $(ls -d npm zoraxy komari uptime-kuma diun rustdesk 2>/dev/null)Expect: For a consistent copy of databases, stop the apps first (see each app below).
scp root@YOUR_SERVER_IP:~/apps-*.tar.gz .Expect: Run this on your own computer. A backup on the same disk does not survive a reinstall.
Open it: Nothing to open. Check that the engine runs and how much disk images use.
docker info --format "{{.ServerVersion}}"
docker system dfExpect: A version number means the engine runs. On Alpine, rc-service docker status shows the service.
apt-get update
apt-get install --only-upgrade -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginExpect: Running containers with restart: unless-stopped come back after the engine restarts.
dnf upgrade -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginapk update
apk upgrade docker docker-cli-compose
rc-service docker restartdocker image prune -aExpect: Asks before deleting. Removes images that no container uses.
Open it: Admin UI on 127.0.0.1:81. From your computer run ssh -L 81:127.0.0.1:81 root@YOUR_SERVER_IP, then open http://127.0.0.1:81.
docker compose -f /opt/npm/compose.yaml ps
docker logs --tail 50 npmExpect: The container is "running" or "Up". Errors in the log usually name the cause.
docker compose -f /opt/npm/compose.yaml stop
tar -czf ~/npm-$(date +%F).tar.gz -C /opt npm
docker compose -f /opt/npm/compose.yaml startExpect: Stopping first keeps SQLite databases consistent. Copy the archive off the server.
docker compose -f /opt/npm/compose.yaml pull
docker compose -f /opt/npm/compose.yaml up -d
docker image prune -fExpect: Read the upstream release notes and back up first. Only changed containers restart.
docker compose -f /opt/npm/compose.yaml downExpect: Data stays in /opt/npm. Delete that directory only when you are sure.
Open it: Admin UI on 127.0.0.1:8000. Run ssh -L 8000:127.0.0.1:8000 root@YOUR_SERVER_IP, then open http://127.0.0.1:8000.
docker compose -f /opt/zoraxy/compose.yaml ps
docker logs --tail 50 zoraxyExpect: The container is "running" or "Up". Errors in the log usually name the cause.
docker compose -f /opt/zoraxy/compose.yaml stop
tar -czf ~/zoraxy-$(date +%F).tar.gz -C /opt zoraxy
docker compose -f /opt/zoraxy/compose.yaml startExpect: Stopping first keeps SQLite databases consistent. Copy the archive off the server.
docker compose -f /opt/zoraxy/compose.yaml pull
docker compose -f /opt/zoraxy/compose.yaml up -d
docker image prune -fExpect: Read the upstream release notes and back up first. Only changed containers restart.
docker compose -f /opt/zoraxy/compose.yaml downExpect: Data stays in /opt/zoraxy. Delete that directory only when you are sure.
Open it: The first account is printed by docker logs komari. Put it behind your domain (below), then add agents from the dashboard: it shows a one-line agent command for each server. Proxy target: komari:25774
docker compose -f /opt/komari/compose.yaml ps
docker logs --tail 50 komariExpect: The container is "running" or "Up". Errors in the log usually name the cause.
docker compose -f /opt/komari/compose.yaml stop
tar -czf ~/komari-$(date +%F).tar.gz -C /opt komari
docker compose -f /opt/komari/compose.yaml startExpect: Stopping first keeps SQLite databases consistent. Copy the archive off the server.
docker compose -f /opt/komari/compose.yaml pull
docker compose -f /opt/komari/compose.yaml up -d
docker image prune -fExpect: Read the upstream release notes and back up first. Only changed containers restart.
docker compose -f /opt/komari/compose.yaml downExpect: Data stays in /opt/komari. Delete that directory only when you are sure.
Open it: Open it through ssh -L 3001:127.0.0.1:3001 root@YOUR_SERVER_IP and create the admin account first. The first visitor becomes admin. Proxy target: uptime-kuma:3001
docker compose -f /opt/uptime-kuma/compose.yaml ps
docker logs --tail 50 uptime-kumaExpect: The container is "running" or "Up". Errors in the log usually name the cause.
docker compose -f /opt/uptime-kuma/compose.yaml stop
tar -czf ~/uptime-kuma-$(date +%F).tar.gz -C /opt uptime-kuma
docker compose -f /opt/uptime-kuma/compose.yaml startExpect: Stopping first keeps SQLite databases consistent. Copy the archive off the server.
docker compose -f /opt/uptime-kuma/compose.yaml pull
docker compose -f /opt/uptime-kuma/compose.yaml up -d
docker image prune -fExpect: Read the upstream release notes and back up first. Only changed containers restart.
docker compose -f /opt/uptime-kuma/compose.yaml downExpect: Data stays in /opt/uptime-kuma. Delete that directory only when you are sure.
Open it: No web UI. Diun checks images every 6 hours and notifies you about new versions. When a notification arrives, update that app with its “Update to the latest image” step on this page.
docker exec diun diun notif testExpect: A message arrives on Telegram or ntfy. If not, check the token or topic and generate the plan again.
docker exec diun diun image listdocker compose -f /opt/diun/compose.yaml ps
docker logs --tail 50 diunExpect: The container is "running" or "Up". Errors in the log usually name the cause.
docker compose -f /opt/diun/compose.yaml stop
tar -czf ~/diun-$(date +%F).tar.gz -C /opt diun
docker compose -f /opt/diun/compose.yaml startExpect: Stopping first keeps SQLite databases consistent. Copy the archive off the server.
docker compose -f /opt/diun/compose.yaml pull
docker compose -f /opt/diun/compose.yaml up -d
docker image prune -fExpect: Read the upstream release notes and back up first. Only changed containers restart.
docker compose -f /opt/diun/compose.yaml downExpect: Data stays in /opt/diun. Delete that directory only when you are sure.
Open it: In each RustDesk client: Settings → Network → ID server = your server IP or domain, Key = the public key below.
cat /opt/rustdesk/data/id_ed25519.pubdocker compose -f /opt/rustdesk/compose.yaml ps
docker logs --tail 50 hbbsExpect: The container is "running" or "Up". Errors in the log usually name the cause.
docker compose -f /opt/rustdesk/compose.yaml stop
tar -czf ~/rustdesk-$(date +%F).tar.gz -C /opt rustdesk
docker compose -f /opt/rustdesk/compose.yaml startExpect: Stopping first keeps SQLite databases consistent. Copy the archive off the server.
docker compose -f /opt/rustdesk/compose.yaml pull
docker compose -f /opt/rustdesk/compose.yaml up -d
docker image prune -fExpect: Read the upstream release notes and back up first. Only changed containers restart.
docker compose -f /opt/rustdesk/compose.yaml downExpect: Data stays in /opt/rustdesk. Delete that directory only when you are sure.
Open it: Start it with zsh, or make it your login shell.
chsh -s "$(command -v zsh)"Expect: Takes effect on the next login.
zsh -ic uninstall_oh_my_zshExpect: Restores the previous ~/.zshrc when a backup exists.
Open it: Run 1pctl user-info for the address, entrance path, and account. Open the panel port in your cloud security group.
1pctl user-info
1pctl status1pctl uninstallExpect: Interactive. Read each prompt; apps installed through the panel are affected.