# required to run in a container
daemon off;

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {
    # basic settings
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_names_hash_bucket_size 64;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    {{ if .deis_router_gzip }}
    gzip {{ .deis_router_gzip }};
    gzip_comp_level {{ .deis_router_gzipCompLevel }};
    gzip_disable {{ .deis_router_gzipDisable }};
    gzip_http_version {{ .deis_router_gzipHttpVersion }};
    gzip_types {{ .deis_router_gzipTypes }};
    gzip_proxied {{ .deis_router_gzipProxied }};
    gzip_vary {{ .deis_router_gzipVary }};{{ end }}

    # send logs to STDOUT so they can be seen using 'docker logs'
    access_log /dev/stdout;
    error_log /dev/stdout;

    ## start deis-controller
    {{ if .deis_controller_host }}
    upstream deis-controller {
        server {{ .deis_controller_host }}:{{ .deis_controller_port }};
    }

    server {
        server_name ~^deis\.(?<domain>.+)$;
        server_name_in_redirect off;
        port_in_redirect off;

        location / {
            proxy_buffering             off;
            proxy_set_header            Host $host;
            proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect              off;
            proxy_connect_timeout       10s;
            proxy_send_timeout          1200s;
            proxy_read_timeout          1200s;

            proxy_pass                  http://deis-controller;
        }
    }{{ end }}
    ## end deis-controller

    ## start service definitions for each application
    {{ $domains := .deis_domains }}{{ range $service := .deis_services }}{{ if $service.Nodes }}
    upstream {{ Base $service.Key }} {
        {{ range $upstream := $service.Nodes }}server {{ $upstream.Value }};
        {{ end }}
    }

    server {
        server_name ~^{{ Base $service.Key }}\.(?<domain>.+)${{ range $app_domains := $domains }}{{ if eq (Base $service.Key) (Base $app_domains.Key) }} {{ $app_domains.Value }}{{ end }}{{ end }};

        server_name_in_redirect off;
        port_in_redirect off;

        location / {
            proxy_buffering             off;
            proxy_set_header            Host $host;
            proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect              off;
            proxy_connect_timeout       10s;
            proxy_send_timeout          1200s;
            proxy_read_timeout          1200s;

            add_header                  X-Deis-Upstream $upstream_addr;

            proxy_pass                  http://{{ Base $service.Key }};
        }
    }
    {{ end }}{{ end }}
    ## end service definitions for each application

    # healthcheck
    server {
        listen 80 default_server;
        location /health-check {
            default_type 'text/plain';
            access_log off;
            return 200;
        }
    }
}

## start builder
{{ if .deis_builder_host }}
tcp {
    access_log /dev/stdout;
    tcp_nodelay on;
    timeout 1200000;

    # same directive names, but these are in miliseconds...
    proxy_connect_timeout       10000;
    proxy_send_timeout          1200000;
    proxy_read_timeout          1200000;

    upstream builder {
        server {{ .deis_builder_host }}:{{ .deis_builder_port }};
    }

    server {
        listen 2222;
        proxy_pass builder;
    }
}{{ end }}
## end builder
