{"id":3218,"date":"2026-10-26T16:20:26","date_gmt":"2026-10-26T14:20:26","guid":{"rendered":"https:\/\/lassinsivut.eu\/?p=3218"},"modified":"2026-10-26T17:09:08","modified_gmt":"2026-10-26T15:09:08","slug":"nginx-proxy-manager-geoblock-grafana-monitorointi","status":"publish","type":"post","link":"https:\/\/lassinsivut.eu\/en\/nginx-proxy-manager-geoblock-grafana-monitorointi\/","title":{"rendered":"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki &#038; Promtail)"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3218\" class=\"elementor elementor-3218\">\n\t\t\t\t<div class=\"aux-parallax-section elementor-element elementor-element-f629acd e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"f629acd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-de0e6fa elementor-widget elementor-widget-spacer\" data-id=\"de0e6fa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-055621d elementor-widget elementor-widget-heading\" data-id=\"055621d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki &amp; Promtail)<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5b17b00 elementor-widget elementor-widget-text-editor\" data-id=\"5b17b00\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-path-to-node=\"4\"><span class=\"\">Aiemmassa oppaassa k\u00e4vimme l\u00e4pi,<\/span><span class=\"\"> kuinka asettaa Nginx Proxy Manageriin (NPM) GeoBlocking MaxMindin tietokannan avulla.<\/span><span class=\"\"> Se on tehokas tapa est\u00e4\u00e4 ei-toivottu liikenne tietyist\u00e4 maista ja palauttaa niille esimerkiksi kustomoitu 503-virhesivu.<\/span><\/p><p data-path-to-node=\"5\">Mutta mist\u00e4 tied\u00e4mme, kuinka paljon liikennett\u00e4 oikeasti blokataan ja mist\u00e4 maista sit\u00e4 tulee? T\u00e4ss\u00e4 oppaassa rakennamme seurantapaneelin <b data-path-to-node=\"5\" data-index-in-node=\"138\">Grafanan<\/b>, <b data-path-to-node=\"5\" data-index-in-node=\"148\">Lokin<\/b> ja <b data-path-to-node=\"5\" data-index-in-node=\"157\">Promtailin<\/b> avulla. N\u00e4yt\u00e4n, kuinka NPM:n lokit muutetaan JSON-muotoon, l\u00e4hetet\u00e4\u00e4n Lokille ja visualisoidaan upeaksi maailmankartaksi ja top-listaksi.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"aux-parallax-section elementor-element elementor-element-8500fde e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"8500fde\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-09017ed elementor-widget elementor-widget-heading\" data-id=\"09017ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Vaihe 1: Nginx-lokien muuttaminen JSON-muotoon<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-03d3099 elementor-widget elementor-widget-text-editor\" data-id=\"03d3099\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-path-to-node=\"7\">Oletuksena Nginx kirjoittaa lokia pelkk\u00e4n\u00e4 tekstin\u00e4. Jotta Grafana voi suodattaa dataa k\u00e4tev\u00e4sti (esimerkiksi maatunnuksen tai eston perusteella), meid\u00e4n t\u00e4ytyy kertoa Nginxille, ett\u00e4 haluamme lokit rakenteellisena JSON-datana.<\/p><p data-path-to-node=\"8\"><span class=\"\">Avaa aiemmin luomasi Nginxin lis\u00e4konfiguraatiotiedosto (esim.<\/span> <code class=\"\" data-path-to-node=\"8\" data-index-in-node=\"62\">\/docker\/npm\/data\/nginx\/custom\/http_top.conf<\/code><span class=\"\">) ja p\u00e4ivit\u00e4 se t\u00e4h\u00e4n muotoon:<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a9a4252 elementor-widget elementor-widget-eael-code-snippet\" data-id=\"a9a4252\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-code-snippet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t      <div class=\"eael-code-snippet-wrapper theme-dark view-mode-default\" data-language=\"bash\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-a9a4252\" id=\"eael-code-snippet-a9a4252\" >\n      \n         <div class=\"eael-code-snippet-content\">\n                        <div class=\"eael-code-snippet-line-numbers\" aria-hidden=\"true\">\n                                 <div class=\"line-number\">1<\/div>\n                                 <div class=\"line-number\">2<\/div>\n                                 <div class=\"line-number\">3<\/div>\n                                 <div class=\"line-number\">4<\/div>\n                                 <div class=\"line-number\">5<\/div>\n                                 <div class=\"line-number\">6<\/div>\n                                 <div class=\"line-number\">7<\/div>\n                                 <div class=\"line-number\">8<\/div>\n                                 <div class=\"line-number\">9<\/div>\n                                 <div class=\"line-number\">10<\/div>\n                                 <div class=\"line-number\">11<\/div>\n                                 <div class=\"line-number\">12<\/div>\n                                 <div class=\"line-number\">13<\/div>\n                                 <div class=\"line-number\">14<\/div>\n                                 <div class=\"line-number\">15<\/div>\n                                 <div class=\"line-number\">16<\/div>\n                                 <div class=\"line-number\">17<\/div>\n                                 <div class=\"line-number\">18<\/div>\n                                 <div class=\"line-number\">19<\/div>\n                                 <div class=\"line-number\">20<\/div>\n                                 <div class=\"line-number\">21<\/div>\n                                 <div class=\"line-number\">22<\/div>\n                                 <div class=\"line-number\">23<\/div>\n                                 <div class=\"line-number\">24<\/div>\n                                 <div class=\"line-number\">25<\/div>\n                                 <div class=\"line-number\">26<\/div>\n                                 <div class=\"line-number\">27<\/div>\n                                 <div class=\"line-number\">28<\/div>\n                                 <div class=\"line-number\">29<\/div>\n                                 <div class=\"line-number\">30<\/div>\n                                 <div class=\"line-number\">31<\/div>\n                                 <div class=\"line-number\">32<\/div>\n                                 <div class=\"line-number\">33<\/div>\n                                 <div class=\"line-number\">34<\/div>\n                                 <div class=\"line-number\">35<\/div>\n                                 <div class=\"line-number\">36<\/div>\n                                 <div class=\"line-number\">37<\/div>\n                           <\/div>\n                        <pre class=\"eael-code-snippet-code language-bash\"><code>charset utf-8;\r\n\r\ngeoip2 \/data\/geoip2\/GeoLite2-City.mmdb {\r\n    auto_reload 3h;\r\n    $geoip2_metadata_country_build metadata build_epoch;\r\n    $geoip2_data_country_code default=XX source=$remote_addr country iso_code;\r\n    \r\n    # HUOM: K\u00e4yt\u00e4 ehdottomasti &quot;en&quot; (englanti), jotta MaxMind palauttaa maan koko nimen luotettavasti. \r\n    # Jos k\u00e4yt\u00e4t &quot;fi&quot;, moni maa palauttaa pelk\u00e4n viivan (-).\r\n    $geoip2_data_country_name default=- country names en;\r\n    $geoip2_data_city_name default=- city names en;\r\n    $geoip2_data_region_name default=- subdivisions 0 names en;\r\n}\r\n\r\ngeo $allowed_ip {\r\n    default no;             # Blokataan kaikki oletuksena\r\n    10.10.0.0\/24 yes;     # Whitelist: Oma l\u00e4hiverkko\r\n}\r\n\r\nmap $geoip2_data_country_code $allowed_country {\r\n    default $allowed_ip;\r\n    DE yes;                 # Whitelist: Vain Saksa sallittu\r\n}\r\n\r\n# Grafanaa varten r\u00e4\u00e4t\u00e4l\u00f6ity JSON-loki\r\nlog_format json_analytics escape=json &#039;{&#039;\r\n  &#039;&quot;time_local&quot;: &quot;$time_local&quot;, &#039;\r\n  &#039;&quot;remote_addr&quot;: &quot;$remote_addr&quot;, &#039;\r\n  &#039;&quot;request_uri&quot;: &quot;$request_uri&quot;, &#039;\r\n  &#039;&quot;status&quot;: &quot;$status&quot;, &#039;\r\n  &#039;&quot;server_name&quot;: &quot;$server_name&quot;, &#039;\r\n  &#039;&quot;request_method&quot;: &quot;$request_method&quot;, &#039;\r\n  &#039;&quot;country_code&quot;: &quot;$geoip2_data_country_code&quot;, &#039;\r\n  &#039;&quot;country_name&quot;: &quot;$geoip2_data_country_name&quot;, &#039;\r\n  &#039;&quot;city_name&quot;: &quot;$geoip2_data_city_name&quot;, &#039;\r\n  &#039;&quot;is_allowed&quot;: &quot;$allowed_country&quot; &#039;\r\n&#039;}&#039;;<\/code><\/pre>\n                     <\/div>\n      <\/div>\n      \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b91b0ee elementor-widget elementor-widget-text-editor\" data-id=\"b91b0ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span class=\"\">Muista my\u00f6s varmistaa,<\/span> ett\u00e4 kyseist\u00e4 <code data-path-to-node=\"10\" data-index-in-node=\"37\">json_analytics<\/code> -muotoa k\u00e4ytet\u00e4\u00e4n Nginxin access-lokeissa (esim. <code data-path-to-node=\"10\" data-index-in-node=\"101\">server_proxy.conf<\/code> tiedostossa):<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e0fa05b elementor-widget elementor-widget-eael-code-snippet\" data-id=\"e0fa05b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-code-snippet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t      <div class=\"eael-code-snippet-wrapper theme-dark view-mode-default\" data-language=\"bash\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-e0fa05b\" id=\"eael-code-snippet-e0fa05b\" >\n      \n         <div class=\"eael-code-snippet-content\">\n                        <div class=\"eael-code-snippet-line-numbers\" aria-hidden=\"true\">\n                                 <div class=\"line-number\">1<\/div>\n                                 <div class=\"line-number\">2<\/div>\n                           <\/div>\n                        <pre class=\"eael-code-snippet-code language-bash\"><code>access_log \/data\/logs\/all_proxy_access.log json_analytics;\r\nerror_log \/data\/logs\/all_proxy_error.log warn;<\/code><\/pre>\n                     <\/div>\n      <\/div>\n      \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-71d3113 elementor-widget elementor-widget-text-editor\" data-id=\"71d3113\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Lataa Nginx uudelleen: <code class=\"\" data-path-to-node=\"12\" data-index-in-node=\"23\">docker exec -it npm-containerin-nimi nginx -s reload<\/code><\/p><p>Nimen n\u00e4et <code class=\"\" data-path-to-node=\"12\" data-index-in-node=\"23\">docker ps<\/code>\u00a0komennolla.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"aux-parallax-section elementor-element elementor-element-784bfe1 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"784bfe1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3c504f4 elementor-widget elementor-widget-heading\" data-id=\"3c504f4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Vaihe 2: Valmistele Grafana-ymp\u00e4rist\u00f6n kansiot<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0db280c elementor-widget elementor-widget-text-editor\" data-id=\"0db280c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span class=\"\">Luodaan seurantaty\u00f6kaluille oma hakemisto.<\/span> Nykyiset Docker-imaget vaativat tiukat kansion omistajuudet turvallisuussyist\u00e4.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-77c156b elementor-widget elementor-widget-eael-code-snippet\" data-id=\"77c156b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-code-snippet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t      <div class=\"eael-code-snippet-wrapper theme-dark view-mode-default\" data-language=\"bash\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-77c156b\" id=\"eael-code-snippet-77c156b\" >\n      \n         <div class=\"eael-code-snippet-content\">\n                        <div class=\"eael-code-snippet-line-numbers\" aria-hidden=\"true\">\n                                 <div class=\"line-number\">1<\/div>\n                                 <div class=\"line-number\">2<\/div>\n                                 <div class=\"line-number\">3<\/div>\n                                 <div class=\"line-number\">4<\/div>\n                                 <div class=\"line-number\">5<\/div>\n                                 <div class=\"line-number\">6<\/div>\n                                 <div class=\"line-number\">7<\/div>\n                                 <div class=\"line-number\">8<\/div>\n                                 <div class=\"line-number\">9<\/div>\n                           <\/div>\n                        <pre class=\"eael-code-snippet-code language-bash\"><code>mkdir -p \/docker\/grafana\r\ncd \/docker\/grafana\r\n\r\n# Luodaan tarvittavat alikansiot\r\nmkdir -p config-loki config-promtail loki-data grafana-data\r\n\r\n# Asetetaan oikeudet, jotta containerit voivat tallentaa dataa\r\nsudo chown -R 10001:10001 loki-data\r\nsudo chown -R 472:472 grafana-data<\/code><\/pre>\n                     <\/div>\n      <\/div>\n      \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"aux-parallax-section elementor-element elementor-element-0753080 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"0753080\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-97035ba elementor-widget elementor-widget-heading\" data-id=\"97035ba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Vaihe 3: Konfiguraatiotiedostot Promtailille ja Lokille<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2fb74e6 elementor-widget elementor-widget-text-editor\" data-id=\"2fb74e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-path-to-node=\"17\"><b data-path-to-node=\"17\" data-index-in-node=\"0\">Promtail<\/b> lukee NPM:n lokitiedostoja ja l\u00e4hett\u00e4\u00e4 ne <b data-path-to-node=\"17\" data-index-in-node=\"51\">Lokille<\/b>, joka indeksoi ne Grafanaa varten.<\/p><p data-path-to-node=\"18\">Luo tiedosto <code data-path-to-node=\"18\" data-index-in-node=\"13\">config-promtail\/config.yaml<\/code>:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-086a66d elementor-widget elementor-widget-eael-code-snippet\" data-id=\"086a66d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-code-snippet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t      <div class=\"eael-code-snippet-wrapper theme-dark view-mode-default\" data-language=\"yml\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-086a66d\" id=\"eael-code-snippet-086a66d\" >\n      \n         <div class=\"eael-code-snippet-content\">\n                        <div class=\"eael-code-snippet-line-numbers\" aria-hidden=\"true\">\n                                 <div class=\"line-number\">1<\/div>\n                                 <div class=\"line-number\">2<\/div>\n                                 <div class=\"line-number\">3<\/div>\n                                 <div class=\"line-number\">4<\/div>\n                                 <div class=\"line-number\">5<\/div>\n                                 <div class=\"line-number\">6<\/div>\n                                 <div class=\"line-number\">7<\/div>\n                                 <div class=\"line-number\">8<\/div>\n                                 <div class=\"line-number\">9<\/div>\n                                 <div class=\"line-number\">10<\/div>\n                                 <div class=\"line-number\">11<\/div>\n                                 <div class=\"line-number\">12<\/div>\n                                 <div class=\"line-number\">13<\/div>\n                                 <div class=\"line-number\">14<\/div>\n                                 <div class=\"line-number\">15<\/div>\n                           <\/div>\n                        <pre class=\"eael-code-snippet-code language-yml\"><code>server:\r\n  http_listen_port: 9080\r\n  grpc_listen_port: 0\r\npositions:\r\n  filename: \/tmp\/positions.yaml\r\nclients:\r\n  - url: http:\/\/loki:3100\/loki\/api\/v1\/push\r\nscrape_configs:\r\n  - job_name: system\r\n    static_configs:\r\n      - targets:\r\n          - localhost\r\n        labels:\r\n          job: varlogs\r\n          __path__: \/var\/log\/*log<\/code><\/pre>\n                     <\/div>\n      <\/div>\n      \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3a607dd elementor-widget elementor-widget-text-editor\" data-id=\"3a607dd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Luo tiedosto <code data-path-to-node=\"20\" data-index-in-node=\"13\">config-loki\/local-config.yaml<\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4007732 elementor-widget elementor-widget-eael-code-snippet\" data-id=\"4007732\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-code-snippet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t      <div class=\"eael-code-snippet-wrapper theme-dark view-mode-default\" data-language=\"yml\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-4007732\" id=\"eael-code-snippet-4007732\" >\n      \n         <div class=\"eael-code-snippet-content\">\n                        <div class=\"eael-code-snippet-line-numbers\" aria-hidden=\"true\">\n                                 <div class=\"line-number\">1<\/div>\n                                 <div class=\"line-number\">2<\/div>\n                                 <div class=\"line-number\">3<\/div>\n                                 <div class=\"line-number\">4<\/div>\n                                 <div class=\"line-number\">5<\/div>\n                                 <div class=\"line-number\">6<\/div>\n                                 <div class=\"line-number\">7<\/div>\n                                 <div class=\"line-number\">8<\/div>\n                                 <div class=\"line-number\">9<\/div>\n                                 <div class=\"line-number\">10<\/div>\n                                 <div class=\"line-number\">11<\/div>\n                                 <div class=\"line-number\">12<\/div>\n                                 <div class=\"line-number\">13<\/div>\n                                 <div class=\"line-number\">14<\/div>\n                                 <div class=\"line-number\">15<\/div>\n                                 <div class=\"line-number\">16<\/div>\n                                 <div class=\"line-number\">17<\/div>\n                                 <div class=\"line-number\">18<\/div>\n                                 <div class=\"line-number\">19<\/div>\n                                 <div class=\"line-number\">20<\/div>\n                                 <div class=\"line-number\">21<\/div>\n                                 <div class=\"line-number\">22<\/div>\n                           <\/div>\n                        <pre class=\"eael-code-snippet-code language-yml\"><code>auth_enabled: false\r\nserver:\r\n  http_listen_port: 3100\r\ncommon:\r\n  path_prefix: \/loki\r\n  storage:\r\n    filesystem:\r\n      chunks_directory: \/loki\/chunks\r\n      rules_directory: \/loki\/rules\r\n  replication_factor: 1\r\n  ring:\r\n    kvstore:\r\n      store: inmemory\r\nschema_config:\r\n  configs:\r\n    - from: 2020-10-24\r\n      store: boltdb-shipper\r\n      object_store: filesystem\r\n      schema: v11\r\n      index:\r\n        prefix: index_\r\n        period: 24h<\/code><\/pre>\n                     <\/div>\n      <\/div>\n      \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"aux-parallax-section elementor-element elementor-element-c5d96b1 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"c5d96b1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a8b8ab elementor-widget elementor-widget-heading\" data-id=\"7a8b8ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Vaihe 4: Docker Compose<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9f78a6f elementor-widget elementor-widget-text-editor\" data-id=\"9f78a6f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Luo tiedosto <code class=\"\" data-path-to-node=\"23\" data-index-in-node=\"13\">compose.yaml<\/code> <code class=\"\" data-path-to-node=\"23\" data-index-in-node=\"26\">\/docker\/grafana\/<\/code><span class=\"\"> -kansioon.<\/span><i data-path-to-node=\"23\" data-index-in-node=\"54\">Huom: Varmista, ett\u00e4 Promtailin volume viittaa oikeaan paikkaan is\u00e4nt\u00e4koneellasi, jossa Nginx Proxy Managerin lokit sijaitsevat.<\/i><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-27b13fb elementor-widget elementor-widget-eael-code-snippet\" data-id=\"27b13fb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-code-snippet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t      <div class=\"eael-code-snippet-wrapper theme-dark view-mode-default\" data-language=\"yml\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-27b13fb\" id=\"eael-code-snippet-27b13fb\" >\n      \n         <div class=\"eael-code-snippet-content\">\n                        <div class=\"eael-code-snippet-line-numbers\" aria-hidden=\"true\">\n                                 <div class=\"line-number\">1<\/div>\n                                 <div class=\"line-number\">2<\/div>\n                                 <div class=\"line-number\">3<\/div>\n                                 <div class=\"line-number\">4<\/div>\n                                 <div class=\"line-number\">5<\/div>\n                                 <div class=\"line-number\">6<\/div>\n                                 <div class=\"line-number\">7<\/div>\n                                 <div class=\"line-number\">8<\/div>\n                                 <div class=\"line-number\">9<\/div>\n                                 <div class=\"line-number\">10<\/div>\n                                 <div class=\"line-number\">11<\/div>\n                                 <div class=\"line-number\">12<\/div>\n                                 <div class=\"line-number\">13<\/div>\n                                 <div class=\"line-number\">14<\/div>\n                                 <div class=\"line-number\">15<\/div>\n                                 <div class=\"line-number\">16<\/div>\n                                 <div class=\"line-number\">17<\/div>\n                                 <div class=\"line-number\">18<\/div>\n                                 <div class=\"line-number\">19<\/div>\n                                 <div class=\"line-number\">20<\/div>\n                                 <div class=\"line-number\">21<\/div>\n                                 <div class=\"line-number\">22<\/div>\n                                 <div class=\"line-number\">23<\/div>\n                                 <div class=\"line-number\">24<\/div>\n                                 <div class=\"line-number\">25<\/div>\n                                 <div class=\"line-number\">26<\/div>\n                                 <div class=\"line-number\">27<\/div>\n                                 <div class=\"line-number\">28<\/div>\n                           <\/div>\n                        <pre class=\"eael-code-snippet-code language-yml\"><code>services:\r\n  loki:\r\n    image: grafana\/loki:latest\r\n    ports:\r\n      - &quot;3100:3100&quot;\r\n    command: -config.file=\/etc\/loki\/local-config.yaml\r\n    volumes:\r\n      - .\/loki-data:\/loki\r\n      - .\/config-loki:\/etc\/loki\r\n    restart: unless-stopped\r\n\r\n  promtail:\r\n    image: grafana\/promtail:latest\r\n    volumes:\r\n      # MUUTA T\u00c4M\u00c4 vastaamaan omaa NPM asennustasi:\r\n      - \/docker\/npm\/data\/logs:\/var\/log \r\n      - .\/config-promtail\/config.yaml:\/etc\/promtail\/config.yaml\r\n    restart: unless-stopped\r\n\r\n  grafana:\r\n    image: grafana\/grafana:latest\r\n    ports:\r\n      - &quot;3000:3000&quot;\r\n    environment:\r\n      - GF_AUTH_ANONYMOUS_ENABLED=false\r\n    volumes:\r\n      - .\/grafana-data:\/var\/lib\/grafana\r\n    restart: unless-stopped<\/code><\/pre>\n                     <\/div>\n      <\/div>\n      \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0403aef elementor-widget elementor-widget-text-editor\" data-id=\"0403aef\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>K\u00e4ynnist\u00e4 ymp\u00e4rist\u00f6: <code data-path-to-node=\"25\" data-index-in-node=\"21\">docker compose up -d<\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"aux-parallax-section elementor-element elementor-element-134d377 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"134d377\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fb11b6d elementor-widget elementor-widget-heading\" data-id=\"fb11b6d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Vaihe 5: Grafana Dashboardin rakentaminen<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-57452ab elementor-widget elementor-widget-text-editor\" data-id=\"57452ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-path-to-node=\"27\">Kirjaudu Grafanaan osoitteessa <code data-path-to-node=\"27\" data-index-in-node=\"31\">http:\/\/palvelimen-ip:3000<\/code> (oletustunnukset: admin \/ admin). Lis\u00e4\u00e4 ensin tietol\u00e4hde (Data Source): Valitse <b data-path-to-node=\"27\" data-index-in-node=\"137\">Loki<\/b> ja aseta URL-osoitteeksi <code data-path-to-node=\"27\" data-index-in-node=\"167\">http:\/\/loki:3100<\/code>.<\/p><p data-path-to-node=\"28\">Luo uusi Dashboard ja lis\u00e4\u00e4 siihen kaksi paneelia:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-946ae9a elementor-widget elementor-widget-heading\" data-id=\"946ae9a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">1. Maailmankartta (Geomap) \u2013 N\u00e4ytt\u00e4\u00e4 estetyt yhteydet kartalla<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b9965e5 elementor-widget elementor-widget-text-editor\" data-id=\"b9965e5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span class=\"\">Valitse paneelin tyypiksi <\/span><b data-path-to-node=\"30\" data-index-in-node=\"26\">Geomap<\/b> (tai Heatmap) ja aseta kyselyksi (LogQL):<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c1cfeb6 elementor-widget elementor-widget-eael-code-snippet\" data-id=\"c1cfeb6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-code-snippet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t      <div class=\"eael-code-snippet-wrapper theme-dark view-mode-default\" data-language=\"bash\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-c1cfeb6\" id=\"eael-code-snippet-c1cfeb6\" >\n      \n         <div class=\"eael-code-snippet-content\">\n                        <div class=\"eael-code-snippet-line-numbers\" aria-hidden=\"true\">\n                                 <div class=\"line-number\">1<\/div>\n                                 <div class=\"line-number\">2<\/div>\n                                 <div class=\"line-number\">3<\/div>\n                           <\/div>\n                        <pre class=\"eael-code-snippet-code language-bash\"><code>sum by (country_code) (\r\n  count_over_time({job=&quot;varlogs&quot;, filename=~&quot;.*access.*&quot;} | json | __error__=&quot;&quot; | is_allowed=&quot;no&quot; | status=&quot;503&quot; | country_code != &quot;XX&quot; | country_code != &quot;&quot; [$__range])\r\n)<\/code><\/pre>\n                     <\/div>\n      <\/div>\n      \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-13ba06b elementor-widget elementor-widget-text-editor\" data-id=\"13ba06b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-path-to-node=\"32\"><i data-path-to-node=\"32\" data-index-in-node=\"0\">Miksi n\u00e4m\u00e4 filtterit?<\/i><\/p><ul data-path-to-node=\"33\"><li><p data-path-to-node=\"33,0,0\"><code data-path-to-node=\"33,0,0\" data-index-in-node=\"0\">filename=~\".*access.*\"<\/code> ohittaa Nginxin virhelokit (error.log), jotka ovat puhdasta teksti\u00e4 ja rikkovat JSON-parserin.<\/p><\/li><li><p data-path-to-node=\"33,1,0\"><code data-path-to-node=\"33,1,0\" data-index-in-node=\"0\">$__range<\/code> skaalautuu Grafanan aikavalitsimen mukaan.<\/p><\/li><li><p data-path-to-node=\"33,2,0\"><code data-path-to-node=\"33,2,0\" data-index-in-node=\"0\">is_allowed=\"no\"<\/code> ja <code data-path-to-node=\"33,2,0\" data-index-in-node=\"19\">status=\"503\"<\/code> poimivat vain oikeasti estetyt yhteydet.<\/p><\/li><\/ul><p data-path-to-node=\"34\"><b data-path-to-node=\"34\" data-index-in-node=\"0\">T\u00e4rke\u00e4t asetukset kartalle (Transform data &amp; Map Layers):<\/b> Jotta kartta ymm\u00e4rt\u00e4\u00e4 datan oikein, sinun on teht\u00e4v\u00e4 kaksi asiaa:<\/p><ol start=\"1\" data-path-to-node=\"35\"><li><p data-path-to-node=\"35,0,0\">Mene <b data-path-to-node=\"35,0,0\" data-index-in-node=\"5\">Transform data<\/b> -v\u00e4lilehdelle ja lis\u00e4\u00e4: <b data-path-to-node=\"35,0,0\" data-index-in-node=\"44\">Merge<\/b> (laita t\u00e4m\u00e4 aivan ylimm\u00e4ksi!) ja sen alle <b data-path-to-node=\"35,0,0\" data-index-in-node=\"92\">Labels to fields<\/b>.<\/p><\/li><li><p data-path-to-node=\"35,1,0\">Oikean reunan asetuksista valitse <b data-path-to-node=\"35,1,0\" data-index-in-node=\"34\">Map layers -&gt; Data layer<\/b>:<\/p><ul data-path-to-node=\"35,1,1\"><li><p data-path-to-node=\"35,1,1,0,0\">Location mode: Lookup<\/p><\/li><li><p data-path-to-node=\"35,1,1,1,0\">Lookup field: <code data-path-to-node=\"35,1,1,1,0\" data-index-in-node=\"14\">country_code<\/code><\/p><\/li><li><p data-path-to-node=\"35,1,1,2,0\">Gazetteer: Countries<\/p><\/li><li><p data-path-to-node=\"35,1,1,3,0\">Size \/ Weight field: Value<\/p><\/li><\/ul><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2fb8d16 elementor-widget elementor-widget-heading\" data-id=\"2fb8d16\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">2. Estetyt maat Top-lista (Bar Gauge)<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1852154 elementor-widget elementor-widget-text-editor\" data-id=\"1852154\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Lis\u00e4\u00e4 toinen paneeli,<span class=\"\"> tyypilt\u00e4\u00e4n <\/span><b class=\"\" data-path-to-node=\"37\" data-index-in-node=\"33\">Bar Gauge<\/b><span class=\"\">,<\/span><span class=\"\"> ja aseta kyselyksi:<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dfa5037 elementor-widget elementor-widget-eael-code-snippet\" data-id=\"dfa5037\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-code-snippet.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t      <div class=\"eael-code-snippet-wrapper theme-dark view-mode-default\" data-language=\"bash\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-dfa5037\" id=\"eael-code-snippet-dfa5037\" >\n      \n         <div class=\"eael-code-snippet-content\">\n                        <div class=\"eael-code-snippet-line-numbers\" aria-hidden=\"true\">\n                                 <div class=\"line-number\">1<\/div>\n                                 <div class=\"line-number\">2<\/div>\n                                 <div class=\"line-number\">3<\/div>\n                           <\/div>\n                        <pre class=\"eael-code-snippet-code language-bash\"><code>sum by (country_name) (\r\n  count_over_time({job=&quot;varlogs&quot;, filename=~&quot;.*access.*&quot;} | json | __error__=&quot;&quot; | is_allowed=&quot;no&quot; | status=&quot;503&quot; | country_name != &quot;-&quot; [$__range])\r\n) or vector(0)<\/code><\/pre>\n                     <\/div>\n      <\/div>\n      \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e8ad279 elementor-widget elementor-widget-text-editor\" data-id=\"e8ad279\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-path-to-node=\"39\">T\u00e4ss\u00e4 <code data-path-to-node=\"39\" data-index-in-node=\"6\">or vector(0)<\/code> on t\u00e4rke\u00e4 varmistus: jos liikennett\u00e4 ei ole hetkeen blokattu, Grafana ei kaadu &#8221;No Data&#8221; -virheeseen, vaan palauttaa siististi arvon 0.<\/p><p data-path-to-node=\"40\"><b data-path-to-node=\"40\" data-index-in-node=\"0\">Siisti asettelu (Transform data):<\/b> P\u00e4\u00e4st\u00e4ksesi eroon rumasta <code data-path-to-node=\"40\" data-index-in-node=\"60\">Value #A<\/code> -tekstist\u00e4, joka syntyy <code data-path-to-node=\"40\" data-index-in-node=\"93\">vector(0)<\/code> -toiminnosta, k\u00e4yt\u00e4 j\u00e4lleen transformaatioita:<\/p><ol start=\"1\" data-path-to-node=\"41\"><li><p data-path-to-node=\"41,0,0\">Mene <b data-path-to-node=\"41,0,0\" data-index-in-node=\"5\">Transform data<\/b> -v\u00e4lilehdelle.<\/p><\/li><li><p data-path-to-node=\"41,1,0\">Lis\u00e4\u00e4 <b data-path-to-node=\"41,1,0\" data-index-in-node=\"6\">Labels to fields<\/b>.<\/p><\/li><li><p data-path-to-node=\"41,2,0\">Lis\u00e4\u00e4 <b data-path-to-node=\"41,2,0\" data-index-in-node=\"6\">Filter data by values<\/b>:<\/p><ul data-path-to-node=\"41,2,1\"><li><p data-path-to-node=\"41,2,1,0,0\">Type: Include \/ Match: All<\/p><\/li><li><p data-path-to-node=\"41,2,1,1,0\">Conditions: Field -&gt; <code data-path-to-node=\"41,2,1,1,0\" data-index-in-node=\"21\">Value<\/code> -&gt; Is greater than -&gt; <code data-path-to-node=\"41,2,1,1,0\" data-index-in-node=\"49\">0<\/code>. T\u00e4m\u00e4 piilottaa automaattisesti tyhj\u00e4t rivit, ja j\u00e4ljelle j\u00e4\u00e4 vain siisti lista estettyjen maiden oikeista nimist\u00e4.<\/p><\/li><\/ul><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-141b7b1 elementor-widget elementor-widget-heading\" data-id=\"141b7b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Ongelmanratkaisu: Jos kartta ei n\u00e4y tai lataudu<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f6fc1ec elementor-widget elementor-widget-text-editor\" data-id=\"f6fc1ec\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-path-to-node=\"1\"><span class=\"\">Joskus Grafanan oletusarvoinen taustakartta ei lataudu oikein verkkorajoitusten tai palvelinongelmien vuoksi,<\/span><span class=\"\"> jolloin kartan tilalla n\u00e4kyy vain tyhj\u00e4 ruutu.<\/span> Voit korjata t\u00e4m\u00e4n vaihtamalla taustakartaksi vaihtoehtoisen palvelimen, kuten Carton tyylikk\u00e4\u00e4n tumman teeman (<code data-path-to-node=\"1\" data-index-in-node=\"269\">dark_all<\/code>).<\/p><p data-path-to-node=\"2\">N\u00e4in vaihdat taustakartan:<\/p><ol start=\"1\" data-path-to-node=\"3\"><li><p data-path-to-node=\"3,0,0\">Paina &#8221;Traffic Map&#8221; -paneelin otsikkoa ja valitse <b data-path-to-node=\"3,0,0\" data-index-in-node=\"50\">Edit<\/b>.<\/p><\/li><li><p data-path-to-node=\"3,1,0\">Etsi oikean reunan valikosta osio <b data-path-to-node=\"3,1,0\" data-index-in-node=\"34\">Map layers<\/b> ja avaa <b data-path-to-node=\"3,1,0\" data-index-in-node=\"53\">Basemap layer<\/b> -asetukset.<\/p><\/li><li><p data-path-to-node=\"3,2,0\">M\u00e4\u00e4rit\u00e4 asetukset seuraavasti:<\/p><ul data-path-to-node=\"3,2,1\"><li><p data-path-to-node=\"3,2,1,0,0\"><b data-path-to-node=\"3,2,1,0,0\" data-index-in-node=\"0\">Layer type:<\/b> <code data-path-to-node=\"3,2,1,0,0\" data-index-in-node=\"12\">arcGIS MapServer<\/code><\/p><\/li><li><p data-path-to-node=\"3,2,1,1,0\"><b data-path-to-node=\"3,2,1,1,0\" data-index-in-node=\"0\">Server instance:<\/b> <code data-path-to-node=\"3,2,1,1,0\" data-index-in-node=\"17\">Custom MapServer<\/code><\/p><\/li><li><p data-path-to-node=\"3,2,1,2,0\"><b data-path-to-node=\"3,2,1,2,0\" data-index-in-node=\"0\">URL Template:<\/b> <code data-path-to-node=\"3,2,1,2,0\" data-index-in-node=\"14\">[https:\/\/basemaps.cartocdn.com\/rastertiles\/dark_all\/](https:\/\/basemaps.cartocdn.com\/rastertiles\/dark_all\/){z}\/{x}\/{y}.png<\/code><i class=\"\" data-path-to-node=\"3,2,1,2,0\" data-index-in-node=\"136\">(Huom: Mik\u00e4li k\u00e4yt\u00e4t Carton rekister\u00f6ity\u00e4 tili\u00e4, voit lis\u00e4t\u00e4 osoitteen per\u00e4\u00e4n <code data-path-to-node=\"3,2,1,2,0\" data-index-in-node=\"214\">?key={YOUR_API_KEY}<\/code>, mutta julkiset peruskartat toimivat usein my\u00f6s ilman avainta).<\/i><\/p><\/li><li><p data-path-to-node=\"3,2,1,3,0\"><b data-path-to-node=\"3,2,1,3,0\" data-index-in-node=\"0\">Attribution:<\/b> <code data-path-to-node=\"3,2,1,3,0\" data-index-in-node=\"13\">\u00a9 Carto.com<\/code><\/p><\/li><\/ul><\/li><li><p data-path-to-node=\"3,3,0\">Paina ylh\u00e4\u00e4lt\u00e4 <b data-path-to-node=\"3,3,0\" data-index-in-node=\"15\">Apply<\/b> ja tallenna Dashboard. Kartan pit\u00e4isi nyt ilmesty\u00e4 n\u00e4kyviin v\u00e4litt\u00f6m\u00e4sti.<\/p><\/li><\/ol><p data-path-to-node=\"4\"><i class=\"\" data-path-to-node=\"4\" data-index-in-node=\"0\">(Vinkki: Jos haluat kokeilla karttaan muita v\u00e4riteemoja, l\u00f6yd\u00e4t kaikki tuetut tyylit suoraan <a class=\"ng-star-inserted\" href=\"https:\/\/github.com\/cartodb\/basemap-styles\" target=\"_blank\" rel=\"noopener\" data-hveid=\"0\" data-ved=\"0CAAQ_4QMahgKEwjs-rPgydeXAxUAAAAAHQAAAAAQ3Qs\">Carton GitHub-repositoriosta<\/a>.)<\/i><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"aux-parallax-section elementor-element elementor-element-439d238 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"439d238\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c196ea0 elementor-widget elementor-widget-heading\" data-id=\"c196ea0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Yhteenveto<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8889efe elementor-widget elementor-widget-text-editor\" data-id=\"8889efe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nyt sinulla on t\u00e4ysin lokaalisti py\u00f6riv\u00e4, visuaalinen seurantataulu palvelimesi GeoBlock-osumille. Nginx puskee dataa JSON-muodossa, Promtail poimii sen, Loki indeksoi, ja Grafana piirt\u00e4\u00e4 sen kauniisti kartalle ilman mink\u00e4\u00e4nlaisia ulkoisia pilvipalveluita tai API-avaimia.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki &amp; Promtail) Aiemmassa oppaassa k\u00e4vimme l\u00e4pi, kuinka asettaa Nginx Proxy Manageriin (NPM) GeoBlocking MaxMindin tietokannan avulla. Se on tehokas tapa est\u00e4\u00e4 ei-toivottu liikenne tietyist\u00e4 maista ja palauttaa niille esimerkiksi kustomoitu 503-virhesivu. Mutta mist\u00e4 tied\u00e4mme, kuinka paljon liikennett\u00e4 oikeasti blokataan ja mist\u00e4 maista sit\u00e4 tulee? T\u00e4ss\u00e4 oppaassa rakennamme seurantapaneelin Grafanan, Lokin ja Promtailin avulla. N\u00e4yt\u00e4n, kuinka NPM:n lokit muutetaan JSON-muotoon, l\u00e4hetet\u00e4\u00e4n Lokille ja visualisoidaan upeaksi maailmankartaksi ja top-listaksi. Vaihe 1: Nginx-lokien muuttaminen JSON-muotoon Oletuksena Nginx kirjoittaa lokia pelkk\u00e4n\u00e4 tekstin\u00e4. Jotta Grafana voi suodattaa dataa k\u00e4tev\u00e4sti (esimerkiksi maatunnuksen tai eston perusteella), meid\u00e4n t\u00e4ytyy kertoa Nginxille, ett\u00e4 haluamme lokit rakenteellisena JSON-datana. Avaa aiemmin luomasi Nginxin lis\u00e4konfiguraatiotiedosto (esim. \/docker\/npm\/data\/nginx\/custom\/http_top.conf) ja p\u00e4ivit\u00e4 se t\u00e4h\u00e4n muotoon: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 charset utf-8; geoip2 \/data\/geoip2\/GeoLite2-City.mmdb { auto_reload 3h; $geoip2_metadata_country_build metadata build_epoch; $geoip2_data_country_code default=XX source=$remote_addr country iso_code; # HUOM: K\u00e4yt\u00e4 ehdottomasti &quot;en&quot; (englanti), jotta MaxMind palauttaa maan koko nimen luotettavasti. # Jos k\u00e4yt\u00e4t &quot;fi&quot;, moni maa palauttaa pelk\u00e4n viivan (-). $geoip2_data_country_name default=- country names en; $geoip2_data_city_name default=- city names en; $geoip2_data_region_name default=- subdivisions 0 names en; } geo $allowed_ip { default no; # Blokataan kaikki oletuksena 10.10.0.0\/24 yes; # Whitelist: Oma l\u00e4hiverkko } map $geoip2_data_country_code $allowed_country { default $allowed_ip; DE yes; # Whitelist: Vain Saksa sallittu } # Grafanaa varten r\u00e4\u00e4t\u00e4l\u00f6ity JSON-loki log_format json_analytics escape=json &#039;{&#039; &#039;&quot;time_local&quot;: &quot;$time_local&quot;, &#039; &#039;&quot;remote_addr&quot;: &quot;$remote_addr&quot;, &#039; &#039;&quot;request_uri&quot;: &quot;$request_uri&quot;, &#039; &#039;&quot;status&quot;: &quot;$status&quot;, &#039; &#039;&quot;server_name&quot;: &quot;$server_name&quot;, &#039; &#039;&quot;request_method&quot;: &quot;$request_method&quot;, &#039; &#039;&quot;country_code&quot;: &quot;$geoip2_data_country_code&quot;, &#039; &#039;&quot;country_name&quot;: &quot;$geoip2_data_country_name&quot;, &#039; &#039;&quot;city_name&quot;: &quot;$geoip2_data_city_name&quot;, &#039; &#039;&quot;is_allowed&quot;: &quot;$allowed_country&quot; &#039; &#039;}&#039;; Muista my\u00f6s varmistaa, ett\u00e4 kyseist\u00e4 json_analytics -muotoa k\u00e4ytet\u00e4\u00e4n Nginxin access-lokeissa (esim. server_proxy.conf tiedostossa): 1 2 access_log \/data\/logs\/all_proxy_access.log json_analytics; error_log \/data\/logs\/all_proxy_error.log warn; Lataa Nginx uudelleen: docker exec -it npm-containerin-nimi nginx -s reload Nimen n\u00e4et docker ps\u00a0komennolla. Vaihe 2: Valmistele Grafana-ymp\u00e4rist\u00f6n kansiot Luodaan seurantaty\u00f6kaluille oma hakemisto. Nykyiset Docker-imaget vaativat tiukat kansion omistajuudet turvallisuussyist\u00e4. 1 2 3 4 5 6 7 8 9 mkdir -p \/docker\/grafana cd \/docker\/grafana # Luodaan tarvittavat alikansiot mkdir -p config-loki config-promtail loki-data grafana-data # Asetetaan oikeudet, jotta containerit voivat tallentaa dataa sudo chown -R 10001:10001 loki-data sudo chown -R 472:472 grafana-data Vaihe 3: Konfiguraatiotiedostot Promtailille ja Lokille Promtail lukee NPM:n lokitiedostoja ja l\u00e4hett\u00e4\u00e4 ne Lokille, joka indeksoi ne Grafanaa varten. Luo tiedosto config-promtail\/config.yaml: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: \/tmp\/positions.yaml clients: &#8211; url: http:\/\/loki:3100\/loki\/api\/v1\/push scrape_configs: &#8211; job_name: system static_configs: &#8211; targets: &#8211; localhost labels: job: varlogs __path__: \/var\/log\/*log Luo tiedosto config-loki\/local-config.yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 auth_enabled: false server: http_listen_port: 3100 common: path_prefix: \/loki storage: filesystem: chunks_directory: \/loki\/chunks rules_directory: \/loki\/rules replication_factor: 1 ring: kvstore: store: inmemory schema_config: configs: &#8211; from: 2020-10-24 store: boltdb-shipper object_store: filesystem schema: v11 index: prefix: index_ period: 24h Vaihe 4: Docker Compose Luo tiedosto compose.yaml \/docker\/grafana\/ -kansioon.Huom: Varmista, ett\u00e4 Promtailin volume viittaa oikeaan paikkaan is\u00e4nt\u00e4koneellasi, jossa Nginx Proxy Managerin lokit sijaitsevat. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 services: loki: image: grafana\/loki:latest ports: &#8211; &quot;3100:3100&quot; command: -config.file=\/etc\/loki\/local-config.yaml volumes: &#8211; .\/loki-data:\/loki &#8211; .\/config-loki:\/etc\/loki restart: unless-stopped promtail: image: grafana\/promtail:latest volumes: # MUUTA T\u00c4M\u00c4 vastaamaan omaa NPM asennustasi: &#8211; \/docker\/npm\/data\/logs:\/var\/log &#8211; .\/config-promtail\/config.yaml:\/etc\/promtail\/config.yaml restart: unless-stopped grafana: image: grafana\/grafana:latest ports: &#8211; &quot;3000:3000&quot; environment: &#8211; GF_AUTH_ANONYMOUS_ENABLED=false volumes: &#8211; .\/grafana-data:\/var\/lib\/grafana restart: unless-stopped K\u00e4ynnist\u00e4 ymp\u00e4rist\u00f6: docker compose up -d Vaihe 5: Grafana Dashboardin rakentaminen Kirjaudu Grafanaan osoitteessa http:\/\/palvelimen-ip:3000 (oletustunnukset: admin \/ admin). Lis\u00e4\u00e4 ensin tietol\u00e4hde (Data Source): Valitse Loki ja aseta URL-osoitteeksi http:\/\/loki:3100. Luo uusi Dashboard ja lis\u00e4\u00e4 siihen kaksi paneelia: 1. Maailmankartta (Geomap) \u2013 N\u00e4ytt\u00e4\u00e4 estetyt yhteydet kartalla Valitse paneelin tyypiksi Geomap (tai Heatmap) ja aseta kyselyksi (LogQL): 1 2 3 sum by (country_code) ( count_over_time({job=&quot;varlogs&quot;, filename=~&quot;.*access.*&quot;} | json | __error__=&quot;&quot; | is_allowed=&quot;no&quot; | status=&quot;503&quot; | country_code != &quot;XX&quot; | country_code != &quot;&quot; [$__range]) ) Miksi n\u00e4m\u00e4 filtterit? filename=~&#8221;.*access.*&#8221; ohittaa Nginxin virhelokit (error.log), jotka ovat puhdasta teksti\u00e4 ja rikkovat JSON-parserin. $__range skaalautuu Grafanan aikavalitsimen mukaan. is_allowed=&#8221;no&#8221; ja status=&#8221;503&#8243; poimivat vain oikeasti estetyt yhteydet. T\u00e4rke\u00e4t asetukset kartalle (Transform data &amp; Map Layers): Jotta kartta ymm\u00e4rt\u00e4\u00e4 datan oikein, sinun on teht\u00e4v\u00e4 kaksi asiaa: Mene Transform data -v\u00e4lilehdelle ja lis\u00e4\u00e4: Merge (laita t\u00e4m\u00e4 aivan ylimm\u00e4ksi!) ja sen alle Labels to fields. Oikean reunan asetuksista valitse Map layers -&gt; Data layer: Location mode: Lookup Lookup field: country_code Gazetteer: Countries Size \/ Weight field: Value 2. Estetyt maat Top-lista (Bar Gauge) Lis\u00e4\u00e4 toinen paneeli, tyypilt\u00e4\u00e4n Bar Gauge, ja aseta kyselyksi: 1 2 3 sum by (country_name) ( count_over_time({job=&quot;varlogs&quot;, filename=~&quot;.*access.*&quot;} | json | __error__=&quot;&quot; | is_allowed=&quot;no&quot; | status=&quot;503&quot; | country_name != &quot;-&quot; [$__range]) ) or vector(0) T\u00e4ss\u00e4 or vector(0) on t\u00e4rke\u00e4 varmistus: jos liikennett\u00e4 ei ole hetkeen blokattu, Grafana ei kaadu &#8221;No Data&#8221; -virheeseen, vaan palauttaa siististi arvon 0. Siisti asettelu (Transform data): P\u00e4\u00e4st\u00e4ksesi eroon rumasta Value #A -tekstist\u00e4, joka syntyy vector(0) -toiminnosta, k\u00e4yt\u00e4 j\u00e4lleen transformaatioita: Mene Transform data -v\u00e4lilehdelle. Lis\u00e4\u00e4 Labels to fields. Lis\u00e4\u00e4 Filter data by values: Type: Include \/ Match: All Conditions: Field -&gt; Value -&gt; Is greater than -&gt; 0. T\u00e4m\u00e4 piilottaa automaattisesti tyhj\u00e4t rivit, ja j\u00e4ljelle j\u00e4\u00e4 vain siisti lista estettyjen maiden oikeista nimist\u00e4. Ongelmanratkaisu: Jos kartta ei n\u00e4y tai lataudu Joskus Grafanan oletusarvoinen taustakartta ei lataudu oikein verkkorajoitusten tai palvelinongelmien vuoksi, jolloin kartan tilalla n\u00e4kyy vain tyhj\u00e4 ruutu. Voit korjata t\u00e4m\u00e4n vaihtamalla taustakartaksi vaihtoehtoisen palvelimen, kuten Carton tyylikk\u00e4\u00e4n tumman teeman (dark_all). N\u00e4in vaihdat taustakartan: Paina &#8221;Traffic Map&#8221; -paneelin otsikkoa ja valitse Edit. Etsi oikean reunan valikosta osio Map layers ja avaa Basemap layer -asetukset. M\u00e4\u00e4rit\u00e4 asetukset seuraavasti: Layer type: arcGIS MapServer Server instance: Custom MapServer URL Template: [https:\/\/basemaps.cartocdn.com\/rastertiles\/dark_all\/](https:\/\/basemaps.cartocdn.com\/rastertiles\/dark_all\/){z}\/{x}\/{y}.png(Huom: Mik\u00e4li k\u00e4yt\u00e4t Carton rekister\u00f6ity\u00e4 tili\u00e4, voit lis\u00e4t\u00e4 osoitteen per\u00e4\u00e4n ?key={YOUR_API_KEY}, mutta julkiset peruskartat toimivat usein my\u00f6s ilman avainta). Attribution: \u00a9 Carto.com Paina ylh\u00e4\u00e4lt\u00e4 Apply ja tallenna Dashboard. Kartan pit\u00e4isi nyt ilmesty\u00e4 n\u00e4kyviin v\u00e4litt\u00f6m\u00e4sti. (Vinkki: Jos haluat kokeilla karttaan muita<\/p>\n","protected":false},"author":1,"featured_media":3219,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"_templately_pack_id":"","_templately_imported_at":"","_templately_source":"","_templately_import_session_id":"","footnotes":""},"categories":[9,10,16],"tags":[],"class_list":["post-3218","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-palvelin","category-tietoturva"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki &amp; Promtail) - Lassin kotisivut<\/title>\n<meta name=\"description\" content=\"Katso, mist\u00e4 maista palvelimellesi yritet\u00e4\u00e4n yhdist\u00e4\u00e4. Vaiheittainen opas Nginx Proxy Managerin GeoBlock-liikenteen visualisointiin Grafanan, Lokin ja Promtailin avulla.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/lassinsivut.eu\/en\/nginx-proxy-manager-geoblock-grafana-monitorointi\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki &amp; Promtail) - Lassin kotisivut\" \/>\n<meta property=\"og:description\" content=\"Katso, mist\u00e4 maista palvelimellesi yritet\u00e4\u00e4n yhdist\u00e4\u00e4. Vaiheittainen opas Nginx Proxy Managerin GeoBlock-liikenteen visualisointiin Grafanan, Lokin ja Promtailin avulla.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/lassinsivut.eu\/en\/nginx-proxy-manager-geoblock-grafana-monitorointi\/\" \/>\n<meta property=\"og:site_name\" content=\"Lassin kotisivut\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-26T14:20:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T15:09:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/10\/Grafana-banner-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1086\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"lassi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"lassi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/\"},\"author\":{\"name\":\"lassi\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/#\\\/schema\\\/person\\\/67bdceb745edf90a930490fa37b3a755\"},\"headline\":\"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki &#038; Promtail)\",\"datePublished\":\"2026-10-26T14:20:26+00:00\",\"dateModified\":\"2026-10-26T15:09:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/\"},\"wordCount\":640,\"publisher\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/#\\\/schema\\\/person\\\/67bdceb745edf90a930490fa37b3a755\"},\"image\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Grafana-banner-scaled.jpg\",\"articleSection\":[\"Linux\",\"Palvelin\",\"Tietoturva\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/\",\"url\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/\",\"name\":\"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki & Promtail) - Lassin kotisivut\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Grafana-banner-scaled.jpg\",\"datePublished\":\"2026-10-26T14:20:26+00:00\",\"dateModified\":\"2026-10-26T15:09:08+00:00\",\"description\":\"Katso, mist\u00e4 maista palvelimellesi yritet\u00e4\u00e4n yhdist\u00e4\u00e4. Vaiheittainen opas Nginx Proxy Managerin GeoBlock-liikenteen visualisointiin Grafanan, Lokin ja Promtailin avulla.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/#primaryimage\",\"url\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Grafana-banner-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Grafana-banner-scaled.jpg\",\"width\":2560,\"height\":1086},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblock-grafana-monitorointi\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/lassinsivut.eu\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki &#038; Promtail)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/#website\",\"url\":\"https:\\\/\\\/lassinsivut.eu\\\/\",\"name\":\"Lassin kotisivut\",\"description\":\"Blogi t\u00e4ynn\u00e4 tietotekniikan juttuja, tervetuloa!\",\"publisher\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/#\\\/schema\\\/person\\\/67bdceb745edf90a930490fa37b3a755\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/lassinsivut.eu\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/#\\\/schema\\\/person\\\/67bdceb745edf90a930490fa37b3a755\",\"name\":\"lassi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/Profilepicture-Transparent.png\",\"url\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/Profilepicture-Transparent.png\",\"contentUrl\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/Profilepicture-Transparent.png\",\"width\":1080,\"height\":1083,\"caption\":\"lassi\"},\"logo\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/Profilepicture-Transparent.png\"},\"sameAs\":[\"https:\\\/\\\/lassinsivut.eu\"],\"url\":\"https:\\\/\\\/lassinsivut.eu\\\/en\\\/author\\\/lassi\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki & Promtail) - Lassin kotisivut","description":"Katso, mist\u00e4 maista palvelimellesi yritet\u00e4\u00e4n yhdist\u00e4\u00e4. Vaiheittainen opas Nginx Proxy Managerin GeoBlock-liikenteen visualisointiin Grafanan, Lokin ja Promtailin avulla.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/lassinsivut.eu\/en\/nginx-proxy-manager-geoblock-grafana-monitorointi\/","og_locale":"en_US","og_type":"article","og_title":"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki & Promtail) - Lassin kotisivut","og_description":"Katso, mist\u00e4 maista palvelimellesi yritet\u00e4\u00e4n yhdist\u00e4\u00e4. Vaiheittainen opas Nginx Proxy Managerin GeoBlock-liikenteen visualisointiin Grafanan, Lokin ja Promtailin avulla.","og_url":"https:\/\/lassinsivut.eu\/en\/nginx-proxy-manager-geoblock-grafana-monitorointi\/","og_site_name":"Lassin kotisivut","article_published_time":"2026-10-26T14:20:26+00:00","article_modified_time":"2026-10-26T15:09:08+00:00","og_image":[{"width":2560,"height":1086,"url":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/10\/Grafana-banner-scaled.jpg","type":"image\/jpeg"}],"author":"lassi","twitter_card":"summary_large_image","twitter_misc":{"Written by":"lassi","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/#article","isPartOf":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/"},"author":{"name":"lassi","@id":"https:\/\/lassinsivut.eu\/#\/schema\/person\/67bdceb745edf90a930490fa37b3a755"},"headline":"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki &#038; Promtail)","datePublished":"2026-10-26T14:20:26+00:00","dateModified":"2026-10-26T15:09:08+00:00","mainEntityOfPage":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/"},"wordCount":640,"publisher":{"@id":"https:\/\/lassinsivut.eu\/#\/schema\/person\/67bdceb745edf90a930490fa37b3a755"},"image":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/#primaryimage"},"thumbnailUrl":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/10\/Grafana-banner-scaled.jpg","articleSection":["Linux","Palvelin","Tietoturva"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/","url":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/","name":"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki & Promtail) - Lassin kotisivut","isPartOf":{"@id":"https:\/\/lassinsivut.eu\/#website"},"primaryImageOfPage":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/#primaryimage"},"image":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/#primaryimage"},"thumbnailUrl":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/10\/Grafana-banner-scaled.jpg","datePublished":"2026-10-26T14:20:26+00:00","dateModified":"2026-10-26T15:09:08+00:00","description":"Katso, mist\u00e4 maista palvelimellesi yritet\u00e4\u00e4n yhdist\u00e4\u00e4. Vaiheittainen opas Nginx Proxy Managerin GeoBlock-liikenteen visualisointiin Grafanan, Lokin ja Promtailin avulla.","breadcrumb":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/#primaryimage","url":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/10\/Grafana-banner-scaled.jpg","contentUrl":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/10\/Grafana-banner-scaled.jpg","width":2560,"height":1086},{"@type":"BreadcrumbList","@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblock-grafana-monitorointi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/lassinsivut.eu\/"},{"@type":"ListItem","position":2,"name":"Nginx Proxy Managerin GeoBlock-liikenteen visualisointi Grafanalla (Loki &#038; Promtail)"}]},{"@type":"WebSite","@id":"https:\/\/lassinsivut.eu\/#website","url":"https:\/\/lassinsivut.eu\/","name":"Lassi's homepage","description":"Blogi t\u00e4ynn\u00e4 tietotekniikan juttuja, tervetuloa!","publisher":{"@id":"https:\/\/lassinsivut.eu\/#\/schema\/person\/67bdceb745edf90a930490fa37b3a755"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/lassinsivut.eu\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/lassinsivut.eu\/#\/schema\/person\/67bdceb745edf90a930490fa37b3a755","name":"lassi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2021\/11\/Profilepicture-Transparent.png","url":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2021\/11\/Profilepicture-Transparent.png","contentUrl":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2021\/11\/Profilepicture-Transparent.png","width":1080,"height":1083,"caption":"lassi"},"logo":{"@id":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2021\/11\/Profilepicture-Transparent.png"},"sameAs":["https:\/\/lassinsivut.eu"],"url":"https:\/\/lassinsivut.eu\/en\/author\/lassi\/"}]}},"_links":{"self":[{"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/posts\/3218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/comments?post=3218"}],"version-history":[{"count":8,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/posts\/3218\/revisions"}],"predecessor-version":[{"id":3228,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/posts\/3218\/revisions\/3228"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/media\/3219"}],"wp:attachment":[{"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/media?parent=3218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/categories?post=3218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/tags?post=3218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}