mirror of
https://github.com/UiO-Gaming/drift.git
synced 2026-11-05 13:56:46 +01:00
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:
1 parent
0901acd52a
commit
d8aadb93c8
4 files changed
+91
-15
No files matched your search
Executable
+24
@@ -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
|
||||||
@@ -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
|
||||||
Executable
+44
@@ -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
@@ -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.
|
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
|
## uiogaming.no - Nettsiden
|
||||||
|
|
||||||
@@ -270,7 +270,9 @@ I tillegg ligger det ymse andre ting som sakspapirer fra generalforsamlinger og
|
|||||||
|
|
||||||
# Automatisk deployment
|
# 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:
|
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
|
## 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 |
|
| Navn | Type | Nivå | Innhold |
|
||||||
| ----------------- | -------- | ------------ | ----------------------------------------------- |
|
| ----------------- | -------- | ------------ | ------------------------------------- |
|
||||||
| `SSH_PRIVATE_KEY` | Secret | Organisasjon | Privat SSH-nøkkel for `github_deploy` |
|
| `SSH_PRIVATE_KEY` | Secret | Organisasjon | Privat SSH-nøkkel for `github_deploy` |
|
||||||
| `SSH_USER` | Secret | Organisasjon | Brukernavnet, altså `github_deploy` |
|
| `SSH_USER` | Secret | Organisasjon | Brukernavnet, altså `github_deploy` |
|
||||||
| `SSH_HOST` | Variable | Organisasjon | `uiogaming.no` |
|
| `SSH_HOST` | Variable | Organisasjon | `uiogaming.no` |
|
||||||
| `MAIN_BRANCH` | Variable | Organisasjon | `main` |
|
|
||||||
| `WORK_DIR` | Secret | Repo | Mappen applikasjonen ligger i på servermaskinen |
|
|
||||||
|
|
||||||
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:
|
Vil du sette opp automatisk deployment for et nytt repo:
|
||||||
|
|
||||||
1. Kopier `deploy.yml` fra et av repoene over
|
1. Legg til tjenesten i `/srv/uiogaming/docker-compose.yml` og klon repoet til `/srv/uiogaming/<repo>`
|
||||||
2. Legg til `WORK_DIR` som secret i det nye repoet
|
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. Sjekk at organisasjonens secrets og variables er tilgjengelige for det nye repoet. De kan være begrenset til utvalgte repoer
|
3. Kopier `deploy.yml` fra et av repoene over og bytt ut tjenestenavnet
|
||||||
4. Sørg for at `github_deploy` har tilgang til mappen applikasjonen ligger i på servermaskinen, samt kan kjøre `git` og `docker` der
|
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
|
# Nyttige guider
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user