Ri
Developer Tools Azure

Roundup Issue Tracker 2.6 on Ubuntu 24.04 on Azure User Guide

| Product: Roundup Issue Tracker 2.6 on Ubuntu 24.04 LTS on Azure

Overview

Roundup is a mature, highly customisable open source issue and bug tracking system with web, command-line and optional email interfaces. It has been used by large projects for many years, including the Python project itself. Roundup stores issues in a configurable schema of priorities, statuses, keywords and an issue class you can extend, and presents a clean web interface for raising, searching, assigning, discussing and resolving issues, with full history on every item and saved queries for the views you use most.

Roundup ships as a Python package rather than a finished server, so the cloudimg image supplies the production stack around it: Roundup 2.6.0 is installed at a pinned upstream release into a dedicated Python virtual environment, its "classic" tracker is initialised on a local PostgreSQL 16 database, and it is served by gunicorn behind an nginx reverse proxy. gunicorn is bound to loopback 127.0.0.1:8917 and is never exposed directly; nginx on port 80 is the only way in, plus an unauthenticated /healthz endpoint for load balancer probes.

The image is secure by default. No usable credential ships, and nothing is listening on the public port in the image at all, so there is no window in which a freshly launched VM is reachable with a known password. On the first boot of every VM a fresh PostgreSQL password and a unique, randomly generated administrator password are created, written to a root only file, and only then is the public site brought up. A few clearly marked example issues are seeded on first boot so the tracker is populated the moment it comes up. Backed by 24/7 cloudimg support.

What is included:

  • Roundup 2.6.0 installed at a pinned upstream release in a dedicated Python virtual environment at /opt/roundup/venv
  • The "classic" tracker initialised on a local PostgreSQL 16 database, served by the roundup gunicorn systemd service on loopback 127.0.0.1:8917
  • nginx on port 80 as the reverse proxy, with an unauthenticated /healthz endpoint for load balancer probes
  • A per VM PostgreSQL password and a per VM administrator password generated on first boot and stored in /root/roundup-credentials.txt
  • A few clearly marked example issues seeded on first boot so the interface is populated straight away
  • A fully patched Ubuntu 24.04 LTS base with unattended security updates enabled

Before you begin

You will need an Azure subscription, permission to launch a VM, and an SSH key pair. Roundup fits comfortably on a Standard_B2s (2 vCPU, 4 GiB) instance. The image opens TCP 22 (SSH), 80 (web) and 443 (optional TLS you configure). Nothing else is exposed; PostgreSQL and gunicorn listen only on loopback.

Launch the image

You can launch from the Azure Portal or the Azure CLI.

Azure Portal: find the offer on the Azure Marketplace, choose Create, pick your resource group and region, select the Standard_B2s size, provide your SSH public key for the azureuser admin account, and allow inbound 22, 80 and 443. Create the VM and note its public IP address.

Azure CLI: replace the resource group, name and image reference with your own values.

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

Then open the web ports on the VM's network security group:

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

Retrieve the administrator password

Every instance generates its own administrator password on first boot and writes it, together with the tracker URL, to a root only file. Sign in to the VM over SSH and read it:

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

You will see the per VM values (the password is unique to your instance):

ROUNDUP_URL=http://<vm-ip>/
ROUNDUP_ADMIN_USER=admin
ROUNDUP_ADMIN_PASSWORD=********

Terminal showing the per VM Roundup credentials file with the administrator password redacted

The username is admin. Change the password from within Roundup after your first sign-in.

Check the services are healthy

The tracker is served by three systemd units: postgresql, roundup (gunicorn) and nginx. You can confirm they are all active and that only the web port is public:

sudo systemctl is-active postgresql roundup nginx
curl -s -o /dev/null -w 'GET /healthz -> HTTP %{http_code}\n' http://localhost/healthz
curl -s -o /dev/null -w 'GET / -> HTTP %{http_code}\n' http://localhost/

Both requests return 200, and the service check prints active three times.

Terminal showing the postgresql, roundup and nginx services active with gunicorn and PostgreSQL bound to loopback only

No default login ships: the administrator password is unique to your VM, and the built-in credential guesses are rejected. The end-to-end sign-in and issue workflow is proven on first boot.

Terminal showing the Roundup tracker users and the end to end credential and workflow proof passing

Sign in and take a tour

Open http://<vm-ip>/ in your browser. The home page lists the current issues grouped by priority, with a sign-in form in the left menu. Enter admin and the password from the credentials file to sign in.

The Roundup home page with the sign-in form and the current issues grouped by priority

Choose Show All to see the full issue list. Each row shows the priority, id, activity, title and status, and you can sort or group the view and export it as CSV.

The Roundup issue list showing the seeded demonstration issues with priority, activity, title and status columns

The tracker comes with a few clearly marked example issues so the interface is not empty on first launch. You can delete them once you are ready to use the tracker for real work.

Working with issues

Click any issue title to open it. The detail page shows the title, priority, status, assignee and nosy list, the full message history, and a complete audit trail of every change.

A Roundup issue detail page showing the title, priority, status, message history and change history

To raise a new issue, sign in and choose the issue-creation link, give it a title, pick a priority and status, add a description and save. To work an issue, open it, add a message, change the status (for example to in-progress or resolved) and reassign it if needed. Every change is recorded in the issue's history.

The tracker is confirmed serving with real content on every instance:

Terminal showing the /healthz endpoint returning 200 and the list of issues held by the tracker

Optional: outbound email and the email gateway

Email is entirely optional; the tracker works fully over the web without any mail server. To send outbound notifications, edit the [mail] section of /opt/roundup/tracker/config.ini to point at your SMTP server, then restart the service:

[mail]
domain = your-domain.example
host = smtp.your-domain.example
username = notifications@your-domain.example
password = your-smtp-password
port = 587
tls = yes

To let people raise and reply to issues by email as well, configure Roundup's roundup-mailgw against a mailbox you own; see the Roundup documentation linked from the tracker's Help menu. After changing config.ini, apply it with sudo systemctl restart roundup.

Optional: a custom domain and HTTPS

Point a DNS record at the VM's public IP, then set the tracker's own URL so the links it generates are correct. Edit the [tracker] web value in /opt/roundup/tracker/config.ini to https://your-domain.example/ and restart the service. To terminate TLS, install a certificate with certbot against your domain:

sudo certbot --nginx -d your-domain.example

nginx already forwards X-Forwarded-Proto to gunicorn, so once TLS is in place Roundup treats the connection as secure.

Backups

Roundup keeps all issue data in PostgreSQL. Take a consistent dump on a schedule and copy it off the instance:

sudo -u postgres pg_dump roundup > /var/backups/roundup-$(date +%F).sql

Store backups off the instance and never copy /opt/roundup/tracker/config.ini (which holds the database password) into a world-readable location.

Support

This image is published by cloudimg and includes 24/7 support for the packaged software and its deployment. Roundup is distributed under the MIT licence, with small vendored components under the Zope Public License 2.0 and the Python Software Foundation License 2.0. Roundup is a trademark of its respective owners; cloudimg is not affiliated with, endorsed by or sponsored by the Roundup project, and uses the name nominatively to identify the open source software packaged in this image.