{"id":10066,"date":"2025-11-06T10:34:28","date_gmt":"2025-11-06T13:34:28","guid":{"rendered":"https:\/\/www.fernandoquadro.com.br\/html\/?p=10066"},"modified":"2025-11-17T12:43:48","modified_gmt":"2025-11-17T15:43:48","slug":"salvar-a-configuracao-do-geoserver-no-postgresql-com-jdbcconfig-e-jdbcstore","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2025\/11\/06\/salvar-a-configuracao-do-geoserver-no-postgresql-com-jdbcconfig-e-jdbcstore\/","title":{"rendered":"Salvar a configura\u00e7\u00e3o do GeoServer no PostgreSQL com JDBCConfig e JDBCStore"},"content":{"rendered":"<p>Voc\u00ea sabia que o GeoServer pode armazenar toda a sua<strong> configura\u00e7\u00e3o<\/strong> (workspaces, stores, layers, styles) em um <strong>banco de dados PostgreSQL<\/strong>, em vez de gravar arquivos XML no diret\u00f3rio data_dir?<\/p>\n<p>Isso \u00e9 poss\u00edvel com dois m\u00f3dulos da comunidade: <strong>JDBCConfig e JDBCStore<\/strong>. Apesar de frequentemente usados juntos, eles t\u00eam fun\u00e7\u00f5es diferentes e complementares.<\/p>\n<p><strong>\ud83e\udde9 1. O que \u00e9 o JDBCConfig<\/strong><\/p>\n<p>O JDBCConfig \u00e9 um m\u00f3dulo que permite ao GeoServer salvar toda a configura\u00e7\u00e3o do cat\u00e1logo(metadados) dentro de um banco relacional, como o PostgreSQL.<\/p>\n<p>Por padr\u00e3o, o GeoServer armazena sua configura\u00e7\u00e3o em diversos arquivos XML dentro do diret\u00f3rio data_dir \u2014 um para cada workspace, store, camada e estilo. Com o m\u00f3dulo <strong>JDBCConfig<\/strong>, essas informa\u00e7\u00f5es deixam de ser gravadas nesses arquivos e passam a ser persistidas diretamente em tabelas no banco de dados, substituindo por completo o backend de configura\u00e7\u00e3o baseado em arquivos.<\/p>\n<p><strong>1.1 O que ele armazena<\/strong><\/p>\n<ul>\n<li>Workspaces<\/li>\n<li>DataStores (refer\u00eancias \u00e0s fontes de dados)<\/li>\n<li>Layers<\/li>\n<li>Styles (metadados, n\u00e3o o conte\u00fado do arquivo em si)<\/li>\n<li>Configura\u00e7\u00f5es globais e de servi\u00e7os (WMS, WFS, etc.)<\/li>\n<\/ul>\n<p><strong>1.2 Vantagens<\/strong><\/p>\n<ul>\n<li>Melhor escalabilidade: evita o gargalo de leitura\/escrita em centenas de XMLs.<\/li>\n<li>Mais seguran\u00e7a em cluster: todas as inst\u00e2ncias compartilham o mesmo cat\u00e1logo.<\/li>\n<li>Gerenciamento centralizado: f\u00e1cil backup, versionamento e replica\u00e7\u00e3o via banco.<\/li>\n<\/ul>\n<p><strong>1.3 Quando usar<\/strong><\/p>\n<ul>\n<li>Ambientes em cluster (v\u00e1rias inst\u00e2ncias do GeoServer).<\/li>\n<li>Ambientes com muitas camadas e workspaces (centenas ou milhares).<\/li>\n<li>Pode ser usado mesmo em um \u00fanico servidor, apenas para reduzir I\/O de disco e facilitar<\/li>\n<\/ul>\n<p><strong>\ud83d\uddc2\ufe0f 2. O que \u00e9 o JDBCStore<\/strong><\/p>\n<p>O JDBCStore \u00e9 outro m\u00f3dulo comunit\u00e1rio que complementa o JDBCConfig. Ele permite armazenar os arquivos reais do data_dir (como estilos .sld, imagens, legendas e uploads) dentro do banco de dados, em vez de no sistema de arquivos.<\/p>\n<p>Diferente do JDBCConfig, que salva metadados e estrutura do cat\u00e1logo, o JDBCStore salva conte\u00fado bin\u00e1rio (arquivos, blobs).<\/p>\n<p><strong>2.1 O que ele armazena<\/strong><\/p>\n<ul>\n<li>Arquivos de estilos (SLD, CSS)<\/li>\n<li>Imagens usadas em s\u00edmbolos e legendas<\/li>\n<li>Arquivos de uploads feitos via REST ou UI<\/li>\n<li>Qualquer outro recurso armazenado dentro de data_dir<\/li>\n<\/ul>\n<p><strong>2.2 Vantagens<\/strong><\/p>\n<ul>\n<li>Evita depend\u00eancia de compartilhamento via NFS em clusters.<\/li>\n<li>Centraliza todos os recursos no banco, junto com o cat\u00e1logo.<\/li>\n<li>Facilita backup e replica\u00e7\u00e3o, basta copiar o banco.<\/li>\n<\/ul>\n<p><strong>2.3 Quando usar<\/strong><\/p>\n<ul>\n<li>Com JDBCConfig, em ambiente clusterizado \u00e9 ideal.<\/li>\n<li>Sem JDBCConfig, se voc\u00ea quiser apenas armazenar os arquivos no banco e manter a configura\u00e7\u00e3o ainda em XML.<\/li>\n<li>\u00datil tamb\u00e9m em servidores \u00fanicos, se voc\u00ea quiser facilitar deploys e migra\u00e7\u00f5es (sem precisar sincronizar pastas de estilos entre m\u00e1quinas).<\/li>\n<\/ul>\n<p><strong>\ud83d\udd17 3. Rela\u00e7\u00e3o e diferen\u00e7as entre JDBCConfig e JDBCStore<\/strong><\/p>\n<p>Embora os dois m\u00f3dulos sejam frequentemente mencionados juntos, eles t\u00eam prop\u00f3sitos distintos dentro do GeoServer.<\/p>\n<p>O JDBCConfig \u00e9 respons\u00e1vel por armazenar as configura\u00e7\u00f5es do cat\u00e1logo, ou seja, toda a estrutura de metadados que descreve o funcionamento do GeoServer, os workspaces, as conex\u00f5es com bancos de dados, as camadas e os estilos associados. Ele substitui o modelo tradicional baseado em arquivos XML, gravando essas informa\u00e7\u00f5es diretamente em tabelas no banco de dados.<\/p>\n<p>J\u00e1 o JDBCStore atua em outro n\u00edvel: ele armazena o conte\u00fado f\u00edsico dos arquivos que normalmente ficam no data_dir. Isso inclui estilos (.sld, .css), imagens, legendas e qualquer outro arquivo bin\u00e1rio usado pelo GeoServer. Em vez de deixar esses recursos no sistema de arquivos, o JDBCStore os grava como blobs dentro do banco.<\/p>\n<p>Os dois m\u00f3dulos podem funcionar independentemente. Voc\u00ea pode usar apenas o JDBCConfig, mantendo os arquivos (como SLDs) ainda no disco ou apenas o JDBCStore, guardando os arquivos no banco, mas deixando o cat\u00e1logo em XML.<\/p>\n<p>No entanto, o uso conjunto dos dois traz o m\u00e1ximo de benef\u00edcios: a configura\u00e7\u00e3o e os recursos do GeoServer passam a ser totalmente centralizados e sincronizados no banco de dados, eliminando a necessidade de um diret\u00f3rio compartilhado via NFS.<\/p>\n<p>Resumindo:<\/p>\n<ul>\n<li>O JDBCConfig guarda o \u201cquem \u00e9 quem\u201d (a estrutura de configura\u00e7\u00e3o).<\/li>\n<li>O JDBCStore guarda o \u201co que \u00e9\u201d (os arquivos e recursos reais).<\/li>\n<li>Usados juntos, eliminam completamente a necessidade de um data_dir compartilhado, tornando o GeoServer mais robusto e escal\u00e1vel em ambientes distribu\u00eddos.<\/li>\n<\/ul>\n<p><strong>\u2699\ufe0f 4. Como instalar o JDBCConfig e o JDBCStore no GeoServer 2.28.0<\/strong><\/p>\n<p><strong>4.1 Baixar os m\u00f3dulos<\/strong><\/p>\n<p>Acesse a p\u00e1gina de Community Modules da sua vers\u00e3o: <a href=\"https:\/\/geoserver.org\/release\/2.28.x\/\" target=\"_blank\">https:\/\/geoserver.org\/release\/2.28.x\/<\/a><\/p>\n<p>Baixe os arquivos:<\/p>\n<p>geoserver-2.28.x-jdbcconfig-plugin.zip<br \/>\ngeoserver-2.28.x-jdbcstore-plugin.zip<\/p>\n<p>Extraia os .jar e copie para:<\/p>\n<pre>\r\nGEOSERVER_HOME\/WEB-INF\/lib\/\r\n<\/pre>\n<p><strong>4.2 Criar o banco no PostgreSQL<\/strong><\/p>\n<p>Crie um novo banco vazio, por exemplo:<\/p>\n<pre>\r\nCREATE DATABASE geoserver_catalog;\r\nCREATE USER geoserver_user WITH PASSWORD 'senha_segura';\r\nGRANT ALL PRIVILEGES ON DATABASE geoserver_catalog TO geoserver_user;\r\n<\/pre>\n<p><strong>4.3 Configurar o JDBCConfig<\/strong><\/p>\n<p>Ap\u00f3s o primeiro restart do GeoServer com o m\u00f3dulo instalado, ser\u00e1 criada a pasta:<\/p>\n<pre>\r\ndata_dir\/jdbcconfig\/\r\n<\/pre>\n<p>Dentro dela h\u00e1 um arquivo de exemplo <strong>jdbcconfig.properties.postgres<\/strong>. Edite-o e configure conforme abaixo:<\/p>\n<pre>\r\nenabled=true\r\ninitdb=true\r\nimport=true\r\n...\r\nusername=geoserver_user\r\npassword=senha_segura\r\njdbcUrl=jdbc:postgresql:\/\/localhost:5432\/geoserver_catalog\r\n<\/pre>\n<p>Salve o arquivo como <strong>jdbcconfig.properties<\/strong>, reinicie o GeoServer e observe no log, se tudo estiver certo, ele criar\u00e1 as tabelas automaticamente e importar\u00e1 sua configura\u00e7\u00e3o XML atual para o banco.<\/p>\n<p><strong>4.4 Configurar o JDBCStore<\/strong><\/p>\n<p>Ap\u00f3s instalar o m\u00f3dulo jdbcstore, um diret\u00f3rio semelhante ser\u00e1 criado:<\/p>\n<pre>\r\ndata_dir\/jdbcstore\/\r\n<\/pre>\n<p>Edite o arquivo jdbcstore.properties (tamb\u00e9m h\u00e1 um .postgres de exemplo):<\/p>\n<pre>\r\nenabled=true\r\ninitdb=true\r\n...\r\nusername=geoserver_user\r\npassword=senha_segura\r\njdbcUrl=jdbc:postgresql:\/\/localhost:5432\/geoserver_catalog\r\n<\/pre>\n<p>Reinicie o GeoServer novamente.<\/p>\n<p><strong>\ud83e\udde0 5. Conclus\u00e3o<\/strong><\/p>\n<p>O uso do JDBCConfig e do JDBCStore traz uma s\u00e9rie de benef\u00edcios, especialmente em ambientes de alta disponibilidade ou clusterizados.<\/p>\n<p>Eles permitem que toda a configura\u00e7\u00e3o e os recursos do GeoServer sejam armazenados de forma transacional, centralizada e sincronizada dentro de um banco de dados relacional.<\/p>\n<p>Mas mesmo em ambientes sem cluster, esses m\u00f3dulos podem ser vantajosos para quem busca:<\/p>\n<ul>\n<li>Simplificar backups e migra\u00e7\u00f5es (basta exportar o banco);<\/li>\n<li>Reduzir I\/O de disco em instala\u00e7\u00f5es muito grandes;<\/li>\n<li>Facilitar o versionamento da configura\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>E voc\u00ea leitor, conhecia esses m\u00f3dulos do GeoServer? O que achou? Deixe seu coment\u00e1rio, vou gostar de saber sua opini\u00e3o.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voc\u00ea sabia que o GeoServer pode armazenar toda a sua configura\u00e7\u00e3o (workspaces, stores, layers, styles) em um banco de dados PostgreSQL, em vez de gravar arquivos XML no diret\u00f3rio data_dir? Isso \u00e9 poss\u00edvel com dois m\u00f3dulos da comunidade: JDBCConfig e&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2025\/11\/06\/salvar-a-configuracao-do-geoserver-no-postgresql-com-jdbcconfig-e-jdbcstore\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":10079,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[208],"class_list":["post-10066","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-geoserver"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10066","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=10066"}],"version-history":[{"count":19,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10066\/revisions"}],"predecessor-version":[{"id":10117,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/10066\/revisions\/10117"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/10079"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=10066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=10066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=10066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}