SelfHostStackOpen-Source Directory

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 / ScalePagerDuty & Opsgenie CostSelf-Hosted VPS CostEstimated Annual SavingsTechnical 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/yearGoAlert 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/yearGoAlert 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+/yearFull 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.

Min RAM256 MB
Min CPU1 vCPU
GitHub Repo ↗

✅ 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

On-call schedule management with rotation, escalation, and override support
Multi-channel alerting: SMS, voice calls, email, Slack, and webhooks
Automatic escalation when alerts are unacknowledged within configurable time windows
Google Calendar and CalDAV sync for on-call schedule visualization
GraphQL API for custom integrations and dashboard embedding

Architecture Notes

Go application with PostgreSQL backend. Exposes a GraphQL API for the web UI and external integrations. Supports SMS (Twilio), voice calls (Twilio), email, and Slack notifications. On-call schedules sync with Google Calendar and CalDAV.

Known Limitations

Requires Twilio or an SMS-capable provider for voice/SMS notifications — these costs are separate from the self-hosted infrastructure.

Official Documentation ↗
📄 docker-compose.yml
Production Ready
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

  1. 1Provision a VPS with at least 256MB RAM and 1 vCPU.
  2. 2Install Docker & Docker Compose: `curl -fsSL https://get.docker.com | sh`.
  3. 3Create the GoAlert docker-compose.yml with PostgreSQL backend.
  4. 4Set up a Twilio account for SMS/voice notifications and note the SID and auth token.
  5. 5Run `docker compose up -d` and access the web UI at http://YOUR_VPS_IP:8081.
  6. 6Configure Caddy reverse proxy for SSL and create on-call schedules in the UI.
  7. 7Integrate with Slack via incoming webhooks for chat-based alerting.

Recommended Cloud VPS for GoAlert

Compare all VPS hosts →
Hetzner Cloud€3.79/mo

CX22 (2 vCPU, 4GB RAM, 40GB NVMe)

Plenty of headroom for GoAlert with room for other services.

Deploy on Hetzner →
DigitalOcean$6.00/mo

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.

Min RAM1 GB
Min CPU1 vCPU
GitHub Repo ↗

✅ 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

Deep integration with Grafana alerting and Prometheus alertmanager
On-call schedule management with rotations, overrides, and escalation chains
Multi-channel notifications: Slack, Telegram, phone, SMS, email, webhooks
Incident grouping and auto-resolution based on alert fingerprints
Web UI for schedule management and incident timeline visualization

Architecture Notes

Python/Django application with PostgreSQL and Redis backend. Deeply integrated with Grafana alerting and Prometheus alertmanager — alerts flow naturally from Prometheus/Grafana dashboards into OnCall escalation policies. Supports Slack, Telegram, phone, SMS, and webhook notifications.

Known Limitations

Best value comes when already using Grafana + Prometheus for monitoring — standalone usage requires more setup to create alert sources.

Official Documentation ↗
📄 docker-compose.yml
Production Ready
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

  1. 1Provision a VPS with at least 1GB RAM and 1 vCPU.
  2. 2Install Docker & Docker Compose: `curl -fsSL https://get.docker.com | sh`.
  3. 3Clone the Grafana OnCall Docker setup: `git clone https://github.com/grafana/oncall`.
  4. 4Follow the official Docker deployment guide to configure PostgreSQL and Redis connections.
  5. 5Run `docker compose up -d` and configure Grafana OnCall as a data source in your Grafana instance.
  6. 6Connect your existing Prometheus/Grafana alerting rules to OnCall escalation policies.
  7. 7Configure Slack integration for team-based alerting and acknowledgment.

Recommended Cloud VPS for Grafana OnCall

Compare all VPS hosts →
Hetzner Cloud€3.79/mo

CX22 (2 vCPU, 4GB RAM, 40GB NVMe)

Comfortable for OnCall alongside Grafana and Prometheus.

Deploy on Hetzner →
Hetzner Cloud€14.28/mo

CPX31 (4 vCPU, 8GB RAM)

Recommended when running the full Grafana + Prometheus + OnCall stack.

Deploy on Hetzner →
DigitalOcean$24.00/mo

Regular Droplet (2 vCPU, 4GB RAM, 80GB SSD)

Includes $200 free trial credits for new accounts.

Claim $200 DO Credit →

Quick Specification Matrix

ToolLicenseMin RAMMin CPUGitHub RepoPrimary Advantage
PagerDuty & Opsgenie (Proprietary)Proprietary ClosedManaged CloudManaged CloudN/ATurnkey onboarding with vendor lock-in & paywalls
GoAlertApache-2.0256 MB1 vCPUtarget/goalertZero per-user fees — unlimited on-call users on a single VPS
Grafana OnCallAGPL-3.01 GB1 vCPUgrafana/oncallNative 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 MetricPagerDuty & Opsgenie BaselineSelf-Hosted Alternative MetricOperational Bottleneck / LimitSource
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 Configuration5-15 minutes to configure a multi-tier escalation chain5-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.

Starter Stack Pack — $29

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.

n8nVisual workflow automation
📊UmamiPrivacy-first web analytics
🛡️Uptime KumaUptime monitoring & alerts
🔐VaultwardenBitwarden-compatible vault
☁️NextcloudDropbox/Drive replacement
Get the Stack Pack — $29 →

One-time purchase · Instant download · Production-ready

esc
navigate open