diff --git a/Makefile b/Makefile index c37aaa2..fa14a6d 100644 --- a/Makefile +++ b/Makefile @@ -182,9 +182,9 @@ wrk-search: ## Нагрузочный тест поиска (wrk2) http://localhost:8080/v1/search?type=event\&q=test wrk-health: ## Нагрузочный тест health (wrk2) - wrk -t4 -c10000 -d30s -t200 \ + wrk -t4 -c100 -d30s -t100 \ -H "Host: api.eventhub.local" \ - http://localhost/health + https://api.eventhub.local/health # ============================================================================ # CODE QUALITY diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 33d048f..bc88008 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,35 +1,35 @@ # docker/docker-compose.yml services: - # ================== Балансировщик нагрузки ================== + # ================== Балансировщик нагрузки (HTTPS/WSS) ================== traefik: image: traefik:latest - user: "0:1001" # группа docker на хосте (подберите при необходимости, см. ls -la /var/run/docker.sock) + user: "0:1001" # группа docker на хосте (подберите под свою систему, см. ls -la /var/run/docker.sock) command: - - "--api.insecure=true" # дашборд (можно отключить в production) + - "--api.insecure=true" # дашборд (можно удалить в production) - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - - "--entrypoints.web.address=:80" # пользовательский REST - - "--entrypoints.ws.address=:8081" # пользовательский WebSocket - - "--entrypoints.admin-web.address=:8445" # админский REST - - "--entrypoints.admin-ws.address=:8446" # админский WebSocket - # === Включаем метрики Prometheus === + - "--providers.file.filename=/etc/traefik/dynamic_conf.yml" # самоподписанный сертификат и редирект + - "--entrypoints.web.address=:80" # HTTP (для редиректа) + - "--entrypoints.websecure.address=:443" # HTTPS/WSS + # Метрики Prometheus - "--metrics.prometheus=true" - "--metrics.prometheus.buckets=0.1,0.3,1.2,5.0" - "--metrics.prometheus.addEntryPointsLabels=true" - "--metrics.prometheus.addServicesLabels=true" ports: - "80:80" + - "443:443" + # порт дашборда (опционально) - "8080:8080" - - "8081:8081" - - "8445:8445" - - "8446:8446" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "./traefik/certs:/etc/traefik/certs:ro" # самоподписанный сертификат + - "./traefik/dynamic_conf.yml:/etc/traefik/dynamic_conf.yml:ro" networks: - eventhub-net restart: unless-stopped - # ================== Кластер EventHub ================== + # ================== Кластер EventHub (3 ноды) ================== eventhub-node1: build: context: .. @@ -46,25 +46,41 @@ services: - eventhub-node1-data:/app/data labels: - "traefik.enable=true" - # REST API пользователей + # --- REST API пользователей --- - "traefik.http.routers.api.rule=Host(`api.eventhub.local`)" - "traefik.http.routers.api.entrypoints=web" - - "traefik.http.routers.api.service=api" + - "traefik.http.routers.api.middlewares=redirect-to-https@file" + - "traefik.http.routers.api-secure.rule=Host(`api.eventhub.local`)" + - "traefik.http.routers.api-secure.entrypoints=websecure" + - "traefik.http.routers.api-secure.tls=true" + - "traefik.http.routers.api-secure.service=api" - "traefik.http.services.api.loadbalancer.server.port=8080" - # WebSocket пользователей + # --- WebSocket пользователей (WSS через websecure) --- - "traefik.http.routers.ws.rule=Host(`ws.eventhub.local`)" - - "traefik.http.routers.ws.entrypoints=ws" - - "traefik.http.routers.ws.service=ws" + - "traefik.http.routers.ws.entrypoints=web" + - "traefik.http.routers.ws.middlewares=redirect-to-https@file" + - "traefik.http.routers.ws-secure.rule=Host(`ws.eventhub.local`)" + - "traefik.http.routers.ws-secure.entrypoints=websecure" + - "traefik.http.routers.ws-secure.tls=true" + - "traefik.http.routers.ws-secure.service=ws" - "traefik.http.services.ws.loadbalancer.server.port=8081" - # Админский REST + # --- Админский REST --- - "traefik.http.routers.admin-api.rule=Host(`admin.eventhub.local`)" - - "traefik.http.routers.admin-api.entrypoints=admin-web" - - "traefik.http.routers.admin-api.service=admin-api" + - "traefik.http.routers.admin-api.entrypoints=web" + - "traefik.http.routers.admin-api.middlewares=redirect-to-https@file" + - "traefik.http.routers.admin-api-secure.rule=Host(`admin.eventhub.local`)" + - "traefik.http.routers.admin-api-secure.entrypoints=websecure" + - "traefik.http.routers.admin-api-secure.tls=true" + - "traefik.http.routers.admin-api-secure.service=admin-api" - "traefik.http.services.admin-api.loadbalancer.server.port=8445" - # Админский WebSocket + # --- Админский WebSocket (WSS) --- - "traefik.http.routers.admin-ws.rule=Host(`admin-ws.eventhub.local`)" - - "traefik.http.routers.admin-ws.entrypoints=admin-ws" - - "traefik.http.routers.admin-ws.service=admin-ws" + - "traefik.http.routers.admin-ws.entrypoints=web" + - "traefik.http.routers.admin-ws.middlewares=redirect-to-https@file" + - "traefik.http.routers.admin-ws-secure.rule=Host(`admin-ws.eventhub.local`)" + - "traefik.http.routers.admin-ws-secure.entrypoints=websecure" + - "traefik.http.routers.admin-ws-secure.tls=true" + - "traefik.http.routers.admin-ws-secure.service=admin-ws" - "traefik.http.services.admin-ws.loadbalancer.server.port=8446" restart: unless-stopped @@ -86,19 +102,35 @@ services: - "traefik.enable=true" - "traefik.http.routers.api.rule=Host(`api.eventhub.local`)" - "traefik.http.routers.api.entrypoints=web" - - "traefik.http.routers.api.service=api" + - "traefik.http.routers.api.middlewares=redirect-to-https@file" + - "traefik.http.routers.api-secure.rule=Host(`api.eventhub.local`)" + - "traefik.http.routers.api-secure.entrypoints=websecure" + - "traefik.http.routers.api-secure.tls=true" + - "traefik.http.routers.api-secure.service=api" - "traefik.http.services.api.loadbalancer.server.port=8080" - "traefik.http.routers.ws.rule=Host(`ws.eventhub.local`)" - - "traefik.http.routers.ws.entrypoints=ws" - - "traefik.http.routers.ws.service=ws" + - "traefik.http.routers.ws.entrypoints=web" + - "traefik.http.routers.ws.middlewares=redirect-to-https@file" + - "traefik.http.routers.ws-secure.rule=Host(`ws.eventhub.local`)" + - "traefik.http.routers.ws-secure.entrypoints=websecure" + - "traefik.http.routers.ws-secure.tls=true" + - "traefik.http.routers.ws-secure.service=ws" - "traefik.http.services.ws.loadbalancer.server.port=8081" - "traefik.http.routers.admin-api.rule=Host(`admin.eventhub.local`)" - - "traefik.http.routers.admin-api.entrypoints=admin-web" - - "traefik.http.routers.admin-api.service=admin-api" + - "traefik.http.routers.admin-api.entrypoints=web" + - "traefik.http.routers.admin-api.middlewares=redirect-to-https@file" + - "traefik.http.routers.admin-api-secure.rule=Host(`admin.eventhub.local`)" + - "traefik.http.routers.admin-api-secure.entrypoints=websecure" + - "traefik.http.routers.admin-api-secure.tls=true" + - "traefik.http.routers.admin-api-secure.service=admin-api" - "traefik.http.services.admin-api.loadbalancer.server.port=8445" - "traefik.http.routers.admin-ws.rule=Host(`admin-ws.eventhub.local`)" - - "traefik.http.routers.admin-ws.entrypoints=admin-ws" - - "traefik.http.routers.admin-ws.service=admin-ws" + - "traefik.http.routers.admin-ws.entrypoints=web" + - "traefik.http.routers.admin-ws.middlewares=redirect-to-https@file" + - "traefik.http.routers.admin-ws-secure.rule=Host(`admin-ws.eventhub.local`)" + - "traefik.http.routers.admin-ws-secure.entrypoints=websecure" + - "traefik.http.routers.admin-ws-secure.tls=true" + - "traefik.http.routers.admin-ws-secure.service=admin-ws" - "traefik.http.services.admin-ws.loadbalancer.server.port=8446" restart: unless-stopped @@ -120,19 +152,35 @@ services: - "traefik.enable=true" - "traefik.http.routers.api.rule=Host(`api.eventhub.local`)" - "traefik.http.routers.api.entrypoints=web" - - "traefik.http.routers.api.service=api" + - "traefik.http.routers.api.middlewares=redirect-to-https@file" + - "traefik.http.routers.api-secure.rule=Host(`api.eventhub.local`)" + - "traefik.http.routers.api-secure.entrypoints=websecure" + - "traefik.http.routers.api-secure.tls=true" + - "traefik.http.routers.api-secure.service=api" - "traefik.http.services.api.loadbalancer.server.port=8080" - "traefik.http.routers.ws.rule=Host(`ws.eventhub.local`)" - - "traefik.http.routers.ws.entrypoints=ws" - - "traefik.http.routers.ws.service=ws" + - "traefik.http.routers.ws.entrypoints=web" + - "traefik.http.routers.ws.middlewares=redirect-to-https@file" + - "traefik.http.routers.ws-secure.rule=Host(`ws.eventhub.local`)" + - "traefik.http.routers.ws-secure.entrypoints=websecure" + - "traefik.http.routers.ws-secure.tls=true" + - "traefik.http.routers.ws-secure.service=ws" - "traefik.http.services.ws.loadbalancer.server.port=8081" - "traefik.http.routers.admin-api.rule=Host(`admin.eventhub.local`)" - - "traefik.http.routers.admin-api.entrypoints=admin-web" - - "traefik.http.routers.admin-api.service=admin-api" + - "traefik.http.routers.admin-api.entrypoints=web" + - "traefik.http.routers.admin-api.middlewares=redirect-to-https@file" + - "traefik.http.routers.admin-api-secure.rule=Host(`admin.eventhub.local`)" + - "traefik.http.routers.admin-api-secure.entrypoints=websecure" + - "traefik.http.routers.admin-api-secure.tls=true" + - "traefik.http.routers.admin-api-secure.service=admin-api" - "traefik.http.services.admin-api.loadbalancer.server.port=8445" - "traefik.http.routers.admin-ws.rule=Host(`admin-ws.eventhub.local`)" - - "traefik.http.routers.admin-ws.entrypoints=admin-ws" - - "traefik.http.routers.admin-ws.service=admin-ws" + - "traefik.http.routers.admin-ws.entrypoints=web" + - "traefik.http.routers.admin-ws.middlewares=redirect-to-https@file" + - "traefik.http.routers.admin-ws-secure.rule=Host(`admin-ws.eventhub.local`)" + - "traefik.http.routers.admin-ws-secure.entrypoints=websecure" + - "traefik.http.routers.admin-ws-secure.tls=true" + - "traefik.http.routers.admin-ws-secure.service=admin-ws" - "traefik.http.services.admin-ws.loadbalancer.server.port=8446" restart: unless-stopped @@ -144,9 +192,8 @@ services: - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' - # === Ограничение retention === - - '--storage.tsdb.retention.time=30d' # хранить данные 30 дней - - '--storage.tsdb.retention.size=15GB' # максимальный размер 15 ГБ + - '--storage.tsdb.retention.time=30d' + - '--storage.tsdb.retention.size=15GB' volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus @@ -160,9 +207,9 @@ services: image: grafana/grafana:latest environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD} - - GF_SECURITY_DISABLE_INITIAL_ADMIN_PASSWORD_CHANGE=false # обязательно сменить пароль после первого входа - - GF_USERS_ALLOW_SIGN_UP=false # запретить самостоятельную регистрацию - - GF_AUTH_ANONYMOUS_ENABLED=false # запретить анонимный доступ + - GF_SECURITY_DISABLE_INITIAL_ADMIN_PASSWORD_CHANGE=false + - GF_USERS_ALLOW_SIGN_UP=false + - GF_AUTH_ANONYMOUS_ENABLED=false volumes: - ./grafana/provisioning:/etc/grafana/provisioning - ./grafana/dashboards:/etc/grafana/dashboards diff --git a/docker/traefik/certs/make-traefik-certs.sh b/docker/traefik/certs/make-traefik-certs.sh new file mode 100644 index 0000000..dd5e8d8 --- /dev/null +++ b/docker/traefik/certs/make-traefik-certs.sh @@ -0,0 +1,4 @@ +#mkdir -p docker/traefik/certs +cd docker/traefik/certs +# Генерируем приватный ключ и самоподписанный сертификат на 10 лет +openssl req -x509 -newkey rsa:4096 -keyout traefik.key -out traefik.crt -days 3650 -nodes -subj "/CN=*.eventhub.local" \ No newline at end of file diff --git a/docker/traefik/certs/traefik.crt b/docker/traefik/certs/traefik.crt new file mode 100644 index 0000000..d5c10f7 --- /dev/null +++ b/docker/traefik/certs/traefik.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFFzCCAv+gAwIBAgIUUX5W2zeEC7Z8wSBPoFSDNLpV6U0wDQYJKoZIhvcNAQEL +BQAwGzEZMBcGA1UEAwwQKi5ldmVudGh1Yi5sb2NhbDAeFw0yNjA0MjUwNzAzNTZa +Fw0zNjA0MjIwNzAzNTZaMBsxGTAXBgNVBAMMECouZXZlbnRodWIubG9jYWwwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDAKnFa4rgzqERaAHGh1sKLy++A +AqFKBIJAtK+8YPz45jtHElT0BJfE2kOo3wZ+iucbE+dg4yfrKkD4bfa6zbwCYP2h +hEHT6w1tI1BMZCrgY+eqEjvgTYLb5oq9J9zs9GawmaW+XCnUVAOWdOFU3MQlBcbn +FJrDAwz4BjmaRFGVMm95Nk2eGD3cObuqQUVMR95YgZxHyX5M7F8jIAdUO6DoB+fT +MQEEudkU/po/Xp2Xx3GJavRDMPoZ4HEGpQlPmU5JzeMAHVVx6Zj8Ls45eGX4qwf7 +4OXbAmBRntpjDIz8qQVAl11QakM2ZW2ALEkIqRU6tIiiyk/PO3fuq11IMGNlx1oL +9L8ClSsgsA3UX7YmjpFmvDJX0anBHiUKonHXzroPu4opm9RpUhYkUTiNLoQxOWwz +FeBmfg5vzJ/fd/w/796CU56vCRctG5UpXWD9dQxjXkWVZIoRvuIeGIIW2qy+NkJA +OuF0aTAphm4Hns9yT4EvfJIvLSZKQyFu6oIfvR4e1RTlZmzgVUQ+O50Kk7z6Jwnt +DkFburi/HnJ8I5YS6zeLrNykKhTPOZu8SfFm5UA71SJZorzftE3R6jz9iPj2Ev48 +F7rCWhMqfGtiIp70ASx9xv+5ZTQPLEQkvH+R4JYOqWUwmJhtiso6z8a8zB+3MbGX +f2VTurQ1nB6+C9SaIQIDAQABo1MwUTAdBgNVHQ4EFgQU/EItSTyuc3hQdo4uZdh9 +L8o6kkMwHwYDVR0jBBgwFoAU/EItSTyuc3hQdo4uZdh9L8o6kkMwDwYDVR0TAQH/ +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAY0UTqk6ICLlyFKNoTyybd1Mf+Hsz +Wn39zJnfdfTbw7DTZgAxU+rPkwWVtpAQpzKS9WugoYa7AEUZDphDHQBlzhuT8xd7 +0Gy47kZEklY29FaNDKaiStZ+GEU323irC22y2od0AVHVssKGG/tLWL4hUViMYTWx +Yj6zpzovM2BrIzzAvjIQ0DAAFcVEr5lyvCduz83NiqQH6M/onTGXM01nXhUoIZnZ +QV0O4Rsnsi5VcnP8pUI3aKkxZ7rkVb/AktNTe7rX7xRztdTt0BGOOVR0u7Q97cQ6 +kjXbrwIf6cura9J1FyyUeGA7B9z1huYm5XslpkhJ3ILd8DHBvKv5n7wDNuNbocGo +FrVza3sruJDwQzJSDmUyC+xoRv112X2R51sjOe9j17zxfSFqjVckWXTvI+ZvoLoX +g3pbAMQ06bmXpDYcg6er9NG/eycZvpYbSCCRS+TRDLSMshg/F6JoGVcHJtCNkTl9 +Sl70z3+/ytjdOl/+XYQ6sEUzd4qtBrslCBX78y4elcO8qQIBWBkvYr+BI09MJyW0 +C+Zae0G3mifyhWCfqm6Eq5lKhVhO9bF5rL6E+n4QSYK4PQ6GqAkNZ8/yVo8YcI0Z +fYNOIjQTEz9qqTlwDS8PTO0fFZLeiB64P86jf6m6WNhuQ+CC3BP6HP5ACImhy26N +ctzWkY+lExmP/1o= +-----END CERTIFICATE----- diff --git a/docker/traefik/certs/traefik.key b/docker/traefik/certs/traefik.key new file mode 100644 index 0000000..c72eea6 --- /dev/null +++ b/docker/traefik/certs/traefik.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +OcJYMreefpqPopJhaO1krD+TWml5ciw= +-----END PRIVATE KEY----- diff --git a/docker/traefik/dynamic_conf.yml b/docker/traefik/dynamic_conf.yml new file mode 100644 index 0000000..a329ac8 --- /dev/null +++ b/docker/traefik/dynamic_conf.yml @@ -0,0 +1,16 @@ +tls: + stores: + default: + defaultCertificate: + certFile: /etc/traefik/certs/traefik.crt + keyFile: /etc/traefik/certs/traefik.key + certificates: + - certFile: /etc/traefik/certs/traefik.crt + keyFile: /etc/traefik/certs/traefik.key + +http: + middlewares: + redirect-to-https: + redirectScheme: + scheme: https + permanent: true \ No newline at end of file diff --git a/test/wrk/scripts/debug.lua b/test/wrk/scripts/debug.lua new file mode 100644 index 0000000..72c7ef1 --- /dev/null +++ b/test/wrk/scripts/debug.lua @@ -0,0 +1,106 @@ +-- Helper Functions: + +-- Resource: http://lua-users.org/wiki/TypeOf +function typeof(var) + local _type = type(var); + if(_type ~= "table" and _type ~= "userdata") then + return _type; + end + local _meta = getmetatable(var); + if(_meta ~= nil and _meta._NAME ~= nil) then + return _meta._NAME; + else + return _type; + end +end + +-- Resource: https://gist.github.com/lunixbochs/5b0bb27861a396ab7a86 +local function string(o) + return '"' .. tostring(o) .. '"' +end + +local function recurse(o, indent) + if indent == nil then indent = '' end + local indent2 = indent .. ' ' + if type(o) == 'table' then + local s = indent .. '{' .. '\n' + local first = true + for k,v in pairs(o) do + if first == false then s = s .. ', \n' end + if type(k) ~= 'number' then k = string(k) end + s = s .. indent2 .. '[' .. k .. '] = ' .. recurse(v, indent2) + first = false + end + return s .. '\n' .. indent .. '}' + else + return string(o) + end +end + +local function var_dump(...) + local args = {...} + if #args > 1 then + var_dump(args) + else + print(recurse(args[1])) + end +end + +-- @end: Helper Functions + +max_requests = 0 +counter = 1 + +function setup(thread) + thread:set("id", counter) + + counter = counter + 1 +end + +init = function(args) + io.write("[init]\n") + + -- Check if arguments are set + if not (next(args) == nil) then + io.write("[init] Arguments\n") + + -- Loop through passed arguments + for index, value in ipairs(args) do + io.write("[init] - " .. args[index] .. "\n") + end + end +end + +response = function (status, headers, body) + io.write("------------------------------\n") + io.write("Response ".. counter .." with status: ".. status .." on thread ".. id .."\n") + io.write("------------------------------\n") + + io.write("[response] Headers:\n") + + -- Loop through passed arguments + for key, value in pairs(headers) do + io.write("[response] - " .. key .. ": " .. value .. "\n") + end + + io.write("[response] Body:\n") + io.write(body .. "\n") + + -- Stop after max_requests if max_requests is a positive number + if (max_requests > 0) and (counter > max_requests) then + wrk.thread:stop() + end + + counter = counter + 1 +end + +done = function (summary, latency, requests) + io.write("------------------------------\n") + io.write("Requests\n") + io.write("------------------------------\n") + + io.write(typeof(requests)) + + var_dump(summary) + var_dump(requests) +end \ No newline at end of file