Cronicle
Overview
Cronicle is a simple, distributed job scheduler and cron replacement with a polished web UI. You define scheduled events once, then run shell scripts, HTTP requests or custom plugins across your fleet of servers. You can watch live progress and logs from the browser, and chain jobs together with dependencies and alerting.
This SecureAnyCloud image installs Cronicle 0.9.122 from the official pinned installer and runs it as the dedicated cronicle system service on Node.js 22. The web UI is bound to the loopback address 127.0.0.1:3012, and nginx on port 80 reverse-proxies to it and serves an unauthenticated health endpoint.
The embedded flat-file storage, which holds your jobs, schedule and users along with logs and the job queue, lives on a dedicated Azure data disk. A unique admin password is generated on the first boot of every VM, so a fresh VM never uses the default admin/admin login.
What you get:
- Cronicle 0.9.122 installed via the official pinned installer and run as the
croniclesystem service on Node.js 22 LTS - The built-in embedded flat-file Storage engine (no external database required), with your schedule, job history and users on a dedicated Azure data disk at
/var/lib/cronicle - Cronicle bound to
127.0.0.1:3012, fronted by nginx on port 80 (including the live-log websocket) - Port 80 serving an unauthenticated
/healthzendpoint for load balancer probes - A unique
adminpassword generated on first boot and written to a root-only file, so no shared or default admin ships in the image - A fresh per-VM session-signing secret generated on first boot, never a shared secret baked into the image
- Three plugins ready to use: Shell Script, HTTP Request and a Test Plugin
cronicle.serviceandnginx.serviceas enabled, active system services- 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 a reasonable starting size. Choose a larger size if you plan to run many concurrent jobs.
Configure the NSG to allow inbound 22/tcp from your management network and 80/tcp (and 443/tcp if you add TLS) for the web UI. The web UI is served over plain HTTP by default, so for production put your own domain and a trusted certificate in front of it (see Maintenance).
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Cronicle 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).
Review the dedicated data disk on the Disks tab, then select Review + create and 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:cronicle-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name cronicle \
--image sac1647283583153:cronicle-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
az vm open-port --resource-group <your-rg> --name cronicle --port 80 --priority 1010Step 3 - Connect to your VM
ssh azureuser@<vm-public-ip>Step 4 - Confirm the services are running
systemctl is-active cronicle.service nginx.service ss -tlnp | grep -E '3012|:80 'Both services report active. Cronicle listens only on the loopback address 127.0.0.1:3012, and nginx on port 80 reverse-proxies to it. The application connector is never exposed directly on a public interface.
Step 5 - Retrieve your admin password
First boot generates a unique Cronicle admin password for your VM and writes it to a root-only file:
sudo cat /root/cronicle-credentials.txtThis file contains CRONICLE_USERNAME (admin), CRONICLE_PASSWORD and the web UI URL. Store the password somewhere safe. The file is mode 0600 and owned by root, so only an administrator can read it.
The embedded Storage that holds your schedule, job history and users lives on the dedicated Azure data disk mounted at /var/lib/cronicle.
Step 6 - Confirm the health endpoints
nginx serves an unauthenticated health endpoint for load balancers and probes, and it fronts the Cronicle app shell:
curl -s http://localhost/healthz
curl -s -o /dev/null -w 'healthz HTTP %{http_code}\n' http://localhost/healthz
curl -s -o /dev/null -w 'root HTTP %{http_code}\n' http://localhost/The /healthz endpoint returns ok with HTTP 200 and never requires authentication, so it is safe for an Azure Load Balancer health probe. The root path returns HTTP 200, which confirms that Cronicle is up behind nginx and ready for sign-in.
Step 7 - Verify authentication from the command line
Cronicle's login API is a plain JSON POST to /api/user/login. It always returns HTTP 200, and success or failure is carried in the code field of the JSON body (0 on success, plus a session_id).
The following check signs in with the correct per-VM password. For contrast, it also tries the default admin password and a wrong password, and both are rejected. The command embeds your unique password, so run it interactively rather than from a script. Substitute the value of CRONICLE_PASSWORD from Step 5 for <CRONICLE_PASSWORD>:
login() { curl -s -H 'Content-Type: application/json' \
-d "{\"username\":\"admin\",\"password\":\"$1\"}" \
http://localhost/api/user/login \
| python3 -c 'import json,sys; d=json.load(sys.stdin); print("code=%s session=%s" % (d.get("code"), bool(d.get("session_id"))))' } echo "per-VM password -> $(login '<CRONICLE_PASSWORD>')" echo "default admin -> $(login 'admin')" echo "wrong password -> $(login 'wrong')"The correct per-VM password prints code=0 session=True (signed in). The default admin password and a wrong password both print code=login session=False, which shows that the appliance replaced the default login on first boot.
Step 8 - Sign in to the web UI
Browse to http://<vm-public-ip>/. You land on the Cronicle User Login page. Enter admin as the username and the password from Step 5, then select Login.
Step 9 - Explore the Home dashboard
After you sign in, you land on the Home tab. It shows server stats (total events, categories and plugins), a live list of active jobs, and any upcoming scheduled events. From here, open the Schedule tab to manage events.
Step 10 - Create a scheduled event
Select the Schedule tab, then Add Event.... Give the event a title.
Choose a Category (the image ships a ready-made General category), a Target (which server or group to run on) and a Plugin. The image ships Shell Script, HTTP Request and Test Plugin plugins.
Set a schedule, or leave the event disabled and run it on demand, then select Create Event. For example, you can create a Hello World event that uses the built-in Test Plugin.
Step 11 - Run a job and watch the live log
On the Schedule tab, select Run next to your event to launch it immediately. Then select the Running status badge to open its live Job Details page.
Cronicle streams job progress, CPU and memory usage, and the live log in real time over a websocket, so you can watch what a job is doing while it runs. When the job finishes, it moves to the Completed tab with its full log retained.
Step 12 - Confirm data lives on the dedicated disk
Cronicle stores its data under /var/lib/cronicle on the dedicated Azure data disk. This includes the embedded Storage that holds your schedule, job history and users, along with logs and the job queue. The data survives OS changes, and you can resize the disk independently:
findmnt /var/lib/cronicleA separate Azure data disk backs the mount. The disk is captured into the image and re-provisioned on every VM.
Maintenance
- Password: First boot sets the admin password through Cronicle's own storage CLI. To rotate it later, stop
cronicle.servicewithsudo systemctl stop cronicle.service, runsudo /opt/cronicle/bin/control.sh admin admin '<new-password>', then start the service again withsudo systemctl start cronicle.service. - Serve a real domain and TLS: The appliance serves the web UI over plain HTTP on port 80. For production, point a DNS name at the VM, obtain a trusted certificate (for example with certbot and Let's Encrypt), and front Cronicle with nginx TLS on port 443. Then set
base_app_urlin/opt/cronicle/conf/config.jsonto yourhttps://URL so that the links Cronicle generates are correct, and restart the service. - Plugins: Cronicle ships Shell Script, HTTP Request and Test Plugin plugins. From the Admin tab, add your own custom plugins (any executable that speaks Cronicle's simple JSON-over-stdio protocol).
- Users and access control: From the Admin tab, add teammates and set per-privilege access (create, edit, delete and run events, abort jobs, and toggle the scheduler).
- Multi-server clusters: A single Cronicle server is a complete "Primary Group" master out of the box. To add worker servers, install Cronicle on additional VMs, point them at the same Storage backend, and add them under Admin, then Server Groups.
- Storage and backup: All Cronicle state lives under
/var/lib/cronicleon the data disk. Back up that volume to protect your schedule, job history and users. - Security patches: Unattended-upgrades remains enabled, so the OS continues to receive security updates automatically.
Support
SecureAnyCloud provides 24/7 expert support for this image. For help with your deployment, contact sales@secureanycloud.com.
Deploy on Azure
Launch Cronicle Job Scheduler 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