limit_req_zone $binary_remote_addr zone=push_json:32m rate=200r/s;

map $hostname $upstream {
    ~^test-gateway  solomon-test-upstream;
    ~^pre-gateway   solomon-pre-upstream;
    default         solomon-upstream;
}
upstream solomon-test-upstream {
    server localhost:5540;
    server test-gateway-sas-00.mon.yandex.net:5540 backup;
}
upstream solomon-pre-upstream {
    server localhost:5540;
    server pre-gateway-sas-00.mon.yandex.net:5540 backup;
    server pre-gateway-sas-01.mon.yandex.net:5540 backup;
    server pre-gateway-sas-02.mon.yandex.net:5540 backup;
}
upstream solomon-upstream {
    server localhost:5540;
    server gateway-myt-00.mon.yandex.net:5540 backup;
    server gateway-myt-01.mon.yandex.net:5540 backup;
    server gateway-myt-02.mon.yandex.net:5540 backup;
    server gateway-vla-00.mon.yandex.net:5540 backup;
    server gateway-vla-01.mon.yandex.net:5540 backup;
    server gateway-vla-02.mon.yandex.net:5540 backup;
    server gateway-vla-03.mon.yandex.net:5540 backup;
    server gateway-vla-04.mon.yandex.net:5540 backup;
    server gateway-sas-00.mon.yandex.net:5540 backup;
    server gateway-sas-01.mon.yandex.net:5540 backup;
    server gateway-sas-02.mon.yandex.net:5540 backup;
    server gateway-sas-03.mon.yandex.net:5540 backup;
    server gateway-sas-04.mon.yandex.net:5540 backup;
    server gateway-man-00.mon.yandex.net:5540 backup;
    server gateway-man-01.mon.yandex.net:5540 backup;
    server gateway-man-02.mon.yandex.net:5540 backup;
}
upstream solomon-discovery {
    server localhost:8010;
}


client_max_body_size    16m;
client_body_buffer_size 128k;

client_header_buffer_size   4k;
large_client_header_buffers 8 32k;


log_format  debug '$time_local {"remote_addr":"$remote_addr", "status":"$status", "request":"$request", "body":"$request_body"}';
log_format  uniagent escape=json '{"unixtime":$msec,"real":"$hostname","remote_addr":"$remote_addr","https":"$https","host":"$host","method":"$request_method","uri":"$request_uri","protocol":"$server_protocol","user_agent":"$http_user_agent","http_referer":"$http_referer","request_length":$request_length,"request_time":$request_time,"status":$status,"bytes_sent":$bytes_sent}';
access_log  syslog:server=unix:/var/run/unified_agent/nginx_sock,nohostname,tag=nginx,severity=info uniagent;


server {
    listen      80 default_server;
    listen      [::]:80 default_server;
    listen      443 ssl http2 default_server;
    listen      [::]:443 ssl http2 default_server;

    include     /etc/nginx/ssl_config;

    location =/ping-internal {
        return 200 "OK";
    }
    location =/proxy.html {
        return 200 "$hostname";
    }
    location =/balancer-ping {
        proxy_pass      http://localhost:5540;
        proxy_redirect  off;
    }
    location / {
        return 404;
    }
}


server {
    listen      80;
    listen      [::]:80;
    listen      443 ssl http2;
    listen      [::]:443 ssl http2;
    server_name solomon-dev.yandex-team.ru;

    location / {
        return 302 https://solomon-test.yandex-team.ru$request_uri;
    }
}

server {
    listen      80;
    listen      [::]:80;
    listen      443 ssl http2;
    listen      [::]:443 ssl http2;
    server_name solomon;

    location / {
        return 302 https://solomon.yandex-team.ru$request_uri;
    }
}

server {
    listen      80;
    listen      [::]:80;
    server_name solomon.search.yandex.net
                solomon.yandex-team.ru
                mon.yandex-team.ru
                monitoring.yandex-team.ru
                solomon-prestable.yandex-team.ru
                solomon-pre.yandex-team.ru
                solomon-test.yandex-team.ru;

    location =/balancer-ping {
        proxy_pass      http://localhost:5540;
        proxy_redirect  off;
    }
    location / {
        return 302 https://$host$request_uri;
    }
    location /discovery {
        #root /Berkanavt/solomon/web;
        #root /Berkanavt/solomon/discovery/www;
        proxy_pass      http://solomon-discovery;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
    }
}


server {
    listen      80;
    listen      [::]:80;
    server_name solomon.viewer.yandex-team.ru;

    location / {
        return 302 https://solomon.yandex-team.ru$request_uri;
    }
}


server {
    listen      80;
    listen      [::]:80;
    server_name solomon.yandex.net
                solomon-pre.yandex.net
                solomon-prestable.yandex.net
                solomon-test.yandex.net
                api.solomon.search.yandex.net       # DEPRECATED: must be deleted
                api.solomon-test.search.yandex.net; # DEPRECATED: must be deleted

    location /rest {
        deny all;

        proxy_pass      http://$upstream;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
    }

    location /data-api {
        add_header Access-Control-Allow-Origin "*";
        add_header Access-Control-Allow-Methods "GET";

        proxy_pass      http://$upstream;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
    }

    location /push {
        #limit_req       zone=push_json burst=20 nodelay;
        proxy_pass      http://$upstream;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
        #include         /etc/nginx/mirrors_conf;
        #access_log      /var/log/nginx/debug_access.log debug;
    }

    location /discovery {
        #root /Berkanavt/solomon/web;
        #root /Berkanavt/solomon/discovery/www;
        proxy_pass      http://solomon-discovery;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
    }

    location / {
        proxy_pass      http://$upstream;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
    }
}


server {
    listen      443 ssl http2;
    listen      [::]:443 ssl http2;
    server_name solomon.yandex.net
                solomon-pre.yandex.net
                solomon-prestable.yandex.net
                solomon-test.yandex.net
                solomon.search.yandex.net
                solomon.yandex-team.ru
                mon.yandex-team.ru
                monitoring.yandex-team.ru
                api.solomon.search.yandex.net       # DEPRECATED: must be deleted
                api.solomon-test.search.yandex.net  # DEPRECATED: must be deleted
                solomon-prestable.yandex-team.ru
                solomon-pre.yandex-team.ru
                solomon-test.yandex-team.ru;

    include /etc/nginx/ssl_config;
    include /etc/nginx/nginx-resolver;

    add_header X-Backend "$hostname";
    add_header X-Service-Backend "$upstream_addr";

    location =/ping {
        error_page 403 =200 /ping-internal;
    }
    location =/ping-internal {
        return 200 "OK";
    }
    location =/proxy.html {
        return 200 "$hostname";
    }
    location =/balancer-ping {
        proxy_pass      http://localhost:5540;
        proxy_redirect  off;
    }

    ##
    ## Solomon documentation
    ##
    location ~ ^/docs/build/(.*)$ {
        proxy_pass https://docs.yandex-team.ru/build/$1;

        include /etc/nginx/disable-cache;
    }

    location ~ ^/docs-assets/(.*)$ {
        proxy_pass https://docs.yandex-team.ru/docs-assets/$1;

        include /etc/nginx/disable-cache;
    }

    location ~ ^/docs-api/(.*)$ {
        proxy_pass https://docs.yandex-team.ru/docs-api/$1;

        include /etc/nginx/disable-cache;
    }

    location ~ ^/docs-viewer/(?<page>.*)$ {
        proxy_set_header X-Source-Domain $host;
        proxy_set_header x-root-s3-folder-name "solomon";
        proxy_set_header x-proxy-doc-prefix "docs";
        proxy_set_header Accept-Encoding "";
        proxy_pass https://docs.yandex-team.ru/docs-viewer/$page$is_args$args;
        proxy_redirect ~/solomon/(?<redirect_path>.*)$ /docs/$redirect_path;

        rewrite (.*)\.html$ $1 last;

        sub_filter '/build/ru/' '/docs/build/ru/';
        sub_filter 'href="/solomon/' 'href="/docs/';
        sub_filter_once off;

        include /etc/nginx/disable-cache;
    }

    location = /docs {
        return 301 /docs/;
    }

    location ~ ^/docs/(?<docpath>.*)$ {
        proxy_set_header X-Source-Domain $host;
        proxy_set_header x-root-s3-folder-name "solomon";
        proxy_set_header x-proxy-doc-prefix "docs"; # Для пустого docs заменить на "null"
        proxy_set_header Accept-Encoding "";
        proxy_pass https://docs.yandex-team.ru/solomon/$docpath;
        proxy_redirect ~/solomon/(?<redirect_path>.*)$ /docs/$redirect_path;

        rewrite (.*)\.html$ $1 last;

        sub_filter '/build/ru/' '/docs/build/ru/';
        sub_filter 'href="/solomon/' 'href="/docs/';
        sub_filter_once off;

        include /etc/nginx/disable-cache;
    }

    location = /docs/report-bug {
        proxy_pass https://docs.yandex-team.ru/docs/report-bug;

        include /etc/nginx/disable-cache;
    }

    location = /api/doc {
        proxy_pass https://docs.yandex-team.ru/api/doc$is_args$args;

        include /etc/nginx/disable-cache;
    }

    ##
    ## New Solomon UI
    ##
    location = / {
        root /Berkanavt/solomon/web/admin;
        try_files $uri /index.html =404;
    }

    ##
    ## Solomon admin UI
    ##
    location /admin {
        root /Berkanavt/solomon/web;

        # cache only .js and .css files in browser
        etag off;
        if ($request_uri ~* '\.(?:js|css)$') {
            expires max;
        }
        try_files $uri /admin/index.html =404;
    }

    ##
    ## Old /rest api
    ##
    location /rest {
        proxy_pass      http://$upstream;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
    }

    ##
    ## Solomon API v2.0
    ##
    location ~ ^/api/(v2|v3|internal).*$ {
        proxy_pass      http://$upstream;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
    }


    ##
    ## GRPC API
    ##
    location ~ /yandex.monitoring.v3 {
        grpc_pass grpc://localhost:5740;
    }

    location ~ /yandex.monitoring.api.v3 {
        grpc_pass grpc://localhost:5740;
    }

    location /grpc.reflection {
        grpc_pass grpc://localhost:5740;
    }

    location /discovery {
        #root /Berkanavt/solomon/web;
        #root /Berkanavt/solomon/discovery/www;
        proxy_pass      http://solomon-discovery;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
    }

    ##
    ## "If" is evil, so no authorization for this directory
    ##
    location /push {
        #limit_req       zone=push_json burst=20 nodelay;
        proxy_pass      http://$upstream;
        proxy_redirect  off;
        include         /etc/nginx/proxy_params;
        #include         /etc/nginx/mirrors_conf;
        #access_log      /var/log/nginx/debug_access.log debug;
    }

    location / {
        proxy_pass  http://$upstream;
        include     /etc/nginx/proxy_params;
    }
}
