{"id":66030,"date":"2023-12-14T09:14:40","date_gmt":"2023-12-14T12:14:40","guid":{"rendered":"https:\/\/kinqsta.com\/pt\/?p=66030&#038;preview=true&#038;preview_id=66030"},"modified":"2023-12-18T05:50:51","modified_gmt":"2023-12-18T08:50:51","slug":"manual-do-cto-de-startups-para-executar-no-postgres","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/","title":{"rendered":"O Manual do CTO de Startups para Executar no Postgres"},"content":{"rendered":"<p>Ent\u00e3o voc\u00ea est\u00e1 iniciando um novo projeto &#8211; ou empresa &#8211; e decidiu que vai usar o Postgres. A parte dif\u00edcil (escolher o banco de dados) terminou e agora come\u00e7a a parte divertida: garantir que voc\u00ea n\u00e3o precise pensar nisso novamente por mais alguns anos.<\/p>\n<p>Neste artigo, voc\u00ea ver\u00e1 algumas dicas menos conhecidas para configurar o Postgres a longo prazo, desde o pooling de conex\u00f5es at\u00e9 no\u00e7\u00f5es b\u00e1sicas de seguran\u00e7a, extens\u00f5es e \u00edndices.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Configure o pool de conex\u00f5es para o Postgres com o PGBouncer<\/h2>\n<p>Por padr\u00e3o, o Postgres cria um <a href=\"https:\/\/www.postgresql.org\/docs\/current\/connect-estab.html\" target=\"_blank\" rel=\"noopener noreferrer\">processo separado<\/a> para <a href=\"https:\/\/www.postgresql.org\/docs\/current\/connect-estab.html\">cada conex\u00e3o de cliente<\/a> a partir do processo principal do sistema operacional. Com baixo volume, o tempo necess\u00e1rio para criar e destruir esses processos \u2013 al\u00e9m do fato de que eles nunca s\u00e3o reutilizados \u2013 n\u00e3o importa. Voc\u00ea pode definir um n\u00famero de max_connections <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-connection.html\">manualmente<\/a>, mas eventualmente, conforme voc\u00ea escala, provavelmente encontrar\u00e1 problemas aqui. O <strong><a href=\"https:\/\/stackoverflow.blog\/2020\/10\/14\/improve-database-performance-with-connection-pooling\/\" target=\"_blank\" rel=\"noopener noreferrer\">pooling de conex\u00f5es<\/a><\/strong> ajuda voc\u00ea a, essencialmente, &#8220;armazenar em cache&#8221; esses processos e reutiliz\u00e1-los \u00e0 medida que os clientes se conectam e desconectam do seu banco de dados.<\/p>\n<p>Embora voc\u00ea <em>possa<\/em> criar o pooling de conex\u00f5es na l\u00f3gica do aplicativo, a maioria opta por uma ferramenta de terceiros e, no caso do Postgres, \u00e9 o <strong><a href=\"https:\/\/www.pgbouncer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">PGBouncer<\/a><\/strong>. Trata-se de um pooler de conex\u00f5es leve e de c\u00f3digo aberto que voc\u00ea pode instalar no servidor do banco de dados ou no servidor de aplicativos. Voc\u00ea tem <a href=\"https:\/\/www.pgbouncer.org\/features.html\" target=\"_blank\" rel=\"noopener noreferrer\">tr\u00eas n\u00edveis de pooling<\/a> para escolher:<\/p>\n<ul>\n<li><strong>Pooling de sess\u00e3o<\/strong>: Mant\u00e9m-se fiel ao modelo &#8220;as conex\u00f5es do cliente s\u00e3o indefinidas&#8221; e mant\u00e9m uma conex\u00e3o aberta durante todo o tempo em que o cliente estiver conectado.<\/li>\n<li><strong>Pooling de<\/strong> <strong>transa\u00e7\u00f5es<\/strong>: As conex\u00f5es duram uma \u00fanica transa\u00e7\u00e3o e, depois disso, s\u00e3o enviadas de volta ao pool.<\/li>\n<li><strong>Pooling de instru\u00e7\u00f5es<\/strong>: As conex\u00f5es duram apenas uma consulta, portanto, se voc\u00ea tiver v\u00e1rias como parte de uma transa\u00e7\u00e3o, isso n\u00e3o funcionar\u00e1 de forma alguma.<\/li>\n<\/ul>\n<p>A maioria escolhe o pooling de sess\u00f5es &#8211; \u00e9 o mais conservador e menos arriscado para descartar conex\u00f5es &#8211; mas cada aplicativo \u00e9 diferente, e voc\u00ea precisar\u00e1 descobrir o modo certo para suas restri\u00e7\u00f5es.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>A maioria dos frameworks web deixa isso a cargo de ferramentas de terceiros (veja <a href=\"https:\/\/groups.google.com\/g\/django-developers\/c\/NwY9CHM4xpU\">este t\u00f3pico do f\u00f3rum do Django<\/a> sobre o PGBouncer), mas o Rails realmente fornece um <a href=\"https:\/\/api.rubyonrails.org\/classes\/ActiveRecord\/ConnectionAdapters\/ConnectionPool.html\">recurso nativo de pool de conex\u00f5es<\/a>.<\/p>\n<\/aside>\n\n<h3>Impacto no desempenho do pool de conex\u00f5es<\/h3>\n<p>A quest\u00e3o de um milh\u00e3o de d\u00f3lares, no entanto, \u00e9: isso realmente funciona? A <a href=\"https:\/\/www.percona.com\/blog\/scaling-postgresql-with-pgbouncer-you-may-need-a-connection-pooler-sooner-than-you-expect\/\">Percona realizou<\/a> uma s\u00e9rie de benchmarks para descobrir como o PGBouncer impacta o desempenho. Com um pequeno n\u00famero de clientes simult\u00e2neos (&lt;60), o PGBouncer, na verdade, degrada as transa\u00e7\u00f5es por segundo (TPS) consideravelmente devido \u00e0 sobrecarga (pooling) do agrupamento. Mas quando voc\u00ea escala para mais de 100, come\u00e7a a ver benef\u00edcios significativos de desempenho.<\/p>\n<figure style=\"width: 612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/10\/pgbouncer.png\" alt=\"PGBouncer\" width=\"612\" height=\"371\"><figcaption class=\"wp-caption-text\">PGBouncer.<\/figcaption><\/figure>\n<p>Ent\u00e3o, voc\u00ea precisa de um pooler de conex\u00f5es imediatamente para dar suporte aos seus primeiros usu\u00e1rios? Provavelmente n\u00e3o. Mas o uso do PGBouncer ajudar\u00e1 voc\u00ea quando atingir um tr\u00e1fego baixo\/moderado.<\/p>\n<h2>Seguran\u00e7a do Postgres para leigos<\/h2>\n<p>Nas primeiras semanas em que voc\u00ea est\u00e1 trabalhando no seu projeto, geralmente s\u00e3o apenas um ou dois desenvolvedores trabalhando em um banco de dados vazio; a seguran\u00e7a n\u00e3o \u00e9 a principal preocupa\u00e7\u00e3o. Mas, \u00e0 medida que voc\u00ea lan\u00e7ar seu aplicativo para o mundo, ela precisar\u00e1 estar presente. E com os bancos de dados, \u00e0s vezes parece que h\u00e1 <a href=\"https:\/\/www.postgresql.org\/docs\/7.0\/security.htm\" target=\"_blank\" rel=\"noopener noreferrer\">um milh\u00e3o de maneiras diferentes de bloquear as coisas<\/a>.<\/p>\n<h3>Restringindo o acesso no n\u00edvel do host ou do usu\u00e1rio<\/h3>\n<p>Vamos come\u00e7ar com o acesso. O Postgres restringe o acesso de duas maneiras:<\/p>\n<ol start=\"1\">\n<li>No n\u00edvel do <strong>host<\/strong> &#8211; definindo endere\u00e7os IP e dom\u00ednios com direitos de acesso.<\/li>\n<li>No n\u00edvel do <strong>usu\u00e1rio<\/strong> &#8211; definindo os usu\u00e1rios do banco de dados e suas permiss\u00f5es.<\/li>\n<\/ol>\n<p>O <a href=\"https:\/\/www.postgresql.org\/docs\/current\/auth-pg-hba-conf.html\" target=\"_blank\" rel=\"noopener noreferrer\">arquivo <strong>pg_hba.conf<\/strong><\/a> no diret\u00f3rio PGDATA \u00e9 onde voc\u00ea define quem pode se conectar a quais bancos de dados. Se voc\u00ea n\u00e3o tiver uma entrada para um cliente nesse arquivo, ele n\u00e3o poder\u00e1 acessar o banco de dados. Supondo que o servidor de aplicativos esteja sendo executado em outro local, veja como voc\u00ea pode permitir que ele acesse o banco de dados:<\/p>\n<pre><code class=\"language-bash\"># Trust any connection via TCP\/IP from this machine\nhost all 127.0.0.1 255.255.255.255 trust<\/code><\/pre>\n<p>Al\u00e9m de apenas &#8220;confiar em todas as conex\u00f5es desta m\u00e1quina&#8221;, h\u00e1 v\u00e1rias maneiras diferentes de <a href=\"https:\/\/www.postgresql.org\/docs\/current\/client-authentication.html\" target=\"_blank\" rel=\"noopener noreferrer\">autenticar seu cliente com o servidor de banco de dados<\/a>, desde a senha at\u00e9 a identifica\u00e7\u00e3o e os certificados. E se voc\u00ea tiver evitado os grandes confortos do RDS (ou Kinsta) e estiver executando seu backend no mesmo servidor do banco de dados, poder\u00e1 <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-connection.html\" target=\"_blank\" rel=\"noopener noreferrer\">se conectar por meio de soquetes Unix<\/a> em vez de TCP\/IP.<\/p>\n<h3>Autoriza\u00e7\u00e3o e privil\u00e9gios<\/h3>\n<p>Depois que o pr\u00f3prio cliente for autenticado, voc\u00ea precisar\u00e1 lidar com a quest\u00e3o da autoriza\u00e7\u00e3o. O padr\u00e3o SQL define um sistema de privil\u00e9gios e cada objeto no Postgres (como uma tabela, linha etc.) tem privil\u00e9gios diferentes relacionados a ele que podem ser atribu\u00eddos aos usu\u00e1rios: coisas como <code>SELECT<\/code> e <code>UPDATE<\/code>, mas tamb\u00e9m <code>TRUNCATE<\/code>, <code>REFERENCES<\/code>, <code>TRIGGER<\/code>, etc. Voc\u00ea concede privil\u00e9gios aos usu\u00e1rios com o comando <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-grant.html\" target=\"_blank\" rel=\"noopener noreferrer\">GRANT<\/a><\/code> comando.<\/p>\n<p>A pr\u00e1tica recomendada \u00e9 seguir o princ\u00edpio do menor privil\u00e9gio, de modo que o usu\u00e1rio do banco de dados que voc\u00ea criar para o(s) seu(s) cliente(s) s\u00f3 <em>poder\u00e1<\/em> acessar o que for <em>necess\u00e1rio<\/em>.<\/p>\n<h3>Seguran\u00e7a em n\u00edvel de linha<\/h3>\n<p>O \u00faltimo ponto a ser abordado aqui \u00e9 a <strong><a href=\"https:\/\/www.postgresql.org\/docs\/current\/ddl-rowsecurity.html\" target=\"_blank\" rel=\"noopener noreferrer\">seguran\u00e7a em n\u00edvel de linha<\/a><\/strong>. A RLS existe sob a perspectiva da tabela (n\u00e3o do usu\u00e1rio) e restringe quais linhas podem ser acessadas, atualizadas, etc. Por padr\u00e3o, as tabelas n\u00e3o t\u00eam a RLS ativada, portanto, o usu\u00e1rio poder\u00e1 fazer o que as pol\u00edticas de acesso dele determinarem. Para ativar o RLS para uma tabela, voc\u00ea deve come\u00e7ar com:<\/p>\n<pre><code class=\"language-sql\">ALTER TABLE [table_name] ENABLE ROW LEVEL SECURITY<\/code><\/pre>\n<p>E, em seguida, voc\u00ea adiciona uma pol\u00edtica. Digamos que voc\u00ea queira restringir o acesso de leitura \u00e0 tabela <strong>lightsaber_internals <\/strong>a indiv\u00edduos confi\u00e1veis, que j\u00e1 est\u00e3o definidos no grupo de usu\u00e1rios <strong>jedi<\/strong>, de modo que somente o propriet\u00e1rio de lightsaber pode ver seus detalhes internos. Veja como voc\u00ea faria isso:<\/p>\n<pre><code class=\"language-sql\">ALTER TABLE lightsaber_internals ENABLE ROW LEVEL SECURITY\nCREATE POLICY jedi_only ON lightsaber_internals TO jedi\n    USING (jedi = lightsaber_jedi);<\/code><\/pre>\n<p>Pol\u00edticas de RLS como essa s\u00e3o \u00fateis quando voc\u00ea precisa de seguran\u00e7a em um n\u00edvel mais granular do que apenas tabelas (situa\u00e7\u00f5es com PII, etc).<\/p>\n<h2>Pense com anteced\u00eancia nos problemas de dimensionamento<\/h2>\n<p>Em todas as startups em que trabalhei, houve algum grau de dimensionamento manual no que se refere ao banco de dados. Um dia, voc\u00ea acorda e o Datadog est\u00e1 surtando porque o seu servidor Postgres est\u00e1 completamente sem espa\u00e7o. Voc\u00ea investigar\u00e1, atualizar\u00e1 a p\u00e1gina de incidentes e, por fim, atualizar\u00e1 o tamanho do disco at\u00e9 que isso aconte\u00e7a novamente (embora, da pr\u00f3xima vez, possa ser um problema de RAM). Voc\u00ea pode se antecipar a essas coisas! Algumas sugest\u00f5es:<\/p>\n<h3>1. Configure o monitoramento do banco de dados<\/h3>\n<p>A maioria das empresas em que trabalhei usa o <a href=\"https:\/\/www.datadoghq.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Datadog<\/a> para monitorar o banco de dados. Se voc\u00ea estiver usando um servi\u00e7o de banco de dados gerenciado, provavelmente poder\u00e1 se virar um pouco usando o material nativo deles. O Datadog tem um <a href=\"https:\/\/www.datadoghq.com\/blog\/postgresql-monitoring\/\" target=\"_blank\" rel=\"noopener noreferrer\">bom artigo em seu blog<\/a> sobre as principais m\u00e9tricas que voc\u00ea deve observar, como taxa de transfer\u00eancia de leitura e escrita, varreduras sequenciais, dados escritos no disco, etc.<\/p>\n<h3>2. Elabore diretrizes para escalonamento verticalmente<\/h3>\n<p>Quando sua equipe receber um alerta \u2013 e isso vai acontecer \u2013 a \u00faltima coisa que voc\u00ea quer \u00e9 que todos precisem se mobilizar para resolver o problema, quando na maioria dos casos, um simples aumento de escala resolve. \u00c9 bom elaborar um plano b\u00e1sico para sua equipe sobre o que est\u00e1 dentro do escopo quando voc\u00ea est\u00e1 ficando sem espa\u00e7o ou capacidade de processamento.<\/p>\n<h3>3. Limpeza e ajuste do seu Autovacuum<\/h3>\n<p>Quando voc\u00ea exclui (<code>DELETE<\/code>) dados no Postgres ou atualiza (<code>UPDATE<\/code>) dados (o que \u00e9 funcionalmente equivalente a excluir e inserir), o Postgres n\u00e3o <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/autovacuum-tuning-basics\/\">apaga esses dados<\/a> imediatamente (\ud83d\ude31). Em vez disso, eles s\u00e3o &#8220;marcados&#8221; como exclu\u00eddos armazenando o ID da transa\u00e7\u00e3o da exclus\u00e3o em um cabe\u00e7alho <strong>xmax;<\/strong> o motivo disso \u00e9 que facilita o MVCC no Postgres. Mas se essas linhas n\u00e3o forem realmente exclu\u00eddas eventualmente, come\u00e7ar\u00e3o a desperdi\u00e7ar espa\u00e7o em disco e causar problemas.<\/p>\n<p>A maneira mais f\u00e1cil de se livrar dessas linhas \u00e9 usando o comando <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-vacuum.html\" target=\"_blank\" rel=\"noopener noreferrer\">VACUUM<\/a><\/code>. Voc\u00ea poderia executar uma limpeza manualmente sempre que linhas mortas se acumulassem ou at\u00e9 mesmo configur\u00e1-la para ser executada a cada x minutos, mas uma estrat\u00e9gia melhor \u00e9 autovacuum baseada em quantas linhas mortas se acumularam. Ajustar seu autovacuum \u00e9 um t\u00f3pico complexo que vai al\u00e9m do escopo deste post: Eu recomendaria fortemente a leitura do <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/autovacuum-tuning-basics\/\">artigo<\/a> da 2ndQuadrant <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/autovacuum-tuning-basics\/\" target=\"_blank\" rel=\"noopener noreferrer\">sobre isso<\/a>.<\/p>\n<h3>4. Configure uma r\u00e9plica de leitura (ou duas)<\/h3>\n<p>Esta \u00e9 f\u00e1cil. Se voc\u00ea prev\u00ea um aumento significativo no tr\u00e1fego (um lan\u00e7amento em breve, etc.), pode criar facilmente r\u00e9plicas somente de leitura (ou pelo menos uma); elas ajudar\u00e3o a descarregar algum trabalho da inst\u00e2ncia principal do banco de dados.<\/p>\n<p>Se optar por v\u00e1rias r\u00e9plicas, voc\u00ea ter\u00e1 o benef\u00edcio adicional de aumentar a disponibilidade se alguma delas ficar inativa por qualquer motivo. A adi\u00e7\u00e3o de r\u00e9plicas \u00e9 bastante simples na maioria dos provedores de DBaaS; apenas fique atento ao custo: elas geralmente t\u00eam o mesmo pre\u00e7o de uma inst\u00e2ncia principal de banco de dados, apesar de serem somente leitura.<\/p>\n<h2>Adicione \u00edndices \u00e0s suas tabelas (previstas) mais grandes<\/h2>\n<p>Os \u00edndices de banco de dados ajudam a acelerar as consultas de leitura, criando estruturas de dados auxiliares que tornam as varreduras mais r\u00e1pidas. Para muitos casos de uso, adicionar um \u00edndice a uma ou duas tabelas \u00e9 basicamente uma tarefa f\u00e1cil. No Postgres, voc\u00ea pode criar um \u00edndice com o comando <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">CREATE INDEX<\/a><\/code> (duh). Quando voc\u00ea consultar uma tabela, o banco de dados verificar\u00e1 se existe um \u00edndice e o usar\u00e1 se existir (voc\u00ea pode verificar se isso est\u00e1 acontecendo com <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-explain.html\" target=\"_blank\" rel=\"noopener noreferrer\">EXPLAIN<\/a><\/code> a prop\u00f3sito).<\/p>\n<p>O tipo mais popular de \u00edndice no Postgres &#8211; e o padr\u00e3o quando voc\u00ea usa <code>CREATE INDEX<\/code> &#8211; \u00e9 um <strong>\u00edndice B-Tree<\/strong>. Essencialmente, ele pega a coluna na qual voc\u00ea deseja criar um \u00edndice, classifica e armazena ponteiros para as linhas classificadas. Dessa forma, voc\u00ea pode obter efici\u00eancia de pesquisa bin\u00e1ria em qualquer coluna que desejar, n\u00e3o apenas na coluna em que a tabela real est\u00e1 classificada (se \u00e9 que existe uma). Voc\u00ea pode ler mais detalhadamente sobre como essas \u00e1rvores s\u00e3o implementadas nos documentos do Postgres <a href=\"https:\/\/www.postgresql.org\/docs\/current\/btree-implementation.html\" target=\"_blank\" rel=\"noopener noreferrer\">aqui<\/a>.<\/p>\n<p>Embora \u00fateis, os \u00edndices n\u00e3o s\u00e3o s\u00f3 divers\u00e3o; eles ocupam espa\u00e7o e, se voc\u00ea n\u00e3o tomar cuidado com a quantidade e o tipo que cria, eles podem come\u00e7ar a prejudicar o desempenho do banco de dados. Ningu\u00e9m diz isso melhor do que os pr\u00f3prios <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">documentos do Postgres<\/a>:<\/p>\n<p><em>&#8220;Os \u00edndices s\u00e3o usados principalmente para melhorar o desempenho do banco de dados (embora o uso inadequado possa resultar em um desempenho mais lento).&#8221;<\/em><\/p>\n<p>Nos bastidores, quando voc\u00ea cria um \u00edndice, o Postgres materializa uma tabela de pesquisa que tem o \u00edndice e um ponteiro para o registro do \u00edndice. Um n\u00famero excessivo dessas tabelas consome espa\u00e7o em disco, torna as consultas INSERT mais demoradas e for\u00e7a o mecanismo de consulta a considerar mais op\u00e7\u00f5es antes de escolher como executar uma consulta.<\/p>\n<h2>B\u00f4nus: Adicione algumas extens\u00f5es do Postgres<\/h2>\n<p>Um aspecto que torna o Postgres \u00fanico \u00e9 o <a href=\"https:\/\/www.postgresql.org\/docs\/15\/external-extensions.html\" target=\"_blank\" rel=\"noopener noreferrer\">suporte nativo<\/a> a extens\u00f5es de terceiros. Voc\u00ea pode cri\u00e1-las a partir de SQL e C, e elas podem ser t\u00e3o pequenas quanto algumas instru\u00e7\u00f5es ou t\u00e3o grandes quanto uma biblioteca de software inteira. O uso de <a href=\"https:\/\/gist.github.com\/joelonsql\/e5aa27f8cc9bd22b8999b7de8aee9d47#file-postgresql-extensions-md\" target=\"_blank\" rel=\"noopener noreferrer\">extens\u00f5es de c\u00f3digo aberto\/dispon\u00edveis publicamente<\/a> ajuda voc\u00ea da mesma forma que o uso de um pacote de software; por que escrever seu pr\u00f3prio c\u00f3digo quando voc\u00ea pode usar o de outra pessoa? Aqui est\u00e3o algumas das extens\u00f5es mais populares do Postgres:<\/p>\n<h3>Timescale<\/h3>\n<p>O <a href=\"https:\/\/www.timescale.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Timescale<\/a> \u00e9 uma extens\u00e3o do Postgres para que voc\u00ea trabalhe com dados de s\u00e9ries temporais. Em resumo, ele torna suas consultas (muito) mais r\u00e1pidas e armazena dados de s\u00e9ries temporais com muita efici\u00eancia. Voc\u00ea pode encontrar instru\u00e7\u00f5es de instala\u00e7\u00e3o <a href=\"https:\/\/docs.timescale.com\/self-hosted\/latest\/install\/\" target=\"_blank\" rel=\"noopener noreferrer\">aqui<\/a> ou considerar a op\u00e7\u00e3o de hospedagem na nuvem do Timescale se estiver realmente executando seus neg\u00f3cios com dados de s\u00e9ries temporais (embora voc\u00ea provavelmente j\u00e1 esteja ciente disso se for o caso).<\/p>\n<h3>PostGIS<\/h3>\n<p>O <a href=\"https:\/\/postgis.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">PostGIS<\/a> adiciona suporte ao Postgres para armazenamento, indexa\u00e7\u00e3o e consulta de dados geogr\u00e1ficos (pense em linhas, pol\u00edgonos, locais, etc.). Se voc\u00ea estiver usando um provedor de nuvem, a maioria pr\u00e9-instala o PostGIS. Mas se voc\u00ea precisar instal\u00e1-lo por conta pr\u00f3pria, poder\u00e1 encontrar instru\u00e7\u00f5es de instala\u00e7\u00e3o <a href=\"https:\/\/postgis.net\/documentation\/getting_started\/\" target=\"_blank\" rel=\"noopener noreferrer\">aqui<\/a>.<\/p>\n<h3>pg_stat_statements<\/h3>\n<p>O <a href=\"https:\/\/www.postgresql.org\/docs\/current\/pgstatstatements.html\" target=\"_blank\" rel=\"noopener noreferrer\">pg_stat_statements<\/a> cria uma visualiza\u00e7\u00e3o em seu banco de dados Postgres com estat\u00edsticas sobre cada consulta executada no banco de dados. Voc\u00ea pode ver estat\u00edsticas como o tempo que a consulta leva para ser executada (m\u00e9dia, mediana), quem executou a consulta, acessos ao cache de blocos, n\u00famero de blocos gravados e muito mais (44 colunas no total nessa visualiza\u00e7\u00e3o). <a href=\"https:\/\/gist.github.com\/rcanepa\/535163dc249539912c25\" target=\"_blank\" rel=\"noopener noreferrer\">Para instalar<\/a>, basta adicion\u00e1-lo ao seu arquivo .conf e reiniciar o servidor.<\/p>\n<h3>pg_audit<\/h3>\n<p>O <a href=\"https:\/\/www.pgaudit.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">pg_audit<\/a> ajuda as empresas que podem estar sujeitas a auditorias detalhadas (por exemplo, governamentais, financeiras, etc.). Voc\u00ea pode fazer com que o Postgres registre todas as instru\u00e7\u00f5es do banco de dados configurando `log_statement=all`, mas isso n\u00e3o significa que as informa\u00e7\u00f5es de que voc\u00ea precisa ser\u00e3o f\u00e1ceis de pesquisar e encontrar. O pg_audit utiliza as fun\u00e7\u00f5es de registro interno do Postgres para facilitar a localiza\u00e7\u00e3o e o trabalho com os registros de que um auditor pode precisar. Voc\u00ea pode encontrar instru\u00e7\u00f5es de instala\u00e7\u00e3o <a href=\"https:\/\/github.com\/pgaudit\/pgaudit\" target=\"_blank\" rel=\"noopener noreferrer\">aqui<\/a>.<\/p>\n<h2>Resumo<\/h2>\n<p>O Postgres \u00e9 uma op\u00e7\u00e3o excelente (e <a href=\"https:\/\/clearbit.com\/resources\/books\/data-driven-marketing\/b2b-seo-content-that-ranks\" target=\"_blank\" rel=\"noopener noreferrer\">muito popular<\/a>) para voc\u00ea construir sua empresa e que temos orgulho de apoiar na Kinsta. Esperamos que essas dicas ajudem voc\u00ea a come\u00e7ar a trabalhar e a se preparar para o escalonamento. Tem outras dicas ou pensamentos baseados em sua experi\u00eancia? Deixe-nos saber aqui.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ent\u00e3o voc\u00ea est\u00e1 iniciando um novo projeto &#8211; ou empresa &#8211; e decidiu que vai usar o Postgres. A parte dif\u00edcil (escolher o banco de dados) &#8230;<\/p>\n","protected":false},"author":310,"featured_media":66031,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1000],"class_list":["post-66030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-postgresql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>O Manual do CTO de Startups para Executar no Postgres - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Aprenda sobre algumas dicas menos conhecidas para configurar o Postgres para longo prazo, desde o agrupamento de conex\u00f5es at\u00e9 no\u00e7\u00f5es b\u00e1sicas de seguran\u00e7a, passando por extens\u00f5es e \u00edndices.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"O Manual do CTO de Startups para Executar no Postgres\" \/>\n<meta property=\"og:description\" content=\"Aprenda sobre algumas dicas menos conhecidas para configurar o Postgres para longo prazo, desde o agrupamento de conex\u00f5es at\u00e9 no\u00e7\u00f5es b\u00e1sicas de seguran\u00e7a, passando por extens\u00f5es e \u00edndices.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-14T12:14:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-18T08:50:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Justin Gage\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Aprenda sobre algumas dicas menos conhecidas para configurar o Postgres para longo prazo, desde o agrupamento de conex\u00f5es at\u00e9 no\u00e7\u00f5es b\u00e1sicas de seguran\u00e7a, passando por extens\u00f5es e \u00edndices.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Justin Gage\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/\"},\"author\":{\"name\":\"Justin Gage\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\"},\"headline\":\"O Manual do CTO de Startups para Executar no Postgres\",\"datePublished\":\"2023-12-14T12:14:40+00:00\",\"dateModified\":\"2023-12-18T08:50:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/\"},\"wordCount\":2451,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/\",\"url\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/\",\"name\":\"O Manual do CTO de Startups para Executar no Postgres - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"datePublished\":\"2023-12-14T12:14:40+00:00\",\"dateModified\":\"2023-12-18T08:50:51+00:00\",\"description\":\"Aprenda sobre algumas dicas menos conhecidas para configurar o Postgres para longo prazo, desde o agrupamento de conex\u00f5es at\u00e9 no\u00e7\u00f5es b\u00e1sicas de seguran\u00e7a, passando por extens\u00f5es e \u00edndices.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/kinqsta.com\/pt\/topicos\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"O Manual do CTO de Startups para Executar no Postgres\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#website\",\"url\":\"https:\/\/kinqsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\",\"name\":\"Justin Gage\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g\",\"caption\":\"Justin Gage\"},\"description\":\"Justin is a technical writer and author of the popular Technically newsletter. He did his B.S. in Data Science before a stint in full-stack engineering and now focuses on making complex technical concepts accessible to everyone.\",\"sameAs\":[\"https:\/\/technically.substack.com\/\"],\"url\":\"https:\/\/kinqsta.com\/pt\/blog\/author\/justingage\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"O Manual do CTO de Startups para Executar no Postgres - Kinsta\u00ae","description":"Aprenda sobre algumas dicas menos conhecidas para configurar o Postgres para longo prazo, desde o agrupamento de conex\u00f5es at\u00e9 no\u00e7\u00f5es b\u00e1sicas de seguran\u00e7a, passando por extens\u00f5es e \u00edndices.","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:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/","og_locale":"pt_PT","og_type":"article","og_title":"O Manual do CTO de Startups para Executar no Postgres","og_description":"Aprenda sobre algumas dicas menos conhecidas para configurar o Postgres para longo prazo, desde o agrupamento de conex\u00f5es at\u00e9 no\u00e7\u00f5es b\u00e1sicas de seguran\u00e7a, passando por extens\u00f5es e \u00edndices.","og_url":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2023-12-14T12:14:40+00:00","article_modified_time":"2023-12-18T08:50:51+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","type":"image\/jpeg"}],"author":"Justin Gage","twitter_card":"summary_large_image","twitter_description":"Aprenda sobre algumas dicas menos conhecidas para configurar o Postgres para longo prazo, desde o agrupamento de conex\u00f5es at\u00e9 no\u00e7\u00f5es b\u00e1sicas de seguran\u00e7a, passando por extens\u00f5es e \u00edndices.","twitter_image":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","twitter_creator":"@kinsta_pt","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Justin Gage","Tempo estimado de leitura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/"},"author":{"name":"Justin Gage","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f"},"headline":"O Manual do CTO de Startups para Executar no Postgres","datePublished":"2023-12-14T12:14:40+00:00","dateModified":"2023-12-18T08:50:51+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/"},"wordCount":2451,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/","url":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/","name":"O Manual do CTO de Startups para Executar no Postgres - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinqsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","datePublished":"2023-12-14T12:14:40+00:00","dateModified":"2023-12-18T08:50:51+00:00","description":"Aprenda sobre algumas dicas menos conhecidas para configurar o Postgres para longo prazo, desde o agrupamento de conex\u00f5es at\u00e9 no\u00e7\u00f5es b\u00e1sicas de seguran\u00e7a, passando por extens\u00f5es e \u00edndices.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#primaryimage","url":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","contentUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/pt\/blog\/manual-do-cto-de-startups-para-executar-no-postgres\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL","item":"https:\/\/kinqsta.com\/pt\/topicos\/postgresql\/"},{"@type":"ListItem","position":3,"name":"O Manual do CTO de Startups para Executar no Postgres"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/pt\/#website","url":"https:\/\/kinqsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinqsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f","name":"Justin Gage","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g","caption":"Justin Gage"},"description":"Justin is a technical writer and author of the popular Technically newsletter. He did his B.S. in Data Science before a stint in full-stack engineering and now focuses on making complex technical concepts accessible to everyone.","sameAs":["https:\/\/technically.substack.com\/"],"url":"https:\/\/kinqsta.com\/pt\/blog\/author\/justingage\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts\/66030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/users\/310"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/comments?post=66030"}],"version-history":[{"count":7,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts\/66030\/revisions"}],"predecessor-version":[{"id":66079,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts\/66030\/revisions\/66079"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/66030\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/66030\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/66030\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/66030\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/66030\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/66030\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/66030\/translations\/es"},{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/66030\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/media\/66031"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/media?parent=66030"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/tags?post=66030"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/topic?post=66030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}