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/.env

Edit 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 -d

Traefik 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:

VariableDescription
ENCRYPTION_KEY64-char hex string for credential encryption
API_KEYAdmin API key for tenant management
DB_PASSWORDPostgreSQL password
DOMAINYour public domain name
ACME_EMAILEmail 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 --build

Database 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/health

The health endpoint returns { "status": "ok" } when the API is running and connected to the database.