upstream v-configuration {
   least_conn;
   server 127.0.0.1:23000;
}

upstream v-partnerportal {
   least_conn;
   server 127.0.0.1:3020;
}

upstream v-apiserver {
   least_conn;
   server 127.0.0.1:8090;
}

upstream v-surveillance {
   least_conn;
   server 127.0.0.1:8041;
}

upstream userportal {
   least_conn;
   server 127.0.0.1:3010;
}

upstream v-notificationserver {
   least_conn;
   server 127.0.0.1:8079;
}

upstream v-remoteeventserver {
	ip_hash;
	server 127.0.0.1:15675;
}

# Streaming Section
upstream stream_service {
   server 127.0.0.1:8083;
}

upstream cache_service {
   server 127.0.0.1:8084;
}

upstream metadata_service_proxy {
   server 127.0.0.1:20004;
}

upstream stream_service_proxy {
   server 127.0.0.1:20003 max_conns=1000 max_fails=3 fail_timeout=30s;
   keepalive 64;
}

upstream grpc_rcsagent {
   server 127.0.0.1:9012;   # gRPC RCS Agent
   keepalive 180;
}

map $http_upgrade $connection_upgrade {
	default upgrade;
	'' close;
}

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;
   http2 on;

   # return 301 https://$host$request_uri;

   location /v-apiserver/ {
      proxy_pass http://v-apiserver;
   }

   location /vsaas {
      proxy_pass http://v-surveillance;
   }

   location / {
      proxy_pass http://userportal/;
   }

   location /v-notificationserver {
      proxy_pass http://v-notificationserver;
   }

   location ~ /(.+)/v2/stream/(.*)$ {
      proxy_pass http://$1/v2/stream/$2;
   }

   location ~ /(.+)/live/(.*)$ {
      proxy_pass http://$1/live/$2;
   }

   location /ws {
      proxy_pass http://v-remoteeventserver;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_connect_timeout 1s;
      proxy_set_header Host $host;
	}

   # Streaming Section
    # gRPC upstreams (1 hour timeouts)
   location /metadata_service. {
      grpc_pass grpc://metadata_service_proxy;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;    # fail fast on connect
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /stream_service. {
      grpc_pass grpc://stream_service_proxy;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /central_service. {
      grpc_pass grpc://stream_service_proxy;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /stream_service_archive.v3. {
      grpc_pass grpc://stream_service;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /central_service_archive.v3. {
      grpc_pass grpc://stream_service;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /api/ws {
      proxy_pass http://stream_service;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_connect_timeout 3s;
      proxy_send_timeout 3600s;
      proxy_read_timeout 3600s;
      send_timeout 3600s;

      proxy_set_header Host $host;
   }

   location /v3/api/ws {
      proxy_pass http://stream_service;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_connect_timeout 3s;
      proxy_send_timeout 3600s;
      proxy_read_timeout 3600s;
      send_timeout 3600s;

      proxy_set_header Host $host;
   }

   location /v2/stream {
      proxy_pass http://stream_service;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_connect_timeout 3s;
      proxy_send_timeout 3600s;
      proxy_read_timeout 3600s;
      send_timeout 3600s;

      proxy_set_header Host $host;
   }

   location /ws/timeline {
      proxy_pass http://cache_service;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_connect_timeout 3s;
      proxy_send_timeout 3600s;
      proxy_read_timeout 3600s;
      send_timeout 3600s;

      proxy_set_header Host $host;
   }

   # Route for RCS Agent
   location /v_data_pusher_receiver. {
      grpc_pass grpc://grpc_rcsagent;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      error_page 502 = /error502grpc;
   }

   location = /error502grpc {

      internal;

      default_type application/grpc;

      add_header grpc-status 14;

      add_header grpc-message “unavailable”;

      return 204;

   }
}


server {
   # SSL configuration

   listen 443 ssl;
   listen [::]:443 ssl;

   http2 on;

   ssl_certificate		/etc/nginx/ssl/videonetics.cer;
   ssl_certificate_key	/etc/nginx/ssl/videonetics.key;

   ssl_session_timeout 1d;
   ssl_session_cache shared:SharedNixCraftSSL:10m;
   ssl_session_tickets off;

   # TLS 1.3 only
   ssl_protocols TLSv1.2 TLSv1.3;
   ssl_prefer_server_ciphers off;

   # OCSP stapling
   ssl_stapling off;
   ssl_stapling_verify off;

   # verify chain of trust of OCSP response using Root CA and Intermediate certs
   # ssl_trusted_certificate /etc/nginx/ssl/fullchain.pem;

   client_max_body_size	200M;


   location /v-apiserver/ {
      proxy_pass http://v-apiserver;

      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      # enables WS support
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_send_timeout          600;
      proxy_read_timeout          600;
      send_timeout                600;
   }

   location /vsaas {
      proxy_pass http://v-surveillance;

      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      # enables WS support
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_send_timeout          600;
      proxy_read_timeout          600;
      send_timeout                600;
   }

   location / {
      proxy_pass http://userportal/;

      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      # enables WS support
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_send_timeout          600;
      proxy_read_timeout          600;
      send_timeout                600;
   }

   location /v-configuration/ {
      proxy_pass http://v-configuration/;

      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      proxy_send_timeout          600;
      proxy_read_timeout          600;
      send_timeout                600;
   }

   location /v-notificationserver {
      proxy_pass http://v-notificationserver;

      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      # enables WS support
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_send_timeout          600;
      proxy_read_timeout          600;
      send_timeout                600;
   }

   location ~ /(.+)/v2/stream/(.*)$ {
      proxy_pass http://$1/v2/stream/$2;

      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }

   location ~ /(.+)/live/(.*)$ {
      proxy_pass http://$1/live/$2;
   }

   location /ws {
      proxy_pass http://v-remoteeventserver;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_connect_timeout 1s;
      proxy_set_header Host $host;
      proxy_ssl_certificate /etc/nginx/ssl/videonetics.cer;
      proxy_ssl_certificate_key /etc/nginx/ssl/videonetics.key;
	}

   # Streaming Section
   location /metadata_service. {
      grpc_pass grpc://metadata_service_proxy;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;    # fail fast on connect
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /stream_service. {
      grpc_pass grpc://stream_service_proxy;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /central_service. {
      grpc_pass grpc://stream_service_proxy;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /stream_service_archive.v3. {
      grpc_pass grpc://stream_service;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /central_service_archive.v3. {
      grpc_pass grpc://stream_service;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      grpc_buffer_size 16k;
      error_page 502 = /error502grpc;
   }

   location /api/ws {
      proxy_pass http://stream_service;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_connect_timeout 3s;
      proxy_send_timeout 3600s;
      proxy_read_timeout 3600s;
      send_timeout 3600s;

      proxy_set_header Host $host;
   }

   location /v3/api/ws {
      proxy_pass http://stream_service;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_connect_timeout 3s;
      proxy_send_timeout 3600s;
      proxy_read_timeout 3600s;
      send_timeout 3600s;

      proxy_set_header Host $host;
   }

   location /v2/stream {
      proxy_pass http://stream_service;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_connect_timeout 3s;
      proxy_send_timeout 3600s;
      proxy_read_timeout 3600s;
      send_timeout 3600s;

      proxy_set_header Host $host;
   }

   location /ws/timeline {
      proxy_pass http://cache_service;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_connect_timeout 3s;
      proxy_send_timeout 3600s;
      proxy_read_timeout 3600s;
      send_timeout 3600s;

      proxy_set_header Host $host;
   }

   # Route for RCS Agent
   location /v_data_pusher_receiver. {
      grpc_pass grpc://grpc_rcsagent;
      access_log /var/log/nginx/grpc_access.log grpc;

      grpc_connect_timeout 3s;
      grpc_send_timeout 3600s;
      grpc_read_timeout 3600s;
      error_page 502 = /error502grpc;
   }

   location = /error502grpc {

      internal;

      default_type application/grpc;

      add_header grpc-status 14;

      add_header grpc-message “unavailable”;

      return 204;

   }
}

server {
   listen 3030 default_server;
   #listen [::]:3010 default_server ipv6only=on;

   location / {
      proxy_pass http://v-partnerportal/;
   }

   location /v-apiserver/ {
      proxy_pass http://v-apiserver;
   }
}


