OJS on VPS: Operating Systems, Control Panels, and Staging
A Virtual Private Server (VPS) is the most common self-hosting option for academic journals running Open Journal Systems (OJS). Unlike shared hosting, a VPS gives you root access, the freedom to choose your operating system, and the ability to install any control panel or run a fully manual LEMP/LAMP stack. This article covers which OS to choose, how each major control panel interacts with an OJS deployment, and how to set up staging environments for safe upgrades.
1. Choosing a VPS Operating Systemβ
1.1 Linux β The Only Practical Choiceβ
OJS is a PHP/MySQL application designed for Linux. While it can run on Windows, the PKP development and support community focuses entirely on Linux. All PKP documentation, community forum answers, and official Docker images assume a Linux host.
1.2 Supported Distributionsβ
| Distribution | LTS / Support Period | Notes |
|---|---|---|
| Ubuntu 22.04 LTS | April 2027 (standard) / 2032 (ESM) | Most popular in PKP Community Forum; default in many VPS templates |
| Ubuntu 24.04 LTS | April 2029 | PHP 8.3 available in default repos; newer but well-tested |
| Debian 12 (Bookworm) | ~2028 | Extremely stable; preferred by system administrators who avoid Ubuntu |
| Debian 11 (Bullseye) | ~2026 | Still in LTS; PHP 8.2 via sury repo |
| AlmaLinux 9 | 2032 | RHEL 9 clone; ideal for institutions already using Red Hat/CentOS |
| Rocky Linux 9 | 2032 | Another RHEL 9 clone; widely adopted after CentOS 8 EOL |
| CentOS Stream 9 | 2027 | Rolling RHEL preview; not recommended for production stability |
Recommendation: Ubuntu 22.04 LTS or Debian 12 for new deployments. Both have PHP 8.2/8.3 readily available, large community documentation, and are supported by every major control panel.
1.3 PHP Version Availability by OSβ
OJS 3.5+ requires PHP 8.1 minimum (PHP 8.2 recommended). Default repository availability:
| OS | Default PHP | PHP 8.2 | PHP 8.3 |
|---|---|---|---|
| Ubuntu 22.04 | 8.1 | via ondrej/php PPA | via ondrej/php PPA |
| Ubuntu 24.04 | 8.3 | β default repos | β default repos |
| Debian 12 | 8.2 | β default repos | via sury repo |
| AlmaLinux / Rocky 9 | 8.0 (AppStream) | via Remi RPM repo | via Remi RPM repo |
Adding the OndΕej SurΓ½ PPA (Ubuntu/Debian):
add-apt-repository ppa:ondrej/php # Ubuntu
# or
curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg \
https://packages.sury.org/php/apt.gpg
echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] \
https://packages.sury.org/php/ $(lsb_release -sc) main" \
> /etc/apt/sources.list.d/php.list
apt update
2. VPS Providers Popular with OJS Usersβ
The PKP Community Forum regularly discusses VPS options. The providers most frequently mentioned:
| Provider | Entry Tier | Data Centres | Notable Feature |
|---|---|---|---|
| DigitalOcean | $6/mo (1 vCPU / 1 GB) | 15 regions | One-click LAMP droplets; excellent docs |
| Linode / Akamai | $5/mo | 11 regions | Competitive pricing; robust API |
| Vultr | $6/mo | 32 locations | NVMe SSD by default |
| Hetzner Cloud | β¬4.15/mo | EU + US | Best price-to-performance in Europe |
| AWS Lightsail | $5/mo | 30 regions | AWS ecosystem; easy snapshots |
| UpCloud | β¬7/mo | 12 regions | MaxIOPS SSD; strong uptime SLA |
| Contabo | β¬5.99/mo | EU, US, Asia | High-RAM / high-disk at low cost |
Minimum recommended spec for a live OJS journal: 2 vCPU / 2 GB RAM / 40 GB SSD. Scale up based on submission volume (see the Server Infrastructure article).
Community reference: PKP Forum β Recommended Hosting Providers
3. Running OJS Without a Control Panel (Manual LEMP/LAMP)β
Before discussing panels, it is worth noting that many experienced administrators choose no control panel β they configure Nginx or Apache, PHP-FPM, and MySQL manually. This approach gives maximum control and is the most documented path in PKP official guides.
The main steps are covered in the PKP Admin Guide β Installation and the OJS Installation & Requirements page in this guide.
When to choose no panel:
- You are comfortable with Linux command-line administration
- You need maximum performance (panels add overhead)
- You want to use Docker or automation tools (Ansible, Terraform)
- You are deploying multiple OJS instances on a single server (multi-journal)
4. Control Panelsβ
4.1 cPanel / WHMβ
cPanel is the most widely used commercial web hosting control panel. It runs on top of Apache (traditionally) or LiteSpeed Web Server and manages PHP via MultiPHP Manager.
OJS compatibility:
- β Supported β PHP 8.1/8.2/8.3 available via EasyApache 4
- β MySQL databases and users managed via cPanel GUI
- β File Manager for uploading/extracting OJS release archives
- β Cron jobs via cPanel cron scheduler
- β οΈ
files_dirmust be placed outsidepublic_htmlβ create it at~/ojs-files/and set permissions
OJS Installation via cPanel:
- Create the database: Databases β MySQL Databases β Create Database & User
- Upload OJS: Files β File Manager β Upload the
.tar.gztopublic_html, then extract - Set
files_dir: Create/home/username/ojs-files/via File Manager; set permissions 755 - Edit
config.inc.php: Setfiles_dir, database credentials, andbase_url - Run installer: Visit
https://yourdomain.comin a browser to complete the web installer - Add cron job: Advanced β Cron Jobs β add:
0 * * * * /usr/local/bin/php /home/username/public_html/lib/pkp/tools/scheduler.php run
PHP configuration via MultiPHP INI Editor (cPanel):
- Set
upload_max_filesize = 128M - Set
post_max_size = 128M - Set
memory_limit = 256M - Set
max_execution_time = 300
Staging on cPanel: Create a subdomain (e.g. staging.journal.com) pointing to a separate public_html/staging/ directory, and create a separate database. Copy the live database and files_dir to test upgrades before applying to production.
Source: cPanel Documentation, PKP Forum β cPanel OJS threads
4.2 Pleskβ
Plesk is a commercial control panel popular among European hosting providers and Windows users (though it also runs on Linux). It supports Apache and Nginx simultaneously (Nginx as a reverse proxy in front of Apache).
OJS compatibility:
- β PHP 8.1/8.2/8.3 selectable per-domain in Plesk PHP Settings
- β MySQL and PostgreSQL databases supported
- β Nginx + Apache combination works well with OJS
- β File Manager with extraction support
- β Scheduled tasks (cron) via Plesk Task Scheduler
OJS-specific Plesk notes:
- Set the document root for your domain to the OJS directory
- In PHP Settings, enable all required extensions:
mbstring,xml,gd,zip,intl,curl - If using Nginx+Apache mode, OJS
.htaccessrules are respected by the Apache layer - Place
files_diroutside the Pleskhttpdocsdirectory (e.g./var/www/vhosts/domain.com/ojs-files/)
Staging with Plesk: Plesk has a built-in Staging feature (available in Plesk Obsidian+):
- Go to Websites & Domains β [your site] β Staging
- Click Create Staging Copy β Plesk clones the document root and database into a staging subdomain
- Test your OJS upgrade on the staging copy
- Use Deploy to Production to push the upgraded copy back
Source: Plesk Documentation β Staging, PKP Forum β Plesk OJS threads
4.3 HestiaCPβ
HestiaCP is a free, open-source control panel forked from VestaCP. It is widely used on Debian and Ubuntu VPS instances and is frequently recommended in the PKP community for budget deployments.
OJS compatibility:
- β Nginx + PHP-FPM stack (ideal for OJS performance)
- β Apache + PHP-FPM also available
- β Supports multiple PHP versions side-by-side
- β MariaDB included
- β Let's Encrypt SSL built-in
- β Cron job manager in the web UI
- β Free and open-source
Installation overview:
# Install HestiaCP on Ubuntu 22.04
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
bash hst-install.sh
OJS on HestiaCP β key steps:
- Create a web domain in HestiaCP (Nginx + PHP 8.2 template)
- Create a MySQL database and user via HestiaCP Database panel
- Upload OJS to the web domain's
public_html - Set
files_dirto a path outsidepublic_html(HestiaCP home dirs:/home/username/) - Configure cron via HestiaCP β Cron
Custom Nginx template for OJS (HestiaCP):
HestiaCP uses Nginx template files in /usr/local/hestia/data/templates/web/nginx/. The default PHP-FPM template works with OJS. If you need URL rewriting, ensure try_files $uri $uri/ /index.php?$query_string; is present.
Source: HestiaCP Documentation, PKP Forum β HestiaCP threads
4.4 CyberPanelβ
CyberPanel is a free control panel built on top of OpenLiteSpeed (the open-source version of LiteSpeed Web Server). LiteSpeed is known for superior PHP performance over Apache/Nginx via its LSAPI handler.
OJS compatibility:
- β PHP 8.1/8.2/8.3 selectable per-website
- β MariaDB included
- β
OpenLiteSpeed handles
.htaccessβ OJS rewrite rules work - β Free tier includes Let's Encrypt and Git integration
- β οΈ Some OJS
.htaccessdirectives may need manual.htaccessadjustment for LSAPI - β οΈ Less community discussion about CyberPanel + OJS compared to cPanel or HestiaCP
OJS-specific settings:
- Increase PHP limits via CyberPanel β Websites β Edit PHP Configuration: set
upload_max_filesize,post_max_size,memory_limit files_dirshould be outside the document root (e.g./home/domain.com/ojs-files/)
One-click installs: CyberPanel's marketplace (Applications β Install) does not currently include OJS, but it does include WordPress, Joomla, and other PHP apps. OJS must be installed manually.
Source: CyberPanel Documentation, PKP Forum
4.5 DirectAdminβ
DirectAdmin is a lightweight commercial control panel popular among budget VPS providers. It supports Apache and Nginx/OpenLiteSpeed.
OJS compatibility:
- β PHP 8.1/8.2/8.3 via CustomBuild 2.0
- β MySQL/MariaDB databases managed via GUI
- β Cron jobs via DirectAdmin task scheduler
- β File Manager with archive extraction
- β Lower resource overhead than cPanel
OJS-specific notes:
- CustomBuild manages PHP versions:
cd /usr/local/directadmin/custombuild && ./build php n files_diroutside the domain'spublic_html- Let's Encrypt via SSL Certificates in user panel
Source: DirectAdmin Documentation, PKP Forum
4.6 Webmin / Virtualminβ
Webmin is a free, open-source web-based interface for Linux system administration. Virtualmin extends Webmin with virtual hosting management (similar to cPanel/Plesk).
OJS compatibility:
- β Full Linux system management β install any PHP version, web server, database
- β Apache or Nginx supported
- β MySQL/MariaDB and PostgreSQL
- β Cron jobs, firewall, SSL, user management
- β Completely free (GPL)
- β οΈ More complex UI than cPanel for non-administrators
- β οΈ No OJS-specific one-click installer
Virtualmin's Install Scripts include WordPress, Drupal, Joomla β but not OJS. You must install OJS manually after creating a virtual server in Virtualmin.
When to use Webmin/Virtualmin:
- You want a free, full-featured panel for a single institution server
- You need to manage system services (PHP-FPM pools, MySQL config) beyond what cPanel exposes
- You are comfortable with Linux and want transparency into your server
4.7 ISPConfigβ
ISPConfig is a free open-source hosting control panel that supports Apache/Nginx, PHP-FPM, MySQL/MariaDB, and multi-server setups.
OJS compatibility:
- β Nginx + PHP-FPM (ideal stack for OJS)
- β Multiple PHP versions
- β Let's Encrypt SSL
- β Cron jobs per-client
- β Reseller / multi-server management
ISPConfig is a strong choice for hosting providers or institutions that manage OJS for multiple journals / departments across servers.
Source: ISPConfig Documentation
5. Control Panel Comparison Summaryβ
| Panel | License | Best OS | Nginx+PHP-FPM | Multi-PHP | Staging Built-in | OJS Community Use |
|---|---|---|---|---|---|---|
| cPanel/WHM | Commercial | AlmaLinux / Rocky 9 | Via EasyApache | β | Manual only | ββββ (most discussed) |
| Plesk | Commercial | Ubuntu / Debian / Windows | β | β | β Native | βββ |
| HestiaCP | Free / OSS | Ubuntu 22.04 / Debian 12 | β | β | Manual | βββ |
| CyberPanel | Free / OSS | Ubuntu / AlmaLinux | OpenLiteSpeed | β | Manual | ββ |
| DirectAdmin | Commercial | Ubuntu / AlmaLinux | β | β | Manual | ββ |
| Webmin/Virtualmin | Free / OSS | Any Linux | β | β | Manual | ββ |
| ISPConfig | Free / OSS | Debian / Ubuntu | β | β | Manual | β |
| No panel (manual) | β | Any Linux | β | β | Manual / Docker | βββββ (most control) |
6. Staging Environments for OJSβ
6.1 Why Staging Mattersβ
OJS upgrades (e.g. 3.4 β 3.5) run database migrations that cannot be rolled back automatically. A staging environment lets you:
- Test that the upgrade completes without errors
- Verify that all plugins are compatible with the new version
- Test theme rendering and customisations
- Train editorial staff on the new interface before going live
Recommendation from PKP: Always test on a staging server before upgrading production. PKP Upgrading Guide
6.2 Manual Staging Setup (All Panels / No Panel)β
Step 1 β Clone the database:
# Dump production database
mysqldump -u ojsuser -p --single-transaction ojs_prod \
| gzip > /tmp/ojs_prod_$(date +%Y%m%d).sql.gz
# Restore to staging database
mysql -u ojsuser -p ojs_staging < <(gunzip -c /tmp/ojs_prod_*.sql.gz)
Step 2 β Copy the files directory:
rsync -a /var/www/ojs-files/ /var/www/ojs-files-staging/
Step 3 β Copy OJS application files:
rsync -a --exclude='cache/*' /var/www/html/ojs/ /var/www/html/ojs-staging/
Step 4 β Adjust config.inc.php on staging:
base_url[default] = "https://staging.journal.example.com"
name = ojs_staging
files_dir = /var/www/ojs-files-staging
Step 5 β Disable email sending on staging (to avoid accidental emails to authors):
; Disable outgoing email on staging
smtp_server =
default_sender_email =
Step 6 β Test the upgrade on staging:
cd /var/www/html/ojs-staging
php tools/upgrade.php upgrade
Step 7 β If staging upgrade is successful, run on production:
cd /var/www/html/ojs
php tools/upgrade.php upgrade
6.3 Staging with Plesk (Built-in)β
Plesk Obsidian and later versions include native staging. Steps (from the Plesk UI):
- Websites & Domains β [domain] β Staging
- Create Staging Copy β select "Copy database" and "Copy files"
- Plesk creates
staging.[yourdomain.com]automatically - Perform the upgrade on the staging copy
- When satisfied, use Deploy to Production
Source: Plesk Staging Documentation
6.4 One-Click / Automated Staging with Dockerβ
Using Docker Compose, a staging environment can be spun up from a copy of production data in minutes:
# Dump production DB
docker exec ojs_db mysqldump -u ojsuser -pojspassword ojs \
> /tmp/ojs_prod.sql
# Start staging stack (separate compose project)
docker compose -p ojs_staging \
-f docker-compose.staging.yml up -d
# Import production data into staging DB
docker exec -i ojs_staging_db mysql -u ojsuser -pojspassword ojs \
< /tmp/ojs_prod.sql
docker-compose.staging.yml points to the same image as production but uses a different port and a staging-specific config.inc.php via a bind mount.
6.5 Automated Staging with Git + CI/CDβ
For advanced deployments, a Git-based workflow can automate staging:
- Maintain an
upgradebranch in your deployment repository - On push, a CI/CD pipeline (GitHub Actions, GitLab CI) triggers:
- Spin up a Docker staging environment
- Restore the latest database backup
- Run
php tools/upgrade.php upgrade - Run automated smoke tests (HTTP status checks, login test)
- If all tests pass, the pipeline notifies the admin to apply the upgrade to production
Community examples of OJS CI/CD pipelines can be found in PKP Forum discussions and the pkp/docker-ojs GitHub issues.
7. General OJS Configuration Notes Applicable to All Panelsβ
Regardless of control panel, these config.inc.php settings are critical:
; Increase PHP limits (also set in php.ini / .user.ini / .htaccess)
; upload_max_filesize and post_max_size must match in PHP config
files_dir = /path/outside/webroot/ojs-files
; Force HTTPS
force_ssl = On
base_url[default] = "https://journal.example.com"
; Scheduled tasks (required for reminders, stats, DOI deposits)
scheduled_tasks = On
; Session security
session_cookie_secure = On
; Disable installation after setup
installed = On
PHP settings to apply in all environments (via .htaccess, .user.ini, php.ini, or panel GUI):
upload_max_filesize = 128M
post_max_size = 128M
memory_limit = 256M
max_execution_time = 300
max_input_vars = 3000
8. Recommendations by Use Caseβ
| Scenario | Recommended Setup |
|---|---|
| Shared hosting provider already running cPanel | Use cPanel β OJS installs cleanly; staging is manual |
| New VPS, want free panel with good performance | HestiaCP on Ubuntu 22.04 + Nginx + PHP 8.2 |
| Institutional server with Windows admin familiarity | Plesk (Linux) β best staging support of all panels |
| High-traffic or multi-journal deployment | No panel β manual Nginx + PHP-FPM + Docker |
| Budget VPS (Hetzner, Contabo), want free panel | CyberPanel (OpenLiteSpeed) or HestiaCP |
| Need reseller / multi-tenant management | ISPConfig or Virtualmin |
| Want maximum reproducibility / DevOps workflow | Docker Compose + CI/CD staging pipeline |
Referencesβ
-
PKP Admin Guide β Official installation, configuration, and upgrade documentation.
https://docs.pkp.sfu.ca/admin-guide/en/ -
PKP Upgrading Guide β Step-by-step upgrade procedures including staging recommendations.
https://docs.pkp.sfu.ca/admin-guide/en/upgrading-ojs-3 -
PKP Community Forum β The primary venue for server, panel, and staging discussions from OJS administrators.
https://forum.pkp.sfu.ca/ -
cPanel Documentation
https://docs.cpanel.net/ -
Plesk Documentation β Staging Websites
https://docs.plesk.com/en-US/obsidian/administrator-guide/websites-and-domains/staging-websites.65174/ -
HestiaCP Documentation
https://hestiacp.com/docs/ -
CyberPanel Documentation
https://cyberpanel.net/docs/ -
DirectAdmin Documentation
https://help.directadmin.com/ -
Webmin / Virtualmin Documentation
https://webmin.com/docs/ -
ISPConfig Documentation
https://www.ispconfig.org/documentation/ -
PKP docker-ojs (GitHub) β Official Docker image and Compose configuration used in staging workflows.
https://github.com/pkp/docker-ojs -
OndΕej SurΓ½ PHP PPA β PPA for PHP 8.x on Ubuntu/Debian.
https://deb.sury.org/