Reverse proxy setup
In the following, different reverse proxy setups are given (in alphabetical order) to make Crow work behind a reverse proxy:
Apache
The following modules are required:
proxyproxy_http
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
Caddy
Server
GRPC
Note
This is only needed when agents on remote servers should be connected over the public internet.
Nginx
Server
server {
    listen 443 ssl;
    server_name crow.example.com;
    ssl_certificate path/to/cert;
    ssl_certificate_key path/to/key;
    location / {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_pass http://0.0.0.0:8000;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_buffering off;
        chunked_transfer_encoding off;
    }
}
Info
This does not cover an SSL configuration with NGINX but only shows how to properly forward incoming requests through NGINX to Crow.
GRPC
Note
This is only needed when agents on remote servers should be connected over the public internet.
server {
    listen 443 ssl;
    server_name grpc.example.com;
    ssl_certificate path/to/cert;
    ssl_certificate_key path/to/key;
    location / {
      grpc_pass grpc://0.0.0.0:9000;
    }
}
Ngrok
Start ngrok using the designed Crow port, e.g. ngrok http 8000. This will return a response similar to the following
Set CROW_HOST to the returned URL and (re)start Crow.
Tunnelmole
Start tunnelmole using the designed Crow port, e.g. tmole 8000. This will return a response similar to the following
tmole 8000
http://bvdo5f-ip-49-183-170-144.tunnelmole.net is forwarding to localhost:8000
https://bvdo5f-ip-49-183-170-144.tunnelmole.net is forwarding to localhost:8000
Set CROW_HOST to the returned URL (e.g. exx.tunnelmole.net) and (re)start Crow.
Traefik
This is a comprehensive example, which uses traefik running via docker compose and applies TLS termination and automatic redirection from http to https.
Server
services:
  server:
    image: <image>
    environment:
      # [..] Crow settings
    networks:
      - dmz # externally defined network, so that traefik can connect to the server
    volumes:
      - crow-server-data:/var/lib/crow/
    deploy:
      labels:
        - traefik.enable=true
        # web server
        - traefik.http.services.crow-service.loadbalancer.server.port=8000
        - traefik.http.routers.crow-secure.rule=Host(`cd.your-domain.com`)
        - traefik.http.routers.crow-secure.tls=true
        - traefik.http.routers.crow-secure.tls.certresolver=letsencrypt
        - traefik.http.routers.crow-secure.entrypoints=web-secure
        - traefik.http.routers.crow-secure.service=crow-service
        - traefik.http.routers.crow.rule=Host(`cd.your-domain.com`)
        - traefik.http.routers.crow.entrypoints=web
        - traefik.http.routers.crow.service=crow-service
        - traefik.http.middlewares.crow-redirect.redirectscheme.scheme=https
        - traefik.http.middlewares.crow-redirect.redirectscheme.permanent=true
        - traefik.http.routers.crow.middlewares=crow-redirect@docker
GRPC
Note
This is only needed when agents on remote servers should be connected over the public internet.
# [...] continued from previous block
        - traefik.http.services.crow-grpc.loadbalancer.server.port=9000
        - traefik.http.services.crow-grpc.loadbalancer.server.scheme=h2c
        - traefik.http.routers.crow-grpc-secure.rule=Host(`grpc.crow.example.com`)
        - traefik.http.routers.crow-grpc-secure.tls=true
        - traefik.http.routers.crow-grpc-secure.tls.certresolver=letsencrypt
        - traefik.http.routers.crow-grpc-secure.entrypoints=web-secure
        - traefik.http.routers.crow-grpc-secure.service=crow-grpc
        - traefik.http.routers.crow-grpc.rule=Host(`grpc.crow.example.com`)
        - traefik.http.routers.crow-grpc.entrypoints=web
        - traefik.http.routers.crow-grpc.service=crow-grpc
        - traefik.http.middlewares.crow-grpc-redirect.redirectscheme.scheme=https
        - traefik.http.middlewares.crow-grpc-redirect.redirectscheme.permanent=true
        - traefik.http.routers.crow-grpc.middlewares=crow-grpc-redirect@docker
networks:
  dmz:
    external: true
HAProxy
General frontend configuration:
frontend https_in
    mode http
    bind :::443 v4v6 ssl crt <cert>
    acl is_ci_subdomain hdr(host) -i crow.example.com
    acl is_grpc_ci_subdomain hdr(host) -i grpc.crow.example.com
    use_backend crowci_backend if is_ci_subdomain
    use_backend crowci_grpc_backend if is_grpc_ci_subdomain
Server
backend crowci_backend
    mode http
    balance roundrobin
    http-request del-header X-Forwarded-For
    http-request del-header X-Real-IP
    # add an X-Forwarded-For header to the request, containing the actual IP address of the client
    option forwardfor
    server crowci 0.0.0.0:8000 maxconn 100000 check