{"id":3108,"date":"2026-03-30T22:45:28","date_gmt":"2026-03-30T19:45:28","guid":{"rendered":"https:\/\/lassinsivut.eu\/?p=3108"},"modified":"2026-03-30T23:33:53","modified_gmt":"2026-03-30T20:33:53","slug":"nginx-proxy-manager-geoblocking","status":"publish","type":"post","link":"https:\/\/lassinsivut.eu\/en\/nginx-proxy-manager-geoblocking\/","title":{"rendered":"Nginx Proxy Manager GeoBlocking"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"3108\" class=\"elementor elementor-3108\">\n\t\t\t\t<div class=\"aux-parallax-section elementor-element elementor-element-7eac5e6 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"7eac5e6\" 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-4c5d7bd elementor-widget elementor-widget-spacer\" data-id=\"4c5d7bd\" 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\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"aux-parallax-section elementor-element elementor-element-37546e0 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"37546e0\" 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-b9bff38 elementor-widget elementor-widget-heading\" data-id=\"b9bff38\" 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\">GeoBlocking Nginx Proxy Managerilla<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-93f2a24 elementor-widget elementor-widget-text-editor\" data-id=\"93f2a24\" 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>Geoblokki tarkoittaa tiettyjen maiden tai alueiden IP-osoitteiden est\u00e4mist\u00e4 p\u00e4\u00e4sem\u00e4st\u00e4 palveluun. Sen tarkoituksena on parantaa tietoturvaa ja v\u00e4hent\u00e4\u00e4 turhaa liikennett\u00e4 esimerkiksi silloin, kun palvelua k\u00e4ytet\u00e4\u00e4n vain tietyss\u00e4 maassa. N\u00e4in voidaan est\u00e4\u00e4 haitallisia kirjautumisyrityksi\u00e4 ja pienent\u00e4\u00e4 palvelimen kuormitusta.<\/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-8809174 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"8809174\" 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-8671b7a elementor-widget elementor-widget-heading\" data-id=\"8671b7a\" 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\">Dockerin asennus<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-50d0371 elementor-widget elementor-widget-text-editor\" data-id=\"50d0371\" 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>Asennetaan Docker ensin k\u00e4tev\u00e4sti heid\u00e4n valmiilla bash scriptill\u00e4.<\/p><p><strong>curl -fsSL https:\/\/get.docker.com | sudo sh<\/strong><\/p><p>Tehd\u00e4\u00e4n kansio Nginxille.<\/p><p><strong>mkdir -p \/docker\/npm<\/strong><\/p><p><strong>cd \/docker\/npm<\/strong><\/p><p>Luodaan Docker compose tiedosto johon kaikki konfiguraatiot tulevat.<\/p><p><strong>nano compose.yaml<\/strong><\/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-29972bd elementor-widget elementor-widget-eael-code-snippet\" data-id=\"29972bd\" 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=\"dockerfile\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-29972bd\" id=\"eael-code-snippet-29972bd\" >\n               <div class=\"eael-code-snippet-header eael-file-preview-header\">\n            <div class=\"eael-file-preview-left\">\n                           <div class=\"eael-file-info\">\n                                    <div class=\"eael-file-icon\">\n                                             <span class=\"eael-file-icon-emoji\">\ud83d\udc33<\/span>\n                                          <\/div>\n                                    <div class=\"eael-file-name\">\n                     <span class=\"file-name-text\">\n                        compose.yaml                     <\/span>\n                  <\/div>\n                                 <\/div>\n            <\/div>\n\n                        <div class=\"eael-file-preview-right\">\n               <div class=\"eael-code-snippet-copy-container\">\n                  <button data-clipboard-target=\"#eael-code-snippet-29972bd .eael-code-snippet-code code\" class=\"eael-code-snippet-copy-button\" type=\"button\" aria-label=\"Copy code to clipboard Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewbox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                           <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                  <\/button>\n                                 <\/div>\n            <\/div>\n                     <\/div>\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 class=\"line-number\">38<\/div>\n                                 <div class=\"line-number\">39<\/div>\n                                 <div class=\"line-number\">40<\/div>\n                                 <div class=\"line-number\">41<\/div>\n                                 <div class=\"line-number\">42<\/div>\n                                 <div class=\"line-number\">43<\/div>\n                                 <div class=\"line-number\">44<\/div>\n                                 <div class=\"line-number\">45<\/div>\n                                 <div class=\"line-number\">46<\/div>\n                                 <div class=\"line-number\">47<\/div>\n                                 <div class=\"line-number\">48<\/div>\n                                 <div class=\"line-number\">49<\/div>\n                                 <div class=\"line-number\">50<\/div>\n                                 <div class=\"line-number\">51<\/div>\n                           <\/div>\n                        <pre class=\"eael-code-snippet-code language-dockerfile\"><code>services:\r\n  app:\r\n    image: &#039;jc21\/nginx-proxy-manager:latest&#039;\r\n    restart: unless-stopped\r\n    ports:\r\n      # These ports are in format &lt;host-port&gt;:&lt;container-port&gt;\r\n      - &#039;80:80&#039; # Public HTTP Port\r\n      - &#039;443:443&#039; # Public HTTPS Port\r\n      - &#039;81:81&#039; # Admin Web Port\r\n      # Add any other Stream port you want to expose\r\n      # - &#039;21:21&#039; # FTP\r\n    environment:\r\n      # Mysql\/Maria connection parameters:\r\n      DB_MYSQL_HOST: &quot;db&quot;\r\n      DB_MYSQL_PORT: 3306\r\n      DB_MYSQL_USER: &quot;npm&quot;\r\n      DB_MYSQL_PASSWORD: &quot;npm&quot;\r\n      DB_MYSQL_NAME: &quot;npm&quot;\r\n      # Uncomment this if IPv6 is not enabled on your host\r\n      # DISABLE_IPV6: &#039;true&#039;\r\n    volumes:\r\n      - .\/data:\/data\r\n      - .\/letsencrypt:\/etc\/letsencrypt\r\n      - .\/data\/nginx\/custom:\/etc\/nginx\/conf.d\/custom\r\n    depends_on:\r\n      - db\r\n\r\n  db:\r\n    image: &#039;jc21\/mariadb-aria:latest&#039;\r\n    restart: unless-stopped\r\n    environment:\r\n      MYSQL_ROOT_PASSWORD: &#039;npm&#039;\r\n      MYSQL_DATABASE: &#039;npm&#039;\r\n      MYSQL_USER: &#039;npm&#039;\r\n      MYSQL_PASSWORD: &#039;npm&#039;\r\n    volumes:\r\n      - .\/mysql:\/var\/lib\/mysql\r\n\r\n  geoip-upd:\r\n    container_name: geoip-upd\r\n    image: maxmindinc\/geoipupdate:latest\r\n    restart: unless-stopped\r\n    volumes:\r\n      - .\/data\/geoip2:\/usr\/share\/GeoIP\r\n    environment:\r\n      TZ: &quot;Europe\/Helsinki&quot;\r\n      GEOIPUPDATE_ACCOUNT_ID: 1234567\r\n      GEOIPUPDATE_LICENSE_KEY: &quot;keykeykeykeykeykeykeykey&quot;\r\n      GEOIPUPDATE_EDITION_IDS: &quot;GeoLite2-City GeoLite2-Country GeoLite2-ASN&quot;    #Databaset joita tarvimme\r\n      GEOIPUPDATE_FREQUENCY: 12                #Kuinka usein database p\u00e4ivittyy\r\n      GEOIPUPDATE_PRESERVE_FILE_TIMES: 1       #Todellinen aika tiedostolle<\/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-6a3c2c1 elementor-widget elementor-widget-text-editor\" data-id=\"6a3c2c1\" 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>Seuraavaksi ladataan tarvittavat moduulit.<\/p><p><strong>nano \/docker\/npm\/data\/nginx\/custom\/root_top.conf<\/strong><\/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-62b7a70 elementor-widget elementor-widget-eael-code-snippet\" data-id=\"62b7a70\" 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-62b7a70\" id=\"eael-code-snippet-62b7a70\" >\n               <div class=\"eael-code-snippet-header eael-file-preview-header\">\n            <div class=\"eael-file-preview-left\">\n                           <div class=\"eael-file-info\">\n                                    <div class=\"eael-file-name\">\n                     <span class=\"file-name-text\">\n                        root_top.conf                     <\/span>\n                  <\/div>\n                                 <\/div>\n            <\/div>\n\n                        <div class=\"eael-file-preview-right\">\n               <div class=\"eael-code-snippet-copy-container\">\n                  <button data-clipboard-target=\"#eael-code-snippet-62b7a70 .eael-code-snippet-code code\" class=\"eael-code-snippet-copy-button\" type=\"button\" aria-label=\"Copy code to clipboard Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewbox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                           <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                  <\/button>\n                                 <\/div>\n            <\/div>\n                     <\/div>\n      \n         <div class=\"eael-code-snippet-content\">\n                        <pre class=\"eael-code-snippet-code language-bash\"><code>load_module \/usr\/lib\/nginx\/modules\/ngx_http_geoip2_module.so;\r\nload_module \/usr\/lib\/nginx\/modules\/ngx_stream_geoip2_module.so;<\/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-bbf55ee elementor-widget elementor-widget-text-editor\" data-id=\"bbf55ee\" 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>Uudelleen k\u00e4ynnistet\u00e4\u00e4n containeri jotta muutokset tulevat voimaan.<\/p><p><strong>docker exec -it docker-npm nginx -s reload<\/strong><\/p><p>Tarkista kuitenkin oman containerin nimi seuraavalla komennolla.<\/p><p><strong>docker ps<\/strong><\/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-70d1b06 elementor-widget elementor-widget-heading\" data-id=\"70d1b06\" 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\">Tietokannan lataaminen<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3a0f957 elementor-widget elementor-widget-text-editor\" data-id=\"3a0f957\" 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>Mene osoitteeseen <a href=\"https:\/\/www.maxmind.com\/en\/geolite2\/signup\">https:\/\/www.maxmind.com\/en\/geolite2\/signup<\/a><\/p><p>K\u00e4yt\u00e4mme maxmindin tarjoavaa geoip datasettej\u00e4, ne p\u00e4ivittyv\u00e4t yll\u00e4tt\u00e4v\u00e4n nopeasti. Luo uusi license key ja ota talteen account ID, License Key sek\u00e4 n\u00e4m\u00e4:<\/p><p><strong>GeoLite2-ASN, GeoLite2-Country ja GeoLite2-City<\/strong><\/p><p>Lis\u00e4tty\u00e4si tarvittavat tunnukset Docker Compose tiedostoon ja k\u00e4ynnist\u00e4m\u00e4ll\u00e4 Containerin n\u00e4emme tiedostot.<\/p><p><strong>docker compose up -d<\/strong><\/p><p><strong>ls -l \/docker\/npm\/data\/geoip2<\/strong><\/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-d189a48 elementor-widget elementor-widget-heading\" data-id=\"d189a48\" 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\">Tietokannan konfigurointi Nginx Proxy Managerille<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-56b45e7 elementor-widget elementor-widget-text-editor\" data-id=\"56b45e7\" 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>Luodaan uusi tiedosto joka k\u00e4sittelee tietokannan sis\u00e4ll\u00f6n ja parsii sielt\u00e4 mm.country coden, nimen, cityn sek\u00e4 regionin. T\u00e4ss\u00e4 ohjeessa p\u00e4\u00e4st\u00e4mme vain Saksasta liikenteen.<\/p><p><strong>nano \/docker\/npm\/data\/nginx\/custom\/http_top.conf<\/strong><\/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-8c1ef23 elementor-widget elementor-widget-eael-code-snippet\" data-id=\"8c1ef23\" 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-8c1ef23\" id=\"eael-code-snippet-8c1ef23\" >\n               <div class=\"eael-code-snippet-header eael-file-preview-header\">\n            <div class=\"eael-file-preview-left\">\n                           <div class=\"eael-file-info\">\n                                    <div class=\"eael-file-name\">\n                     <span class=\"file-name-text\">\n                        http_top.conf                     <\/span>\n                  <\/div>\n                                 <\/div>\n            <\/div>\n\n                        <div class=\"eael-file-preview-right\">\n               <div class=\"eael-code-snippet-copy-container\">\n                  <button data-clipboard-target=\"#eael-code-snippet-8c1ef23 .eael-code-snippet-code code\" class=\"eael-code-snippet-copy-button\" type=\"button\" aria-label=\"Copy code to clipboard Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewbox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                           <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                  <\/button>\n                                 <\/div>\n            <\/div>\n                     <\/div>\n      \n         <div class=\"eael-code-snippet-content\">\n                        <pre class=\"eael-code-snippet-code language-bash\"><code>charset utf-8;\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        $geoip2_data_country_name default=- country names de;\r\n        $geoip2_data_city_name default=- city names de;\r\n        $geoip2_data_region_name default=- subdivisions 0 names de;\r\n}\r\ngeo $allowed_ip {\r\n        default no;             # Blockaa oletuksena\r\n        10.10.1.0\/24 yes;     # Whitelistaa locaali verkko\r\n}\r\n\r\nmap $geoip2_data_country_code $allowed_country {\r\n        default $allowed_ip;\r\n        DE yes;                 # Vain Saksa voit lis\u00e4t\u00e4 lis\u00e4\u00e4 maita\r\n}\r\n\r\n#Formaatti logille, my\u00f6hemmin my\u00f6s Grafanaa varten\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_time&quot;: &quot;$request_time&quot;, &#039;\r\n       &#039;&quot;request_method&quot;: &quot;$request_method&quot;, &#039;\r\n       &#039;&quot;bytes_sent&quot;: &quot;$bytes_sent&quot;, &#039;\r\n       &#039;&quot;http_host&quot;: &quot;$http_host&quot;, &#039;\r\n       &#039;&quot;http_x_forwarded_for&quot;: &quot;$http_x_forwarded_for&quot;, &#039;\r\n       &#039;&quot;http_cookie&quot;: &quot;$http_cookie&quot;, &#039;\r\n       &#039;&quot;server_protocol&quot;: &quot;$server_protocol&quot;, &#039;\r\n       &#039;&quot;upstream_addr&quot;: &quot;$upstream_addr&quot;, &#039;\r\n       &#039;&quot;upstream_response_time&quot;: &quot;$upstream_response_time&quot;, &#039;\r\n       &#039;&quot;ssl_protocol&quot;: &quot;$ssl_protocol&quot;, &#039;\r\n       &#039;&quot;ssl_cipher&quot;: &quot;$ssl_cipher&quot;, &#039;\r\n       &#039;&quot;http_user_agent&quot;: &quot;$http_user_agent&quot;, &#039;\r\n       &#039;&quot;remote_user&quot;: &quot;$remote_user&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-9f67385 elementor-widget elementor-widget-text-editor\" data-id=\"9f67385\" 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>Login n\u00e4et t\u00e4ll\u00e4 komennolla.<\/p><p><strong>tail -f \/dockers\/nginx-proxym\/data\/logs\/proxy-host-%HOSTID%_access-geo.log<\/strong><\/p><p>Lis\u00e4t\u00e4\u00e4n viel\u00e4 Proxy Manageriin.<\/p><p>Avaa Nginx Proxy manager WebUI ja paina <strong>Proxy Hosts<\/strong>, sen j\u00e4lkeen <strong>Add proxy Host.<\/strong><\/p><p>Kirjoita haluamasi domain, paikallinen osoite sek\u00e4 portti. Lis\u00e4\u00e4 viel\u00e4 asetukset\u00a0<strong>Block Common Exploits<\/strong> sek\u00e4\u00a0<strong>Websocket Support.<\/strong><\/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-ef102fd elementor-widget elementor-widget-image\" data-id=\"ef102fd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"768\" height=\"768\" src=\"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/npm_add-768x768.png\" class=\"attachment-medium_large size-medium_large wp-image-3112\" alt=\"\" srcset=\"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/npm_add-768x768.png 768w, https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/npm_add-300x300.png 300w, https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/npm_add-150x150.png 150w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\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-b3e2e28 elementor-widget elementor-widget-text-editor\" data-id=\"b3e2e28\" 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>Seuraavaksi paina oikealta ylh\u00e4\u00e4lt\u00e4 asetus kuvaketta ja lis\u00e4\u00e4 seuraava koodi.<\/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-7d88f38 elementor-widget elementor-widget-eael-code-snippet\" data-id=\"7d88f38\" 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=\"html\" data-copy-button=\"1\" data-snippet-id=\"eael-code-snippet-7d88f38\" id=\"eael-code-snippet-7d88f38\" >\n               <div class=\"eael-code-snippet-header eael-file-preview-header\">\n            <div class=\"eael-file-preview-left\">\n                           <div class=\"eael-file-info\">\n                                 <\/div>\n            <\/div>\n\n                        <div class=\"eael-file-preview-right\">\n               <div class=\"eael-code-snippet-copy-container\">\n                  <button data-clipboard-target=\"#eael-code-snippet-7d88f38 .eael-code-snippet-code code\" class=\"eael-code-snippet-copy-button\" type=\"button\" aria-label=\"Copy code to clipboard Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewbox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                           <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                  <\/button>\n                                 <\/div>\n            <\/div>\n                     <\/div>\n      \n         <div class=\"eael-code-snippet-content\">\n                        <pre class=\"eael-code-snippet-code language-html\"><code>if ($allowed_country = no) {\r\n\treturn 444;\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-6768f3d elementor-widget elementor-widget-text-editor\" data-id=\"6768f3d\" 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 on kaikki valmista, ett\u00e4 geoblokki on yksinkertainen mutta tehokas keino parantaa palvelun turvallisuutta ja hallittavuutta. Toteuttamalla sen Nginx Proxy Managerin avulla saamme helposti yll\u00e4pidett\u00e4v\u00e4n ratkaisun, jota voidaan tarvittaessa muokata nopeasti. N\u00e4in varmistamme, ett\u00e4 palvelu pysyy suojattuna ja toimii optimaalisesti vain halutuille k\u00e4ytt\u00e4jille.<\/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>","protected":false},"excerpt":{"rendered":"<p>GeoBlocking Nginx Proxy Managerilla Geoblokki tarkoittaa tiettyjen maiden tai alueiden IP-osoitteiden est\u00e4mist\u00e4 p\u00e4\u00e4sem\u00e4st\u00e4 palveluun. Sen tarkoituksena on parantaa tietoturvaa ja v\u00e4hent\u00e4\u00e4 turhaa liikennett\u00e4 esimerkiksi silloin, kun palvelua k\u00e4ytet\u00e4\u00e4n vain tietyss\u00e4 maassa. N\u00e4in voidaan est\u00e4\u00e4 haitallisia kirjautumisyrityksi\u00e4 ja pienent\u00e4\u00e4 palvelimen kuormitusta. Dockerin asennus Asennetaan Docker ensin k\u00e4tev\u00e4sti heid\u00e4n valmiilla bash scriptill\u00e4. curl -fsSL https:\/\/get.docker.com | sudo sh Tehd\u00e4\u00e4n kansio Nginxille. mkdir -p \/docker\/npm cd \/docker\/npm Luodaan Docker compose tiedosto johon kaikki konfiguraatiot tulevat. nano compose.yaml \ud83d\udc33 compose.yaml 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 services: app: image: &#039;jc21\/nginx-proxy-manager:latest&#039; restart: unless-stopped ports: # These ports are in format &lt;host-port&gt;:&lt;container-port&gt; &#8211; &#039;80:80&#039; # Public HTTP Port &#8211; &#039;443:443&#039; # Public HTTPS Port &#8211; &#039;81:81&#039; # Admin Web Port # Add any other Stream port you want to expose # &#8211; &#039;21:21&#039; # FTP environment: # Mysql\/Maria connection parameters: DB_MYSQL_HOST: &quot;db&quot; DB_MYSQL_PORT: 3306 DB_MYSQL_USER: &quot;npm&quot; DB_MYSQL_PASSWORD: &quot;npm&quot; DB_MYSQL_NAME: &quot;npm&quot; # Uncomment this if IPv6 is not enabled on your host # DISABLE_IPV6: &#039;true&#039; volumes: &#8211; .\/data:\/data &#8211; .\/letsencrypt:\/etc\/letsencrypt &#8211; .\/data\/nginx\/custom:\/etc\/nginx\/conf.d\/custom depends_on: &#8211; db db: image: &#039;jc21\/mariadb-aria:latest&#039; restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: &#039;npm&#039; MYSQL_DATABASE: &#039;npm&#039; MYSQL_USER: &#039;npm&#039; MYSQL_PASSWORD: &#039;npm&#039; volumes: &#8211; .\/mysql:\/var\/lib\/mysql geoip-upd: container_name: geoip-upd image: maxmindinc\/geoipupdate:latest restart: unless-stopped volumes: &#8211; .\/data\/geoip2:\/usr\/share\/GeoIP environment: TZ: &quot;Europe\/Helsinki&quot; GEOIPUPDATE_ACCOUNT_ID: 1234567 GEOIPUPDATE_LICENSE_KEY: &quot;keykeykeykeykeykeykeykey&quot; GEOIPUPDATE_EDITION_IDS: &quot;GeoLite2-City GeoLite2-Country GeoLite2-ASN&quot; #Databaset joita tarvimme GEOIPUPDATE_FREQUENCY: 12 #Kuinka usein database p\u00e4ivittyy GEOIPUPDATE_PRESERVE_FILE_TIMES: 1 #Todellinen aika tiedostolle Seuraavaksi ladataan tarvittavat moduulit. nano \/docker\/npm\/data\/nginx\/custom\/root_top.conf root_top.conf load_module \/usr\/lib\/nginx\/modules\/ngx_http_geoip2_module.so; load_module \/usr\/lib\/nginx\/modules\/ngx_stream_geoip2_module.so; Uudelleen k\u00e4ynnistet\u00e4\u00e4n containeri jotta muutokset tulevat voimaan. docker exec -it docker-npm nginx -s reload Tarkista kuitenkin oman containerin nimi seuraavalla komennolla. docker ps Tietokannan lataaminen Mene osoitteeseen https:\/\/www.maxmind.com\/en\/geolite2\/signup K\u00e4yt\u00e4mme maxmindin tarjoavaa geoip datasettej\u00e4, ne p\u00e4ivittyv\u00e4t yll\u00e4tt\u00e4v\u00e4n nopeasti. Luo uusi license key ja ota talteen account ID, License Key sek\u00e4 n\u00e4m\u00e4: GeoLite2-ASN, GeoLite2-Country ja GeoLite2-City Lis\u00e4tty\u00e4si tarvittavat tunnukset Docker Compose tiedostoon ja k\u00e4ynnist\u00e4m\u00e4ll\u00e4 Containerin n\u00e4emme tiedostot. docker compose up -d ls -l \/docker\/npm\/data\/geoip2 Tietokannan konfigurointi Nginx Proxy Managerille Luodaan uusi tiedosto joka k\u00e4sittelee tietokannan sis\u00e4ll\u00f6n ja parsii sielt\u00e4 mm.country coden, nimen, cityn sek\u00e4 regionin. T\u00e4ss\u00e4 ohjeessa p\u00e4\u00e4st\u00e4mme vain Saksasta liikenteen. nano \/docker\/npm\/data\/nginx\/custom\/http_top.conf http_top.conf 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; $geoip2_data_country_name default=- country names de; $geoip2_data_city_name default=- city names de; $geoip2_data_region_name default=- subdivisions 0 names de; } geo $allowed_ip { default no; # Blockaa oletuksena 10.10.1.0\/24 yes; # Whitelistaa locaali verkko } map $geoip2_data_country_code $allowed_country { default $allowed_ip; DE yes; # Vain Saksa voit lis\u00e4t\u00e4 lis\u00e4\u00e4 maita } #Formaatti logille, my\u00f6hemmin my\u00f6s Grafanaa varten 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_time&quot;: &quot;$request_time&quot;, &#039; &#039;&quot;request_method&quot;: &quot;$request_method&quot;, &#039; &#039;&quot;bytes_sent&quot;: &quot;$bytes_sent&quot;, &#039; &#039;&quot;http_host&quot;: &quot;$http_host&quot;, &#039; &#039;&quot;http_x_forwarded_for&quot;: &quot;$http_x_forwarded_for&quot;, &#039; &#039;&quot;http_cookie&quot;: &quot;$http_cookie&quot;, &#039; &#039;&quot;server_protocol&quot;: &quot;$server_protocol&quot;, &#039; &#039;&quot;upstream_addr&quot;: &quot;$upstream_addr&quot;, &#039; &#039;&quot;upstream_response_time&quot;: &quot;$upstream_response_time&quot;, &#039; &#039;&quot;ssl_protocol&quot;: &quot;$ssl_protocol&quot;, &#039; &#039;&quot;ssl_cipher&quot;: &quot;$ssl_cipher&quot;, &#039; &#039;&quot;http_user_agent&quot;: &quot;$http_user_agent&quot;, &#039; &#039;&quot;remote_user&quot;: &quot;$remote_user&quot; &#039; &#039;}&#039;; Login n\u00e4et t\u00e4ll\u00e4 komennolla. tail -f \/dockers\/nginx-proxym\/data\/logs\/proxy-host-%HOSTID%_access-geo.log Lis\u00e4t\u00e4\u00e4n viel\u00e4 Proxy Manageriin. Avaa Nginx Proxy manager WebUI ja paina Proxy Hosts, sen j\u00e4lkeen Add proxy Host. Kirjoita haluamasi domain, paikallinen osoite sek\u00e4 portti. Lis\u00e4\u00e4 viel\u00e4 asetukset\u00a0Block Common Exploits sek\u00e4\u00a0Websocket Support. Seuraavaksi paina oikealta ylh\u00e4\u00e4lt\u00e4 asetus kuvaketta ja lis\u00e4\u00e4 seuraava koodi. if ($allowed_country = no) { return 444; } Nyt on kaikki valmista, ett\u00e4 geoblokki on yksinkertainen mutta tehokas keino parantaa palvelun turvallisuutta ja hallittavuutta. Toteuttamalla sen Nginx Proxy Managerin avulla saamme helposti yll\u00e4pidett\u00e4v\u00e4n ratkaisun, jota voidaan tarvittaessa muokata nopeasti. N\u00e4in varmistamme, ett\u00e4 palvelu pysyy suojattuna ja toimii optimaalisesti vain halutuille k\u00e4ytt\u00e4jille.<\/p>","protected":false},"author":1,"featured_media":3109,"comment_status":"closed","ping_status":"open","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"footnotes":""},"categories":[9,10,16],"tags":[],"class_list":["post-3108","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 v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Nginx Proxy Manager GeoBlocking - Lassin kotisivut<\/title>\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-geoblocking\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nginx Proxy Manager GeoBlocking - Lassin kotisivut\" \/>\n<meta property=\"og:description\" content=\"GeoBlocking Nginx Proxy Managerilla Geoblokki tarkoittaa tiettyjen maiden tai alueiden IP-osoitteiden est\u00e4mist\u00e4 p\u00e4\u00e4sem\u00e4st\u00e4 palveluun. Sen tarkoituksena on parantaa tietoturvaa ja v\u00e4hent\u00e4\u00e4 turhaa liikennett\u00e4 esimerkiksi silloin, kun palvelua k\u00e4ytet\u00e4\u00e4n vain tietyss\u00e4 maassa. N\u00e4in voidaan est\u00e4\u00e4 haitallisia kirjautumisyrityksi\u00e4 ja pienent\u00e4\u00e4 palvelimen kuormitusta. Dockerin asennus Asennetaan Docker ensin k\u00e4tev\u00e4sti heid\u00e4n valmiilla bash scriptill\u00e4. curl -fsSL https:\/\/get.docker.com | sudo sh Tehd\u00e4\u00e4n kansio Nginxille. mkdir -p \/docker\/npm cd \/docker\/npm Luodaan Docker compose tiedosto johon kaikki konfiguraatiot tulevat. nano compose.yaml \ud83d\udc33 compose.yaml 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 services: app: image: &#039;jc21\/nginx-proxy-manager:latest&#039; restart: unless-stopped ports: # These ports are in format &lt;host-port&gt;:&lt;container-port&gt; - &#039;80:80&#039; # Public HTTP Port - &#039;443:443&#039; # Public HTTPS Port - &#039;81:81&#039; # Admin Web Port # Add any other Stream port you want to expose # - &#039;21:21&#039; # FTP environment: # Mysql\/Maria connection parameters: DB_MYSQL_HOST: &quot;db&quot; DB_MYSQL_PORT: 3306 DB_MYSQL_USER: &quot;npm&quot; DB_MYSQL_PASSWORD: &quot;npm&quot; DB_MYSQL_NAME: &quot;npm&quot; # Uncomment this if IPv6 is not enabled on your host # DISABLE_IPV6: &#039;true&#039; volumes: - .\/data:\/data - .\/letsencrypt:\/etc\/letsencrypt - .\/data\/nginx\/custom:\/etc\/nginx\/conf.d\/custom depends_on: - db db: image: &#039;jc21\/mariadb-aria:latest&#039; restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: &#039;npm&#039; MYSQL_DATABASE: &#039;npm&#039; MYSQL_USER: &#039;npm&#039; MYSQL_PASSWORD: &#039;npm&#039; volumes: - .\/mysql:\/var\/lib\/mysql geoip-upd: container_name: geoip-upd image: maxmindinc\/geoipupdate:latest restart: unless-stopped volumes: - .\/data\/geoip2:\/usr\/share\/GeoIP environment: TZ: &quot;Europe\/Helsinki&quot; GEOIPUPDATE_ACCOUNT_ID: 1234567 GEOIPUPDATE_LICENSE_KEY: &quot;keykeykeykeykeykeykeykey&quot; GEOIPUPDATE_EDITION_IDS: &quot;GeoLite2-City GeoLite2-Country GeoLite2-ASN&quot; #Databaset joita tarvimme GEOIPUPDATE_FREQUENCY: 12 #Kuinka usein database p\u00e4ivittyy GEOIPUPDATE_PRESERVE_FILE_TIMES: 1 #Todellinen aika tiedostolle Seuraavaksi ladataan tarvittavat moduulit. nano \/docker\/npm\/data\/nginx\/custom\/root_top.conf root_top.conf load_module \/usr\/lib\/nginx\/modules\/ngx_http_geoip2_module.so; load_module \/usr\/lib\/nginx\/modules\/ngx_stream_geoip2_module.so; Uudelleen k\u00e4ynnistet\u00e4\u00e4n containeri jotta muutokset tulevat voimaan. docker exec -it docker-npm nginx -s reload Tarkista kuitenkin oman containerin nimi seuraavalla komennolla. docker ps Tietokannan lataaminen Mene osoitteeseen https:\/\/www.maxmind.com\/en\/geolite2\/signup K\u00e4yt\u00e4mme maxmindin tarjoavaa geoip datasettej\u00e4, ne p\u00e4ivittyv\u00e4t yll\u00e4tt\u00e4v\u00e4n nopeasti. Luo uusi license key ja ota talteen account ID, License Key sek\u00e4 n\u00e4m\u00e4: GeoLite2-ASN, GeoLite2-Country ja GeoLite2-City Lis\u00e4tty\u00e4si tarvittavat tunnukset Docker Compose tiedostoon ja k\u00e4ynnist\u00e4m\u00e4ll\u00e4 Containerin n\u00e4emme tiedostot. docker compose up -d ls -l \/docker\/npm\/data\/geoip2 Tietokannan konfigurointi Nginx Proxy Managerille Luodaan uusi tiedosto joka k\u00e4sittelee tietokannan sis\u00e4ll\u00f6n ja parsii sielt\u00e4 mm.country coden, nimen, cityn sek\u00e4 regionin. T\u00e4ss\u00e4 ohjeessa p\u00e4\u00e4st\u00e4mme vain Saksasta liikenteen. nano \/docker\/npm\/data\/nginx\/custom\/http_top.conf http_top.conf 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; $geoip2_data_country_name default=- country names de; $geoip2_data_city_name default=- city names de; $geoip2_data_region_name default=- subdivisions 0 names de; } geo $allowed_ip { default no; # Blockaa oletuksena 10.10.1.0\/24 yes; # Whitelistaa locaali verkko } map $geoip2_data_country_code $allowed_country { default $allowed_ip; DE yes; # Vain Saksa voit lis\u00e4t\u00e4 lis\u00e4\u00e4 maita } #Formaatti logille, my\u00f6hemmin my\u00f6s Grafanaa varten 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_time&quot;: &quot;$request_time&quot;, &#039; &#039;&quot;request_method&quot;: &quot;$request_method&quot;, &#039; &#039;&quot;bytes_sent&quot;: &quot;$bytes_sent&quot;, &#039; &#039;&quot;http_host&quot;: &quot;$http_host&quot;, &#039; &#039;&quot;http_x_forwarded_for&quot;: &quot;$http_x_forwarded_for&quot;, &#039; &#039;&quot;http_cookie&quot;: &quot;$http_cookie&quot;, &#039; &#039;&quot;server_protocol&quot;: &quot;$server_protocol&quot;, &#039; &#039;&quot;upstream_addr&quot;: &quot;$upstream_addr&quot;, &#039; &#039;&quot;upstream_response_time&quot;: &quot;$upstream_response_time&quot;, &#039; &#039;&quot;ssl_protocol&quot;: &quot;$ssl_protocol&quot;, &#039; &#039;&quot;ssl_cipher&quot;: &quot;$ssl_cipher&quot;, &#039; &#039;&quot;http_user_agent&quot;: &quot;$http_user_agent&quot;, &#039; &#039;&quot;remote_user&quot;: &quot;$remote_user&quot; &#039; &#039;}&#039;; Login n\u00e4et t\u00e4ll\u00e4 komennolla. tail -f \/dockers\/nginx-proxym\/data\/logs\/proxy-host-%HOSTID%_access-geo.log Lis\u00e4t\u00e4\u00e4n viel\u00e4 Proxy Manageriin. Avaa Nginx Proxy manager WebUI ja paina Proxy Hosts, sen j\u00e4lkeen Add proxy Host. Kirjoita haluamasi domain, paikallinen osoite sek\u00e4 portti. Lis\u00e4\u00e4 viel\u00e4 asetukset\u00a0Block Common Exploits sek\u00e4\u00a0Websocket Support. Seuraavaksi paina oikealta ylh\u00e4\u00e4lt\u00e4 asetus kuvaketta ja lis\u00e4\u00e4 seuraava koodi. if ($allowed_country = no) { return 444; } Nyt on kaikki valmista, ett\u00e4 geoblokki on yksinkertainen mutta tehokas keino parantaa palvelun turvallisuutta ja hallittavuutta. Toteuttamalla sen Nginx Proxy Managerin avulla saamme helposti yll\u00e4pidett\u00e4v\u00e4n ratkaisun, jota voidaan tarvittaessa muokata nopeasti. N\u00e4in varmistamme, ett\u00e4 palvelu pysyy suojattuna ja toimii optimaalisesti vain halutuille k\u00e4ytt\u00e4jille.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/lassinsivut.eu\/en\/nginx-proxy-manager-geoblocking\/\" \/>\n<meta property=\"og:site_name\" content=\"Lassin kotisivut\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-30T19:45:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-30T20:33:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/geolocation.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"3 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-geoblocking\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/\"},\"author\":{\"name\":\"lassi\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/#\\\/schema\\\/person\\\/9246ef62dc4013651f8657d79fe2ef58\"},\"headline\":\"Nginx Proxy Manager GeoBlocking\",\"datePublished\":\"2026-03-30T19:45:28+00:00\",\"dateModified\":\"2026-03-30T20:33:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/\"},\"wordCount\":371,\"publisher\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/#\\\/schema\\\/person\\\/9246ef62dc4013651f8657d79fe2ef58\"},\"image\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/geolocation.png\",\"articleSection\":[\"Linux\",\"Palvelin\",\"Tietoturva\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/\",\"url\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/\",\"name\":\"Nginx Proxy Manager GeoBlocking - Lassin kotisivut\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/geolocation.png\",\"datePublished\":\"2026-03-30T19:45:28+00:00\",\"dateModified\":\"2026-03-30T20:33:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/#primaryimage\",\"url\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/geolocation.png\",\"contentUrl\":\"https:\\\/\\\/lassinsivut.eu\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/geolocation.png\",\"width\":1280,\"height\":640},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/lassinsivut.eu\\\/nginx-proxy-manager-geoblocking\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/lassinsivut.eu\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nginx Proxy Manager GeoBlocking\"}]},{\"@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\\\/9246ef62dc4013651f8657d79fe2ef58\"},\"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\\\/9246ef62dc4013651f8657d79fe2ef58\",\"name\":\"lassi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5e227bfe60b98fd4b60c357bafc3f3c3b16fdee80c778359dab94e7ed3a53e6a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5e227bfe60b98fd4b60c357bafc3f3c3b16fdee80c778359dab94e7ed3a53e6a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5e227bfe60b98fd4b60c357bafc3f3c3b16fdee80c778359dab94e7ed3a53e6a?s=96&d=mm&r=g\",\"caption\":\"lassi\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5e227bfe60b98fd4b60c357bafc3f3c3b16fdee80c778359dab94e7ed3a53e6a?s=96&d=mm&r=g\"},\"sameAs\":[\"https:\\\/\\\/lassinsivut.eu\"],\"url\":\"https:\\\/\\\/lassinsivut.eu\\\/en\\\/author\\\/lassi\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Nginx Proxy Manager GeoBlocking - Lassin kotisivut","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-geoblocking\/","og_locale":"en_US","og_type":"article","og_title":"Nginx Proxy Manager GeoBlocking - Lassin kotisivut","og_description":"GeoBlocking Nginx Proxy Managerilla Geoblokki tarkoittaa tiettyjen maiden tai alueiden IP-osoitteiden est\u00e4mist\u00e4 p\u00e4\u00e4sem\u00e4st\u00e4 palveluun. Sen tarkoituksena on parantaa tietoturvaa ja v\u00e4hent\u00e4\u00e4 turhaa liikennett\u00e4 esimerkiksi silloin, kun palvelua k\u00e4ytet\u00e4\u00e4n vain tietyss\u00e4 maassa. N\u00e4in voidaan est\u00e4\u00e4 haitallisia kirjautumisyrityksi\u00e4 ja pienent\u00e4\u00e4 palvelimen kuormitusta. Dockerin asennus Asennetaan Docker ensin k\u00e4tev\u00e4sti heid\u00e4n valmiilla bash scriptill\u00e4. curl -fsSL https:\/\/get.docker.com | sudo sh Tehd\u00e4\u00e4n kansio Nginxille. mkdir -p \/docker\/npm cd \/docker\/npm Luodaan Docker compose tiedosto johon kaikki konfiguraatiot tulevat. nano compose.yaml \ud83d\udc33 compose.yaml 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 services: app: image: &#039;jc21\/nginx-proxy-manager:latest&#039; restart: unless-stopped ports: # These ports are in format &lt;host-port&gt;:&lt;container-port&gt; - &#039;80:80&#039; # Public HTTP Port - &#039;443:443&#039; # Public HTTPS Port - &#039;81:81&#039; # Admin Web Port # Add any other Stream port you want to expose # - &#039;21:21&#039; # FTP environment: # Mysql\/Maria connection parameters: DB_MYSQL_HOST: &quot;db&quot; DB_MYSQL_PORT: 3306 DB_MYSQL_USER: &quot;npm&quot; DB_MYSQL_PASSWORD: &quot;npm&quot; DB_MYSQL_NAME: &quot;npm&quot; # Uncomment this if IPv6 is not enabled on your host # DISABLE_IPV6: &#039;true&#039; volumes: - .\/data:\/data - .\/letsencrypt:\/etc\/letsencrypt - .\/data\/nginx\/custom:\/etc\/nginx\/conf.d\/custom depends_on: - db db: image: &#039;jc21\/mariadb-aria:latest&#039; restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: &#039;npm&#039; MYSQL_DATABASE: &#039;npm&#039; MYSQL_USER: &#039;npm&#039; MYSQL_PASSWORD: &#039;npm&#039; volumes: - .\/mysql:\/var\/lib\/mysql geoip-upd: container_name: geoip-upd image: maxmindinc\/geoipupdate:latest restart: unless-stopped volumes: - .\/data\/geoip2:\/usr\/share\/GeoIP environment: TZ: &quot;Europe\/Helsinki&quot; GEOIPUPDATE_ACCOUNT_ID: 1234567 GEOIPUPDATE_LICENSE_KEY: &quot;keykeykeykeykeykeykeykey&quot; GEOIPUPDATE_EDITION_IDS: &quot;GeoLite2-City GeoLite2-Country GeoLite2-ASN&quot; #Databaset joita tarvimme GEOIPUPDATE_FREQUENCY: 12 #Kuinka usein database p\u00e4ivittyy GEOIPUPDATE_PRESERVE_FILE_TIMES: 1 #Todellinen aika tiedostolle Seuraavaksi ladataan tarvittavat moduulit. nano \/docker\/npm\/data\/nginx\/custom\/root_top.conf root_top.conf load_module \/usr\/lib\/nginx\/modules\/ngx_http_geoip2_module.so; load_module \/usr\/lib\/nginx\/modules\/ngx_stream_geoip2_module.so; Uudelleen k\u00e4ynnistet\u00e4\u00e4n containeri jotta muutokset tulevat voimaan. docker exec -it docker-npm nginx -s reload Tarkista kuitenkin oman containerin nimi seuraavalla komennolla. docker ps Tietokannan lataaminen Mene osoitteeseen https:\/\/www.maxmind.com\/en\/geolite2\/signup K\u00e4yt\u00e4mme maxmindin tarjoavaa geoip datasettej\u00e4, ne p\u00e4ivittyv\u00e4t yll\u00e4tt\u00e4v\u00e4n nopeasti. Luo uusi license key ja ota talteen account ID, License Key sek\u00e4 n\u00e4m\u00e4: GeoLite2-ASN, GeoLite2-Country ja GeoLite2-City Lis\u00e4tty\u00e4si tarvittavat tunnukset Docker Compose tiedostoon ja k\u00e4ynnist\u00e4m\u00e4ll\u00e4 Containerin n\u00e4emme tiedostot. docker compose up -d ls -l \/docker\/npm\/data\/geoip2 Tietokannan konfigurointi Nginx Proxy Managerille Luodaan uusi tiedosto joka k\u00e4sittelee tietokannan sis\u00e4ll\u00f6n ja parsii sielt\u00e4 mm.country coden, nimen, cityn sek\u00e4 regionin. T\u00e4ss\u00e4 ohjeessa p\u00e4\u00e4st\u00e4mme vain Saksasta liikenteen. nano \/docker\/npm\/data\/nginx\/custom\/http_top.conf http_top.conf 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; $geoip2_data_country_name default=- country names de; $geoip2_data_city_name default=- city names de; $geoip2_data_region_name default=- subdivisions 0 names de; } geo $allowed_ip { default no; # Blockaa oletuksena 10.10.1.0\/24 yes; # Whitelistaa locaali verkko } map $geoip2_data_country_code $allowed_country { default $allowed_ip; DE yes; # Vain Saksa voit lis\u00e4t\u00e4 lis\u00e4\u00e4 maita } #Formaatti logille, my\u00f6hemmin my\u00f6s Grafanaa varten 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_time&quot;: &quot;$request_time&quot;, &#039; &#039;&quot;request_method&quot;: &quot;$request_method&quot;, &#039; &#039;&quot;bytes_sent&quot;: &quot;$bytes_sent&quot;, &#039; &#039;&quot;http_host&quot;: &quot;$http_host&quot;, &#039; &#039;&quot;http_x_forwarded_for&quot;: &quot;$http_x_forwarded_for&quot;, &#039; &#039;&quot;http_cookie&quot;: &quot;$http_cookie&quot;, &#039; &#039;&quot;server_protocol&quot;: &quot;$server_protocol&quot;, &#039; &#039;&quot;upstream_addr&quot;: &quot;$upstream_addr&quot;, &#039; &#039;&quot;upstream_response_time&quot;: &quot;$upstream_response_time&quot;, &#039; &#039;&quot;ssl_protocol&quot;: &quot;$ssl_protocol&quot;, &#039; &#039;&quot;ssl_cipher&quot;: &quot;$ssl_cipher&quot;, &#039; &#039;&quot;http_user_agent&quot;: &quot;$http_user_agent&quot;, &#039; &#039;&quot;remote_user&quot;: &quot;$remote_user&quot; &#039; &#039;}&#039;; Login n\u00e4et t\u00e4ll\u00e4 komennolla. tail -f \/dockers\/nginx-proxym\/data\/logs\/proxy-host-%HOSTID%_access-geo.log Lis\u00e4t\u00e4\u00e4n viel\u00e4 Proxy Manageriin. Avaa Nginx Proxy manager WebUI ja paina Proxy Hosts, sen j\u00e4lkeen Add proxy Host. Kirjoita haluamasi domain, paikallinen osoite sek\u00e4 portti. Lis\u00e4\u00e4 viel\u00e4 asetukset\u00a0Block Common Exploits sek\u00e4\u00a0Websocket Support. Seuraavaksi paina oikealta ylh\u00e4\u00e4lt\u00e4 asetus kuvaketta ja lis\u00e4\u00e4 seuraava koodi. if ($allowed_country = no) { return 444; } Nyt on kaikki valmista, ett\u00e4 geoblokki on yksinkertainen mutta tehokas keino parantaa palvelun turvallisuutta ja hallittavuutta. Toteuttamalla sen Nginx Proxy Managerin avulla saamme helposti yll\u00e4pidett\u00e4v\u00e4n ratkaisun, jota voidaan tarvittaessa muokata nopeasti. N\u00e4in varmistamme, ett\u00e4 palvelu pysyy suojattuna ja toimii optimaalisesti vain halutuille k\u00e4ytt\u00e4jille.","og_url":"https:\/\/lassinsivut.eu\/en\/nginx-proxy-manager-geoblocking\/","og_site_name":"Lassin kotisivut","article_published_time":"2026-03-30T19:45:28+00:00","article_modified_time":"2026-03-30T20:33:53+00:00","og_image":[{"width":1280,"height":640,"url":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/geolocation.png","type":"image\/png"}],"author":"lassi","twitter_card":"summary_large_image","twitter_misc":{"Written by":"lassi","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/#article","isPartOf":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/"},"author":{"name":"lassi","@id":"https:\/\/lassinsivut.eu\/#\/schema\/person\/9246ef62dc4013651f8657d79fe2ef58"},"headline":"Nginx Proxy Manager GeoBlocking","datePublished":"2026-03-30T19:45:28+00:00","dateModified":"2026-03-30T20:33:53+00:00","mainEntityOfPage":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/"},"wordCount":371,"publisher":{"@id":"https:\/\/lassinsivut.eu\/#\/schema\/person\/9246ef62dc4013651f8657d79fe2ef58"},"image":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/#primaryimage"},"thumbnailUrl":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/geolocation.png","articleSection":["Linux","Palvelin","Tietoturva"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/","url":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/","name":"Nginx Proxy Manager GeoBlocking - Lassin kotisivut","isPartOf":{"@id":"https:\/\/lassinsivut.eu\/#website"},"primaryImageOfPage":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/#primaryimage"},"image":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/#primaryimage"},"thumbnailUrl":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/geolocation.png","datePublished":"2026-03-30T19:45:28+00:00","dateModified":"2026-03-30T20:33:53+00:00","breadcrumb":{"@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/#primaryimage","url":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/geolocation.png","contentUrl":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/geolocation.png","width":1280,"height":640},{"@type":"BreadcrumbList","@id":"https:\/\/lassinsivut.eu\/nginx-proxy-manager-geoblocking\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/lassinsivut.eu\/"},{"@type":"ListItem","position":2,"name":"Nginx Proxy Manager GeoBlocking"}]},{"@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\/9246ef62dc4013651f8657d79fe2ef58"},"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\/9246ef62dc4013651f8657d79fe2ef58","name":"lassi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5e227bfe60b98fd4b60c357bafc3f3c3b16fdee80c778359dab94e7ed3a53e6a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5e227bfe60b98fd4b60c357bafc3f3c3b16fdee80c778359dab94e7ed3a53e6a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5e227bfe60b98fd4b60c357bafc3f3c3b16fdee80c778359dab94e7ed3a53e6a?s=96&d=mm&r=g","caption":"lassi"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/5e227bfe60b98fd4b60c357bafc3f3c3b16fdee80c778359dab94e7ed3a53e6a?s=96&d=mm&r=g"},"sameAs":["https:\/\/lassinsivut.eu"],"url":"https:\/\/lassinsivut.eu\/en\/author\/lassi\/"}]}},"jetpack_featured_media_url":"https:\/\/lassinsivut.eu\/wp-content\/uploads\/2026\/03\/geolocation.png","_links":{"self":[{"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/posts\/3108","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=3108"}],"version-history":[{"count":7,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/posts\/3108\/revisions"}],"predecessor-version":[{"id":3118,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/posts\/3108\/revisions\/3118"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/media\/3109"}],"wp:attachment":[{"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/media?parent=3108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/categories?post=3108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lassinsivut.eu\/en\/wp-json\/wp\/v2\/tags?post=3108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}