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ê terá um ambiente pronto para desenvolvimento, testes ou treinamentos, contendo:
- PostgreSQL 18 + PostGIS 3.6
- GeoServer 3.0.0
- Nginx como proxy reverso
- Estrutura organizada para persistência dos dados
- Instalação totalmente baseada em containers Docker
Pré-requisitos:
- Ubuntu 26.04
- Acesso sudo
- Conexão com Internet
- Pelo menos 4 GB RAM (8 GB recomendado)
Sem enrolação, vamos aos passos:
1. Atualizar o Ubuntu
Antes de instalar qualquer software é recomendável atualizar os repositórios e aplicar as últimas atualizações do sistema operacional.
> sudo add-apt-repository universe > sudo apt update > sudo apt upgrade -y
2. Instalar apenas os pacotes necessários
Nesta etapa serão instaladas apenas as ferramentas utilizadas durante a instalação do Docker e administração básica do servidor.
> sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common \
vim \
unzip \
wget \
htop \
net-tools \
jq
3. Adicionar os repositórios do Docker
O Docker mantém seu próprio repositório oficial. Nesta etapa iremos adicionar sua chave GPG e registrar o repositório oficial no Ubuntu.
> sudo mkdir -p /etc/apt/keyrings > curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg > sudo chmod a+r /etc/apt/keyrings/docker.gpg > echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" \ | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. Instalar Docker
Agora instalaremos o Docker Engine, Docker Buildx e o Docker Compose Plugin.
> sudo apt update
> sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
5. Habilitar Docker
Habilite o serviço do Docker para que ele seja iniciado automaticamente sempre que o servidor for reiniciado.
> sudo systemctl enable docker > sudo systemctl start docker
6. Ajustar timezone e sincronizar horário
Manter o timezone correto facilita a análise de logs e evita problemas de horário entre GeoServer, PostgreSQL e sistema operacional.
> sudo timedatectl set-timezone America/Sao_Paulo > timedatectl
7. Estrutura
A estrutura abaixo será utilizada para organizar os arquivos do projeto e facilitar futuras manutenções.

8. Criar a Estrutura
> mkdir -p /opt/geoserver3 > cd /opt/geoserver3 > mkdir -p data/postgres > mkdir -p data/geoserver > mkdir -p nginx/conf.d > mkdir -p nginx/logs > mkdir -p logs > mkdir -p backups
9. Criar o arquivo docker-compose.yaml
O arquivo docker-compose.yaml descreve toda a infraestrutura da aplicação e será responsável por criar automaticamente os containers do PostgreSQL/PostGIS, GeoServer e Nginx.
nano docker-compose.yaml
Copie todo o conteúdo abaixo para o arquivo.
services:
postgis:
image: postgis/postgis:18-3.6
container_name: postgis
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
TZ: ${TZ}
# Descomente as linhas abaixo apenas se desejar permitir acesso externo ao PostgreSQL.
#ports:
# - "5432:5432"
volumes:
- ./data/postgres:/var/lib/postgresql
healthcheck:
test:
[
"CMD-SHELL",
"pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB} -h localhost"
]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s
networks:
- geoserver-network
geoserver:
image: docker.osgeo.org/geoserver:3.0.0
container_name: geoserver
restart: unless-stopped
depends_on:
postgis:
condition: service_healthy
ports:
- "8080"
environment:
TZ: ${TZ}
PROXY_BASE_URL: ${PUBLIC_GEOSERVER_URL}
INSTALL_EXTENSIONS: "true"
STABLE_EXTENSIONS: "excel,importer,image,web-resource,wps"
EXTRA_JAVA_OPTS: >-
-Xms2G
-Xmx4G
-Duser.timezone=${TZ}
-Dfile.encoding=UTF-8
-Djava.awt.headless=true
CORS_ENABLED: "true"
CORS_ALLOWED_ORIGINS: "*"
CORS_ALLOWED_METHODS: "GET,POST,PUT,DELETE,HEAD,OPTIONS"
CORS_ALLOWED_HEADERS: "Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization"
CORS_ALLOW_CREDENTIALS: "false"
ROOT_WEBAPP_REDIRECT: "true"
volumes:
- ./data/geoserver:/opt/geoserver_data
healthcheck:
test:
[
"CMD-SHELL",
"curl --fail http://localhost:8080/geoserver/web/ || exit 1"
]
interval: 30s
timeout: 15s
retries: 10
start_period: 180s
networks:
- geoserver-network
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
depends_on:
geoserver:
condition: service_healthy
ports:
- "80:80"
# Descomente a linha abaixo após configurar HTTPS no Nginx.
#- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/logs:/var/log/nginx
networks:
- geoserver-network
networks:
geoserver-network:
driver: bridge
Observação: Um dos benefícios da imagem oficial do GeoServer é a possibilidade de instalar automaticamente as extensões durante a inicialização do container. Neste tutorial já deixamos configurados alguns dos plugins mais utilizados em projetos reais: Excel (exportação de dados), Importer (importação de arquivos), Image (suporte a imagens), Web Resource (recursos web) e WPS (Web Processing Service). Dessa forma, ao término da instalação, o ambiente já estará pronto para utilização, sem necessidade de instalar essas extensões manualmente.
Observação: Os nomes informados na variável STABLE_EXTENSIONS correspondem aos identificadores oficiais das extensões utilizadas pela imagem Docker do GeoServer. A lista completa de plugins disponíveis e seus respectivos nomes pode ser consultada na documentação oficial do Docker do GeoServer: Docker Container – Adding GeoServer Extensions. Para conhecer a finalidade de cada extensão, consulte também a documentação oficial de extensões do GeoServer: GeoServer Extensions Documentation.
E não esqueça de criar também o arquivo .env:
> nano .env
E inserir o seguinte conteúdo:
POSTGRES_DB=geoserver POSTGRES_USER=geoserver POSTGRES_PASSWORD=SUBSTITUA_POR_UMA_SENHA_FORTE PUBLIC_GEOSERVER_URL=http://SEU_IP/geoserver TZ=America/Sao_Paulo
Substitua SUBSTITUA_POR_UMA_SENHA_FORTE por uma senha segura e SEU_IP pelo endereço IP público do servidor antes de iniciar os containers.
A variável PUBLIC_GEOSERVER_URL deve apontar para o endereço utilizado pelos usuários para acessar o GeoServer. Durante os testes ela pode utilizar o IP do servidor. Em ambientes de produção recomenda-se utilizar um domínio com HTTPS.
Dica: Nunca publique este arquivo em repositórios Git públicos, pois ele contém a senha do banco de dados.
10. Criar o arquivo geoserver.conf
O Nginx será utilizado como proxy reverso, permitindo acessar o GeoServer através da porta 80 e facilitando futuras configurações de HTTPS.
> nano nginx/conf.d/geoserver.conf
E insira o seguinte conteúdo:
server {
listen 80;
server_name _;
client_max_body_size 2G;
location = / {
return 302 /geoserver/web/;
}
location /geoserver/ {
proxy_pass http://geoserver:8080/geoserver/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
proxy_request_buffering off;
proxy_buffering off;
}
}
11. Subir os containers
> docker compose up -d
Depois acesse no seu navegador http://SEU_IP/geoserver
12. Conclusão
Agora você possui um ambiente moderno baseado em containers, executando o GeoServer 3, PostgreSQL 18/PostGIS 3.6 e Nginx.
Essa estrutura pode ser utilizada para estudos, treinamentos, desenvolvimento e também servir como base para ambientes de produção de pequeno e médio porte.