Self-Hosting
Notipo is open source under the AGPL-3.0 license. You can run it on your own server with Docker. All features are unlocked when self-hosting.
Requirements
- A Linux VPS with Docker and Docker Compose v2 installed
- A domain name with an A record pointing to the server IP
- Ports 80 and 443 open in the firewall
Quick Start
git clone https://github.com/kfuras/notipo.git
cd notipo
cp apps/api/.env.example apps/api/.envEdit apps/api/.env and set these values:
ENCRYPTION_KEY=<openssl rand -hex 32>
API_KEY=<openssl rand -hex 16>
DB_PASSWORD=<openssl rand -hex 16>
DOMAIN=yourdomain.com
[email protected]Start the stack:
docker compose -f docker-compose.prod.yml up -dTraefik handles TLS certificates automatically via Let's Encrypt. On first start, the app runs database migrations. Your site will be available at https://yourdomain.com.
Open https://yourdomain.com/admin and register with your email and password. The first user becomes the owner with full access — no email verification required.
Environment Variables
The full list of environment variables is documented in the README. The minimum required variables are:
| Variable | Description |
|---|---|
| ENCRYPTION_KEY | 64-char hex string for credential encryption |
| API_KEY | Admin API key for tenant management |
| DB_PASSWORD | PostgreSQL password |
| DOMAIN | Your public domain name |
| ACME_EMAIL | Email for Let's Encrypt certificate notifications |
Architecture
The production Docker Compose stack includes four services:
- Traefik — reverse proxy with automatic TLS via Let's Encrypt
- App — Fastify API server (Node.js)
- Web — nginx serving the static Next.js frontend, proxying API requests to the app
- Postgres — PostgreSQL database
Traefik routes /api/* and /health to the API. Everything else goes to the web frontend.
Updating
cd notipo
git pull
docker compose -f docker-compose.prod.yml up -d --buildDatabase migrations run automatically on container startup.
Email (Optional)
To enable password reset emails, set RESEND_API_KEY and RESEND_FROM_EMAIL. Without these, registration still works — email verification is skipped automatically.
Logs & Troubleshooting
# View API logs
docker logs notipo-app -f --tail 100
# View all services
docker compose -f docker-compose.prod.yml logs -f
# Check health
curl https://yourdomain.com/healthThe health endpoint returns { "status": "ok" } when the API is running and connected to the database.