Deployment guide

Tendenci Ubuntu 24.04

Overview

Tendenci is an open-source Association Management System (AMS) and website platform built for non-profits, associations and membership organisations. From one platform it manages members and memberships, events with online registration, donations and payments, a member directory, forms, newsletters, a photo and file gallery, and the full public-facing website content.

This SecureAnyCloud image runs Tendenci 16.16 on Ubuntu 24.04 LTS, fully installed and reverse-proxied behind nginx. The gunicorn application server, PostgreSQL 16 with the PostGIS spatial extensions Tendenci requires, and the memcached cache are already configured and managed by systemd. A complete association platform is operational within minutes of launch.

What you get:

  • Tendenci 16.16 installed from the official package into a dedicated Python virtual environment at /opt/tendenci
  • PostgreSQL 16 + PostGIS 3 as the primary database and memcached as the cache backend
  • gunicorn serving the Django application on 127.0.0.1:8000, fronted by nginx on port 80
  • Four enabled, active systemd units: postgresql, memcached, tendenci and nginx
  • Secure by default: no administrator account and no shared secret ship in the image. On first boot, a unique Django secret key, site settings key, database password and administrator account are generated and written to a root-only file
  • An Ubuntu 24.04 LTS base, patched at build time, with unattended security upgrades enabled
  • 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_B2s (2 vCPU / 4 GiB RAM) is the recommended size for evaluation and small deployments. For larger sites, choose a size with more memory.

Configure the network security group (NSG) to allow inbound 22/tcp from your management network and 80/tcp for the web interface. Tendenci serves plain HTTP on port 80. For production or shared access, terminate TLS in front of it with your own domain (see the final step).

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Tendenci by SecureAnyCloud, and select Create.

On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80).

Select Review + create, then Create.

Step 2 - 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:tendenci-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name tendenci \
  --image sac1647283583153:tendenci-ubuntu-24-04:default:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_ed25519.pub \
  --vnet-name <your-vnet> --subnet <your-subnet> \
  --public-ip-sku Standard
# Open the HTTP port so you can reach the web interface
az vm open-port --resource-group <your-rg> --name tendenci --port 80 --priority 900

Step 3 - Retrieve the per-VM administrator account

Nothing secret is baked into the image. On first boot, a oneshot service (tendenci-firstboot.service) generates a fresh Django secret key, site settings key, database password and administrator account, all unique to your instance. It writes them to /root/tendenci-credentials.txt, which only root can read.

SSH in as azureuser and read the file:

$
sudo cat /root/tendenci-credentials.txt
# Tendenci - generated on first boot by tendenci-firstboot.service.
# These credentials are unique to THIS VM. Store them somewhere safe. tendenci.url=http://20.55.10.42/ tendenci.admin.user=admin tendenci.admin.pass=Xq7pR2mK9wU4nZ8vB3hL6yD1
# Canonical keys consumed by the sac smoke verifier + guide substitution: TENDENCI_URL=http://20.55.10.42/ TENDENCI_ADMIN_PASSWORD=<set-at-first-boot>

The values above are an example. Your instance has its own unique administrator password.

Step 4 - Confirm the services are running

Check that PostgreSQL, memcached, the Tendenci application and nginx are all active:

sudo systemctl is-active postgresql memcached tendenci nginx

All four report active. gunicorn binds to loopback only (127.0.0.1:8000), and nginx publishes the interface on port 80. Confirm the listeners:

sudo ss -tlnp | grep -E ':80 |:8000 '

Step 5 - Confirm the web endpoints

Request the public homepage and the sign-in page. Both return 200. The Django admin redirects an anonymous request to the login page, which is the secure default.

curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://localhost/
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://localhost/accounts/login/

Step 6 - Sign in to the web UI

Browse to http://<vm-ip>/ to see the public website, served by the built-in Tendenci theme.

To sign in, open http://<vm-ip>/accounts/login/ and enter admin with the password from /root/tendenci-credentials.txt.

Step 7 - Explore the member dashboard

After you sign in, you land on the member dashboard at /dashboard/. It is the control centre for the whole platform, covering members and memberships, events, articles and news, the member directory, forms, files, invoices and site settings.

Step 8 - Use the Django admin

Open /admin/ for the full Django administration site. It gives you low-level management of every object in the platform, from announcements and articles to users, chapters and categories.

Step 9 - Confirm first-boot secret generation

The oneshot tendenci-firstboot.service is ordered before the application. The web UI therefore starts only after every per-VM secret has been generated and a fresh, empty database has been initialised. The service is enabled in the shipped image and disables itself once it has run, leaving a sentinel file behind. Confirm that first boot completed:

test -f /var/lib/sac/data/tendenci-firstboot.done && echo "first boot complete"

Step 10 - Administration

The Tendenci manage.py command is wrapped for convenience. Run sudo tendenci-manage <command>. For example, print the framework version, or add another administrator:

sudo tendenci-manage --version
$
sudo tendenci-manage createsuperuser

The application settings live in /opt/tendenci/mysite/conf/settings.py. Restart the application with sudo systemctl restart tendenci.

Step 11 - Enable HTTPS and outbound email

Tendenci ships on plain HTTP on port 80 so it works immediately. It also ships with a dummy email backend, so nothing depends on a mail server.

For production, point a DNS record at the VM's public IP. Add the hostname to ALLOWED_HOSTS and CSRF_TRUSTED_ORIGINS in /opt/tendenci/mysite/conf/settings.py. Then terminate TLS with a certificate. A common approach is certbot with an nginx reverse proxy, or Azure Application Gateway in front of the VM.

To send newsletters and notifications, set a real EMAIL_BACKEND and SMTP host in the same settings file. Restart the application after you edit the configuration:

$
sudo systemctl restart tendenci

Administration and support

This image is a repackaged open-source software product, with additional charges for SecureAnyCloud support services. Our engineers provide 24/7 support for deployment, upgrades, TLS termination, SMTP and payment gateway integration, theme customisation and scaling.

Tendenci is a trademark of its respective owner. The name is used here only to identify the software this image packages.

Deploy on Azure

Launch Tendenci 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

Deploy on Azure