Self-Hosting Apprise with Docker Compose

What Is Apprise?

Apprise is a notification aggregator that sends alerts to over 100 services through a single API. Instead of writing separate integrations for Slack, Discord, Telegram, email, Pushover, and every other notification platform, you configure Apprise once and send to all of them with one HTTP call. It includes a web UI for managing notification targets and a REST API for programmatic use. Perfect for connecting your self-hosted monitoring stack to the notification channels your team actually uses.

Official site · GitHub · Supported services

Prerequisites

  • A Linux server (Ubuntu 22.04+ recommended)
  • Docker and Docker Compose installed (guide)
  • 512 MB of free RAM
  • 1 GB of free disk space

Docker Compose Configuration

Apprise runs as a single lightweight container with an Nginx frontend and Python backend.

Create a docker-compose.yml file:

services:
  apprise:
    image: caronc/apprise:1.3.1
    container_name: apprise
    restart: unless-stopped
    ports:
      - "8000:8000"
    volumes:
      - apprise_config:/config      # Persistent notification configurations
      - apprise_attach:/attach      # Attachment storage for file-based notifications
    environment:
      - APPRISE_STATEFUL_MODE=simple     # "simple" or "hash" — simple uses human-readable config keys
      - APPRISE_WORKER_COUNT=1           # Gunicorn workers — increase for high-volume setups
      - APPRISE_ATTACH_SIZE=15           # Max attachment size in MB
      - APPRISE_BODY_SIZE_MAX=65536      # Max notification body size in bytes

volumes:
  apprise_config:
  apprise_attach:

Start the stack:

docker compose up -d

The web UI is available immediately at http://your-server-ip:8000.

Initial Setup

  1. Open http://your-server-ip:8000 in your browser
  2. You’ll see the Apprise configuration manager UI
  3. Click Configuration Manager to create notification targets
  4. Add URLs using Apprise URL syntax (documented below)

Adding Notification Targets

Apprise uses URL-based configuration. Each notification service has a specific URL format:

ServiceURL Format
Slackslack://TokenA/TokenB/TokenC/Channel
Discorddiscord://WebhookID/WebhookToken
Telegramtgram://BotToken/ChatID
Email (SMTP)mailto://user:[email protected][email protected]
Pushoverpover://UserKey@AppToken
Gotifygotify://hostname/token
Ntfyntfy://topic or ntfys://ntfy.example.com/topic
Matrixmatrix://user:pass@hostname/#room
Webhookjson://your-webhook-url

Full list: Apprise supported services

Persistent Configuration

Store notification URLs in a named configuration using the API:

# Save a configuration called "homelab"
curl -X POST http://localhost:8000/add/homelab \
  -H "Content-Type: application/json" \
  -d '{"urls": ["discord://WebhookID/WebhookToken", "tgram://BotToken/ChatID"]}'

Sending Notifications

Via REST API

# Send to a saved configuration
curl -X POST http://localhost:8000/notify/homelab \
  -H "Content-Type: application/json" \
  -d '{"title": "Server Alert", "body": "Disk usage at 90%", "type": "warning"}'

Via Stateless API (no saved config needed)

curl -X POST http://localhost:8000/notify \
  -H "Content-Type: application/json" \
  -d '{
    "urls": ["discord://WebhookID/WebhookToken"],
    "title": "Quick Alert",
    "body": "Something happened"
  }'

Notification Types

TypePurpose
infoInformational (default)
successSuccess notification
warningWarning alert
failureError/failure alert

The notification type affects formatting on services that support it — Discord embeds change color, email subjects get prefixed, etc.

Integration with Self-Hosted Monitoring

Apprise works well as a notification hub for your monitoring stack:

Monitoring ToolIntegration Method
Uptime KumaBuilt-in Apprise support (just enter the Apprise API URL)
GrafanaWebhook alert channel pointing to Apprise API
PrometheusAlertmanager webhook receiver
NetdataCustom notification script calling Apprise API
Shell scriptscurl to the Apprise REST API
PortainerWebhook notifications to Apprise

Uptime Kuma Integration

Uptime Kuma has native Apprise support. In Uptime Kuma’s notification settings:

  1. Select Apprise (URL) as the notification type
  2. Enter http://apprise:8000/notify/homelab (if on the same Docker network) or the full URL
  3. Test the notification

Configuration

Security

Apprise has no built-in authentication. For production use, place it behind a reverse proxy with authentication:

    # Add to environment if you want to restrict API access
    environment:
      - APPRISE_API_KEY=your-secret-api-key    # Requires this key in API requests

Alternatively, use Authelia or Authentik in front of Apprise via your reverse proxy.

Stateful Modes

ModeDescription
simpleConfig keys are human-readable names (e.g., homelab, alerts)
hashConfig keys are SHA1 hashes of the tag name (harder to guess)

Use simple for internal homelabs. Use hash if the API is exposed beyond your LAN.

Backup

The only critical data is the config volume:

docker run --rm -v apprise_config:/data -v $(pwd):/backup alpine \
  tar czf /backup/apprise_config_$(date +%Y%m%d).tar.gz /data

Configurations are stored as text files — small and easy to back up. For automated backups, see Backup Strategy.

Troubleshooting

Notifications not arriving

Symptom: API returns 200 but no notification appears on the target service.

Fix: Check the URL syntax. Apprise silently fails on malformed URLs. Test with the web UI first — it shows error details. Also verify your service tokens/webhooks are still valid.

”Connection refused” from other containers

Symptom: Uptime Kuma or other Docker services can’t reach Apprise.

Fix: Use the Docker service name (apprise) not localhost. Ensure both services are on the same Docker network, or use the host IP.

Large attachments rejected

Symptom: File-based notifications fail with size errors.

Fix: Increase APPRISE_ATTACH_SIZE (default 15 MB). Also check your reverse proxy’s upload limit.

Resource Requirements

  • RAM: ~50 MB idle, ~150 MB under load
  • CPU: Minimal — notification sending is I/O-bound, not CPU-bound
  • Disk: <100 MB for the application, plus attachment storage

Apprise is one of the lightest self-hosted services you can run. It’s a good candidate for running alongside other services on resource-constrained hardware like a Raspberry Pi.

Verdict

Apprise solves the “too many notification services” problem cleanly. Instead of configuring Slack webhooks, Discord bots, Telegram bots, and email alerts separately in every monitoring tool, you point everything at Apprise and manage notification targets in one place. The REST API is dead simple, and the URL-based configuration means you can version-control your notification setup.

The main limitation is the lack of built-in authentication — you’ll want a reverse proxy for anything internet-facing. For push notifications to your phone specifically, Ntfy is more focused. For a full notification relay with persistent message storage, Gotify is better. But as a universal notification aggregator that ties your entire homelab together, Apprise is unmatched.