Skip to main content

Backup & Recovery

A complete OJS backup consists of three parts: database, files directory, and config.

What to Back Upโ€‹

ComponentLocationContains
DatabaseMySQL/PostgreSQLAll journal content, users, settings
Files directoryfiles_dir in configUploaded manuscripts, galleys, images
Public directory[ojs_root]/public/Journal logos, uploaded images
Config file[ojs_root]/config.inc.phpDatabase credentials, settings

Database Backupโ€‹

# MySQL
mysqldump -u ojsuser -p --single-transaction --routines ojs \
| gzip > /backups/ojs_db_$(date +%Y%m%d_%H%M).sql.gz

# PostgreSQL
pg_dump -U ojsuser ojs \
| gzip > /backups/ojs_db_$(date +%Y%m%d_%H%M).sql.gz

Files Backupโ€‹

tar -czf /backups/ojs_files_$(date +%Y%m%d_%H%M).tar.gz /var/www/ojs-files

Automated Backup Scriptโ€‹

Create /usr/local/bin/ojs-backup.sh:

#!/bin/bash
BACKUP_DIR=/backups/ojs
DATE=$(date +%Y%m%d_%H%M)
mkdir -p $BACKUP_DIR

# Database
mysqldump -u ojsuser -pYOURPASSWORD --single-transaction ojs \
| gzip > $BACKUP_DIR/db_$DATE.sql.gz

# Files
tar -czf $BACKUP_DIR/files_$DATE.tar.gz /var/www/ojs-files

# Config
cp /var/www/html/ojs/config.inc.php $BACKUP_DIR/config_$DATE.inc.php

# Remove backups older than 30 days
find $BACKUP_DIR -mtime +30 -delete

echo "OJS backup completed: $DATE"

Add to crontab:

0 2 * * * /usr/local/bin/ojs-backup.sh >> /var/log/ojs-backup.log 2>&1

Restoring from Backupโ€‹

1. Restore Filesโ€‹

tar -xzf ojs_files_YYYYMMDD.tar.gz -C /

2. Restore Databaseโ€‹

# MySQL
gunzip < ojs_db_YYYYMMDD.sql.gz | mysql -u ojsuser -p ojs

# PostgreSQL
gunzip < ojs_db_YYYYMMDD.sql.gz | psql -U ojsuser ojs

3. Restore Configโ€‹

cp config_YYYYMMDD.inc.php /var/www/html/ojs/config.inc.php

4. Clear Cacheโ€‹

cd /var/www/html/ojs
php lib/pkp/tools/cacheClear.php

Further Readingโ€‹