Cl
Applications Azure

Claper on Ubuntu 24.04 on Azure User Guide

| Product: Claper on Ubuntu 24.04 LTS on Azure

Overview

This guide covers the deployment and configuration of Claper on Ubuntu 24.04 on Azure using cloudimg Azure Marketplace images. Claper is an open source interactive presentation platform. A presenter uploads their slides and Claper turns the deck into a live session that the audience follows on their own phone or laptop by opening a short join link, with no account and no app to install. Alongside each slide the presenter can run multiple choice polls, scored quizzes, open questions and messages and emoji reactions, and every response updates live on screen as people answer.

All of that real time interaction is delivered by Phoenix LiveView and WebSockets, so votes, questions and reactions appear the moment they are sent. Because the platform is self hosted, the presentation content, the audience responses and the attendee identities stay on infrastructure you control.

The cloudimg image ships the free and open source, AGPL-3.0 licensed Claper release, run the officially supported way as the upstream container pinned by image digest, paired with PostgreSQL 15. Both images are captured into the VM, so your instance starts in seconds with nothing to download. Claper is fronted by nginx on port 80, configured to proxy the LiveView WebSocket upgrades the live features depend on, while Claper itself binds to the loopback interface and PostgreSQL publishes no host port at all. The Phoenix SECRET_KEY_BASE, the database password and a unique administrator password are all generated on the first boot of every VM, the upstream default administrator is never created, and public presenter sign up is disabled. Backed by 24/7 cloudimg support.

Claper is a trademark of its respective owner. This image is produced by cloudimg and is not affiliated with, endorsed by, or sponsored by ClaperCo or the Claper project. It ships the free and open source AGPL-3.0 licensed software, unmodified.

The docker, claper-firstboot, claper, claper-postboot and nginx services all active, and the two compose containers, the Claper release and PostgreSQL 15, up and healthy

What is included:

  • Claper 3.0.0 — the official upstream release container ghcr.io/claperco/claper:3.0.0, pinned by image digest, with the compiled front end and the LibreOffice slide conversion toolchain built in
  • PostgreSQL 15 — the application database, on a private container network with no host port published
  • nginx — the single public listener on port 80, configured for the LiveView / Channels WebSocket upgrades the live features rely on
  • First boot secret generation — Phoenix SECRET_KEY_BASE, database password and a unique administrator password, all generated per VM, replacing the published upstream defaults
  • A bundled self test — logs in as the per VM administrator, proves the upstream defaults are refused, and confirms the live WebSocket upgrades

Prerequisites

  • An Azure subscription with permission to create virtual machines
  • An SSH key pair for administrative access
  • A network security group allowing inbound TCP 22 (SSH) and TCP 80 (web UI) from your own address ranges
  • Standard_B2s (2 vCPU, 4 GB RAM) or larger. Claper is comfortable on Standard_B2s for small and medium sessions; for large live audiences or big slide decks, choose a larger size with more RAM.

Step 1: Deploy from the Azure Portal

  1. Open the Azure Marketplace and search for Claper on Ubuntu 24.04 LTS by cloudimg.
  2. Select Create, then choose your subscription, resource group and region.
  3. Pick a VM size of Standard_B2s or larger.
  4. Under Administrator account, select SSH public key and supply your public key.
  5. Under Inbound port rules, allow SSH (22) and HTTP (80).
  6. Select Review + create, then Create.

Step 2: Deploy from the Azure CLI

az group create --name claper-rg --location eastus
az vm create \
  --resource-group claper-rg \
  --name claper-vm \
  --image cloudimg:claper:default:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-sku Standard

az vm open-port --resource-group claper-rg --name claper-vm --port 80 --priority 1010

Step 3: Connect to your VM

ssh azureuser@<vm-ip>

Step 4: Confirm the services are running

Five units make up the deployment: docker, claper-firstboot (which generates this VM's secrets), claper (the compose stack), claper-postboot (which bootstraps the administrator account) and nginx.

systemctl is-active docker claper-firstboot claper claper-postboot nginx

All five report active. The two containers should both be up and healthy:

sudo docker ps --format 'table {{.Names}}\t{{.Status}}'
NAMES       STATUS
claper      Up 14 minutes (healthy)
claper-db   Up 14 minutes (healthy)

Step 5: Confirm the network exposure

Claper is deliberately not reachable directly. Only nginx listens publicly:

ss -tlnH | grep -E ':(80|4000|5432) ' | sort

You will see 127.0.0.1:4000 for Claper and 0.0.0.0:80 (and [::]:80) for nginx. PostgreSQL appears nowhere, because it publishes no host port at all and is reachable only from the Claper container on a private network.

LISTEN 0  4096  127.0.0.1:4000 0.0.0.0:*
LISTEN 0  511        0.0.0.0:80 0.0.0.0:*
LISTEN 0  511           [::]:80    [::]:*

Claper listening on 127.0.0.1:4000 only, nginx listening publicly on port 80, and PostgreSQL publishing no host port at all

Step 6: Read the per instance credentials

Every VM generates its own secrets on first boot. They are written to a file only root can read:

sudo cat /root/claper-credentials.txt

The file records the administrator email address and password for signing in to Claper, and this VM's URL. Confirm the file is locked down:

sudo stat -c '%a %U:%G  %n' /root/claper-credentials.txt
600 root:root  /root/claper-credentials.txt

The register endpoint returning 403, the claper-credentials.txt file at mode 0600 root root, and the administrator email and URL shown with the password never displayed

Step 7: Understand the security model

Claper has its own email and password login, and this image is careful about how that login is seeded.

  • No known bootstrap credential. Upstream's container, left to its defaults, seeds a well known administrator (admin@claper.co / claper) whenever the database is empty, and ships a published SECRET_KEY_BASE that would let anyone forge an administrator session. This image does neither: it starts Claper with database migrations only, generates a fresh SECRET_KEY_BASE, database password and administrator password on first boot, and creates a single per VM administrator. The upstream default administrator is never created.
  • Audience join is open, presenter sign up is not. Your audience joins a presentation with a code and needs no account, which is the whole point. But public presenter and administrator self registration is disabled: ENABLE_ACCOUNT_CREATION is off, and nginx additionally returns 403 for /users/register, so nobody can register themselves an account over the internet.
  • Only nginx is public. Claper binds to 127.0.0.1:4000, PostgreSQL publishes no host port, and nginx on port 80 is the single public listener, configured for the LiveView WebSocket upgrades the live features need.

You can verify that self registration is refused and that the credentials file is root only:

curl -s -o /dev/null -w 'register: HTTP %{http_code}\n' -X POST http://127.0.0.1/users/register --data-urlencode 'user[email]=intruder@example.com' --data-urlencode 'user[password]=intruderpass123'

It returns 403. The image also ships a self test that proves the whole security model, not merely that a page loads. It logs in as the per VM administrator, checks that the upstream default admin and a wrong password are both refused, confirms /users/register is blocked, and confirms the LiveView WebSocket upgrades through nginx:

sudo /usr/local/sbin/claper-roundtrip.sh

The bundled self test reporting OK for the per VM administrator login, the upstream default admin rejected, a wrong password rejected, the honesty control, presenter self registration blocked, and the LiveView WebSocket upgrading through nginx with a 101

Step 8: Open Claper and sign in

Browse to your VM's address (the CLAPER_URL from your credentials file) and select Log in. Sign in with the ADMIN_EMAIL and ADMIN_PASSWORD values from /root/claper-credentials.txt.

The Claper sign in page, with the product introduction alongside a Welcome back panel asking for an email address and password

Step 9: Your presenter dashboard

After signing in you land on My Events, your presenter dashboard, where you create and manage presentations and open the ones that are live.

The Claper My Events dashboard, signed in as the per instance administrator, with a Create an event button

Step 10: Create a presentation

Select Create an event, give it a name, and optionally drag in a slide deck. Claper accepts a PDF or a PowerPoint file and converts it into per slide images using the LibreOffice toolchain built into the image, so your existing deck works as is. A short join code is generated for the event, which is what your audience will enter to join. Select Create event and the event appears on your dashboard as Live.

Step 11: Add a live poll

Open the event to reach the presenter management console. It shows your slides down the left, a preview in the centre, and an Interactions panel where you add a Poll, a Form, a Quiz or web content to the current slide. Add a poll, give it a question and a couple of options, then toggle it on to make it the current interaction for the audience.

The Claper presenter management console for a presentation, showing the converted slides, a live poll authored on the first slide in the Interactions panel, and the presentation and attendee settings

Step 12: Run the session and let the audience answer

Your audience opens the join link on their phones, enters the event code, and immediately sees whatever interaction you have made current. With the poll enabled, every attendee sees the question and its options and can vote, and the results update live for everyone as the votes come in. The same view carries the message board, questions and reactions.

The attendee view on a phone, showing the live poll How useful was this session with its two options and a Vote button, alongside the message and reaction controls

Step 13: Add more presenters

Because public self registration is disabled, you add further presenter or administrator accounts yourself from Claper's admin panel at /admin/users while signed in as the administrator.

If you would rather let presenters register themselves — for example on a private network — you can re open public sign up by setting ENABLE_ACCOUNT_CREATION=true in the app service of /etc/claper/compose.yaml and removing the location = /users/register { return 403; } block from /etc/nginx/sites-available/claper, then restarting:

sudo systemctl restart claper nginx

Step 14: Managing the service

sudo systemctl status claper --no-pager
sudo docker logs claper --tail 50

Restart or stop the whole stack with sudo systemctl restart claper and sudo systemctl stop claper.

Step 15: Configure email (optional)

Claper can email password reset links and, if you enable it, account confirmations. Out of the box this image uses a local mail adapter that does not send real email, which is fine for a single administrator. To send real email, set MAIL_TRANSPORT=smtp and the SMTP_RELAY, SMTP_PORT, SMTP_USERNAME and SMTP_PASSWORD variables in the app service of /etc/claper/compose.yaml, then sudo systemctl restart claper.

Step 16: Use your own domain and HTTPS (production)

Claper is served over plain HTTP on port 80 so it works the moment the VM boots. For production, point a DNS name at the VM and terminate TLS in front of it. After adding a certificate, set BASE_URL in the app service of /etc/claper/compose.yaml to your https:// address and restart, so the links Claper generates and the WebSocket origin checks use your domain.

Step 17: Security recommendations

  • Restrict inbound port 80 to the networks that genuinely need it
  • Put TLS in front of the VM before using it with real content, so neither the administrator login nor session cookies travel in clear text
  • Keep presenter self registration disabled on any internet facing instance; add accounts from the admin panel instead
  • Keep /root/claper-credentials.txt at mode 0600 and never copy it onto a shared system
  • Back up the claper_db and claper_uploads Docker volumes, which hold every presentation, response and uploaded deck

Step 18: Support and Licensing

Claper is open source software distributed under the GNU Affero General Public License v3 (AGPL-3.0). This image also carries Erlang/OTP and Elixir under Apache 2.0, the LibreOffice, Ghostscript and ImageMagick slide conversion tools that the official image bundles, PostgreSQL 15 under the PostgreSQL Licence, Docker Engine under Apache 2.0 and nginx under the BSD 2 Clause Licence. All are redistributed unmodified.

Commercial support for the cloudimg image is available 24/7. Upstream project documentation lives at github.com/ClaperCo/Claper.

Deploy on Azure

Find Claper on Ubuntu 24.04 LTS by cloudimg on the Azure Marketplace.