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.