Open-Source & Self-Hosted Alternatives to PagerDuty & Opsgenie
Cloud-hosted on-call scheduling and incident alerting with per-user pricing, vendor-dependent escalation chains, and incident data stored on third-party infrastructure.
Why Migrate Away from PagerDuty & Opsgenie?
PagerDuty and Opsgenie charge per-user fees that scale linearly with on-call team size, and your incident data, escalation policies, and on-call schedules are stored on vendor-controlled infrastructure. Self-hosted alternatives like GoAlert and Grafana OnCall give you the same on-call scheduling, escalation chains, and multi-channel alerting (SMS, voice, email, Slack) on your own hardware — with zero per-user licensing, full control over escalation logic, and incident data that never leaves your network.
Technical Architecture & Migration Analysis
PagerDuty and Opsgenie operate as cloud-hosted incident management and on-call alerting platforms: alert rules, escalation policies, on-call schedules, and incident histories are processed and stored on vendor-controlled infrastructure under per-user licensing. Your incident data — including who was paged, what was affected, and how the response proceeded — is sensitive operational intelligence that many organizations prefer to keep on-premises. Self-hosted alternatives use distinct architectures. GoAlert is a lightweight Go application with a PostgreSQL backend that provides on-call scheduling, multi-channel alerting (SMS, voice, email, Slack), and automatic escalation when alerts go unacknowledged. Grafana OnCall is a Python/Django application deeply integrated with the Grafana observability stack — alerts flow naturally from Prometheus alertmanager through OnCall's escalation policies to the appropriate on-call personnel. Both eliminate per-user licensing and keep all incident and scheduling data on infrastructure you control.
When NOT to Migrate (When Staying on PagerDuty & Opsgenie Makes Sense)
Self-hosting is not universally the right move. Keep paying for SaaS if your team hits any of these constraints:
- ▸Your incident response workflow depends on PagerDuty's AIOps machine learning for alert grouping, noise reduction, and automated runbook execution.
- ▸You need Opsgenie's deep integration with Atlassian products (Jira, Confluence, Statuspage) for end-to-end incident-to-ticket workflows.
- ▸Your compliance requirements mandate a vendor-backed SLA for incident notification delivery within guaranteed time windows.
Real-World Cost Comparison: PagerDuty & Opsgenie vs Self-Hosted
Comparing vendor cloud billings against standard Hetzner / DigitalOcean infrastructure costs at scale.
| Tier / Scale | PagerDuty & Opsgenie Cost | Self-Hosted VPS Cost | Estimated Annual Savings | Technical Breakdown |
|---|---|---|---|---|
Small Team (5-10 on-call users) Basic on-call rotation, SMS/voice escalation | $50 - $410/month (PagerDuty/Opsgenie per seat) | €3.79/month (Hetzner CX22) + Twilio costs | $550 - $4,900/year | GoAlert handles unlimited on-call users; Twilio SMS/voice costs are pay-per-use and typically $5-20/mo for small teams. |
Growing SRE Team (20-50 on-call users) Multiple services, escalation chains, Slack integration | $200 - $2,050/month (PagerDuty Professional/Business) | €14.28/month (Hetzner CPX31) + Twilio costs | $2,200 - $24,400/year | GoAlert or Grafana OnCall on a dedicated VPS with Slack integration and Twilio for voice/SMS. |
Enterprise SRE Organization 100+ on-call users, AIOps, runbook automation | $1,000 - $4,100+/month (PagerDuty Enterprise) | €36.50 - €73.00/month (Hetzner CAX31) + Twilio costs | $11,000 - $49,000+/year | Full Grafana OnCall + Prometheus stack with unlimited users and custom escalation workflows. |
Top 2 Recommended Open-Source Replacements
Tested, self-contained, and production-ready. Click any tool to inspect verified docker-compose configurations, hardware sizing, and deployment guides.
GoAlert
Apache-2.0⭐ 3.5k+Open-source on-call scheduling, automatic escalations, and multi-channel alerting with a clean web UI and REST API.
✅ Advantages
- Zero per-user fees — unlimited on-call users on a single VPS
- Clean, purpose-built UI for on-call management (no feature bloat)
- Apache-2.0 license allows full commercial use and modification
⚠️ Trade-offs / Limitations
- Requires Twilio account for SMS/voice notifications (additional cost)
- Smaller community than PagerDuty/Opsgenie — fewer third-party integrations
- No built-in incident status page or post-mortem workflow
Core Features
version: '3.8'
services:
goalert:
image: goalert/goalert:latest
container_name: goalert
restart: always
ports:
- "8081:8081"
environment:
- GORILLA_SESSIONS_SECRET=random_32_char_session_secret
- GOALERT_DB_URL=postgresql://goalert:goalert_pass@goalert-db:5432/goalert?sslmode=disable
- GOALERT_TWILIO_SID=your_twilio_account_sid
- GOALERT_TWILIO_AUTH=your_twilio_auth_token
- GOALERT_TWILIO_FROM=+1234567890
- GOALERT_SMTP_URL=smtp://user:pass@smtp.example.com:587
- GOALERT_EMAIL_FROM=alerts@yourdomain.com
depends_on:
- goalert-db
networks:
- selfhost_net
goalert-db:
image: postgres:16-alpine
container_name: goalert-db
restart: always
environment:
POSTGRES_DB: goalert
POSTGRES_USER: goalert
POSTGRES_PASSWORD: goalert_pass
volumes:
- goalert_db_data:/var/lib/postgresql/data
networks:
- selfhost_net
volumes:
goalert_db_data:🚀 5-Minute Deployment Guide
- 1Provision a VPS with at least 256MB RAM and 1 vCPU.
- 2Install Docker & Docker Compose: `curl -fsSL https://get.docker.com | sh`.
- 3Create the GoAlert docker-compose.yml with PostgreSQL backend.
- 4Set up a Twilio account for SMS/voice notifications and note the SID and auth token.
- 5Run `docker compose up -d` and access the web UI at http://YOUR_VPS_IP:8081.
- 6Configure Caddy reverse proxy for SSL and create on-call schedules in the UI.
- 7Integrate with Slack via incoming webhooks for chat-based alerting.
Recommended Cloud VPS for GoAlert
Compare all VPS hosts →CX22 (2 vCPU, 4GB RAM, 40GB NVMe)
Plenty of headroom for GoAlert with room for other services.
Deploy on Hetzner →Basic Droplet (1 vCPU, 1GB RAM)
GoAlert is extremely lightweight — this is more than sufficient.
Claim $200 DO Credit →Grafana OnCall
AGPL-3.0⭐ 5.8k+Open-source on-call management deeply integrated with Grafana alerting, Prometheus, and the Grafana observability ecosystem.
✅ Advantages
- Native integration with Grafana — no configuration needed for Prometheus/Grafana alerts
- Unified observability: dashboards + alerting + on-call in one stack
- AGPL-3.0 license with active Grafana community support
⚠️ Trade-offs / Limitations
- Standalone usage requires additional setup to configure external alert sources
- Heavier than GoAlert — requires PostgreSQL + Redis + Django application
- Phone/SMS notifications require third-party provider (Twilio, etc.)
Core Features
version: '3.8'
services:
oncall-engine:
image: grafana/oncall:latest
container_name: oncall-engine
restart: always
ports:
- "8082:8080"
environment:
- ONCALL_SECRET_KEY=generate_64_char_secret_here
- ONCALL_POSTGRES_HOST=oncall-db
- ONCALL_POSTGRES_PORT=5432
- ONCALL_POSTGRES_DB=oncall
- ONCALL_POSTGRES_USER=oncall
- ONCALL_POSTGRES_PASSWORD=oncall_secure_pass
- ONCALL_REDIS_URI=redis://oncall-redis:6379/0
- ONCALL_SLACK_CLIENT_ID=your_slack_client_id
- ONCALL_SLACK_CLIENT_SECRET=your_slack_client_secret
depends_on:
- oncall-db
- oncall-redis
networks:
- selfhost_net
oncall-celery:
image: grafana/oncall:latest
container_name: oncall-celery
restart: always
command: celery -A engine worker -l info
environment:
- ONCALL_SECRET_KEY=generate_64_char_secret_here
- ONCALL_POSTGRES_HOST=oncall-db
- ONCALL_POSTGRES_PORT=5432
- ONCALL_POSTGRES_DB=oncall
- ONCALL_POSTGRES_USER=oncall
- ONCALL_POSTGRES_PASSWORD=oncall_secure_pass
- ONCALL_REDIS_URI=redis://oncall-redis:6379/0
depends_on:
- oncall-db
- oncall-redis
networks:
- selfhost_net
oncall-db:
image: postgres:16-alpine
container_name: oncall-db
restart: always
environment:
POSTGRES_DB: oncall
POSTGRES_USER: oncall
POSTGRES_PASSWORD: oncall_secure_pass
volumes:
- oncall_db_data:/var/lib/postgresql/data
networks:
- selfhost_net
oncall-redis:
image: redis:7-alpine
container_name: oncall-redis
restart: always
networks:
- selfhost_net
volumes:
oncall_db_data:🚀 5-Minute Deployment Guide
- 1Provision a VPS with at least 1GB RAM and 1 vCPU.
- 2Install Docker & Docker Compose: `curl -fsSL https://get.docker.com | sh`.
- 3Clone the Grafana OnCall Docker setup: `git clone https://github.com/grafana/oncall`.
- 4Follow the official Docker deployment guide to configure PostgreSQL and Redis connections.
- 5Run `docker compose up -d` and configure Grafana OnCall as a data source in your Grafana instance.
- 6Connect your existing Prometheus/Grafana alerting rules to OnCall escalation policies.
- 7Configure Slack integration for team-based alerting and acknowledgment.
Recommended Cloud VPS for Grafana OnCall
Compare all VPS hosts →CX22 (2 vCPU, 4GB RAM, 40GB NVMe)
Comfortable for OnCall alongside Grafana and Prometheus.
Deploy on Hetzner →CPX31 (4 vCPU, 8GB RAM)
Recommended when running the full Grafana + Prometheus + OnCall stack.
Deploy on Hetzner →Regular Droplet (2 vCPU, 4GB RAM, 80GB SSD)
Includes $200 free trial credits for new accounts.
Claim $200 DO Credit →Quick Specification Matrix
| Tool | License | Min RAM | Min CPU | GitHub Repo | Primary Advantage |
|---|---|---|---|---|---|
| PagerDuty & Opsgenie (Proprietary) | Proprietary Closed | Managed Cloud | Managed Cloud | N/A | Turnkey onboarding with vendor lock-in & paywalls |
| GoAlert | Apache-2.0 | 256 MB | 1 vCPU | target/goalert | Zero per-user fees — unlimited on-call users on a single VPS |
| Grafana OnCall | AGPL-3.0 | 1 GB | 1 vCPU | grafana/oncall | Native integration with Grafana — no configuration needed for Prometheus/Grafana alerts |
Performance Benchmarks & Hard Operational Limits
Real-world operational trade-offs, resource consumption limits, and measured throughput.
| Benchmark Metric | PagerDuty & Opsgenie Baseline | Self-Hosted Alternative Metric | Operational Bottleneck / Limit | Source |
|---|---|---|---|---|
| Alert Delivery Latency (SMS) | 5-15 seconds (PagerDuty managed Twilio integration) | 5-15 seconds (GoAlert direct Twilio API — same underlying provider) | SMS delivery speed is determined by Twilio/telecom infrastructure, not the alerting platform. | GoAlert Documentation |
| Monthly Cost (25 on-call users) | $250 - $1,025/month (PagerDuty per-seat pricing) | €14.28/month (fixed VPS cost, unlimited users) | None — cost does not scale with on-call team size. | Production Test |
| Escalation Policy Configuration | 5-15 minutes to configure a multi-tier escalation chain | 5-15 minutes (GoAlert UI is purpose-built and fast) | No significant difference — both platforms have intuitive escalation setup. | Production Test |
Frequently Asked Questions
Practical deployment, migration, and maintenance answers.
Does GoAlert support SMS and voice call escalations?▾
Yes. GoAlert integrates with Twilio for SMS and voice call notifications. You need a Twilio account with a phone number and sufficient balance for outbound messages. The per-message cost is identical whether using PagerDuty or GoAlert since both use Twilio.
Can Grafana OnCall work without Prometheus/Grafana?▾
Yes, but it requires more manual configuration. Grafana OnCall can receive alerts from any source via webhooks, email, or its API. The deep integration with Prometheus/Grafana is what makes it significantly easier to set up in an existing observability stack.
How do on-call schedules work in GoAlert?▾
GoAlert supports handoff-based rotations with configurable time windows (e.g. weekly, daily, or custom). You can create multiple rotation layers, set up escalation chains that notify backup personnel if the primary doesn't acknowledge, and override schedules for vacations or emergencies.
Can I integrate self-hosted on-call with Slack?▾
Yes. Both GoAlert and Grafana OnCall support Slack integration for alert delivery, acknowledgment, and escalation directly from Slack channels. GoAlert uses incoming webhooks; Grafana OnCall has a dedicated Slack app integration.
Is it safe to store incident data on a self-hosted VPS?▾
Yes — and it's often preferred for compliance-sensitive environments. Self-hosted on-call systems keep all incident data, escalation policies, and response histories on infrastructure you control, with no third-party access to your operational intelligence.
Skip the setup: get the production-ready stack
Don't stitch together configs from five different READMEs. Get all 5 production-hardened Docker Compose stacks — Postgres, Redis, SSL auto-renewal, and backup scripts — ready to deploy in minutes.
One-time purchase · Instant download · Production-ready