Add deploy script, backup script and crontab for the server

- deploy/uiogaming-deploy: forced command for github_deploy's SSH key. Pulls the repo and rebuilds one service from /srv/uiogaming/docker-compose.yml, fixing deploys that failed on container-name conflicts.
- backup/backup_db.sh: nightly pg_dumpall of all databases, gzipped, 14-day retention.
- cron/uiogaming.crontab: the uiogaming user's crontab.
- Document the new deploy setup and the move to /srv/uiogaming.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
leanderandClaude Opus 5.5 committed 2026-11-02 22:47:28 +01:00
1 parent 0901acd52a
commit d8aadb93c8
4 files changed
+91 -15

No files matched your search

+24
View File
@@ -0,0 +1,24 @@
#!/bin/bash
# Nightly dump of all Postgres databases + roles, compressed.
# Installed on the server as /srv/uiogaming/.backups/backup_db.sh, run by cron (see ../cron/uiogaming.crontab).
# The rsync user pulls the backup folder to off-site storage every night at 03:00.
#
# Restore: gunzip -c backup_YYYY-MM-DD.sql.gz | docker exec -i postgres psql -U postgres
set -euo pipefail
BACKUP_DIR=/srv/uiogaming/.backups/postgres
KEEP_DAYS=14
log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $*"; }
fail() { log "Backup FAILED: $*" >&2; rm -f "$BACKUP_FILE"; exit 1; }
mkdir -p "$BACKUP_DIR"
BACKUP_FILE="$BACKUP_DIR/backup_$(date +%F).sql.gz"
trap 'fail "error on line $LINENO"' ERR
log "Backing up all databases"
docker exec postgres pg_dumpall -U postgres | gzip > "$BACKUP_FILE"
[[ $(gunzip -c "$BACKUP_FILE" | tail -n 5) == *"cluster dump complete"* ]] || fail "dump incomplete"
log "Backup completed: $BACKUP_FILE ($(du -h "$BACKUP_FILE" | cut -f1))"
find "$BACKUP_DIR" -name 'backup_*.sql*' -mtime +"$KEEP_DAYS" -delete
+7
View File
@@ -0,0 +1,7 @@
# Crontab for the uiogaming user on the server.
# Install (replaces the whole crontab!): crontab cron/uiogaming.crontab
# Show what's installed: crontab -l
# Nightly backup of all Postgres databases (see ../backup/backup_db.sh).
# The rsync user pulls /srv/uiogaming/.backups off-site at 03:00, so this must finish before then.
0 2 * * * /srv/uiogaming/.backups/backup_db.sh >> /srv/uiogaming/.backups/logs/backup.log 2>&1
+44
View File
@@ -0,0 +1,44 @@
#!/bin/bash
# Deploy script for automatic deployment from GitHub Actions.
#
# Installed on the server as /usr/local/bin/uiogaming-deploy (owned by root, mode 755) and set as
# the only command github_deploy's SSH key may run, in ~github_deploy/.ssh/authorized_keys:
# restrict,command="/usr/local/bin/uiogaming-deploy" ssh-ed25519 AAAA...
#
# The workflow runs `ssh github_deploy@uiogaming.no <service>`. SSH puts <service> in
# SSH_ORIGINAL_COMMAND. The script updates that repo to origin/main and rebuilds the service
# from the top-level docker-compose.yml, which owns all the containers.
set -euo pipefail
ROOT=/srv/uiogaming
BRANCH=main
# compose service name -> repo folder under $ROOT
declare -A REPO=(
[bebbes]=bebbes
[mustaboard]=mustaboard
[mustafa]=mustafa
[name100]=name-100-uio-gamers
[uiogaming.no]=uiogaming.no
)
svc=${SSH_ORIGINAL_COMMAND:-}
if [[ ! $svc =~ ^[a-z0-9.-]+$ || -z ${REPO[$svc]:-} ]]; then
echo "Usage: ssh github_deploy@uiogaming.no <service>" >&2
echo "Known services: ${!REPO[*]}" >&2
exit 1
fi
repo="$ROOT/${REPO[$svc]}"
echo "==> Deploying $svc from $repo"
git -C "$repo" fetch --quiet origin "$BRANCH"
git -C "$repo" reset --hard "origin/$BRANCH"
echo "==> Now at $(git -C "$repo" log -1 --format='%h %s')"
cd "$ROOT"
docker compose up -d --build "$svc"
# Every build leaves the previous image behind; clean those up
docker image prune -f >/dev/null
echo "==> Done"
+16 -15
View File
@@ -94,7 +94,7 @@ Mange applikasjoner har behov for en database, og til det kjører vi en sentral
Når en ny tjeneste skal gis tilgang til databasen anbefaler jeg å lage en ny bruker som bare har tilgang til databasen den skal ha, samt minimale tilganger til denne.
Backup av denne kjøres hver natt i cron job til mappa `/home/uiogaming/Documents/backups/postgres`. Denne mappa tas så backup av med _rsync_ til Leander Furumo sin personlige server off site. Dette gjøres gjennom brukeren `rsync`.
Backup av alle databasene kjøres hver natt kl. 02:00 som en cron job. Scriptet som kjører er ([`backup/backup_db.sh`](backup/backup_db.sh) som ligger i `/srv/uiogaming/.backups/backup_db.sh` på maskinen. Backups havner i `/srv/uiogaming/.backups/postgres`. Backupene komprimeres og slettes fra servermaskinen etter 14 dager. Denne mappa tas så backup av med _rsync_ til Leander Furumo sin personlige server off site kl. 03:00. Dette gjøres gjennom brukeren `rsync`, som bare har lesetilgang til backupmappa.
## uiogaming.no - Nettsiden
@@ -270,7 +270,9 @@ I tillegg ligger det ymse andre ting som sakspapirer fra generalforsamlinger og
# Automatisk deployment
Det er satt opp automatisk deployment for enkelte applikasjoner. Hver gang det pushes til _main_ branch på GitHub vil det kjøres en GitHub Action som logger seg på gjennom SSH og utfører kommandoene den trenger for å oppdatere tjenesten. Dette gjøres gjennom brukeren `github_deploy`.
Det er satt opp automatisk deployment for enkelte applikasjoner. Hver gang det pushes til _main_ branch på GitHub vil det kjøres en GitHub Action som logger seg på gjennom SSH som brukeren `github_deploy` og kjører `ssh github_deploy@uiogaming.no <tjeneste>`.
SSH-nøkkelen til `github_deploy` har bare lov til å kjøre scriptet [`deploy/uiogaming-deploy`](deploy/uiogaming-deploy), som ligger på servermaskinen som `/usr/local/bin/uiogaming-deploy`. Scriptet oppdaterer repoet til `origin/main` og bygger tjenesten på nytt med `docker compose up -d --build <tjeneste>` fra `/srv/uiogaming/docker-compose.yml`. Det er denne felles compose-fila som eier alle containerne, så `docker-compose.yml` i hvert enkelt repo brukes ikke av deploy. Deploy kan også kjøres manuelt fra _Actions_-fanen i repoet (_Run workflow_).
I skrivende stund fungerer dette for følgende tjenester:
@@ -282,24 +284,23 @@ I skrivende stund fungerer dette for følgende tjenester:
## Secrets og variabler
Workflowen (`.github/workflows/deploy.yml`) er lik i alle repoene og henter innloggingsinfo fra GitHub sine _secrets_ og _variables_. De fleste av disse er satt på organisasjonsnivå, under _Settings → Secrets and variables → Actions_ for [UiO-Gaming](https://github.com/UiO-Gaming), og deles av alle repoene:
Workflowen (`.github/workflows/deploy.yml`) er lik i alle repoene bortsett fra tjenestenavnet på slutten av `ssh`-kommandoen. Innloggingsinfo hentes fra GitHub sine _secrets_ og _variables_ på organisasjonsnivå, under _Settings → Secrets and variables → Actions_ for [UiO-Gaming](https://github.com/UiO-Gaming), og deles av alle repoene:
| Navn | Type | Nivå | Innhold |
| ----------------- | -------- | ------------ | ----------------------------------------------- |
| `SSH_PRIVATE_KEY` | Secret | Organisasjon | Privat SSH-nøkkel for `github_deploy` |
| `SSH_USER` | Secret | Organisasjon | Brukernavnet, altså `github_deploy` |
| `SSH_HOST` | Variable | Organisasjon | `uiogaming.no` |
| `MAIN_BRANCH` | Variable | Organisasjon | `main` |
| `WORK_DIR` | Secret | Repo | Mappen applikasjonen ligger i på servermaskinen |
| Navn | Type | Nivå | Innhold |
| ----------------- | -------- | ------------ | ------------------------------------- |
| `SSH_PRIVATE_KEY` | Secret | Organisasjon | Privat SSH-nøkkel for `github_deploy` |
| `SSH_USER` | Secret | Organisasjon | Brukernavnet, altså `github_deploy` |
| `SSH_HOST` | Variable | Organisasjon | `uiogaming.no` |
Den offentlige delen av SSH-nøkkelen ligger i `~/.ssh/authorized_keys` til `github_deploy` på servermaskinen. Byttes nøkkelen må begge stedene oppdateres, men bare én gang siden den deles av alle repoene.
Den offentlige delen av SSH-nøkkelen ligger i `~/.ssh/authorized_keys` til `github_deploy` på servermaskinen, med `restrict,command="/usr/local/bin/uiogaming-deploy"` foran. Byttes nøkkelen må begge stedene oppdateres, men bare én gang siden den deles av alle repoene.
Vil du sette opp automatisk deployment for et nytt repo:
1. Kopier `deploy.yml` fra et av repoene over
2. Legg til `WORK_DIR` som secret i det nye repoet
3. Sjekk at organisasjonens secrets og variables er tilgjengelige for det nye repoet. De kan være begrenset til utvalgte repoer
4. Sørg for at `github_deploy` har tilgang til mappen applikasjonen ligger i på servermaskinen, samt kan kjøre `git` og `docker` der
1. Legg til tjenesten i `/srv/uiogaming/docker-compose.yml` og klon repoet til `/srv/uiogaming/<repo>`
2. Legg til tjenesten i `REPO`-lista i [`deploy/uiogaming-deploy`](deploy/uiogaming-deploy), og kopier scriptet til `/usr/local/bin/uiogaming-deploy` på servermaskinen
3. Kopier `deploy.yml` fra et av repoene over og bytt ut tjenestenavnet
4. Sjekk at organisasjonens secrets og variables er tilgjengelige for det nye repoet. De kan være begrenset til utvalgte repoer
5. Kjør `git config --global --add safe.directory /srv/uiogaming/<repo>` som `github_deploy`
# Nyttige guider