Applications Azure

Binner on Ubuntu 24.04 on Azure User Guide

| Product: Binner on Ubuntu 24.04 LTS on Azure

Overview

Binner is a self-hosted parts inventory system for electronics. Makers, hobbyists and professional engineers use it to catalogue components, track stock levels and storage locations, find the right part fast, and attach datasheets and metadata, with barcode scanning to add and look up parts quickly. It presents a clean web interface backed by a self-contained database, so your inventory stays on infrastructure you control. Binner can optionally enrich part details from external supplier catalogues (DigiKey, Mouser, Octopart) when you supply your own API keys, but this is entirely optional: the appliance runs completely standalone with no external service and no external database.

The cloudimg image ships the pinned Binner 2.6.25 release, runs it as a dedicated binner system user under systemd, and fronts its web interface on port 80 with an nginx reverse proxy. It is secure by default with no shared credential: Binner seeds a default admin/admin account, so on the first boot of every VM that credential is rotated to a unique per-instance password written to a root-only file, the token-signing key is generated uniquely per instance, and the web interface refuses to serve until that rotation has completed. The default login is therefore never reachable on a deployed instance, and no two instances share a secret. Backed by 24/7 cloudimg support.

What is included:

  • Binner 2.6.25 running as the binner systemd service, fronted by nginx on port 80
  • A full web UI for adding, searching and organising parts, with barcode scanning
  • A self-contained database and user-upload store under /var/lib/binner (no external database)
  • Secure-by-default authentication: the seeded admin/admin login is rotated to a unique per-VM password on first boot, and the JWT signing key is generated per VM
  • binner.service + nginx.service as systemd units, enabled and active
  • An unauthenticated /healthz endpoint for Azure Load Balancer health probes
  • Fully patched Ubuntu 24.04 LTS base with unattended security upgrades enabled
  • 24/7 cloudimg support

Prerequisites

An active Azure subscription, an SSH key pair, and a VNet + subnet in the target region. Standard_B2s (2 vCPU / 4 GiB RAM) is a comfortable starting point; Binner is light on resources. NSG inbound: allow 22/tcp from your management network and 80/tcp from the networks that should reach the web interface. Binner serves plain HTTP on port 80; for use beyond a trusted network, terminate TLS in front of it with your own domain (see Maintenance).

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Binner by cloudimg, and select Create. On Basics 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). Then Review + create -> Create.

Step 2 - Deploy from the Azure CLI

az vm create \
  --resource-group <your-rg> \
  --name binner \
  --image <marketplace-image-urn> \
  --size Standard_B2s \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_ed25519.pub \
  --vnet-name <your-vnet> --subnet <your-subnet> \
  --public-ip-sku Standard

az vm open-port --resource-group <your-rg> --name binner --port 80 --priority 1010

Step 3 - Connect to your VM

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the services are running

Binner runs on the loopback interface and nginx publishes it on port 80.

systemctl is-active binner.service nginx.service
active
active

Confirm nginx is on :80, Binner is on 127.0.0.1:8090, and the web UI answers:

ss -tln | grep -E ':80 |:8090 '
curl -s -o /dev/null -w 'web UI (nginx :80): HTTP %{http_code}\n' http://127.0.0.1/

The binner, nginx and firstboot services reported active, nginx listening on port 80 and Binner on loopback 127.0.0.1:8090, and the web UI returning HTTP 200 through nginx

Step 5 - Retrieve your admin credentials

On the first boot of every VM, Binner's seeded admin/admin login is rotated to a unique per-instance password, written to a root-only file:

sudo cat /root/binner-credentials.txt

The file is mode 0600 root:root and contains the web URL and the admin username with its per-VM password:

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

The per-VM Binner credentials file listed as mode 0600 root:root, showing the web URL and the admin username with its per-instance password masked in this render

Step 6 - Sign in to the web UI

Open http://<vm-public-ip>/ in a browser. Binner shows its login page; sign in as admin with the password from the credentials file.

The Binner login page served over nginx on port 80, showing the Binner logo and a username and password form with a LOGIN button

Step 7 - Confirm the default login is disabled

You can prove the secure-by-default posture from the shell: the upstream admin/admin seed is rejected, while the per-VM credential authenticates. These commands read the per-VM password straight from the credentials file, so no secret is typed.

# the upstream default admin/admin is rotated away on first boot -> rejected
curl -s http://127.0.0.1/api/authentication/login -X POST -H 'Content-Type: application/json' \
  -d '{"username":"admin","password":"admin"}' | jq '.isAuthenticated'
false
# the per-VM admin credential from the credentials file authenticates
PW=$(sudo grep '^BINNER_ADMIN_PASSWORD=' /root/binner-credentials.txt | cut -d= -f2-)
curl -s http://127.0.0.1/api/authentication/login -X POST -H 'Content-Type: application/json' \
  -d "{\"username\":\"admin\",\"password\":\"$PW\"}" | jq '.isAuthenticated'
true

A shell session showing the default admin/admin login returning isAuthenticated false while the per-VM admin credential returns isAuthenticated true, proving the seeded default is disabled

Step 8 - The dashboard

After signing in, Binner shows its home dashboard with your inventory summary and quick actions for adding and finding parts.

The Binner home dashboard after signing in, showing the navigation for Home, Add Inventory and Order Import and the inventory summary

Step 9 - Browse your inventory

The Inventory view lists your parts with their part number, quantity, description, part type and storage location, and a search box and sortable columns to find any part quickly.

The Binner Inventory page listing a part with its part number, quantity, description and part type, with a search box, sortable columns and total record count

Step 10 - Add a part

Choose Add Inventory to add a part. Enter a part number and quantity, pick a part type and storage location, and optionally scan a barcode or look the part up from a supplier catalogue to pull in metadata and a datasheet.

The Binner Add Inventory page with fields for the part number, quantity, part type and storage location for adding a new part to the inventory

Step 11 - Barcode scanning

Binner supports barcode scanning to add and look up parts quickly. On the Add Inventory page, scan a manufacturer or supplier barcode with a USB/HID barcode scanner (or a webcam) and Binner parses it to pre-fill the part fields. Scanning on the inventory search finds an existing part instantly.

Step 12 - Optional: enrich parts from supplier catalogues

Binner can pull part metadata, pricing and datasheets from external supplier APIs (DigiKey, Mouser, Octopart). This is entirely optional and requires your own API keys from those providers - the appliance runs fully standalone without them. To enable enrichment, sign in as admin, open Settings, and add your provider API keys there. No supplier key ships in the image.

Maintenance

  • Change the admin password or add users: sign in as admin, open your account settings to change the password, or add more users from the admin area.
  • Your data: the inventory database and uploaded files live under /var/lib/binner (binner.db + UserFiles/). Back this directory up to preserve your inventory.
  • Service management: sudo systemctl status binner.service, and logs via sudo journalctl -u binner.service.
  • TLS: Binner serves plain HTTP on port 80 behind nginx. For internet-facing use, put your own domain and certificate in front (for example with a TLS-terminating load balancer or an nginx server block with your certificate) and restrict 80/tcp at the NSG to trusted networks.
  • Updates: the Ubuntu base has unattended security upgrades enabled.

Support

cloudimg images are backed by 24/7 support. If you need help deploying or operating this image, contact cloudimg support with your Azure region and the VM size you are running.