From 39d5ad4b527266a11a60ef1f777e3686232e4c48 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 20 Oct 2025 15:47:20 -0700 Subject: [PATCH 01/20] first commit of bot config --- .gitea/workflows/build.yml | 5 +-- Dockerfile | 56 +++++++++++------------ backupbot.env | 23 ++++++++++ docker-compose.yml | 8 ++-- services/backupbot/run | 71 +++++++++++++++++++++++------ web/backupbot.cgi | 47 ++++++++++++++++++++ web/index.html | 91 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 251 insertions(+), 50 deletions(-) create mode 100644 backupbot.env create mode 100644 web/backupbot.cgi create mode 100644 web/index.html diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 7fad899..cf9962c 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -8,7 +8,7 @@ on: jobs: build: - runs-on: prodesk + runs-on: prodesk steps: - name: Checkout repository uses: actions/checkout@v4 @@ -30,6 +30,5 @@ jobs: file: ./Dockerfile push: true tags: | - gitea.calahilstudios.com/${{ github.repository_owner }}/${{ github.event.repository.name }}:latest + gitea.calahilstudios.com/${{ github.repository_owner }}/${{ github.event.repository.name }}:develop gitea.calahilstudios.com/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ github.sha }} - diff --git a/Dockerfile b/Dockerfile index 1113b46..127c21a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,37 +1,35 @@ +# Use LinuxServer.io Duplicati base FROM ghcr.io/linuxserver/duplicati:2.1.0 -ENV DEBIAN_FRONTEND=noninteractive -SHELL ["/bin/bash", "-o", "pipefail", "-c"] - -RUN apt-get update -y \ - && apt-get install -y --no-install-recommends \ - ca-certificates \ - curl \ - gnupg \ - lsb-release \ - btrfs-progs \ - #&& rm -rf /var/lib/apt/lists/* \ - && install -m 0755 -d /etc/apt/keyrings \ - && curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc \ - && chmod a+r /etc/apt/keyrings/docker.asc \ - && echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ - $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ - tee /etc/apt/sources.list.d/docker.list > /dev/null \ - && apt-get update -y \ - && apt-get install -y --no-install-recommends \ - cron \ +# Install Docker CLI, bash, python3 +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ bash \ - docker-ce-cli \ - postgresql-client \ - && rm -rf /var/lib/apt/lists/* \ - && mkdir -p /backups + python3 \ + python3-pip \ + docker.io \ + ca-certificates curl && \ + rm -rf /var/lib/apt/lists/* + +# Create directories for backup scripts and logs +RUN mkdir -p /usr/local/bin /config/log /config/web /etc/services/backupbot # Copy backup script COPY backup.sh /usr/local/bin/backup.sh -RUN chmod +x /usr/local/bin/backup.sh \ - && mkdir -p /etc/services.d/backupbot -COPY services/backupbot/run /etc/services.d/backupbot/run -RUN chmod +x /etc/services.d/backupbot/run +RUN chmod +x /usr/local/bin/backup.sh +# Copy the environment variables for the config +COPY backupbot.env /config/backupbot.env +# Copy s6 service for backupbot +COPY services/backupbot/run /etc/services/backupbot/run +RUN chmod +x /etc/services/backupbot/run + +# Copy web frontend +COPY web/ /config/web/ +RUN chmod +x /config/web/backupbot.cgi +# Expose web frontend port +EXPOSE 8080 + +# Keep duplicati entrypoint +ENTRYPOINT ["/init"] diff --git a/backupbot.env b/backupbot.env new file mode 100644 index 0000000..d096410 --- /dev/null +++ b/backupbot.env @@ -0,0 +1,23 @@ +# === BackupBot Environment Configuration === +# Used by backup_scheduler.sh and web frontend +# Do not store sensitive credentials in world-readable locations unless necessary + +# Timezone for scheduling backups (affects 3 AM backup) +TZ=America/Los_Angeles + +# Directory to store backup SQL files +BACKUP_DIR=/backups/postgres + +# Log file path +LOG_FILE=/config/log/pgbackup.log + +# Number of retry attempts on failure +MAX_RETRIES=3 + +# Gotify notification configuration (optional) +GOTIFY_URL=http://gotify.example.com +GOTIFY_TOKEN=your_gotify_token_here + +# Backup time (24-hour format) – defaults to 03:00 local time +BACKUP_HOUR=03 +BACKUP_MINUTE=00 diff --git a/docker-compose.yml b/docker-compose.yml index f5a30ca..c418ce5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,20 +6,18 @@ services: environment: - PUID=0 - PGID=0 - - TZ=Etc/UTC + - TZ=America/Los_Angeles - SETTINGS_ENCRYPTION_KEY=${KEY} - CLI_ARGS= #optional - DUPLICATI__WEBSERVICE_PASSWORD=${PASSWORD} volumes: # Config dir for duplicati - /srv/appdata/duplicati/config:/config - # Backup folder to store dumps/backups + # Backup folder to store dumps/backups/snapshots - /srv/backups:/backups - # Local docker config dirs - - /srv/appdata:/source/appdata:rshared # Docker socket to list containers - /var/run/docker.sock:/var/run/docker.sock:ro - ports: - 8200:8200 + - 8201:8080 restart: unless-stopped diff --git a/services/backupbot/run b/services/backupbot/run index 80a421c..bdd0df2 100644 --- a/services/backupbot/run +++ b/services/backupbot/run @@ -1,27 +1,72 @@ #!/usr/bin/with-contenv bash set -e +# Source env if available +if [[ -f /config/backupbot.env ]]; then + export $(grep -v '^#' /config/backupbot.env | xargs) +fi -echo "[BACKUPBOT_INFO] Starting PostgreSQL backup loop service..." +# Start Python HTTP server for web config in background +cd /config/web +nohup python3 -m http.server 8080 --cgi >/config/log/web.log 2>&1 & -INTERVAL_HOURS="${INTERVAL_HOURS:-24}" +# Start backup scheduler STATE_FILE="/config/last_backup_date" LOG_FILE="/config/log/pgbackup.log" - mkdir -p "$(dirname "$STATE_FILE")" "$(dirname "$LOG_FILE")" +# TZ +: "${TZ:=UTC}" +export TZ + +# Retry config +RETRIES=3 +GOTIFY_URL="${GOTIFY_URL:-}" +GOTIFY_TOKEN="${GOTIFY_TOKEN:-}" + +# Helper: seconds until next 3AM +seconds_until_next_3am() { + local now next_3am + now=$(date +%s) + next_3am=$(date -d "today 03:00" +%s) + ((now >= next_3am)) && next_3am=$(date -d "tomorrow 03:00" +%s) + echo $((next_3am - now)) +} + +# Run backup with retries +run_backup() { + local attempt=1 + while ((attempt <= RETRIES)); do + echo "[INFO] Backup attempt $attempt" + if /usr/local/bin/backup.sh >>"$LOG_FILE" 2>&1; then + echo "[SUCCESS] Backup completed" + return 0 + else + echo "[WARN] Backup failed on attempt $attempt" + ((attempt++)) + sleep 5 + fi + done + # Send Gotify notification if configured + if [[ -n "$GOTIFY_URL" && -n "$GOTIFY_TOKEN" ]]; then + curl -s -X POST "$GOTIFY_URL/message?token=$GOTIFY_TOKEN" \ + -F "title=Backup Failed" \ + -F "message=PostgreSQL backup failed after $RETRIES attempts" \ + -F "priority=5" + fi + return 1 +} + +# Main loop while true; do TODAY=$(date +%F) - - # Check if a backup already ran today if [[ -f "$STATE_FILE" && "$(cat "$STATE_FILE")" == "$TODAY" ]]; then - echo "[BACKUPBOT_INFO] Backup already completed today ($TODAY). Skipping." + echo "[INFO] Backup already done for $TODAY" else - echo "[BACKUPBOT_INFO] Triggering backup.sh at $(date)" - /usr/local/bin/backup.sh "$LOG_FILE" - echo "$TODAY" >"$STATE_FILE" - echo "[BACKUPBOT_INFO] Backup completed and date recorded." + echo "[INFO] Running backup for $TODAY" + if run_backup; then + echo "$TODAY" >"$STATE_FILE" + fi fi - - echo "[BACKUPBOT_INFO] Sleeping for $INTERVAL_HOURS hours..." - sleep "${INTERVAL_HOURS}h" + SECONDS_TO_WAIT=$(seconds_until_next_3am) + sleep "$SECONDS_TO_WAIT" done diff --git a/web/backupbot.cgi b/web/backupbot.cgi new file mode 100644 index 0000000..a7ed333 --- /dev/null +++ b/web/backupbot.cgi @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +import cgi +import cgitb +import os +import json + +cgitb.enable() +print("Content-Type: application/json\n") + +ENV_FILE = "/config/web/backupbot.env" + + +def read_env(): + env = {} + if os.path.exists(ENV_FILE): + with open(ENV_FILE) as f: + for line in f: + line = line.strip() + if line and not line.startswith("#") and "=" in line: + key, val = line.split("=", 1) + env[key.strip()] = val.strip() + return env + + +def write_env(env): + with open(ENV_FILE, "w") as f: + for key, val in env.items(): + f.write(f"{key}={val}\n") + + +form = cgi.FieldStorage() +action = form.getvalue("action") + +if action == "get": + env = read_env() + print(json.dumps(env)) +elif action == "set": + try: + raw = os.environ.get("CONTENT_LENGTH") + length = int(raw) if raw else 0 + data = json.loads(os.read(0, length)) + write_env(data) + print(json.dumps({"status": "ok", "message": "Configuration saved."})) + except Exception as e: + print(json.dumps({"status": "error", "message": str(e)})) +else: + print(json.dumps({"status": "error", "message": "Invalid action"})) diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..f7cc481 --- /dev/null +++ b/web/index.html @@ -0,0 +1,91 @@ + + + + + + BackupBot Configuration + + + + +

BackupBot Configuration

+ +
+ + + + + + + + + +
+ +

+ + + + + From c252250db0ccaa183320cf7cdf6aaf220097c867 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 20 Oct 2025 16:01:41 -0700 Subject: [PATCH 02/20] add develop to build workflow --- .gitea/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index cf9962c..ba93475 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - develop pull_request: jobs: From 12773ef7e7361f1006d2f91fdea4e08a01007fee Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 20 Oct 2025 16:07:27 -0700 Subject: [PATCH 03/20] wrong directory being made --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 127c21a..a8e613f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* # Create directories for backup scripts and logs -RUN mkdir -p /usr/local/bin /config/log /config/web /etc/services/backupbot +RUN mkdir -p /usr/local/bin /config/log /config/web /etc/services.d/backupbot # Copy backup script COPY backup.sh /usr/local/bin/backup.sh @@ -22,8 +22,8 @@ RUN chmod +x /usr/local/bin/backup.sh COPY backupbot.env /config/backupbot.env # Copy s6 service for backupbot -COPY services/backupbot/run /etc/services/backupbot/run -RUN chmod +x /etc/services/backupbot/run +COPY services/backupbot/run /etc/services.d/backupbot/run +RUN chmod +x /etc/services.d/backupbot/run # Copy web frontend COPY web/ /config/web/ From 14c0a4f52247b5e0e4c2db962c73e810c03ba99c Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 20 Oct 2025 16:21:56 -0700 Subject: [PATCH 04/20] layering issues --- Dockerfile | 4 ++-- services/backupbot/run | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index a8e613f..9dbced3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,8 +26,8 @@ COPY services/backupbot/run /etc/services.d/backupbot/run RUN chmod +x /etc/services.d/backupbot/run # Copy web frontend -COPY web/ /config/web/ -RUN chmod +x /config/web/backupbot.cgi +COPY web /defaults/web +RUN chmod +x /defaults/web/backupbot.cgi # Expose web frontend port EXPOSE 8080 diff --git a/services/backupbot/run b/services/backupbot/run index bdd0df2..f745c8d 100644 --- a/services/backupbot/run +++ b/services/backupbot/run @@ -4,6 +4,11 @@ set -e if [[ -f /config/backupbot.env ]]; then export $(grep -v '^#' /config/backupbot.env | xargs) fi +# Initialize default web interface if missing +if [ ! -d /config/web ]; then + echo "[INFO] Populating /config/web from defaults..." + cp -r /defaults/web /config/ +fi # Start Python HTTP server for web config in background cd /config/web From 31921e5a40e100a7d8ea9e3aa24bf71f1d23ba1b Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Mon, 20 Oct 2025 16:30:22 -0700 Subject: [PATCH 05/20] env file mismatch --- services/backupbot/run | 2 +- web/backupbot.cgi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/backupbot/run b/services/backupbot/run index f745c8d..6655c5b 100644 --- a/services/backupbot/run +++ b/services/backupbot/run @@ -42,7 +42,7 @@ run_backup() { local attempt=1 while ((attempt <= RETRIES)); do echo "[INFO] Backup attempt $attempt" - if /usr/local/bin/backup.sh >>"$LOG_FILE" 2>&1; then + if /usr/local/bin/backup.sh "$LOG_FILE"; then echo "[SUCCESS] Backup completed" return 0 else diff --git a/web/backupbot.cgi b/web/backupbot.cgi index a7ed333..ee3e346 100644 --- a/web/backupbot.cgi +++ b/web/backupbot.cgi @@ -7,7 +7,7 @@ import json cgitb.enable() print("Content-Type: application/json\n") -ENV_FILE = "/config/web/backupbot.env" +ENV_FILE = "/config/backupbot.env" def read_env(): From 7fbeb3aa262bc45bbe80902eb7ec8e1811b89dea Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 21 Oct 2025 00:46:22 -0700 Subject: [PATCH 06/20] build fix --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 9dbced3..1d483c1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,7 @@ RUN apt-get update && \ python3 \ python3-pip \ docker.io \ + btrfs-progs \ ca-certificates curl && \ rm -rf /var/lib/apt/lists/* From 300ad5b49c82994d28538190c7b7329381f55a81 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 21 Oct 2025 01:02:47 -0700 Subject: [PATCH 07/20] docker layers are my enemy --- Dockerfile | 2 +- services/backupbot/run | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1d483c1..b9d1212 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ COPY backup.sh /usr/local/bin/backup.sh RUN chmod +x /usr/local/bin/backup.sh # Copy the environment variables for the config -COPY backupbot.env /config/backupbot.env +COPY backupbot.env /defaults/backupbot.env # Copy s6 service for backupbot COPY services/backupbot/run /etc/services.d/backupbot/run diff --git a/services/backupbot/run b/services/backupbot/run index 6655c5b..97e12bc 100644 --- a/services/backupbot/run +++ b/services/backupbot/run @@ -3,6 +3,10 @@ set -e # Source env if available if [[ -f /config/backupbot.env ]]; then export $(grep -v '^#' /config/backupbot.env | xargs) +else + echo "[INFO] copying env vars from defaults..." + cp -r /defaults/backupbot.env /config/ + export $(grep -V '^#' /config/backupbot.env) fi # Initialize default web interface if missing if [ ! -d /config/web ]; then From d1677f92c61dfa3ee72488fde137f4bec47c39dd Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 21 Oct 2025 01:05:14 -0700 Subject: [PATCH 08/20] typos --- services/backupbot/run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/backupbot/run b/services/backupbot/run index 97e12bc..d6fca02 100644 --- a/services/backupbot/run +++ b/services/backupbot/run @@ -6,7 +6,7 @@ if [[ -f /config/backupbot.env ]]; then else echo "[INFO] copying env vars from defaults..." cp -r /defaults/backupbot.env /config/ - export $(grep -V '^#' /config/backupbot.env) + export $(grep -V '^#' /config/backupbot.env | xargs) fi # Initialize default web interface if missing if [ ! -d /config/web ]; then From a2d8f10c2a42dce9bc383cdbec7ea64fe1e19f93 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 21 Oct 2025 01:45:12 -0700 Subject: [PATCH 09/20] lets see if it reads the vars --- web/backupbot.cgi | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/web/backupbot.cgi b/web/backupbot.cgi index ee3e346..707eaa0 100644 --- a/web/backupbot.cgi +++ b/web/backupbot.cgi @@ -16,9 +16,12 @@ def read_env(): with open(ENV_FILE) as f: for line in f: line = line.strip() - if line and not line.startswith("#") and "=" in line: - key, val = line.split("=", 1) - env[key.strip()] = val.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, val = line.split("=", 1) + key = key.strip() + val = val.strip().split("#")[0].strip() # strip inline comments + env[key] = val return env From 8320490b213d0de5e4edb67e446d0e901bfe83cc Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 21 Oct 2025 11:58:04 -0700 Subject: [PATCH 10/20] im at a loss --- backupbot.env | 1 - 1 file changed, 1 deletion(-) diff --git a/backupbot.env b/backupbot.env index d096410..6df6295 100644 --- a/backupbot.env +++ b/backupbot.env @@ -1,4 +1,3 @@ -# === BackupBot Environment Configuration === # Used by backup_scheduler.sh and web frontend # Do not store sensitive credentials in world-readable locations unless necessary From a81f66fa6b76df17a5033161a61b6ca7672d6236 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 21 Oct 2025 12:17:09 -0700 Subject: [PATCH 11/20] switched source to proxy --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b9d1212..5bf53a0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Use LinuxServer.io Duplicati base -FROM ghcr.io/linuxserver/duplicati:2.1.0 +FROM ghcr.calahilstudios.com/linuxserver/duplicati:2.1.0 # Install Docker CLI, bash, python3 RUN apt-get update && \ From 5feac4aa32689f35b3634c39524cd54131139f32 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 21 Oct 2025 13:33:24 -0700 Subject: [PATCH 12/20] revert to dh image --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5bf53a0..da5ce4d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Use LinuxServer.io Duplicati base -FROM ghcr.calahilstudios.com/linuxserver/duplicati:2.1.0 +FROM linuxserver/duplicati:2.1.0 # Install Docker CLI, bash, python3 RUN apt-get update && \ From 2289f7f4009eeb91bc5789f5b498a27beff145c8 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 22 Oct 2025 00:31:49 -0700 Subject: [PATCH 13/20] and then it hit me --- backupbot.env | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/backupbot.env b/backupbot.env index 6df6295..9e7130d 100644 --- a/backupbot.env +++ b/backupbot.env @@ -1,22 +1,8 @@ -# Used by backup_scheduler.sh and web frontend -# Do not store sensitive credentials in world-readable locations unless necessary - -# Timezone for scheduling backups (affects 3 AM backup) TZ=America/Los_Angeles - -# Directory to store backup SQL files BACKUP_DIR=/backups/postgres - -# Log file path LOG_FILE=/config/log/pgbackup.log - -# Number of retry attempts on failure MAX_RETRIES=3 - -# Gotify notification configuration (optional) GOTIFY_URL=http://gotify.example.com GOTIFY_TOKEN=your_gotify_token_here - -# Backup time (24-hour format) – defaults to 03:00 local time BACKUP_HOUR=03 BACKUP_MINUTE=00 From 8fc3c0ae37f1d233902951cd700de682bbceb8ce Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 22 Oct 2025 00:52:43 -0700 Subject: [PATCH 14/20] so close --- services/backupbot/run | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/services/backupbot/run b/services/backupbot/run index d6fca02..d2a0e79 100644 --- a/services/backupbot/run +++ b/services/backupbot/run @@ -2,11 +2,15 @@ set -e # Source env if available if [[ -f /config/backupbot.env ]]; then - export $(grep -v '^#' /config/backupbot.env | xargs) + set -a + source /config/backupbot.env + set +a else echo "[INFO] copying env vars from defaults..." cp -r /defaults/backupbot.env /config/ - export $(grep -V '^#' /config/backupbot.env | xargs) + set -a + source /config/backupbot.env + set +a fi # Initialize default web interface if missing if [ ! -d /config/web ]; then From 981da971cd42330bfadf7eb8f0850770c545bb81 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 22 Oct 2025 01:33:50 -0700 Subject: [PATCH 15/20] one more time --- Dockerfile | 2 +- web/{ => cgi-bin}/backupbot.cgi | 0 web/index.html | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename web/{ => cgi-bin}/backupbot.cgi (100%) diff --git a/Dockerfile b/Dockerfile index da5ce4d..d4b526e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,7 +28,7 @@ RUN chmod +x /etc/services.d/backupbot/run # Copy web frontend COPY web /defaults/web -RUN chmod +x /defaults/web/backupbot.cgi +RUN chmod +x /defaults/web/cgi-bin/backupbot.cgi # Expose web frontend port EXPOSE 8080 diff --git a/web/backupbot.cgi b/web/cgi-bin/backupbot.cgi similarity index 100% rename from web/backupbot.cgi rename to web/cgi-bin/backupbot.cgi diff --git a/web/index.html b/web/index.html index f7cc481..c31c7c0 100644 --- a/web/index.html +++ b/web/index.html @@ -62,7 +62,7 @@