Peekaping
Overview
Peekaping is an open-source, self-hosted uptime monitoring system built with a Go API and a React web interface. It checks websites, APIs, TCP ports, DNS records, containers and databases on a schedule. It records a heartbeat history for every check, calculates uptime statistics, publishes status pages and raises alerts through notification channels.
The SecureAnyCloud image runs Peekaping 0.0.46 with a bundled PostgreSQL and Redis under Docker Compose on a single VM. It generates a unique administrator password and unique database and cache passwords on the first boot of every VM. It also closes self-registration, so nobody can claim the administrator account on your instance.
What you get:
- Peekaping 0.0.46 (API, web interface, producer, worker and ingester) with every container pinned by image digest rather than a floating tag
- A bundled PostgreSQL 17 and Redis 7, reachable only inside a private container network and never published to a host port
- nginx on port 80 as the single public entry point, serving the web interface and proxying the API and the live heartbeat stream
- A unique administrator password, PostgreSQL password and Redis password generated on first boot, plus fresh session signing keys created in a brand-new database
- Self-registration closed on first boot, verified by the image itself
docker.service,peekaping.serviceandnginx.serviceas systemd units, enabled and active- 24/7 SecureAnyCloud support
The Peekaping project describes itself as beta software under active development. The SecureAnyCloud image ships the official upstream 0.0.46 release unmodified and pinned by digest.
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 starting size.
Configure the network security group (NSG) to allow inbound 22/tcp from your management network and 80/tcp for the web interface. No other port needs to be open.
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Peekaping 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, and then select 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:peekaping-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name peekaping \
--image sac1647283583153:peekaping-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 peekaping --port 80 --priority 1010Step 3 - Connect to your VM
Connect over SSH as the azureuser administrator account:
ssh azureuser@<vm-public-ip>Step 4 - Confirm the stack is running
On first boot, the image generates a unique administrator password and unique PostgreSQL and Redis passwords, and it starts the container stack. It registers the administrator account over the loopback interface before the public port is reachable. It then verifies that no further registration is accepted.
Check that all four services are active:
systemctl is-active docker.service peekaping-firstboot.service peekaping.service nginx.serviceExpected output:
active active active activeCheck what is listening. Only SSH and the web interface face the network. The API and the web container are bound to the loopback interface, and PostgreSQL and Redis are not published to a host port at all.
ss -tlnH | awk '{print $1, $4}' | sort -uExpected output:
LISTEN 0.0.0.0:22 LISTEN 0.0.0.0:80 LISTEN 127.0.0.1:8034 LISTEN 127.0.0.1:8081 LISTEN 127.0.0.53%lo:53 LISTEN 127.0.0.54:53 LISTEN [::]:22 LISTEN [::]:80Confirm that the health endpoint answers and that an unauthenticated API call is refused:
curl -s -o /dev/null -w 'health: %{http_code}\n' http://127.0.0.1/api/v1/health
curl -s -o /dev/null -w 'unauthenticated /monitors: %{http_code}\n' http://127.0.0.1/api/v1/monitorsExpected output:
health: 200 unauthenticated /monitors: 401Step 5 - Retrieve your administrator password
Every VM gets its own administrator password. The image writes it to a root-only file on first boot. Read the file with sudo:
sudo cat /root/peekaping-credentials.txtThe file records the access URL, the administrator email and the per-VM password:
PEEKAPING_URL=http://<vm-public-ip> PEEKAPING_ADMIN_EMAIL=admin@peekaping.local PEEKAPING_ADMIN_PASSWORD=<generated-for-your-vm>Confirm the file is readable only by root:
stat -c '%A %U:%G %n' /root/peekaping-credentials.txtExpected output:
-rw------- root:root /root/peekaping-credentials.txtStep 6 - Review the container stack
The eight containers are pinned by image digest, so a rebuild can never silently pull a different version. List them with:
sudo docker compose --env-file /etc/peekaping/peekaping.env -f /etc/peekaping/compose.yaml ps --format 'table {{.Service}}\t{{.Status}}'The migrate container is a one-shot job that applies the database schema and exits 0. The other containers stay running. PostgreSQL and Redis have no host port, so only the other containers can reach them, over the private Compose network.
Step 7 - Sign in to the web interface
Browse to http://<vm-public-ip>/ and sign in with the email and password from Step 5.
Self-registration is closed on this instance. Peekaping accepts a registration only while no administrator exists. The image creates one on first boot before the port is reachable, so nobody else can claim the account. Confirm this from the VM:
curl -s -o /dev/null -w 'register: %{http_code}\n' -X POST http://127.0.0.1/api/v1/auth/register -H 'Content-Type: application/json' -d '{"email":"someone@example.com","password":"Example123!x"}'Expected output:
register: 400Step 8 - Create your first monitor
Choose Monitors, and then choose Create. Give the monitor a name, pick a type and enter the target. An HTTP(S) monitor needs only a URL.
Peekaping supports many monitor types beyond plain HTTP. These include keyword and JSON-query HTTP checks, TCP port, ICMP ping, DNS, push, Docker container, gRPC and SNMP. It also supports direct database checks for MySQL/MariaDB, PostgreSQL, Microsoft SQL Server, MongoDB and Redis, plus MQTT, RabbitMQ and Kafka.
Save the monitor, and Peekaping begins checking at the interval you set. The monitor page shows the current status, a live heartbeat bar, uptime over 24 hours, 7 days, 30 days and a year, and a response-time chart.
You can also confirm from the VM that the API serves authenticated requests. This command signs in with the per-VM credentials and lists your monitors:
TOKEN=$(curl -s -X POST http://127.0.0.1/api/v1/auth/login -H 'Content-Type: application/json' -d "{\"email\":\"<PEEKAPING_ADMIN_EMAIL>\",\"password\":\"<PEEKAPING_ADMIN_PASSWORD>\"}" | jq -r '.data.accessToken // .accessToken'); curl -s -o /dev/null -w 'authenticated /monitors: %{http_code}\n' http://127.0.0.1/api/v1/monitors -H "Authorization: Bearer $TOKEN"Expected output:
authenticated /monitors: 200Step 9 - Publish a status page
Choose Status Pages, and then choose Create. This publishes a public page that shows the monitors you select, so your users can check service health without access to the dashboard. Add notification channels under Notification Channels to receive alerts when a monitor goes down.
The image ships a complete security round-trip check that you can run at any time. It proves that the health endpoint is public, that unauthenticated and wrong-password requests are refused, that registration is closed, and that your per-VM credentials authenticate and can perform a real write:
sudo /usr/local/sbin/peekaping-roundtrip.shStep 10 - Secure the deployment
This image serves Peekaping over plain HTTP on port 80. Before you put it in front of users, complete the following steps:
- Restrict the network security group so that only the addresses that need the dashboard can reach port 80, and keep port 22 limited to your management network.
- Put your own domain and a TLS certificate in front of the VM, for example with an Azure Application Gateway or Azure Front Door, or by adding a certificate to the nginx configuration at
/etc/nginx/sites-available/peekaping. - Change the administrator password in the web interface under the account menu, and enable two-factor authentication there.
Maintenance
Restart or stop the whole stack through its systemd unit. For example, to restart it:
sudo systemctl restart peekaping.serviceCheck the application logs:
sudo docker compose --env-file /etc/peekaping/peekaping.env -f /etc/peekaping/compose.yaml logs --tail 20 apiThe image enables unattended-upgrades, which applies operating system security updates automatically.
systemctl is-enabled unattended-upgrades.serviceExpected output:
enabledThe PostgreSQL and Redis data live in the Docker named volumes peekaping_pgdata and peekaping_redis. Back them up with your usual Azure disk snapshot policy, or dump the database directly:
sudo docker compose --env-file /etc/peekaping/peekaping.env -f /etc/peekaping/compose.yaml exec -T postgres pg_dump -U peekaping peekaping > /tmp/peekaping-backup.sqlSupport
For help with this image, email sales@secureanycloud.com. The upstream project develops Peekaping and documents it at docs.peekaping.com. SecureAnyCloud is not affiliated with, endorsed by or sponsored by Peekaping. The Peekaping name identifies the open-source software shipped in this image.
Deploy on Azure
Launch Peekaping 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
Overview
Peekaping is an open-source, self-hosted uptime and status monitoring system and a modern alternative to Uptime Kuma. It watches your websites, APIs, TCP services and DNS records, and it records a heartbeat history for each check. It calculates uptime statistics over time, publishes status pages and sends alerts through notification channels, all from a web interface running inside your own AWS account.
The SecureAnyCloud image runs the official upstream container stack, built from Peekaping 0.0.46 (MIT), behind nginx on port 80. It includes a bundled PostgreSQL and Redis and keeps all stateful data on a dedicated EBS data volume. Each instance generates a unique administrator password and every secret on first boot, and self-registration is closed, so no shared or default credential ships in the image.
What you get:
- Peekaping 0.0.46 as the official upstream stack: the Go API and socket.io server, a monitor scheduler, a check worker, a heartbeat ingester, the React web interface and a one-shot database migrator, plus a bundled PostgreSQL and Redis, with every image pinned by digest
- The whole stack managed by a single
peekaping.servicesystemd unit, enabled and active on every boot, fronted by nginx on port 80 - The bundled PostgreSQL and Redis reachable only inside a private container network, and the API and web interface bound to loopback behind nginx
- Stateful Docker data (database, cache and images) relocated onto a dedicated EBS data volume mounted at
/var/lib/peekaping - A first-boot service that generates a per-instance administrator password, database password and cache password, creates fresh session signing keys in an empty database, closes self-registration, and records the administrator credentials in a root-only file
- An unauthenticated health endpoint for load balancer and uptime checks
- 24/7 SecureAnyCloud support
Prerequisites
You need an AWS account, an EC2 key pair in the target region, and a VPC with a public subnet.
m5.large (2 vCPU / 8 GiB RAM) is the recommended instance type. Peekaping runs several containers, so 8 GiB RAM or more is advised.
Configure the security group to allow inbound 22/tcp from your management network and 80/tcp for the web interface. Also allow 443/tcp if you terminate TLS. Peekaping serves plain HTTP on port 80, so for production, terminate TLS in front of it with your own domain.
Step 1 - Launch the AMI
Subscribe to the listing in AWS Marketplace, choose Continue to Launch, and launch through the EC2 console or the AWS CLI. Select the m5.large instance type, your key pair, and a security group that opens ports 22 and 80, and 443 for TLS.
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name <your-key-pair> \
--security-group-ids <security-group-id> \
--subnet-id <subnet-id> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=peekaping}]'Step 2 - Connect to your instance
Connect over SSH as the default login user for your OS variant. On Ubuntu 24.04 LTS, the login user is ubuntu. Use the public IP or DNS name of your instance and the private key for your key pair.
ssh -i <your-key.pem> ubuntu@<instance-public-ip>Step 3 - Confirm the services are running
Four systemd units orchestrate Peekaping: the Docker engine, the one-shot first-boot initializer, the peekaping Compose service and nginx. All four are active on a healthy instance.
for s in docker peekaping-firstboot peekaping nginx; do printf "%-28s %s\n" "$s.service" "$(systemctl is-active $s.service)" donedocker.service active peekaping-firstboot.service active peekaping.service active nginx.service activeStep 4 - Inspect the container stack
The peekaping.service unit brings up the full Compose topology. The one-shot migrate container applies the schema and exits, and the api, web, postgres and redis containers report healthy. List the containers with:
sudo docker compose -f /etc/peekaping/compose.yaml ps --format "table {{.Service}}\t{{.Status}}"SERVICE STATUS api Up (healthy) ingester Up postgres Up (healthy) producer Up redis Up (healthy) web Up (healthy) worker UpStep 5 - Confirm the listener set and health
Only SSH and the web interface listen on the network. The API is on 127.0.0.1:8034 and the web container is on 127.0.0.1:8081, both fronted by nginx on port 80. The bundled PostgreSQL and Redis are never published to a host port.
The health endpoint answers 200 without authentication, and an unauthenticated API call is refused with 401.
sudo ss -tlnp | awk 'NR==1 || /:22 |:80 |8034|8081/' curl -s -o /dev/null -w "health %{http_code}\n" http://127.0.0.1/api/v1/health curl -s -o /dev/null -w "unauth /monitors %{http_code}\n" http://127.0.0.1/api/v1/monitorsState Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 4096 0.0.0.0:22 0.0.0.0:* users:(("sshd",...)) LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",...)) LISTEN 0 4096 127.0.0.1:8034 0.0.0.0:* users:(("docker-proxy",...)) LISTEN 0 4096 127.0.0.1:8081 0.0.0.0:* users:(("docker-proxy",...)) health 200 unauth /monitors 401Step 6 - The data volume
Peekaping's stateful Docker data lives on a dedicated EBS volume mounted at /var/lib/peekaping. This data includes the PostgreSQL database, the Redis queue and the pinned container images. The volume is separate from the OS root disk and independently resizable. Check the mount with:
df -h /var/lib/peekaping | tail -1/dev/nvme1n1 30G 49M 28G 1% /var/lib/peekapingStep 7 - Retrieve the per-instance administrator credentials
On the first boot of your instance, the image creates a unique administrator with a per-instance password before the web port becomes reachable. It stores the credentials in a root-only file. Read the file with sudo:
sudo cat /root/peekaping-credentials.txtThe file contains the sign-in email and password for this instance:
PEEKAPING_URL=http://<instance-public-ip> PEEKAPING_ADMIN_EMAIL=<PEEKAPING_ADMIN_EMAIL> PEEKAPING_ADMIN_PASSWORD=<PEEKAPING_ADMIN_PASSWORD>Step 8 - Sign in to the web interface
Open http://<instance-public-ip>/ in a browser and sign in with the administrator email and password from Step 7. Self-registration is closed on this instance, so the sign-up path is disabled and nobody can claim the administrator account.
Step 9 - Create your first monitor
Select Create and choose the HTTP(S) Monitor type. Give the monitor a name and the URL to watch, for example your website or API endpoint, and select Create. Peekaping begins checking immediately at the configured interval and records a heartbeat for each check.
Step 10 - Watch uptime and status
The monitors dashboard lists every monitor with its current status, check interval and heartbeat history. A green Up badge and heartbeat bar confirm that the target is reachable. Peekaping tracks uptime percentages over 24 hours, 7 days, 30 days and a year. You can add notification channels and publish status pages from the interface.
Maintenance
- Service control. The stack runs under systemd. Use
sudo systemctl status peekaping.serviceto check it andsudo systemctl restart peekaping.serviceto restart the whole Compose topology. - Logs.
sudo docker compose -f /etc/peekaping/compose.yaml logs --tail 100 apishows the API logs. Replaceapiwith any service name. - Change the administrator password. Sign in and open Settings, where you can change the password and enable two-factor authentication.
- TLS. Peekaping serves plain HTTP on port 80. For production, put your own domain and a TLS certificate in front of it, for example an AWS load balancer with AWS Certificate Manager, or nginx with Let's Encrypt. Also restrict the security group.
- Backups. Snapshot the
/var/lib/peekapingEBS volume to back up the database and configuration.
Support
24/7 technical support is included with this image. Contact sales@secureanycloud.com for help with deployment, reverse proxy and TLS termination, notification integrations, backup and storage planning, and scaling.
Peekaping is open source under the MIT License, and upstream describes it as beta software under active development. SecureAnyCloud produces this image and is not affiliated with, endorsed by or sponsored by Peekaping.
Deploy on AWS
Launch Peekaping with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com