{"id":10355,"date":"2026-07-17T16:57:31","date_gmt":"2026-07-17T19:57:31","guid":{"rendered":"https:\/\/www.fernandoquadro.com.br\/html\/?p=10355"},"modified":"2026-07-17T17:44:16","modified_gmt":"2026-07-17T20:44:16","slug":"instalacao-do-geoserver-3-com-postgresql-postgis-utilizando-docker","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2026\/07\/17\/instalacao-do-geoserver-3-com-postgresql-postgis-utilizando-docker\/","title":{"rendered":"Instala\u00e7\u00e3o do GeoServer 3 com PostgreSQL\/PostGIS utilizando Docker"},"content":{"rendered":"<p>Prezado leitor,<\/p>\n<p>Neste post irei apresentar como instalar o GeoServer 3 juntamente com o PostgreSQL 18\/PostGIS utilizando Docker em um servidor executando Ubuntu Linux 26.04.<\/p>\n<p>Ao final deste tutorial voc\u00ea ter\u00e1 um ambiente pronto para desenvolvimento, testes ou treinamentos, contendo:<\/p>\n<ul>\n<li>PostgreSQL 18 + PostGIS 3.6<\/li>\n<li>GeoServer 3.0.0<\/li>\n<li>Nginx como proxy reverso<\/li>\n<li>Estrutura organizada para persist\u00eancia dos dados<\/li>\n<li>Instala\u00e7\u00e3o totalmente baseada em containers Docker<\/li>\n<\/ul>\n<p>Pr\u00e9-requisitos:<\/p>\n<ul>\n<li>Ubuntu 26.04<\/li>\n<li>Acesso sudo<\/li>\n<li>Conex\u00e3o com Internet<\/li>\n<li>Pelo menos 4 GB RAM (8 GB recomendado)<\/li>\n<\/ul>\n<p>Sem enrola\u00e7\u00e3o, vamos aos passos:<\/p>\n<p><strong>1. Atualizar o Ubuntu<\/strong><\/p>\n<p>Antes de instalar qualquer software \u00e9 recomend\u00e1vel atualizar os reposit\u00f3rios e aplicar as \u00faltimas atualiza\u00e7\u00f5es do sistema operacional.<\/p>\n<pre>\r\n> sudo add-apt-repository universe\r\n> sudo apt update\r\n> sudo apt upgrade -y\r\n<\/pre>\n<p><strong>2. Instalar apenas os pacotes necess\u00e1rios<\/strong><\/p>\n<p>Nesta etapa ser\u00e3o instaladas apenas as ferramentas utilizadas durante a instala\u00e7\u00e3o do Docker e administra\u00e7\u00e3o b\u00e1sica do servidor.<\/p>\n<pre>\r\n> sudo apt install -y \\\r\n    apt-transport-https \\\r\n    ca-certificates \\\r\n    curl \\\r\n    gnupg \\\r\n    lsb-release \\\r\n    software-properties-common \\\r\n    vim \\\r\n    unzip \\\r\n    wget \\\r\n    htop \\\r\n    net-tools \\\r\n    jq\r\n<\/pre>\n<p><strong>3. Adicionar os reposit\u00f3rios do Docker<\/strong><\/p>\n<p>O Docker mant\u00e9m seu pr\u00f3prio reposit\u00f3rio oficial. Nesta etapa iremos adicionar sua chave GPG e registrar o reposit\u00f3rio oficial no Ubuntu.<\/p>\n<pre>\r\n> sudo mkdir -p \/etc\/apt\/keyrings\r\n\r\n> curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg \\\r\n| sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg\r\n\r\n> sudo chmod a+r \/etc\/apt\/keyrings\/docker.gpg\r\n\r\n> echo \\\r\n\"deb [arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] \\\r\nhttps:\/\/download.docker.com\/linux\/ubuntu \\\r\n$(lsb_release -cs) stable\" \\\r\n| sudo tee \/etc\/apt\/sources.list.d\/docker.list > \/dev\/null\r\n<\/pre>\n<p><strong>4. Instalar Docker<\/strong><\/p>\n<p>Agora instalaremos o Docker Engine, Docker Buildx e o Docker Compose Plugin.<\/p>\n<pre>\r\n> sudo apt update\r\n\r\n> sudo apt install -y \\\r\n    docker-ce \\\r\n    docker-ce-cli \\\r\n    containerd.io \\\r\n    docker-buildx-plugin \\\r\n    docker-compose-plugin\r\n<\/pre>\n<p><strong>5. Habilitar Docker<\/strong><\/p>\n<p>Habilite o servi\u00e7o do Docker para que ele seja iniciado automaticamente sempre que o servidor for reiniciado.<\/p>\n<pre>\r\n> sudo systemctl enable docker\r\n> sudo systemctl start docker\r\n<\/pre>\n<p><strong>6. Ajustar timezone e sincronizar hor\u00e1rio<\/strong><\/p>\n<p>Manter o timezone correto facilita a an\u00e1lise de logs e evita problemas de hor\u00e1rio entre GeoServer, PostgreSQL e sistema operacional.<\/p>\n<pre>\r\n> sudo timedatectl set-timezone America\/Sao_Paulo\r\n> timedatectl\r\n<\/pre>\n<p><strong>7. Estrutura <\/strong><\/p>\n<p>A estrutura abaixo ser\u00e1 utilizada para organizar os arquivos do projeto e facilitar futuras manuten\u00e7\u00f5es.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2026\/07\/ChatGPT-Image-17-de-jul.-de-2026-16_40_00.png\" alt=\"\" width=\"1024\" height=\"1536\" class=\"aligncenter size-full wp-image-10359\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2026\/07\/ChatGPT-Image-17-de-jul.-de-2026-16_40_00.png 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2026\/07\/ChatGPT-Image-17-de-jul.-de-2026-16_40_00-200x300.png 200w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2026\/07\/ChatGPT-Image-17-de-jul.-de-2026-16_40_00-683x1024.png 683w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2026\/07\/ChatGPT-Image-17-de-jul.-de-2026-16_40_00-768x1152.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2026\/07\/ChatGPT-Image-17-de-jul.-de-2026-16_40_00-600x900.png 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2026\/07\/ChatGPT-Image-17-de-jul.-de-2026-16_40_00-945x1418.png 945w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p><strong>8. Criar a Estrutura<\/strong><\/p>\n<pre>\r\n> mkdir -p \/opt\/geoserver3\r\n> cd \/opt\/geoserver3\r\n\r\n> mkdir -p data\/postgres\r\n> mkdir -p data\/geoserver\r\n> mkdir -p nginx\/conf.d\r\n> mkdir -p nginx\/logs\r\n> mkdir -p logs\r\n> mkdir -p backups\r\n<\/pre>\n<p><strong>9. Criar o arquivo docker-compose.yaml<\/strong><\/p>\n<p>O arquivo docker-compose.yaml descreve toda a infraestrutura da aplica\u00e7\u00e3o e ser\u00e1 respons\u00e1vel por criar automaticamente os containers do PostgreSQL\/PostGIS, GeoServer e Nginx.<\/p>\n<pre>\r\nnano docker-compose.yaml\r\n<\/pre>\n<p>Copie todo o conte\u00fado abaixo para o arquivo.<\/p>\n<pre>\r\nservices:\r\n\r\n  postgis:\r\n    image: postgis\/postgis:18-3.6\r\n    container_name: postgis\r\n\r\n    restart: unless-stopped\r\n\r\n    environment:\r\n      POSTGRES_DB: ${POSTGRES_DB}\r\n      POSTGRES_USER: ${POSTGRES_USER}\r\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}\r\n      TZ: ${TZ}\r\n\r\n    # Descomente as linhas abaixo apenas se desejar permitir acesso externo ao PostgreSQL.\r\n    #ports:\r\n    #  - \"5432:5432\"\r\n\r\n    volumes:\r\n      - .\/data\/postgres:\/var\/lib\/postgresql\r\n\r\n    healthcheck:\r\n      test:\r\n        [\r\n          \"CMD-SHELL\",\r\n          \"pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB} -h localhost\"\r\n        ]\r\n      interval: 10s\r\n      timeout: 5s\r\n      retries: 10\r\n      start_period: 20s\r\n\r\n    networks:\r\n      - geoserver-network\r\n\r\n\r\n  geoserver:\r\n    image: docker.osgeo.org\/geoserver:3.0.0\r\n    container_name: geoserver\r\n\r\n    restart: unless-stopped\r\n\r\n    depends_on:\r\n      postgis:\r\n        condition: service_healthy\r\n\r\n    ports:\r\n      - \"8080\"\r\n\r\n    environment:\r\n      TZ: ${TZ}\r\n\r\n      PROXY_BASE_URL: ${PUBLIC_GEOSERVER_URL}\r\n\r\n      INSTALL_EXTENSIONS: \"true\"\r\n\r\n      STABLE_EXTENSIONS: \"excel,importer,image,web-resource,wps\"\r\n\r\n      EXTRA_JAVA_OPTS: >-\r\n        -Xms2G\r\n        -Xmx4G\r\n        -Duser.timezone=${TZ}\r\n        -Dfile.encoding=UTF-8\r\n        -Djava.awt.headless=true\r\n\r\n      CORS_ENABLED: \"true\"\r\n      CORS_ALLOWED_ORIGINS: \"*\"\r\n      CORS_ALLOWED_METHODS: \"GET,POST,PUT,DELETE,HEAD,OPTIONS\"\r\n      CORS_ALLOWED_HEADERS: \"Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization\"\r\n      CORS_ALLOW_CREDENTIALS: \"false\"\r\n\r\n      ROOT_WEBAPP_REDIRECT: \"true\"\r\n\r\n    volumes:\r\n      - .\/data\/geoserver:\/opt\/geoserver_data\r\n\r\n    healthcheck:\r\n      test:\r\n        [\r\n          \"CMD-SHELL\",\r\n          \"curl --fail http:\/\/localhost:8080\/geoserver\/web\/ || exit 1\"\r\n        ]\r\n      interval: 30s\r\n      timeout: 15s\r\n      retries: 10\r\n      start_period: 180s\r\n\r\n    networks:\r\n      - geoserver-network\r\n\r\n  nginx:\r\n    image: nginx:alpine\r\n    container_name: nginx\r\n    restart: unless-stopped\r\n\r\n    depends_on:\r\n      geoserver:\r\n        condition: service_healthy\r\n\r\n    ports:\r\n      - \"80:80\"\r\n      # Descomente a linha abaixo ap\u00f3s configurar HTTPS no Nginx.\r\n      #- \"443:443\"\r\n\r\n    volumes:\r\n      - .\/nginx\/conf.d:\/etc\/nginx\/conf.d:ro\r\n      - .\/nginx\/logs:\/var\/log\/nginx\r\n\r\n    networks:\r\n      - geoserver-network\r\n\r\nnetworks:\r\n  geoserver-network:\r\n    driver: bridge\r\n<\/pre>\n<p><strong>Observa\u00e7\u00e3o:<\/strong> Um dos benef\u00edcios da imagem oficial do GeoServer \u00e9 a possibilidade de instalar automaticamente as extens\u00f5es durante a inicializa\u00e7\u00e3o do container. Neste tutorial j\u00e1 deixamos configurados alguns dos plugins mais utilizados em projetos reais: <strong>Excel <\/strong>(exporta\u00e7\u00e3o de dados), <strong>Importer <\/strong>(importa\u00e7\u00e3o de arquivos), <strong>Image <\/strong>(suporte a imagens), <strong>Web Resource<\/strong> (recursos web) e <strong>WPS <\/strong>(Web Processing Service). Dessa forma, ao t\u00e9rmino da instala\u00e7\u00e3o, o ambiente j\u00e1 estar\u00e1 pronto para utiliza\u00e7\u00e3o, sem necessidade de instalar essas extens\u00f5es manualmente.<\/p>\n<p><strong>Observa\u00e7\u00e3o:<\/strong> Os nomes informados na vari\u00e1vel <strong>STABLE_EXTENSIONS <\/strong>correspondem aos identificadores oficiais das extens\u00f5es utilizadas pela imagem Docker do GeoServer. A lista completa de plugins dispon\u00edveis e seus respectivos nomes pode ser consultada na documenta\u00e7\u00e3o oficial do Docker do GeoServer:<a href=\"https:\/\/docs.geoserver.org\/main\/en\/user\/installation\/docker\/?utm_source=chatgpt.com\" target=\"_blank\"> Docker Container \u2013 Adding GeoServer Extensions<\/a>. Para conhecer a finalidade de cada extens\u00e3o, consulte tamb\u00e9m a documenta\u00e7\u00e3o oficial de extens\u00f5es do GeoServer: <a href=\"https:\/\/docs.geoserver.org\/latest\/en\/user\/extensions\/?utm_source=chatgpt.com\" target=\"_blank\">GeoServer Extensions Documentation<\/a>.<\/p>\n<p>E n\u00e3o esque\u00e7a de criar tamb\u00e9m o arquivo .env:<\/p>\n<pre>\r\n> nano .env\r\n<\/pre>\n<p>E inserir o seguinte conte\u00fado:<\/p>\n<pre>\r\nPOSTGRES_DB=geoserver\r\nPOSTGRES_USER=geoserver\r\nPOSTGRES_PASSWORD=SUBSTITUA_POR_UMA_SENHA_FORTE\r\n\r\nPUBLIC_GEOSERVER_URL=http:\/\/SEU_IP\/geoserver\r\n\r\nTZ=America\/Sao_Paulo\r\n<\/pre>\n<p>Substitua <strong>SUBSTITUA_POR_UMA_SENHA_FORTE <\/strong>por uma senha segura e <strong>SEU_IP <\/strong>pelo endere\u00e7o IP p\u00fablico do servidor antes de iniciar os containers.<\/p>\n<p>A vari\u00e1vel <strong>PUBLIC_GEOSERVER_URL <\/strong>deve apontar para o endere\u00e7o utilizado pelos usu\u00e1rios para acessar o GeoServer. Durante os testes ela pode utilizar o IP do servidor. Em ambientes de produ\u00e7\u00e3o recomenda-se utilizar um dom\u00ednio com HTTPS.<\/p>\n<p><strong>Dica:<\/strong> Nunca publique este arquivo em reposit\u00f3rios Git p\u00fablicos, pois ele cont\u00e9m a senha do banco de dados.<\/p>\n<p><strong>10. Criar o arquivo geoserver.conf<\/strong><\/p>\n<p>O Nginx ser\u00e1 utilizado como proxy reverso, permitindo acessar o GeoServer atrav\u00e9s da porta 80 e facilitando futuras configura\u00e7\u00f5es de HTTPS.<\/p>\n<pre>\r\n> nano nginx\/conf.d\/geoserver.conf\r\n<\/pre>\n<p>E insira o seguinte conte\u00fado:<\/p>\n<pre>\r\nserver {\r\n    listen 80;\r\n    server_name _;\r\n\r\n    client_max_body_size 2G;\r\n\r\n    location = \/ {\r\n        return 302 \/geoserver\/web\/;\r\n    }\r\n\r\n    location \/geoserver\/ {\r\n        proxy_pass http:\/\/geoserver:8080\/geoserver\/;\r\n\r\n        proxy_set_header Host $http_host;\r\n        proxy_set_header X-Real-IP $remote_addr;\r\n        proxy_set_header X-Forwarded-Host $http_host;\r\n        proxy_set_header X-Forwarded-Port $server_port;\r\n        proxy_set_header X-Forwarded-Proto $scheme;\r\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n\r\n        proxy_connect_timeout 60s;\r\n        proxy_send_timeout 600s;\r\n        proxy_read_timeout 600s;\r\n\r\n        proxy_request_buffering off;\r\n        proxy_buffering off;\r\n    }\r\n}\r\n<\/pre>\n<p><strong>11. Subir os containers<\/strong><\/p>\n<pre>\r\n> docker compose up -d\r\n<\/pre>\n<p>Depois acesse no seu navegador http:\/\/SEU_IP\/geoserver<\/p>\n<p><strong>12. Conclus\u00e3o<\/strong><\/p>\n<p>Agora voc\u00ea possui um ambiente moderno baseado em containers, executando o GeoServer 3, PostgreSQL 18\/PostGIS 3.6 e Nginx.<\/p>\n<p>Essa estrutura pode ser utilizada para estudos, treinamentos, desenvolvimento e tamb\u00e9m servir como base para ambientes de produ\u00e7\u00e3o de pequeno e m\u00e9dio porte.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prezado leitor, Neste post irei apresentar como instalar o GeoServer 3 juntamente com o PostgreSQL 18\/PostGIS utilizando Docker em um servidor executando Ubuntu Linux 26.04. Ao final deste tutorial voc\u00ea ter\u00e1 um ambiente pronto para desenvolvimento, testes ou treinamentos, contendo:&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2026\/07\/17\/instalacao-do-geoserver-3-com-postgresql-postgis-utilizando-docker\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":10365,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[304,208,212,230],"class_list":["post-10355","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-docker","tag-geoserver","tag-postgis","tag-postgresql"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10355","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=10355"}],"version-history":[{"count":17,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10355\/revisions"}],"predecessor-version":[{"id":10374,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10355\/revisions\/10374"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/10365"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=10355"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=10355"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=10355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}