Skip to content

Powered by Grav

Maintenance

Bakup and update the server using scripts.

Backup

Create the script

BASH
cd ~/
nano pixelfed_backup.sh
SH
#!/usr/bin/env bash
set -euo pipefail

# ─── Configuration ───────────────────────────────────────────────
APP_DIR="/usr/share/webapps/pixelfed"
BACKUP_DIR="/pixelfed_backup"
VHOST="/etc/apache2/sites-available/pixelfed.cogip.be.conf"
TIMESTAMP="$(date +%Y%m%d_%H%M%S)"
PF_VERSION=$(grep -oP "'version'\s*=>\s*'\K[^']+" "$APP_DIR/config/pixelfed.php")
BACKUP_NAME="pixelfed_${PF_VERSION}_${TIMESTAMP}"
BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}"

# ─── Read DB credentials from .env ──────────────────────────────
ENV_FILE="${APP_DIR}/.env"
DB_NAME=$(grep '^DB_DATABASE=' "$ENV_FILE" | cut -d= -f2 | tr -d '"')
DB_USER=$(grep '^DB_USERNAME=' "$ENV_FILE" | cut -d= -f2 | tr -d '"')
DB_PASS=$(grep '^DB_PASSWORD=' "$ENV_FILE" | cut -d= -f2 | tr -d '"')

# ─── Create backup directory ────────────────────────────────────
mkdir -p "$BACKUP_PATH"

# ─── 1. Database dump (consistent snapshot) ─────────────────────
echo "→ Dumping database '${DB_NAME}'..."
mariadb-dump \
  --user="$DB_USER" \
  --password="$DB_PASS" \
  --single-transaction \
  --routines \
  --triggers \
  --add-drop-table \
  "$DB_NAME" \
  | gzip > "${BACKUP_PATH}/database.sql.gz"

# ─── 2. Application files (full, including vendor/) ────────────
echo "→ Archiving application files..."
sudo tar --exclude="${APP_DIR}/.git" \
    -czf "${BACKUP_PATH}/app.tar.gz" \
    -C "$(dirname "$APP_DIR")" "$(basename "$APP_DIR")"

# ─── 3. Apache vhost ────────────────────────────────────────────
echo "→ Saving vhost config..."
sudo cp "$VHOST" "${BACKUP_PATH}/"

# ─── 4. Verification ────────────────────────────────────────────
echo "→ Verifying backup..."
SQL_SIZE=$(stat -c%s "${BACKUP_PATH}/database.sql.gz")
APP_SIZE=$(stat -c%s "${BACKUP_PATH}/app.tar.gz")
if [ "$SQL_SIZE" -lt 1024 ] || [ "$APP_SIZE" -lt 1024 ]; then
  echo "ERROR: Backup file suspiciously small!" >&2
  exit 1
fi
gunzip -t "${BACKUP_PATH}/database.sql.gz"
tar -tzf "${BACKUP_PATH}/app.tar.gz" > /dev/null

# ─── 5. Final report ────────────────────────────────────────────
echo ""
echo "✓ Backup complete: ${BACKUP_PATH}"
du -sh "$BACKUP_PATH"
echo ""
echo "Restore procedure:"
echo "  1. tar -xzf ${BACKUP_PATH}/app.tar.gz -C /usr/share/webapps/"
echo "  2. sudo chown pixelfed:pixelfed /usr/share/webapps/pixelfed"
echo "  3. gunzip < ${BACKUP_PATH}/database.sql.gz | mariadb -u ${DB_USER} -p ${DB_NAME}"
echo " Optional:"
echo "  4. sudo cp ${BACKUP_PATH}/$(basename "$VHOST") /etc/apache2/sites-available/"
echo "  5. a2ensite pixelfed.cogip.be.conf && systemctl reload apache2"
BASH
chmod +x pixelfed_backup.sh

Execute the script

BASH
./pixelfed_backup.sh

Update

Create the script

BASH
cd ~/
nano pixelfed_update.sh
SH
#!/bin/bash
set -e
if [[ "$#" -ne 1 ]]; then
    echo "Usage: $0 <version-tag>  (e.g. v0.13.1)"
    exit 1
fi
APP_DIR="/usr/share/webapps/pixelfed"
cd "$APP_DIR"
sudo -u pixelfed git fetch
sudo -u pixelfed git stash || true
sudo -u pixelfed git checkout "$1"
sudo -u pixelfed git stash pop
sudo -u pixelfed composer install --no-dev
sudo -u pixelfed php artisan config:cache
sudo -u pixelfed php artisan route:cache
sudo -u pixelfed php artisan view:cache
sudo -u pixelfed php artisan migrate --force
echo "Done. Restart Apache if needed: sudo systemctl reload apache2"
BASH
chmod +x pixelfed_update.sh

Execute the script

BASH
./pixelfed_update.sh

© 2026 howto.cogip.be. All rights reserved.