OpenOLAT
Overview
OpenOLAT is a mature open source learning management system used by universities, schools and training organisations, among them the Universities of Zurich, Bern and Innsbruck. It brings course design and delivery together in one web platform. Features include a visual course editor with learning paths, SCORM, xAPI and IMS content packages, tests and a shared question bank built on QTI 2.1, and assessment and grading tools. It also offers groups with forums, wikis and file sharing, e-portfolios, curriculum management, certificates and badges, calendars and virtual classroom integrations.
This SecureAnyCloud image delivers the official OpenOLAT 21.0.3 release, ready to use on Ubuntu 24.04 and served over HTTPS. Every per-VM secret is generated on first boot.
OpenOLAT is free software published under the Apache License 2.0. The licence and the project's NOTICE file ship in the image at /opt/openolat/LICENSE and /opt/openolat/NOTICE.TXT. OpenOlat and the OpenOlat logo are trademarks of frentix GmbH, Zurich. SecureAnyCloud is not affiliated with, endorsed by, or sponsored by frentix GmbH. This image packages the upstream open source release with SecureAnyCloud's provisioning, hardening and support.
What you get:
- OpenOLAT 21.0.3 from the official release (built from the upstream
OpenOLAT_21.0.3tag), deployed at/opt/openolat/webappwith its file store at/var/lib/openolat/olatdata - A dedicated Apache Tomcat 10.1 on Ubuntu's OpenJDK 21, listening on
127.0.0.1:8088only, with a Java heap sized automatically at 40% of the VM's memory - A local PostgreSQL 16 database, bound to
127.0.0.1only - nginx serving OpenOLAT over HTTPS at
https://<vm-ip>/, with port 80 only redirecting to HTTPS and serving no content of its own - A per-VM administrator password, database password, maintenance tokens, installation identifier and HTTPS certificate, all generated on first boot and written to a root-only file. No default, shared or published credential ships in the image, and the web server does not start until first boot has finished
- A database schema created during the image build, so there is no setup wizard and nothing to configure before you sign in
- Self-registration, guest access and the REST API switched off until you choose to enable them
- 24/7 SecureAnyCloud support
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.
Standard_B2ms (2 vCPU / 8 GiB RAM) is the recommended starting size. OpenOLAT is a Java application with a local database, and on an 8 GiB VM the Java heap grows automatically to about 3.2 GB. Choose a larger size for large course catalogues, many concurrent learners, or heavy video and SCORM use.
Configure the network security group (NSG) to allow inbound 22/tcp from your management network and 443/tcp (HTTPS) from wherever your learners and staff will browse. 80/tcp is optional and only redirects to HTTPS.
Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for OpenOLAT by SecureAnyCloud, and select Create.
On the Basics tab, pick your subscription, resource group, region and size (Standard_B2ms or larger). Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTPS (443).
Select Review + create, then Create.
Deploy from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:openolat-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name openolat \
--image sac1647283583153:openolat-ubuntu-24-04:default:latest \
--size Standard_B2ms \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku StandardOpen port 443 so learners can reach the platform:
az vm open-port --resource-group <your-rg> --name openolat --port 443 --priority 900Connect to your VM
ssh azureuser@<vm-public-ip>Confirm the OpenOLAT stack is running
First boot generates this VM's secrets and only then starts the application and the web server. Wait two or three minutes after the VM is created before you connect. When the three units are active, the platform is ready:
systemctl is-active postgresql openolat nginxactive active activeConfirm that OpenOLAT answers over HTTPS on the VM itself, and check the release. The image ships a self-signed certificate, so -k is expected here until you install your own certificate in Step 11:
curl -sk https://127.0.0.1/dmz/ | grep -oE 'OpenOlat( | )[0-9.]+' | sed 's/ / /' | sort -uOpenOlat 21.0.3Check what the network can reach
Only SSH and the two web ports listen on the VM's network interfaces. Tomcat and PostgreSQL are bound to the loopback address, and the systemd DNS stub resolver is local only:
sudo ss -H -lnt | awk '{print $4}' | sort -u0.0.0.0:22 0.0.0.0:443 0.0.0.0:80 127.0.0.1:5432 127.0.0.1:8088 127.0.0.53%lo:53 127.0.0.54:53 [::]:22 [::]:443 [::]:80Port 80 serves only a permanent redirect to HTTPS:
curl -s -o /dev/null -w '%{http_code} -> %{redirect_url}\n' http://127.0.0.1/301 -> https://127.0.0.1/Retrieve the first-boot credentials
Every secret on this VM was generated on its first boot and written to a file that only root can read. No secret is shared with any other deployment:
sudo cat /root/openolat-credentials.txt# OpenOLAT 21.0.3 on Ubuntu 24.04 by sac - per-VM credentials (generated at first boot)
# Sign in at the URL below as 'administrator'. Your browser will warn about the
# self-signed certificate until you install a certificate for your own domain. OPENOLAT_URL=https://<vm-public-ip>/ openolat.admin.user=administrator openolat.admin.pass=<unique to this VM> openolat.db.name=openolat openolat.db.user=openolat openolat.db.pass=<unique to this VM>administrator is OpenOLAT's built-in system administrator account. OpenOLAT's published default password for that account never exists in this image. The build seeds the account with a random value instead, and replaces it again before capture with a value nobody records.
Your VM generates its own password on first boot, and the first-boot log records each step:
sudo tail -n 3 /var/log/sac/sac-firstboot.log[...] openolat-firstboot: writing /root/openolat-credentials.txt [...] openolat-firstboot: secrets minted - releasing the web stack [...] openolat-firstboot: first boot complete - OpenOLAT is at https://<vm-public-ip>/Sign in
Browse to https://<vm-public-ip>/. Your browser warns about the self-signed certificate. Accept the warning to continue, or install your own certificate first (Step 11).
OpenOLAT signs you in in two stages. Enter the username administrator and select Login, then enter the password from Step 6. The first time you sign in, OpenOLAT asks you to accept its terms of use.
You can also verify the credential from the VM itself. The image includes a small checker that signs in through the real OpenOLAT login form. It reads the password from standard input, so the password never appears on a command line:
sudo sed -n 's/^openolat\.admin\.pass=//p' /root/openolat-credentials.txt | sudo /usr/local/sbin/openolat-login-check administratorLOGIN_OKOpenOLAT's published default password is rejected:
printf 'openolat' | sudo /usr/local/sbin/openolat-login-check administrator || trueLOGIN_REJECTEDChange the administrator password after your first sign-in. Open the menu under your initials at the top right and choose Password. OpenOLAT requires at least 12 characters, including a letter and a digit or symbol.
Build and publish your first course
Choose Authoring in the top navigation, then Create and Course. Give the course a title, keep the default course design (With learning path) and select Create. OpenOLAT opens the new course's settings. The course appears in Authoring under My entries with the status Preparation.
Open Administration in the course toolbar and choose Course editor. Use Insert course elements to add content, for example a Page for the course introduction, a Forum for discussion and a Folder for course materials. Rename each element on its Title and description tab and select Save.
Close the editor by selecting the course title in the breadcrumb, then choose Publish automatically. The course now shows its elements in the learning path on the left.
When you are ready for learners, change the course Status from Preparation to Published. Then add participants under Administration, Members management.
Add users
Choose User management in the top navigation. You can create accounts one by one or import a list, and assign roles such as author, coach or learner administrator.
For a larger institution, OpenOLAT can also sign users in through LDAP, Shibboleth or OpenID Connect identity providers instead of local accounts. See the OpenOLAT administrator manual for each option.
Configure outbound email
OpenOLAT sends account, notification and password-reset mail. Outbound mail is switched off in this image until you configure a relay. Azure blocks outbound port 25 on most subscriptions, so use an authenticated provider on port 587.
Open More, Administration, Core functions, E-mail. Enter your provider's host, port, username and password, then send yourself a test message.
Use a domain name and your own certificate
Point a DNS A record at the VM's public IP. Then tell OpenOLAT the name to use in the links it builds, such as those in notification mail.
Until you set a name, the image points OpenOLAT at the VM's current public IP on every boot. Once you set your own name, the image never overwrites it:
sudo sed -i 's/^server\.domainname=.*/server.domainname=lms.example.com/' /opt/openolat/lib/olat.local.properties
sudo systemctl restart openolatWhen the name resolves publicly, obtain a certificate for it. The Certbot nginx plugin installs the certificate and renews it automatically:
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d lms.example.comSecurity model
- No default credentials. No default or shared credential ships in the image. The OpenOLAT administrator password, the database password, OpenOLAT's maintenance and session-administration URL tokens, its installation identifier and the HTTPS certificate are all generated on this VM's first boot.
- Never half-configured. The database role has no password at all in the captured image. Tomcat and nginx are both held back until first boot has generated this VM's secrets, so a VM is never reachable half-configured.
- Minimal network exposure. Only
22/tcp,80/tcpand443/tcplisten off the VM.80/tcpissues a permanent redirect to HTTPS and serves nothing else. Tomcat is bound to127.0.0.1:8088with no shutdown port and no sample applications, and PostgreSQL is bound to127.0.0.1. - Features off by default. Self-registration, guest access and the REST API are off by default:
sudo grep -E '^(server\.domainname|registration\.enableSelfRegistration|login\.enableGuestLoginLinks|restapi\.enable|smtp\.host)=' /opt/openolat/lib/olat.local.propertiesserver.domainname=<vm-public-ip> smtp.host=disabled registration.enableSelfRegistration=false login.enableGuestLoginLinks=false restapi.enable=falseTurn on self-registration under More, Administration, Login, Self-registration, and guest access under Anonymous and external user. Do this only when you intend to accept public sign-ups or anonymous visitors.
Ubuntu's unattended security upgrades remain enabled. Every package in the stack comes from Ubuntu's main archive except Apache Tomcat, which is the upstream 10.1 release.
Memory and logs
The Java heap follows the VM size, so to give OpenOLAT more memory you only need to resize the VM:
ps -o args= -u openolat | tr ' ' '\n' | grep -E '^-XX:(Max|Initial)RAMPercentage'-XX:InitialRAMPercentage=12 -XX:MaxRAMPercentage=40OpenOLAT's application log is /opt/openolat/logs/olat.log. It rolls over daily and keeps 30 days. Tomcat's own output goes to the systemd journal (journalctl -u openolat):
sudo tail -n 5 /opt/openolat/logs/olat.logBack up your platform
OpenOLAT keeps its state in two places: the PostgreSQL database and the file store at /var/lib/openolat/olatdata. Stop the application briefly so that the two backups are consistent:
sudo systemctl stop openolat
sudo -u postgres pg_dump -Fc openolat > ~/openolat-db-$(date +%F).dump
sudo tar czf ~/openolat-files-$(date +%F).tar.gz /var/lib/openolat/olatdata
sudo systemctl start openolatCopy both backups off the VM. Take an Azure disk snapshot before any upgrade.
Maintenance and upgrades
Ubuntu security updates, including OpenJDK, PostgreSQL and nginx, are applied automatically.
To move to a later OpenOLAT 21 patch release, back up first (Step 14). Then replace the web application with the new release and restart. OpenOLAT upgrades its own database schema on start. The release files are listed at openolat.com/releases. The example below uses openolat_2104.war, so substitute the file name of the release you are installing:
cd /tmp && curl -fsSLO https://www.openolat.com/releases/openolat_2104.war
sudo systemctl stop openolat
sudo mv /opt/openolat/webapp /opt/openolat/webapp.previous
sudo mkdir /opt/openolat/webapp && sudo unzip -q /tmp/openolat_2104.war -d /opt/openolat/webapp
sudo chown -R root:openolat /opt/openolat/webapp && sudo chmod -R g+rX,o+rX /opt/openolat/webapp
sudo systemctl start openolatWatch sudo journalctl -u openolat -f until Tomcat reports that the server has started. Then sign in and check the release shown at the bottom right of every page.
Support
SecureAnyCloud provides 24/7 support for this image. Contact us at sales@secureanycloud.com or through the SecureAnyCloud support page. For questions about OpenOLAT itself, see the OpenOLAT documentation.
Deploy on Azure
Launch OpenOLAT on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com