# Health

# Links

<table id="bkmrk-webmin-https%3A%2F%2Fwebmi" style="border-collapse:collapse;width:100%;border-width:1px;"><colgroup><col style="width:28.8691%;"></col><col style="width:71.2501%;"></col></colgroup><tbody><tr><td>##### Application

</td><td>##### Link

</td></tr><tr><td>Webmin</td><td>[https://webmin.admin.pknw1.co.uk](https://webmin.admin.pknw1.co.uk)

</td></tr></tbody></table>

<table id="bkmrk-nginx_proxy_manager_" style="border-collapse:collapse;width:100%;height:165.8px;"><colgroup><col style="width:28.2479%;"></col><col style="width:71.7521%;"></col></colgroup><tbody><tr><td colspan="2">##### **Core-System Applications**

</td></tr><tr><td>##### Application

</td><td>##### Link

</td></tr><tr><td colspan="2">```
/etc/pknw1/services/core-system
systemctl start core-networking | systemctl stop core-networking
```

</td></tr><tr style="height:35.4px;"><td style="height:35.4px;">nginx\_proxy\_manager\_admin</td><td style="height:35.4px;">[https://proxymanager-admn.admin.pknw1.co.uk](https://proxymanager-admn.admin.pknw1.co.uk) </td></tr><tr style="height:35.4px;"><td style="height:35.4px;">nginx\_proxy\_manager</td><td style="height:35.4px;">[https://proxymanager.admin.pknw1.co.uk](https://proxymanager.admin.pknw1.co.uk) </td></tr><tr style="height:35.4px;"><td style="height:35.4px;">pocket-id</td><td style="height:35.4px;">[https://auth.pknw1.co.uk](https://auth.pknw1.co.uk) </td></tr><tr><td>Alias Vault</td><td>[https://vault.pknw1.co.uk](https://vault.pknw1.co.uk) </td></tr><tr style="height:29.8px;"><td style="height:29.8px;">internal-proxy</td><td style="height:29.8px;">  
</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">portainer</td><td style="height:29.8px;">[https://portainer.admin.pknw1.co.uk](https://portainer.admin.pknw1.co.uk) </td></tr></tbody></table>

<table id="bkmrk-jellyfin-jellyseerr-" style="border-collapse:collapse;width:100%;height:149px;"><colgroup><col style="width:28.3671%;"></col><col style="width:71.6329%;"></col></colgroup><tbody><tr><td colspan="2">##### **Notflix-WebUI Applications**

</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">##### Application

</td><td style="height:29.8px;">##### Link

</td></tr><tr><td colspan="2">```
/etc/pknw1/services/notflix-webui
systemctl start notflix-stack | systemctl stop notflix-stack 
```

</td></tr><tr style="height:29.8px;"><td style="height:29.8px;">jellyfin</td><td style="height:29.8px;">[https://notflix.pknw1.co.uk](https://notflix.pknw1.co.uk) </td></tr><tr style="height:29.8px;"><td style="height:29.8px;">jellyseerr</td><td style="height:29.8px;">[https://requests.pknw1.co.uk](https://requests.pknw1.co.uk) </td></tr><tr style="height:29.8px;"><td style="height:29.8px;">jellyseerr-admin</td><td style="height:29.8px;">[https://accounts.pknw1.co.uk](https://accounts.pknw1.co.uk) </td></tr><tr style="height:29.8px;"><td style="height:29.8px;">jellyfin\_vue</td><td style="height:29.8px;">[https://vue.pknw1.co.uk](https://vue.pknw1.co.uk) </td></tr></tbody></table>

<table id="bkmrk-radarr-sonarr-prowla" style="border-collapse:collapse;width:100%;height:452.05px;"><colgroup><col style="width:27.5328%;"></col><col style="width:72.4672%;"></col></colgroup><tbody><tr><td colspan="2">##### **Notflix-Backend Applications**

</td></tr><tr style="height:64.85px;"><td style="height:64.85px;">##### Application

</td><td style="height:64.85px;">##### Link

</td></tr><tr style="height:85.4px;"><td colspan="2" style="height:85.4px;">```
/etc/pknw1/services/notflix-backend
systemctl start notflix-backend | systemctl stop notflix-backend 
```

</td></tr><tr style="height:35.4px;"><td style="height:35.4px;">radarr</td><td style="height:35.4px;">[https://radarr.admin.pknw1.co.uk](https://radarr.admin.pknw1.co.uk) </td></tr><tr style="height:35.4px;"><td style="height:35.4px;">sonarr</td><td style="height:35.4px;">[https://sonarr.admin.pknw1.co.uk](https://sonarr.admin.pknw1.co.uk) </td></tr><tr style="height:35.4px;"><td style="height:35.4px;">prowlarr</td><td style="height:35.4px;">[https://prowlarr.admin.pknw1.co.uk](https://prowlarr.admin.pknw1.co.uk) </td></tr><tr style="height:29.8px;"><td style="height:29.8px;">flaresolverr</td><td style="height:29.8px;">  
</td></tr><tr style="height:35.4px;"><td style="height:35.4px;">utorrent</td><td style="height:35.4px;">[https://utorrent.admin.pknw1.co.uk](https://utorrent.admin.pknw1.co.uk) </td></tr><tr style="height:29.8px;"><td style="height:29.8px;">iqbit</td><td style="height:29.8px;">[https://qb.admin.pknw1.co.uk](https://qb.admin.pknw1.co.uk) </td></tr><tr style="height:35.4px;"><td style="height:35.4px;">jackett</td><td style="height:35.4px;">[https://jacket.admin.pknw1.co.uk](https://jacket.admin.pknw1.co.uk) </td></tr><tr style="height:29.8px;"><td style="height:29.8px;">ytptube</td><td style="height:29.8px;">DISABLED</td></tr><tr style="height:35.4px;"><td style="height:35.4px;">metube</td><td style="height:35.4px;">[https://metube.admin.pknw1.co.uk](https://metube.admin.pknw1.co.uk) [https://metube.pknw1.co.uk](https://metube.pknw1.co.uk) </td></tr></tbody></table>

<table id="bkmrk-pihole-squid-caddy-n" style="border-collapse:collapse;width:100%;height:392.45px;"><colgroup><col style="width:26.8176%;"></col><col style="width:73.1824%;"></col></colgroup><tbody><tr><td colspan="2">##### **User-Networking Applications**

</td></tr><tr style="height:64.85px;"><td style="height:64.85px;">##### Application

</td><td style="height:64.85px;">##### Link

</td></tr><tr style="height:85.4px;"><td colspan="2" style="height:85.4px;">```
/etc/pknw1/services/user-networking
systemctl start user-networking | systemctl stop user-networking
```

</td></tr><tr style="height:35.4px;"><td style="height:35.4px;">pihole</td><td style="height:35.4px;">[https://pihole.admin.pknw1.co.uk](https://pihole.admin.pknw1.co.uk) </td></tr><tr style="height:29.8px;"><td style="height:29.8px;">squid</td><td style="height:29.8px;">100.100.69.2:3128</td></tr><tr style="height:35.4px;"><td style="height:35.4px;">caddy</td><td style="height:35.4px;">[https://www.webmin.pknw1.co.uk](https://www.webmin.pknw1.co.uk) </td></tr><tr style="height:35.4px;"><td style="height:35.4px;">caddy ui</td><td style="height:35.4px;">[https://caddyui.admin.pknw1.co.uk](https://caddyui.admin.pknw1.co.uk) </td></tr><tr style="height:35.4px;"><td style="height:35.4px;">notflix-reddit-webhook</td><td style="height:35.4px;">[https://adduser.admin.pknw1.co.uk](https://adduser.admin.pknw1.co.uk) [https://signup.admin.pknw1.co.uk](https://signup.admin.pknw1.co.uk) </td></tr><tr style="height:35.4px;"><td style="height:35.4px;">bookstack</td><td style="height:35.4px;">[https://bookstack.notflix.pknw1.co.uk](https://bookstack.notflix.pknw1.co.uk) </td></tr><tr style="height:35.4px;"><td style="height:35.4px;">uptime-kuma</td><td style="height:35.4px;">[https://status.pknw1.co.uk](https://status.pknw1.co.uk) </td></tr></tbody></table>

# Borg Backup for Container Config

[![borg-logo.png](https://bookstack.notflix.pknw1.co.uk/uploads/images/gallery/2025-07/scaled-1680-/borg-logo.png)](https://bookstack.notflix.pknw1.co.uk/uploads/images/gallery/2025-07/borg-logo.png)

Install latest release of [https://www.borgbackup.org/](https://www.borgbackup.org/) from [https://github.com/borgbackup/borg/releases](https://github.com/borgbackup/borg/releases)

- ##### custom backup scripts to backup container configs from `/etc/svc/config/${APPNAME} `

##### 1. Initialization of backups

- [ ] create a new borg repository locally in /dev/shm/${APPNAME}
- [ ] Create a new github repository under pknw1-config/borg-${APPNAME}
- [ ] Push the base files as the initial commit

```
export APPNAME=bookstack
export CONF_FOLDER=/etc/svc/config/${APPNAME}
borg repo-create --encryption repokey-aes-ocb -r /dev/shm/${APPNAME}
gh repo create pknw1-config/borg-${APPNAME} --private
cd /dev/shm/${APPNAME}
git init && git add . && git commit -m "init" && git branch -M main && git remote add origin git@github.com:pknw1-config/borg-${APPNAME}.git && git push -u origin main

```

- [ ] create an initial backup

```
borg -p -r /dev/shm/${APPNAME} create ${APPNAME} -e '*MediaCover*' -e '*Logs*' -e '*logs*' -e '*Backups*' -e '*cache*' -e 'metadata' --stats "init" ${CONF_FOLDER}
```

##### 2. Regular Backups

<details id="bkmrk-borg-docker-auto.sh-"><summary>borg-docker-auto.sh</summary>

```
#!/bin/bash
BRANCH=$(date +%s)
COMMIT=$BRANCH
export BORG_PASSPHRASE=****secret****

if [[ $# -eq 0 ]]
then
  echo "no application specified - trying to guess"

  GUESS=$(pwd | awk -F/ '{print $NF}')
  if [[ -d /etc/svc/config/${GUESS} ]] || [[ -d /etc/pknw1/config/${GUESS} ]]
  then
    echo " ${GUESS}"
    read -N 1 -p "Guessed App ${GUESS} found : Proceed? [Y/N] : " PROCEED
    PROCEEDU=$(echo ${PROCEED} | tr '[:lower:]' '[:upper:]')
    if [[ ${PROCEEDU} == "Y" ]]
    then
      echo "Y"
      APPNAME=${GUESS}
    else
      echo "N"
      exit 0
    fi
  else
    echo "could not guess"
  fi
else
  echo "appname ${1} supplied"
  APPNAME=$1
fi

REMOTE_REPO=$(git ls-remote git@github.com:pknw1-config/borg-${APPNAME}.git)
if ! [[ -z ${REMOTE_REPO} ]]
then
  echo "repo found"
else
  echo "no repo"
  exit 128
fi

[[ -d /etc/svc/config/${APPNAME} ]] && read -p "Using config folder /etc/svc/config/${APPNAME} - or enter alternative locatioon: " CONF_FOLDER_OVERRIDE

if [[ -z ${CONF_FOLDER_OVERRIDE} ]] 
then 
    echo "using default" 
    CONF_FOLDER=/etc/svc/config/${APPNAME}
else
    while ! [[ -d ${CONF_FOLDER_OVERRIDE} ]]
    do
        read -p "   Error ${CONF_FOLDER_OVERRIDE} folder not found - enter a new location : " CONF_FOLDER_OVERRIDE
        if [[ -z ${CONF_FOLDER_OVERRIDE} ]] 
        then
            echo "no location"
            exit 127
        fi
    done
    echo "using ${CONF_FOLDER_OVERRIDE}"
    CONF_FOLDER=${CONF_FOLDER_OVERRIDE}
fi

echo $CONF_FOLDER

MATCHED_CONTAINERS=$(docker ps | grep $APPNAME | awk '{print $2}' )
MATCHED_CONTAINERS_COUNT=$(docker ps | grep $APPNAME | awk '{print $2}'|wc -l )

case $MATCHED_CONTAINERS_COUNT in
   "0") echo "Error zero" 
        exit 128
        ;;
   "1") VALID_LIST=[]
        VALID_LIST+=(${MATCHED_CONTAINERS})
        ;;
   *) echo $MATCHED_CONTAINERS_COUNT
        VALID_LIST=[]
        FIRST_CONTAINER=$(docker ps | grep $APPNAME | awk '{print $2}'|head -n1)
        PROJECT=$(docker inspect ${FIRST_CONTAINER}| grep '"com.docker.compose.project"' | awk -F\" '{print $4}')

        for TEST_CONTAINER in $(docker ps | grep $APPNAME | awk '{print $2}')
        do
            PROJECT_TEST=$(docker inspect ${TEST_CONTAINER}| grep '"com.docker.compose.project"' | awk -F\" '{print $4}')
            if [[ ${PROJECT_TEST} == ${PROJECT} ]]
            then
              #echo "add"
              VALID_LIST+=(${TEST_CONTAINER})
            fi
        done 
   ;;
esac

for CONTAINER in "${VALID_LIST[@]}" # or you can use “${stringPhrases[*]}”
do
    echo "Stopping $CONTAINER";
    docker stop ${CONTAINER}
done  

[[ -d /dev/shm/${APPNAME} ]] || git clone git@github.com:pknw1-config/borg-${APPNAME}.git /dev/shm/${APPNAME}

cd /dev/shm/${APPNAME} && git checkout -b ${BRANCH} 
borg -p -r /dev/shm/${APPNAME} create ${APPNAME} -e '*MediaCover*' -e '*Logs*' -e '*logs*' -e '*Backups*' -e '*cache*' -e 'metadata' --stats $COMMIT ${CONF_FOLDER}
git add . && git commit -m ${COMMIT} && git push -u origin ${BRANCH}


for CONTAINER in "${VALID_LIST[@]}" # or you can use “${stringPhrases[*]}”
do
    echo "Starting $CONTAINER";
    docker start ${CONTAINER}
done 
```

</details>Using the backup script `borg-docker-auto.sh ${APPNAME} `will

- [ ] find all running containers under the app project and `docker stop` each container
- [ ] if `/dev/shm/${APPNAME} `doesnt exist, it will clone the remote repo `pknw1-config/borg-${APPNAME}` is cloned locally
- [ ] a nw git branch is created
- [ ] borg backup from `/etc/svc/config/${APPNAME} `is done to the folder
- [ ] all files are `git add`, `git commit` and `git push` to the new branch
- [ ] each of the stopped containers are re-restarted with docker start