worker_processes auto;
error_log /var/log/nginx/error.log warn;

events {
  worker_connections 4096;
  use epoll;
}

http {
  include /etc/nginx/mime.types;
  default_type application/octet-stream;

  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" rt=$request_time u="$upstream_addr"';
  access_log /var/log/nginx/access.log main;

  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;

  # WebSocket + long polling for Next.js dev/hmr not needed in prod
  map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
  }

  upstream cuppa_web {
    least_conn;
    server web:3000 max_fails=3 fail_timeout=30s;
    keepalive 64;
  }

  limit_req_zone $binary_remote_addr zone=auth_burst:20m rate=30r/s;
  limit_req_zone $binary_remote_addr zone=api_burst:20m rate=100r/s;

  server {
    listen 80;
    server_name _;

    client_max_body_size 2m;

    location /api/auth/ {
      limit_req zone=auth_burst burst=20 nodelay;
      proxy_pass http://cuppa_web;
      include /etc/nginx/proxy_params.conf;
    }

    location /api/ {
      limit_req zone=api_burst burst=50 nodelay;
      proxy_pass http://cuppa_web;
      include /etc/nginx/proxy_params.conf;
    }

    location / {
      proxy_pass http://cuppa_web;
      include /etc/nginx/proxy_params.conf;
    }
  }
}
