Skip to content

Reverse Proxy Setup for Notivae

To make Notivae work correctly, you need to set up a reverse proxy. This is required even for local installations — not just for exposing it to the internet.

Why You Need a Reverse Proxy

By default, Notivae’s frontend and backend are served on different ports:

  • Frontend: http://localhost:8766
  • Backend: http://localhost:8765

But the frontend is hardcoded to call the backend via /api on the same host and port. Without a reverse proxy, this fails, and the web UI won’t work.

A reverse proxy solves this by:

  • Making both frontend and backend accessible from one unified domain
  • Forwarding frontend requests to the frontend container
  • Forwarding /api requests to the backend container
  • Optionally handling HTTPS for secure public access

What You’ll Need

  • A reverse proxy installed (see options below)
  • A domain name (for internet-facing setups)
  • Basic familiarity with editing config files or using Docker
ToolWhy Use ItDocs
CaddyEasiest to set up, automatic HTTPScaddyserver.com
TraefikDesigned for Docker, dynamic routingtraefik.io
NginxMost flexible, widely supportednginx.org

Example Configs

IMPORTANT

These configuration examples assume your reverse proxy is running inside Docker (alongside Notivae, via docker-compose).
If you're using a system-wide reverse proxy (e.g., Traefik or Nginx on the host system), replace:

  • backend:80 with http://localhost:8765
  • frontend:80 with http://localhost:8766

Caddy Example

If you're using Docker Compose, create a Caddyfile like this:

caddyfile
notivae.localhost

handle_path /api/* {
    reverse_proxy backend:80
}

handle {
    reverse_proxy frontend:80
}

And add a Caddy service to your docker-compose.yml:

yaml
services:
  caddy:
    image: caddy:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
    depends_on:
      - frontend
      - backend

💡 You’ll need to update notivae.localhost to your actual domain or host if not using localhost.

Nginx Example

If you're using Docker Compose, create a nginx.conf like this:

nginx
server {
    listen 80;
    server_name notivae.localhost;

    location /api/ {
        proxy_pass http://backend:80/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location / {
        proxy_pass http://frontend:80/;
    }
}

And add an nginx service to your docker-compose.yml:

yaml
services:
  nginx:
    image: nginx:alpine
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    depends_on:
      - frontend
      - backend

INFO

You’ll need to update notivae.localhost to your actual domain or host if not using localhost.

Exposing to the Internet

If you're self-hosting (e.g., on a home network or behind NAT), you'll need to expose your reverse proxy to the internet. There are two options:

1. Port Forwarding (Risky)

Open ports 80 and 443 on your router to your server. Only recommended if you know how to secure your server (firewalls, fail2ban, etc.).

Use a tunnel service to make your reverse proxy public without opening any ports:

These services let you tunnel traffic from a public domain to your local machine securely.

Alternative: Tunnel-Only Setup (No Reverse Proxy)

If you’re using a tunnel provider like Cloudflare Tunnel, you can skip setting up a separate reverse proxy altogether.

Configure your tunnel to forward:

  • https://notivae.example.com/api/http://localhost:8765
  • https://notivae.example.com/http://localhost:8766

This works because most tunnel providers allow advanced path-based routing. Notivae only requires that /api/* hits the backend on the same domain.

This is ideal for simple home or private setups with minimal config.

Final Checklist

Once all of this is in place, open your browser at:

https://<your-domain-or-ip>
e.g. https://notivae.example.com

and the login-page should appear.

TIP

Don't forget to run the setup wizard at

https://<your-domain-or-ip>/#/init

️ Having issues? Start by checking the container logs:

bash
docker compose logs  # inspect all logs
docker compose logs frontend  # inspect logs for a specific service

Still stuck? Look through our troubleshooting guide or otherwise open a GitHub issue.