Roundup Issue Tracker 2.6 on Ubuntu 24.04 on Azure User Guide
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
roundupgunicorn systemd service on loopback127.0.0.1:8917 - nginx on port 80 as the reverse proxy, with an unauthenticated
/healthzendpoint 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=********

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.

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.

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.

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 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.

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:

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.