Open Journal Systems (OJS) in Docker

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!