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