In
Developer Tools Azure

Indico on Ubuntu 24.04 on Azure User Guide

| Product: Indico on Ubuntu 24.04 LTS on Azure

Overview

Indico is a comprehensive, open source event management system: conferences, meetings, lectures, agendas and timetables, abstract and paper review, registration forms, and a room booking module, all behind a rich web interface. It was created at CERN and is used by universities, research organisations and enterprises worldwide. Indico is a Python and Flask application served by uWSGI, with Celery for background tasks, PostgreSQL for storage and Redis for caching and queues.

The cloudimg image installs Indico 3.3.12 the official production way (a dedicated indico system user, a Python 3.12 virtualenv, pip install indico, PostgreSQL 16 and Redis on loopback, and nginx in front), keeps the database and the uploaded materials archive on a dedicated Azure data disk, and generates the Flask SECRET_KEY, the PostgreSQL password and the initial administrator account uniquely on the first boot of each VM. Backed by 24/7 cloudimg support.

What is included:

  • Indico 3.3.12 installed the official production way (MIT licensed), on Python 3.12
  • Two systemd services running as the unprivileged indico user: indico-uwsgi (uWSGI on a loopback socket) and indico-celery (Celery worker and scheduler)
  • PostgreSQL 16 with the unaccent and pg_trgm extensions, plus Redis, bound to loopback; nginx fronting the app on port 80 with an unauthenticated /healthz
  • A per VM Flask SECRET_KEY, a per VM PostgreSQL password and a per VM administrator account, all generated on first boot and recorded in a root only credentials file; none are baked into the image
  • The BASE_URL set automatically from the VM public IP on first boot, so the web interface works immediately
  • A dedicated 20 GiB Azure data disk at /var/lib/indico-data holding the PostgreSQL cluster and the Indico archive, captured into the image and re-provisioned with every VM
  • 24/7 cloudimg support

The Indico sign in page served by the VM on port 80

Prerequisites

An active Azure subscription, an SSH key pair, and a VNet plus subnet in the target region. Standard_D2s_v4 (2 vCPU / 8 GiB RAM) is the recommended size; Indico runs uWSGI and Celery alongside PostgreSQL and Redis, so 8 GiB of RAM is comfortable for evaluation and small deployments. NSG inbound: allow 22/tcp from your management network, and 80/tcp (plus 443/tcp once you add your own TLS certificate) for the web interface.

Step 1 - Deploy from the Azure Marketplace

Launch the image from the Azure portal (search the Marketplace for "Indico on Ubuntu 24.04 LTS by cloudimg", choose your size and networking, and create), or from the Azure CLI:

az vm create \
  --resource-group my-indico-rg \
  --name my-indico \
  --image <cloudimg-indico-image-urn> \
  --size Standard_D2s_v4 \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-sku Standard

Open the required inbound ports on the VM network security group:

az vm open-port --resource-group my-indico-rg --name my-indico --port 80 --priority 900

On first boot the appliance generates its per VM secrets and administrator account and sets BASE_URL to the VM public IP. Allow a minute or two for this to complete before signing in.

Step 2 - Retrieve the per VM administrator password

Indico ships with no default login. The first boot service creates a unique administrator account and writes it to a root only file. SSH in and read it:

ssh azureuser@<vm-public-ip>
sudo cat /root/indico-credentials.txt

You will see the administrator username (admin), email, and the per VM password, along with the URL to use. The database lives on the dedicated data disk and the Flask SECRET_KEY and PostgreSQL password are unique to this VM.

The per VM credentials file with the password masked, and the data disk holding PostgreSQL and the Indico archive

Step 3 - Sign in to the web interface

Browse to http://<vm-public-ip>/ and sign in with the username and password from the credentials file using the "Login with Indico" local provider.

The Indico local sign in form

Step 4 - Create categories, events and timetables

Indico organises everything under categories. Create a category, then create events (meetings, lectures or conferences) inside it. The category page lists upcoming and past events and lets you manage access.

An Indico category listing an event, signed in as the administrator

Each event has a timetable. For a meeting, add contributions (talks) with their times and durations and Indico renders the full agenda automatically, ready to publish to attendees.

An event agenda and timetable with scheduled contributions

Step 5 - Administration

The Administration area (available to the per VM admin account) is where you configure the instance: general settings, security, plugins, user management, the homepage, and the room booking module.

The Indico Administration area, General Settings

Step 6 - Set your own domain, TLS and email before production

Indico bakes absolute URLs from BASE_URL. The appliance boots with BASE_URL set to the VM public IP over plain HTTP as a working evaluation default. Before you publish real events you should:

  1. Point a DNS name at the VM and set BASE_URL = 'https://your.domain' in /opt/indico/etc/indico.conf.
  2. Add a TLS certificate and an nginx :443 server block (Let's Encrypt with certbot --nginx is a good option).
  3. Configure a real SMTP server via SMTP_SERVER in indico.conf so Indico can send registration and notification email.

Restart the services after editing the config:

sudo systemctl restart indico-uwsgi nginx

Verifying the deployment

All services run locally: PostgreSQL, Redis, uWSGI and Celery on loopback, fronted by nginx on port 80.

Indico services active with PostgreSQL, Redis and nginx on loopback

The unauthenticated health endpoint returns 200, and the landing and login pages render:

curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1/healthz

The health endpoint returning 200, the Indico version, and the landing and login pages returning 200

Indico has no default login, and a wrong or blank password is rejected; only the per VM administrator password authenticates to the admin area:

The admin login round trip: a wrong password is rejected, the per VM password reaches the admin area

Data, storage and maintenance

The PostgreSQL cluster and the Indico archive (uploaded materials and attachments) live on the dedicated 20 GiB Azure data disk mounted at /var/lib/indico-data, which is captured into the image and re-provisioned with every VM. For a production instance, grow the data disk to suit your event volume and take regular backups of both the database and the archive. Keep the OS patched with unattended-upgrades (enabled by default).

Useful paths and commands:

  • Configuration: /opt/indico/etc/indico.conf
  • Credentials (root only): /root/indico-credentials.txt
  • Logs: sudo journalctl -u indico-uwsgi -u indico-celery
  • Restart: sudo systemctl restart indico-uwsgi indico-celery nginx

Support

This image is provided by cloudimg with 24/7 support. Indico is open source software released under the MIT License. cloudimg is not affiliated with or endorsed by CERN or the Indico project; "Indico" is used only to identify the software packaged in this image.