notifuse
★ 2.3kA self-hosted alternative to Mailchimp, Hubspot
About
Community Ratings
No ratings yetNew this week
Read recap →Features
- Visual email builder
- Campaign management
- A/B testing
- List management
- Contact profiles
- Visual flow automations
- Webhook steps
- REST API
- Open/click tracking
- Web analytics
Details
- Last Updated
- Nov 11, 2026
- Created
- Mar 15, 2025
- Install Methods
- docker-compose
- Requirements
- PostgreSQL 17 or newerAlloyDB Omni (optional for heavy-traffic web analytics installs)
- API
- REST
- Backup & Export
- file-backupdatabase-dump
- Privacy & Independence
- Cloud: Optional
- User Model
- Multi-UserMulti-Tenant
- Deployment
Deployment: Docker Compose ✓2 Containers — light hosting footprintRuns as 2 containers
Run notifuse yourself
Pick how much you want to manage.
netcupBest match
Full control
A small server, then Docker Compose.
About 20 minutes with Docker
Hetzner
Full control
A small server, then Docker Compose.
About 20 minutes with Docker
DigitalOcean
Full control
A small server, then Docker Compose.
About 20 minutes with Docker
1 more way to host
Some links earn us a commission. netcup pays us one and is our preferred VPS host.
Is this your project? Sponsor a listing
Run notifuse with Docker Compose
Compose file from the notifuse project repository.
2 services · database: postgres · infra: postgres
no resource limits declared
needs persistent storage (2 volumes)
compose.yaml · @ f075a7f · scanned Nov 12, 2026
# ⚠️ IMPORTANT: If using a .env file with Docker Compose
# Values containing # must be quoted: DB_PASSWORD="mypass#word123"
# See env.example for more details.
services:
api:
build:
context: .
dockerfile: Dockerfile
ports:
- '8081:8080'
- '587:587'
environment:
# Server Configuration
- SERVER_PORT=${SERVER_PORT:-8080}
- SERVER_HOST=${SERVER_HOST:-0.0.0.0}
- ENVIRONMENT=${ENVIRONMENT:-production}
# Database Configuration (Required)
- DB_HOST=${DB_HOST:-postgres}
- DB_PORT=${DB_PORT:-5432}
- DB_USER=${DB_USER:-postgres}
- DB_PASSWORD=${DB_PASSWORD:-postgres}
- DB_PREFIX=${DB_PREFIX:-notifuse}
- DB_NAME=${DB_NAME:-notifuse_system}
- DB_SSLMODE=${DB_SSLMODE:-disable}
# Secret Key (Required) - encrypts stored credentials and signs sessions and
# API keys. Set it in .env; a new installation generates one with
# openssl rand -base64 32. To replace it, list the new key first and the
# current one after a comma: Notifuse re-encrypts the stored data with the new
# key when it starts (see the 42.0 entry of CHANGELOG.md).
- 'SECRET_KEY=${SECRET_KEY:?set SECRET_KEY in .env. New installation, generate one with openssl rand -base64 32. Before 42.0 compose.yaml provided a default, see the 42.0 entry of CHANGELOG.md}'
# Notifuse licence key (Optional). Leaving it unset is the ordinary state
# of a self-hosted installation and means the free tier. It overrides any
# key pasted in the console under Settings > Licence. See env.example for
# what a licence covers and where a key comes from.
# - NOTIFUSE_LICENSE_KEY=${NOTIFUSE_LICENSE_KEY}
# All other settings (ROOT_EMAIL, API_ENDPOINT, SMTP)
# can be configured through the Setup Wizard on first launch
# Or set them here as environment variables if you prefer
# - ROOT_EMAIL=${ROOT_EMAIL}
# - API_ENDPOINT=${API_ENDPOINT}
# - SMTP_HOST=${SMTP_HOST}
# - SMTP_PORT=${SMTP_PORT}
# - SMTP_USERNAME=${SMTP_USERNAME}
# - SMTP_PASSWORD=${SMTP_PASSWORD}
# - SMTP_FROM_EMAIL=${SMTP_FROM_EMAIL}
# - SMTP_FROM_NAME=${SMTP_FROM_NAME}
# SMTP Bridge Configuration (Optional - for receiving inbound emails)
# - SMTP_BRIDGE_ENABLED=${SMTP_BRIDGE_ENABLED}
# - SMTP_BRIDGE_PORT=${SMTP_BRIDGE_PORT}
# - SMTP_BRIDGE_DOMAIN=${SMTP_BRIDGE_DOMAIN}
# - SMTP_BRIDGE_TLS=${SMTP_BRIDGE_TLS} # off | starttls | implicit (default: starttls when certs present)
# - SMTP_BRIDGE_TLS_CERT_BASE64=${SMTP_BRIDGE_TLS_CERT_BASE64}
# - SMTP_BRIDGE_TLS_KEY_BASE64=${SMTP_BRIDGE_TLS_KEY_BASE64}
depends_on:
- postgres
volumes:
- ./data:/app/data
restart: unless-stopped
networks:
- notifuse-network
healthcheck:
test:
['CMD', 'wget', '--no-verbose', '--tries=1', '--spider', 'http://localhost:8080/healthz']
interval: 10s
timeout: 5s
retries: 3
start_period: 10s
postgres:
# Pinned to 17 deliberately. Bumping the major version here would break
# every existing install: the server refuses to start on a data directory
# from an older major without pg_upgrade, and postgres:18 also moved PGDATA
# to /var/lib/postgresql/18/docker (declaring VOLUME /var/lib/postgresql),
# so the volume mounted below would no longer receive the data at all.
# Notifuse runs on 17+; to move to 18, migrate with pg_upgrade and mount
# the volume at /var/lib/postgresql. For faster analytics, prefer
# compose.alloydb.yaml.
image: postgres:17-alpine
ports:
- '5433:5432'
environment:
- POSTGRES_USER=${DB_USER:-postgres}
- POSTGRES_PASSWORD=${DB_PASSWORD:-postgres}
- POSTGRES_DB=${POSTGRES_DB:-postgres}
volumes:
- postgres-data:/var/lib/postgresql/data
restart: unless-stopped
networks:
- notifuse-network
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres']
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres-data:
driver: local
networks:
notifuse-network:
driver: bridge
This file may be out of date. Check the notifuse documentation for current setup steps.
Tags
Track your self-hosted stack
Bookmark software to try, rate tools you've used, and keep your collection in one place.