Scenario: customer want to have OJS in docker containers.
Solution: official OJS docker container + Mariadb container deployed on Ubuntu 24.04
Solution. this solution specifically designed for OJS v3_3_0-8. upgrade from it to 3_3_0-9 working fine, but for different versions there could be some differences.
Update OS and install necesary packages
apt-get update
apt-get install -y ca-certificates curl wget
install docker GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
Install docker repo
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
Install docker engine
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
create folders and assign rights
mkdir /opt/ojs
cd /opt/ojs
mkdir ./volumes && chown 100:101 ./volumes -R
mkdir ./volumes/private && chown 100:101 ./volumes/private -R
mkdir ./volumes/public && chown 100:101 ./volumes/public -R
mkdir ./volumes/db && chown 999:999 ./volumes/db -R
mkdir ./volumes/logs && mkdir ./volumes/logs/db && chown 999:999 ./volumes/logs/db -R
mkdir ./volumes/config && wget "https://github.com/pkp/ojs/raw/3_3_0-8/config.TEMPLATE.inc.php" -O ./volumes/config/ojs.config.inc.php
create shell-script to run container.
cat << EOF > /opt/ojs/control_ojs.sh
#!/bin/bash
case "\$1" in
start)
docker compose -f /opt/ojs/docker-compose.yml up -d
;;
stop)
docker compose -f /opt/ojs/docker-compose.yml down
;;
restart)
docker compose -f /opt/ojs/docker-compose.yml down
docker compose -f /opt/ojs/docker-compose.yml up -d
;;
*)
echo "Usage: ./control_ojs.sh {start|stop|restart}"
exit 1
;;
esac
EOF
chmod +x /opt/ojs/control_ojs.sh
Create docker compose file
cat << EOF > /opt/ojs/docker-compose.yml
services:
db:
image: mariadb:10.2
container_name: "ojs_db_demo"
environment:
MYSQL_ROOT_PASSWORD: "ojsPwd"
MYSQL_DATABASE: "ojs"
MYSQL_USER: "ojs"
MYSQL_PASSWORD: "ojsPwd"
volumes:
- ./volumes/db:/var/lib/mysql
- ./volumes/dump:/docker-entrypoint-initdb.d
networks:
- inside
restart: always
ojs:
image: pkpofficial/ojs:3_3_0-8
container_name: "ojs_app_demo"
hostname: "demo"
ports:
- "80:80"
- "443:443"
volumes:
- /etc/localtime:/etc/localtime
- ./volumes/private:/var/www/files
- ./volumes/public:/var/www/html/public
- ./volumes/logs/app:/var/log/apache2
# # WARNING: You can only enable file-volumes if file exists in the container.
- ./volumes/config/ojs.config.inc.php:/var/www/html/config.inc.php
networks:
- inside
depends_on:
- db
restart: always
networks:
inside:
external: false
ipam:
config:
- subnet: 10.100.10.0/24
EOF
start container
/opt/ojs/control_ojs.sh start
After initial configuration (or if you migrating DB from different server), edit file /opt/ojs/docker-compose.yml to comment out (or delete) following lines and restart container after that:
# environment:
# MYSQL_ROOT_PASSWORD: "ojsPwd"
# MYSQL_DATABASE: "ojs"
# MYSQL_USER: "ojs"
# MYSQL_PASSWORD: "ojsPwd"
done.
Upgrade/update procedure for OJS
Edit file /opt/ojs/docker-compose.yml – correct line with desired version of OJS: image: pkpofficial/ojs:3_3_0-8
restart container:
/opt/ojs/control_ojs.sh restart
When containers started, execute following command and watch for errors:
docker exec -it ojs_app /usr/local/bin/ojs-upgrade
Wait for line similar to: Successfully upgraded to version 3.3.0.9
Note: Upgrading to different major/minor versions may require additional steps – probably changes to configuration file.
Note: Also, as upgrade path recommended to update to latest available build for minor version and update to first available build in next minor version. for example to upgrade 3.3.0.3->3.4.0.6, do following updates: 3.3.0.3->3.3.0.18, 3.3.0.18->3.4.0.1, 3.4.0.1->3.4.0.6
Happy journaling!