<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>pgcli</title>
    <link>https://pgcli.pages.dev/</link>
    <description>Recent content on pgcli</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    
    
    
      <lastBuildDate>Fri, 30 Oct 2026 15:08:09 +0800</lastBuildDate>
    
    
      <atom:link href="https://pgcli.pages.dev/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
        <title>Extension Catalog</title>
        <link>https://pgcli.pages.dev/docs/extensions/catalog/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/extensions/catalog/</guid>
        <description>&lt;p&gt;This page lists all built-in extensions available in the base image. For usage examples, see &lt;a href=&#34;https://pgcli.pages.dev/docs/extensions/popular/&#34;&gt;Popular Extensions&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;built-in-extensions-45&#34;&gt;Built-in Extensions (45)&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;These extensions ship in the PostgreSQL base image — no image build or &lt;code&gt;pg extension install&lt;/code&gt; needed. Just run &lt;code&gt;CREATE EXTENSION&lt;/code&gt; to enable them.&lt;/p&gt;&#xA;&lt;h3 id=&#34;requires-shared_preload_libraries&#34;&gt;Requires shared_preload_libraries&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;These extensions need a PostgreSQL restart after enabling. pgcli handles this automatically when installed via &lt;code&gt;pg extension install&lt;/code&gt;.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Feedback</title>
        <link>https://pgcli.pages.dev/support/feedback/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/support/feedback/</guid>
        <description>&lt;p&gt;pgcli collects feedback on GitHub and by email.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Report a bug or request a feature&lt;/strong&gt; — open an issue at&#xA;&lt;a href=&#34;https://github.com/mars-base/pgcli/issues&#34;&gt;mars-base/pgcli/issues&lt;/a&gt;. Include&#xA;the output of &lt;code&gt;pg version&lt;/code&gt; and the steps to reproduce.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;By email&lt;/strong&gt; — write to&#xA;&lt;a href=&#34;mailto:dw_wang126@126.com&#34;&gt;dw_wang126@126.com&lt;/a&gt; if you prefer not to post&#xA;publicly.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
      </item>
    <item>
        <title>PgBouncer</title>
        <link>https://pgcli.pages.dev/docs/addon/pgbouncer/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/pgbouncer/</guid>
        <description>&lt;p&gt;PgBouncer is a lightweight connection pooler for PostgreSQL. As a pgcli addon&#xA;it runs as a container in front of one or more PostgreSQL instances, reusing&#xA;server connections across many short-lived client sessions — transaction-level&#xA;pooling by default.&lt;/p&gt;&#xA;&lt;p&gt;PgBouncer supports two deployment modes:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local:&lt;/strong&gt; &lt;code&gt;pg addon install pgbouncer -i &amp;lt;instance&amp;gt;&lt;/code&gt; — stored under&#xA;&lt;code&gt;instances.&amp;lt;name&amp;gt;.addons&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Remote:&lt;/strong&gt; &lt;code&gt;pg addon install pgbouncer --dsn &amp;lt;dsn&amp;gt; --pg-name &amp;lt;name&amp;gt;&lt;/code&gt; —&#xA;stored in top-level &lt;code&gt;addons.pgbouncer&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;platform-support&#34;&gt;Platform support&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;PgBouncer works on &lt;strong&gt;Linux&lt;/strong&gt; (host networking, including cross-host pools) and&#xA;on &lt;strong&gt;macOS&lt;/strong&gt; for &lt;strong&gt;single-host dev/test&lt;/strong&gt; (the container joins the &lt;code&gt;pgcli-net&lt;/code&gt;&#xA;bridge and publishes its port, the same way a PG instance does under podman&#xA;machine). On macOS:&lt;/p&gt;</description>
      </item>
    <item>
        <title>Popular Extensions</title>
        <link>https://pgcli.pages.dev/docs/extensions/popular/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/extensions/popular/</guid>
        <description>&lt;p&gt;Usage examples for the most commonly used PostgreSQL extensions, tested on &lt;strong&gt;PG 18&lt;/strong&gt; with pgcli.&lt;/p&gt;&#xA;&lt;h2 id=&#34;performance--monitoring&#34;&gt;Performance &amp;amp; Monitoring&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Install&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Description&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg_stat_statements&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install pg_stat_statements&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;SQL performance analysis. &lt;strong&gt;Must-have for production.&lt;/strong&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg_repack&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install pg_repack&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Online table reorganization. Reclaims bloat.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg_prewarm&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install pg_prewarm&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Preload table data after restart.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-0&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;12&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-0-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Install all at once&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg extension install pg_stat_statements,pg_repack,pg_prewarm --auto-restart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Find top 5 slow queries&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT query, calls, total_exec_time::numeric(10,2) AS ms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Repack a bloated table&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -- pg_repack -U admin -d default_db -t my_table --no-superuser-check&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Prewarm a table&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT pg_prewarm(&amp;#39;my_table&amp;#39;);&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;data-types--identifiers&#34;&gt;Data Types &amp;amp; Identifiers&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Install&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Description&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;uuid-ossp&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;builtin&lt;/td&gt;&#xA;      &lt;td&gt;UUID generation (v1/v3/v5). &lt;strong&gt;PG 18 has built-in &lt;code&gt;gen_random_uuid()&lt;/code&gt; (v4) and &lt;code&gt;uuidv7()&lt;/code&gt; (v7) — no extension needed.&lt;/strong&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;hstore&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;builtin&lt;/td&gt;&#xA;      &lt;td&gt;Key-value pair storage.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;citext&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;builtin&lt;/td&gt;&#xA;      &lt;td&gt;Case-insensitive text. &lt;code&gt;Foo&lt;/code&gt; = &lt;code&gt;foo&lt;/code&gt;.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-1&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;18&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-1-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# UUID generation (PG 18 built-in — no extension needed)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT gen_random_uuid();&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# v4 random UUID (built-in since PG 13)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT uuidv7();&amp;#34;&lt;/span&gt;           &lt;span class=&#34;c1&#34;&gt;# v7 time-ordered UUID (new in PG 18)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# uuid-ossp extension — only needed for v1/v3/v5 UUIDs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CREATE EXTENSION IF NOT EXISTS \&amp;#34;uuid-ossp\&amp;#34;;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT uuid_generate_v1();&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# v1 timestamp + MAC address&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT uuid_generate_v3(uuid_ns_url(), &amp;#39;https://example.com&amp;#39;);&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# v3 MD5-based&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT uuid_generate_v5(uuid_ns_url(), &amp;#39;https://example.com&amp;#39;);&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# v5 SHA-1 based&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Key-value storage&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT &amp;#39;theme =&amp;gt; dark, lang =&amp;gt; en&amp;#39;::hstore -&amp;gt; &amp;#39;theme&amp;#39;;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Returns: dark&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Case-insensitive matching&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CREATE TABLE users (email citext);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         INSERT INTO users VALUES (&amp;#39;Alice@Example.COM&amp;#39;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         SELECT * FROM users WHERE email = &amp;#39;alice@example.com&amp;#39;;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;search--text&#34;&gt;Search &amp;amp; Text&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Install&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Description&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg_trgm&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;builtin&lt;/td&gt;&#xA;      &lt;td&gt;Trigram similarity for fuzzy search and autocomplete.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;unaccent&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;builtin&lt;/td&gt;&#xA;      &lt;td&gt;Strip accents for flexible international text search.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-2&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;12&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-2-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Fuzzy search&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT name, similarity(name, &amp;#39;John&amp;#39;) FROM users&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         ORDER BY similarity(name, &amp;#39;John&amp;#39;) DESC LIMIT 5;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create a trigram index for fast fuzzy search&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CREATE INDEX users_name_trgm_idx ON users USING gin (name gin_trgm_ops);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Remove accents&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT unaccent(&amp;#39;Crème Brûlée&amp;#39;);&amp;#34;&lt;/span&gt;  -- returns &lt;span class=&#34;s1&#34;&gt;&amp;#39;Creme Brulee&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Combine for accent-insensitive fuzzy search&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT name FROM users WHERE name % unaccent(&amp;#39;Creme Brulee&amp;#39;);&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;security--encryption&#34;&gt;Security &amp;amp; Encryption&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Install&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Description&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pgcrypto&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;builtin&lt;/td&gt;&#xA;      &lt;td&gt;Hashing, encryption/decryption, random generation.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pgaudit&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install pgaudit&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Audit logging. Required for compliance (GDPR, HIPAA, SOX).&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-3&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;11&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-3-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Hash a password with bcrypt&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT crypt(&amp;#39;my_password&amp;#39;, gen_salt(&amp;#39;bf&amp;#39;));&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Verify a password&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT (crypt(&amp;#39;my_password&amp;#39;, stored_hash) = stored_hash);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Symmetric encryption/decryption&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT pgp_sym_decrypt(pgp_sym_encrypt(&amp;#39;secret&amp;#39;, &amp;#39;key&amp;#39;), &amp;#39;key&amp;#39;);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Enable audit logging for specific operations&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SET pgaudit.log = &amp;#39;read, ddl&amp;#39;;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;geospatial&#34;&gt;Geospatial&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Install&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Description&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;postgis&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install postgis&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Full spatial database: geometry, spatial indexes, distance/area.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-4&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;16&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-4-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg extension install postgis --auto-restart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create a table with spatial data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CREATE TABLE places (id serial, name text, geom geometry(Point, 4326));&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;INSERT INTO places (name, geom) VALUES&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         (&amp;#39;San Francisco&amp;#39;, ST_MakePoint(-122.4, 37.8)),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         (&amp;#39;London&amp;#39;, ST_MakePoint(-0.1276, 51.5074));&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Find places within 5km of a point&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT name FROM places&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         WHERE ST_DWithin(geom, ST_MakePoint(-122.4, 37.8)::geography, 5000);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Calculate distance between two cities (in meters)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT ST_Distance(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;           ST_MakePoint(-74.006, 40.7128)::geography,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;           ST_MakePoint(-0.1276, 51.5074)::geography);&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;ai--vector-search&#34;&gt;AI &amp;amp; Vector Search&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Install&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Description&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pgvector&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install vector&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Store and search embedding vectors. Standard for AI apps.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-5&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;11&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-5-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg extension install vector --auto-restart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create a table with vector column&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CREATE TABLE items (id serial PRIMARY KEY, embedding vector(3));&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;INSERT INTO items (embedding) VALUES (&amp;#39;[1,2,3]&amp;#39;), (&amp;#39;[4,5,6]&amp;#39;), (&amp;#39;[7,8,9]&amp;#39;);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Find nearest neighbors (Euclidean distance)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT id FROM items ORDER BY embedding &amp;lt;-&amp;gt; &amp;#39;[3,1,2]&amp;#39; LIMIT 5;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create an IVFFlat index for fast approximate search&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CREATE INDEX items_embedding_idx ON items USING ivfflat (embedding vector_l2_ops);&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;time-series&#34;&gt;Time Series&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Install&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Description&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;timescaledb&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install timescaledb&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Optimized time-series storage with hypertables.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-6&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;9&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-6-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg extension install timescaledb --auto-restart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create a hypertable&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CREATE TABLE sensor (time timestamptz NOT NULL, value float);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         SELECT create_hypertable(&amp;#39;sensor&amp;#39;, &amp;#39;time&amp;#39;);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Time-bucket aggregation&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT time_bucket(&amp;#39;1 hour&amp;#39;, time) AS bucket, avg(value)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         FROM sensor GROUP BY bucket ORDER BY bucket;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;scheduling--distributed&#34;&gt;Scheduling &amp;amp; Distributed&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Install&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Description&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg_cron&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install pg_cron&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Cron-based job scheduler. Auto-configured by pgcli.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;citus&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install citus&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Distributed PostgreSQL with sharding.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-7&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;11&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-7-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg extension install pg_cron --auto-restart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Schedule a daily cleanup job (runs at midnight)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT cron.schedule(&amp;#39;cleanup&amp;#39;, &amp;#39;0 0 * * *&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         &amp;#39;DELETE FROM logs WHERE created_at &amp;lt; now() - interval &amp;#39;&amp;#39;30 days&amp;#39;&amp;#39;&amp;#39;);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# List scheduled jobs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT jobid, schedule, command FROM cron.job;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Unschedule a job&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT cron.unschedule(&amp;#39;cleanup&amp;#39;);&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;foreign-data&#34;&gt;Foreign Data&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Install&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Description&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;postgres_fdw&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;builtin&lt;/td&gt;&#xA;      &lt;td&gt;Query external PostgreSQL servers as local tables.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg_duckdb&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;&lt;code&gt;pg extension install pg_duckdb&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Embedded DuckDB analytics engine. Read Parquet/CSV, offload OLAP queries.&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-8&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;13&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-8-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create a foreign server&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CREATE SERVER remote FOREIGN DATA WRAPPER postgres_fdw&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         OPTIONS (host &amp;#39;10.0.0.2&amp;#39;, port &amp;#39;5432&amp;#39;, dbname &amp;#39;analytics&amp;#39;);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create user mapping&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CREATE USER MAPPING FOR current_user SERVER remote&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         OPTIONS (user &amp;#39;reader&amp;#39;, password &amp;#39;secret&amp;#39;);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Import remote schema as foreign tables&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;IMPORT FOREIGN SCHEMA public FROM SERVER remote INTO remote_schema;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Query remote data as if it were local&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT * FROM remote_schema.events LIMIT 10;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-3a03632b-fence-9&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;31&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-3a03632b-fence-9-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg extension install pg_duckdb --auto-restart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Run SQL in DuckDB — duckdb.query is a table function (FROM clause required)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT * FROM duckdb.query(\$\$ SELECT 42 AS answer, &amp;#39;hello&amp;#39; AS msg \$\$);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Export a table to Parquet&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;COPY my_table TO &amp;#39;/tmp/my_table.parquet&amp;#39; (FORMAT &amp;#39;parquet&amp;#39;);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Read Parquet/CSV files directly&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT * FROM duckdb.query(\$\$&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         SELECT * FROM read_parquet(&amp;#39;/tmp/my_table.parquet&amp;#39;) WHERE id &amp;gt; 2 \$\$);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Offload an entire query to DuckDB (OLAP acceleration)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SET duckdb.force_execution = true;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         SELECT category, sum(amount) FROM sales GROUP BY category;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Pure DuckDB SQL (no PostgreSQL planner involved)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT * FROM duckdb.raw_query(\$\$ SELECT range AS n FROM range(1, 6) \$\$);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# --- Read files from S3 / MinIO (no file copy needed) ---&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create an S3 secret once (use_ssl is text: &amp;#39;true&amp;#39;/&amp;#39;false&amp;#39;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT duckdb.create_simple_secret(&amp;#39;S3&amp;#39;, &amp;#39;&amp;lt;access_key&amp;gt;&amp;#39;, &amp;#39;&amp;lt;secret_key&amp;gt;&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         &amp;#39;&amp;#39;, &amp;#39;us-east-1&amp;#39;, &amp;#39;path&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;minio.example.com:9000&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         &amp;#39;s3://bucket&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;false&amp;#39;);&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Query a CSV in the bucket directly&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SELECT * FROM duckdb.query(\$\$&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         SELECT category, count(*) AS cnt, sum(sales) AS total_sales&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         FROM read_csv(&amp;#39;s3://bucket/products.csv&amp;#39;, auto_detect=true)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;         GROUP BY category ORDER BY total_sales DESC \$\$);&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;compatibility-notes&#34;&gt;Compatibility Notes&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Extension&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;PG 18 Status&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Notes&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;pgml&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Not available&lt;/td&gt;&#xA;      &lt;td&gt;Only supports PG 14-17 (no PG 18 package)&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;code&gt;uuid-ossp&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;td&gt;Partially needed&lt;/td&gt;&#xA;      &lt;td&gt;PG 18 built-in: &lt;code&gt;gen_random_uuid()&lt;/code&gt; (v4), &lt;code&gt;uuidv7()&lt;/code&gt; (v7). Extension only needed for v1/v3/v5&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;</description>
      </item>
    <item>
        <title>Technical Support</title>
        <link>https://pgcli.pages.dev/support/tech-support/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/support/tech-support/</guid>
        <description>&lt;p&gt;Questions about installation, instance management, backups, replicas, or HA&#xA;clusters — reach the pgcli maintainers directly.&lt;/p&gt;&#xA;&lt;h2 id=&#34;wechat&#34;&gt;WeChat&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Scan the QR code with WeChat to add us as a contact, and put &lt;strong&gt;技术咨询&lt;/strong&gt;&#xA;(technical consultation) in the friend-request note:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://pgcli.pages.dev/wechat-qr.jpeg&#34;&gt;&lt;img src=&#34;https://pgcli.pages.dev/wechat-qr.jpeg&#34; alt=&#34;WeChat contact QR code&#34; width=&#34;200&#34; loading=&#34;lazy&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;telegram&#34;&gt;Telegram&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Scan the QR code with Telegram to start a chat:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://pgcli.pages.dev/telegram-qr.jpeg&#34;&gt;&lt;img src=&#34;https://pgcli.pages.dev/telegram-qr.jpeg&#34; alt=&#34;Telegram contact QR code&#34; width=&#34;200&#34; loading=&#34;lazy&#34;&gt;&lt;/a&gt;&lt;/p&gt;</description>
      </item>
    <item>
        <title>Etcd</title>
        <link>https://pgcli.pages.dev/docs/addon/etcd/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/etcd/</guid>
        <description>&lt;p&gt;etcd is a distributed key-value store. pgcli can run one or more etcd members&#xA;as a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt; — shared infrastructure rather than a&#xA;per-instance sidecar. This is useful as the DCS (Distributed Concurrent Store)&#xA;backing a PostgreSQL HA stack, or as a general config/lock service.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Security caveat:&lt;/strong&gt; pgcli-managed etcd members currently run &lt;strong&gt;without&lt;/strong&gt;&#xA;TLS/CA certificates and &lt;strong&gt;without&lt;/strong&gt; authentication/RBAC — any client that can&#xA;reach a client port has full read/write access. Plan a deployment around&#xA;network isolation (loopback binds by default; keep advertised ports inside a&#xA;trusted network). CA/TLS and auth/RBAC support is on the roadmap for a later&#xA;release.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Paid Subscription</title>
        <link>https://pgcli.pages.dev/support/subscription/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/support/subscription/</guid>
        <description>&lt;p&gt;pgcli itself is free and open source (Apache 2.0). A paid subscription adds&#xA;priority response times, help with production deployments, and feature input.&lt;/p&gt;&#xA;&lt;!-- TODO: subscription tiers, pricing, and purchase link to be added. --&gt;</description>
      </item>
    <item>
        <title>PgDog</title>
        <link>https://pgcli.pages.dev/docs/addon/pgdog/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/pgdog/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://pgdog.dev&#34;&gt;PgDog&lt;/a&gt; is a high-performance Postgres proxy written in Rust&#xA;(the successor to PgCat). It provides connection pooling, read/write load&#xA;balancing across replicas, and horizontal sharding — in front of one or more&#xA;PostgreSQL backends. pgcli can run PgDog as a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt;:&#xA;shared infrastructure rather than a per-instance sidecar.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Security caveat:&lt;/strong&gt; PgDog authenticates clients against &lt;strong&gt;plaintext&lt;/strong&gt;&#xA;passwords stored in &lt;code&gt;users.toml&lt;/code&gt;. pgcli writes that file mode &lt;code&gt;0600&lt;/code&gt; and&#xA;mounts it read-only into the container, but the passwords still sit in clear&#xA;text on disk and in &lt;code&gt;pg.yaml&lt;/code&gt;. Keep the listen port on loopback (the default)&#xA;or inside a trusted network, and treat the config file as a secret.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Garage</title>
        <link>https://pgcli.pages.dev/docs/addon/garage/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/garage/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://garagehq.deuxfleurs.fr&#34;&gt;Garage&lt;/a&gt; is a Rust, AGPLv3 reimplementation of&#xA;S3-compatible object storage, built by&#xA;&lt;a href=&#34;https://deuxfleurs.fr&#34;&gt;Deuxfleurs&lt;/a&gt; for small self-hosted and geo-distributed&#xA;clusters. pgcli runs it as a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt; with the same CLI&#xA;surface as &lt;a href=&#34;../minio/&#34;&gt;&lt;code&gt;minio&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;../silo/&#34;&gt;&lt;code&gt;silo&lt;/code&gt;&lt;/a&gt; and&#xA;&lt;a href=&#34;../rustfs/&#34;&gt;&lt;code&gt;rustfs&lt;/code&gt;&lt;/a&gt; (install, list, logs, autostart, password), but its&#xA;runtime model diverges from all three in four ways that shape this page:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;A rendered TOML config file, not argv/env.&lt;/strong&gt; Garage reads&#xA;&lt;code&gt;/etc/garage.toml&lt;/code&gt;. pgcli renders it under the instance directory and&#xA;bind-mounts it read-only; the MinIO/silo/rustfs addons pass argv or env.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Two kinds of directory — and multi-disk is native since Garage v0.9.0.&lt;/strong&gt;&#xA;&lt;code&gt;metadata_dir&lt;/code&gt; (LMDB) and &lt;code&gt;data_dir&lt;/code&gt; (blocks) are separate bind mounts, and&#xA;&lt;code&gt;metadata_dir&lt;/code&gt; is always exactly one. &lt;code&gt;data_dir&lt;/code&gt; takes either a single path&#xA;or, natively upstream, a list of &lt;code&gt;{ path = …, capacity = … }&lt;/code&gt; entries — one&#xA;per disk, so a node spreads its blocks across several drives itself rather&#xA;than needing host LVM/RAID under one big filesystem. pgcli exposes that list&#xA;as &lt;code&gt;--drive&lt;/code&gt; (repeatable); MinIO, silo, rustfs, seaweedfs and garage all&#xA;take a per-node drive list now — see &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/garage/#multi-disk-data-dirs&#34;&gt;Multi-disk data&#xA;dirs&lt;/a&gt; and &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/garage/#capacity-and-sizing&#34;&gt;Capacity and&#xA;sizing&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Four ports, from their own pool.&lt;/strong&gt; S3 API, node-to-node RPC, the &lt;code&gt;s3_web&lt;/code&gt;&#xA;static site, and the admin/metrics API — allocated together per instance&#xA;from &lt;code&gt;garage_start_port&lt;/code&gt; (default &lt;strong&gt;3900&lt;/strong&gt;), a separate cursor from the&#xA;shared minio/silo/rustfs pool.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No native TLS — plaintext HTTP only.&lt;/strong&gt; pgBackRest&amp;rsquo;s S3 repository forces&#xA;HTTPS, so a Garage store meant to receive &lt;code&gt;archive-push&lt;/code&gt; must be &lt;strong&gt;fronted by&#xA;the &lt;a href=&#34;../nginx/&#34;&gt;nginx addon&lt;/a&gt;&lt;/strong&gt; — see &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/garage/#tls-by-fronting-with-nginx&#34;&gt;TLS by fronting with&#xA;nginx&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Like rustfs, Garage is a good successor route now that the open-source MinIO&#xA;repository is archived. pgcli runs it &lt;strong&gt;single-node&lt;/strong&gt; by default&#xA;(&lt;code&gt;replication_factor = 1&lt;/code&gt;, &lt;code&gt;garage server --single-node&lt;/code&gt;) and, with a handful of&#xA;cluster flags, as a &lt;strong&gt;multi-node cross-host cluster&lt;/strong&gt; — see &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/garage/#multi-node-cluster&#34;&gt;Multi-node&#xA;cluster&lt;/a&gt;.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Patroni HA</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://patroni.readthedocs.io&#34;&gt;Patroni&lt;/a&gt; is the de-facto standard for&#xA;PostgreSQL high availability: it manages each postmaster&amp;rsquo;s lifecycle, streams&#xA;replication between members, and performs &lt;strong&gt;automatic failover&lt;/strong&gt; when the&#xA;leader is lost. pgcli exposes Patroni as a distinct mode — &lt;code&gt;pg ha&lt;/code&gt; — rather than&#xA;folding it into the plain &lt;code&gt;pg&lt;/code&gt; instance path.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;This is a separate mode, not an addon subcommand.&lt;/strong&gt; Patroni (not pgcli) owns&#xA;the PostgreSQL process. &lt;code&gt;pg ha&lt;/code&gt; members do &lt;strong&gt;not&lt;/strong&gt; appear in &lt;code&gt;cfg.Instances&lt;/code&gt;,&#xA;share no instance lifecycle code, and are not created by &lt;code&gt;pg create&lt;/code&gt;. The one&#xA;thing it borrows from the addon system is the &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/etcd/&#34;&gt;etcd&lt;/a&gt; DCS.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Patroni Dynamic Configuration</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha-dynamic/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha-dynamic/</guid>
        <description>&lt;p&gt;These parameters are stored in the DCS (etcd) under &lt;code&gt;/service/&amp;lt;scope&amp;gt;/config&lt;/code&gt; and&#xA;applied to &lt;strong&gt;every&lt;/strong&gt; member of the cluster. Modify them with &lt;code&gt;pg ha edit-config&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-36d98529-fence-0&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;3&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-36d98529-fence-0-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg ha edit-config app -- -s &lt;span class=&#34;nv&#34;&gt;loop_wait&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg ha edit-config app -- -s &lt;span class=&#34;s1&#34;&gt;&amp;#39;postgresql.parameters.max_connections=200&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg ha edit-config app --show          &lt;span class=&#34;c1&#34;&gt;# view current config&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Reference: &lt;a href=&#34;https://patroni.readthedocs.io/en/latest/dynamic_configuration.html&#34;&gt;Patroni official docs&lt;/a&gt;,&#xA;&lt;a href=&#34;https://pigsty.cc/docs/patroni/config/dynamic/&#34;&gt;Pigsty dynamic config&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;bootstrap.dcs&lt;/code&gt; is one-time.&lt;/strong&gt; The &lt;code&gt;bootstrap.dcs&lt;/code&gt; block in &lt;code&gt;patroni.yml&lt;/code&gt;&#xA;only takes effect when the &lt;strong&gt;first&lt;/strong&gt; member of a scope bootstraps the cluster.&#xA;Once Patroni writes the config into the DCS, subsequent changes to&#xA;&lt;code&gt;bootstrap.dcs&lt;/code&gt; in the YAML file are &lt;strong&gt;completely ignored&lt;/strong&gt; — even on&#xA;re-install (&lt;code&gt;pg ha create&lt;/code&gt;). Re-running &lt;code&gt;pg ha create&lt;/code&gt; does &lt;strong&gt;not&lt;/strong&gt; re-read&#xA;&lt;code&gt;bootstrap.dcs&lt;/code&gt; — Patroni sees the existing &lt;code&gt;config&lt;/code&gt; key in the DCS and uses&#xA;it directly.&lt;/p&gt;</description>
      </item>
    <item>
        <title>PostgREST</title>
        <link>https://pgcli.pages.dev/docs/addon/postgrest/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/postgrest/</guid>
        <description>&lt;p&gt;PostgREST is a single-process, stateless web server that turns a PostgreSQL&#xA;schema into a RESTful API. As a pgcli addon it runs as one container in front&#xA;of any PG endpoint — no data directory, no rendered config file, everything&#xA;configured through &lt;code&gt;PGRST_*&lt;/code&gt; environment variables.&lt;/p&gt;&#xA;&lt;p&gt;PostgREST is a &lt;strong&gt;proxy-type&lt;/strong&gt; addon like &lt;a href=&#34;../pgbouncer/&#34;&gt;PgBouncer&lt;/a&gt; and&#xA;&lt;a href=&#34;../pgdog/&#34;&gt;PgDog&lt;/a&gt;: it holds no state of its own. &lt;strong&gt;Two deployment modes&lt;/strong&gt;&#xA;mirror PgBouncer&amp;rsquo;s:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local:&lt;/strong&gt; &lt;code&gt;pg addon install postgrest -i &amp;lt;instance&amp;gt;&lt;/code&gt; — stored as a sidecar&#xA;under &lt;code&gt;instances.&amp;lt;name&amp;gt;.addons.postgrest&lt;/code&gt;, DSN built from the instance.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Remote:&lt;/strong&gt; &lt;code&gt;pg addon install postgrest --dsn &amp;lt;dsn&amp;gt; --pg-name &amp;lt;name&amp;gt;&lt;/code&gt; —&#xA;stored in top-level &lt;code&gt;addons.postgrest&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The &lt;code&gt;--dsn&lt;/code&gt; in either mode is passed verbatim into the container&amp;rsquo;s&#xA;&lt;code&gt;PGRST_DB_URI&lt;/code&gt;, so it works against &lt;strong&gt;any&lt;/strong&gt; PG endpoint: a direct managed&#xA;instance, a &lt;a href=&#34;../pgbouncer/&#34;&gt;PgBouncer&lt;/a&gt; pool, or a Patroni cluster behind its&#xA;&lt;a href=&#34;../haproxy/&#34;&gt;HAProxy&lt;/a&gt; listener.&lt;/p&gt;</description>
      </item>
    <item>
        <title>SeaweedFS</title>
        <link>https://pgcli.pages.dev/docs/addon/seaweedfs/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/seaweedfs/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://github.com/seaweedfs/seaweedfs&#34;&gt;SeaweedFS&lt;/a&gt; is a Go, Apache-2.0&#xA;S3-compatible object store whose defining trait is &lt;strong&gt;volume-granularity disk&#xA;management&lt;/strong&gt;: data is split into fixed-size &lt;em&gt;volumes&lt;/em&gt; (&lt;code&gt;.vol&lt;/code&gt; files) that the&#xA;master places across volumeservers, giving O(1) reads and cheap small-file&#xA;storage. pgcli runs it as a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt; with the same CLI&#xA;surface as &lt;a href=&#34;../garage/&#34;&gt;&lt;code&gt;garage&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;../minio/&#34;&gt;&lt;code&gt;minio&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;../silo/&#34;&gt;&lt;code&gt;silo&lt;/code&gt;&lt;/a&gt; and&#xA;&lt;a href=&#34;../rustfs/&#34;&gt;&lt;code&gt;rustfs&lt;/code&gt;&lt;/a&gt; (install, list, logs, autostart, password, &lt;code&gt;pg mc&lt;/code&gt;), but&#xA;its runtime model diverges in four ways that shape this page:&lt;/p&gt;</description>
      </item>
    <item>
        <title>Patroni REST API</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha-rest-api/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha-rest-api/</guid>
        <description>&lt;p&gt;Patroni exposes an HTTP REST API on each member, providing health check endpoints&#xA;(for load balancers and Kubernetes probes), monitoring data (including Prometheus&#xA;metrics), and cluster management operations.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Reference: &lt;a href=&#34;https://patroni.readthedocs.io/en/latest/rest_api.html&#34;&gt;Patroni official docs&lt;/a&gt;,&#xA;&lt;a href=&#34;https://pigsty.cc/docs/patroni/rest_api/&#34;&gt;Pigsty REST API&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;finding-the-rest-api&#34;&gt;Finding the REST API&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Each member&amp;rsquo;s REST API port is assigned automatically by pgcli and stored in&#xA;&lt;code&gt;pg.yaml&lt;/code&gt; under &lt;code&gt;addons.patroni.&amp;lt;scope&amp;gt;.members.&amp;lt;name&amp;gt;.restapi_port&lt;/code&gt;. The port&#xA;is also embedded in the rendered &lt;code&gt;patroni.yml&lt;/code&gt; as &lt;code&gt;restapi.connect_address&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;td-code td-code--untitled&#34; id=&#34;td-code-fb544c01-fence-0&#34; data-td-code data-td-code-auto-id&#xA;     data-td-language=&#34;bash&#34; data-td-line-count=&#34;2&#34;&gt;&#xA;  &lt;div class=&#34;td-code__viewport&#34; id=&#34;td-code-fb544c01-fence-0-viewport&#34; data-td-code-viewport&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Find REST API ports&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pg ha status app          &lt;span class=&#34;c1&#34;&gt;# shows pg= and rest= ports for each member&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h3 id=&#34;authentication&#34;&gt;Authentication&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;pgcli enables basic-auth on the REST API (username &lt;code&gt;postgres&lt;/code&gt;, auto-generated&#xA;password). But authentication is &lt;strong&gt;method-based&lt;/strong&gt;, not blanket:&lt;/p&gt;</description>
      </item>
    <item>
        <title>RustFS</title>
        <link>https://pgcli.pages.dev/docs/addon/rustfs/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/rustfs/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://github.com/rustfs/rustfs&#34;&gt;rustfs&lt;/a&gt; is a Rust reimplementation of&#xA;S3-compatible object storage: the same S3 API, a web console, erasure-coded&#xA;multi-drive and multi-node layouts — and a completely different runtime model&#xA;from MinIO/silo. pgcli runs it as a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt; with the&#xA;same CLI surface as &lt;a href=&#34;../minio/&#34;&gt;&lt;code&gt;minio&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;../silo/&#34;&gt;&lt;code&gt;silo&lt;/code&gt;&lt;/a&gt; (install, TLS,&#xA;BYO certs, drives, logs, autostart), sharing the one port pool, but with three&#xA;differences that shape this page:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;A fixed container user.&lt;/strong&gt; Upstream rustfs bakes &lt;code&gt;User=rustfs&lt;/code&gt; (uid/gid&#xA;10001) into the image. pgcli works around this entirely &lt;strong&gt;inside its own&#xA;wrapper image&lt;/strong&gt; — see &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/rustfs/#privileges-and-ownership&#34;&gt;Privileges and ownership&lt;/a&gt;&#xA;below — so a rustfs store needs no host-side ownership dance.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Three topologies, no multi-node single-drive.&lt;/strong&gt; rustfs speaks SNSD / SNMD&#xA;/ MNMD only — see &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/rustfs/#deployment-modes&#34;&gt;Deployment modes&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Its own TLS filenames.&lt;/strong&gt; rustfs reads &lt;code&gt;rustfs_cert.pem&lt;/code&gt; / &lt;code&gt;rustfs_key.pem&lt;/code&gt;&#xA;from &lt;code&gt;RUSTFS_TLS_PATH&lt;/code&gt;, not MinIO&amp;rsquo;s &lt;code&gt;public.crt&lt;/code&gt; / &lt;code&gt;private.key&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Pick rustfs when you want a lean, Rust-native S3 endpoint; it can coexist with&#xA;minio and silo on one host (all three draw from the same port pool).&lt;/p&gt;</description>
      </item>
    <item>
        <title>Extensions in HA Clusters</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha-extensions/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha-extensions/</guid>
        <description>&lt;p&gt;Installing PostgreSQL extensions in a Patroni-managed HA cluster is&#xA;fundamentally different from a single-node instance. This page explains why,&#xA;and walks through the &lt;code&gt;pg ha extension&lt;/code&gt; command subtree that handles it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-not-pg-extension-install&#34;&gt;Why not &lt;code&gt;pg extension install&lt;/code&gt;?&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The single-node flow (&lt;code&gt;pg extension install &amp;lt;instance&amp;gt; &amp;lt;ext&amp;gt;&lt;/code&gt;) works by:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Building a &lt;code&gt;-ext&lt;/code&gt; derived image with Pigsty packages&lt;/li&gt;&#xA;&lt;li&gt;Stopping and recreating the container from the new image&lt;/li&gt;&#xA;&lt;li&gt;Editing &lt;code&gt;postgresql.conf&lt;/code&gt; to set &lt;code&gt;shared_preload_libraries&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Running &lt;code&gt;CREATE EXTENSION&lt;/code&gt; inside the container&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;In a Patroni cluster, &lt;strong&gt;steps 2-4 all break&lt;/strong&gt;:&lt;/p&gt;</description>
      </item>
    <item>
        <title>HAProxy</title>
        <link>https://pgcli.pages.dev/docs/addon/haproxy/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/haproxy/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://www.haproxy.org&#34;&gt;HAProxy&lt;/a&gt; is the load balancer the Patroni docs&#xA;recommend putting in front of a cluster: clients connect to one stable address,&#xA;HAProxy health-checks each member&amp;rsquo;s REST API, and routes writes to the current&#xA;leader (and, in read/write-split mode, reads to the replicas). pgcli runs it as&#xA;a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt; — shared routing infrastructure, not a&#xA;per-instance sidecar — pinned to the official &lt;code&gt;haproxy:3.2.23-alpine&lt;/code&gt; image.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Platform support:&lt;/strong&gt; the HAProxy addon is &lt;strong&gt;Linux-only&lt;/strong&gt; for now. It reaches&#xA;Patroni members over the host network, which the macOS &lt;code&gt;podman machine&lt;/code&gt; does&#xA;not expose to containers. On macOS &lt;code&gt;NewHAProxyManager&lt;/code&gt; fails fast with a&#xA;clear message; &lt;code&gt;pg addon list&lt;/code&gt; still shows installed instances without live&#xA;status.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Silo</title>
        <link>https://pgcli.pages.dev/docs/addon/silo/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/silo/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://silo.pgsty.com&#34;&gt;silo&lt;/a&gt; is Pigsty&amp;rsquo;s maintained fork of MinIO: S3-compatible&#xA;object storage with the web console bundled in, keeping MinIO&amp;rsquo;s wire contract&#xA;end to end — the S3 API, the &lt;code&gt;MINIO_*&lt;/code&gt; environment variables, the&#xA;&lt;code&gt;server /data --address :9000 --console-address :9001&lt;/code&gt; command line, the&#xA;&lt;code&gt;--certs-dir&lt;/code&gt; layout, and erasure-coded cluster mode. pgcli runs it as a&#xA;&lt;strong&gt;standalone, top-level addon&lt;/strong&gt; with exactly the same surface as the&#xA;&lt;a href=&#34;../minio/&#34;&gt;&lt;code&gt;minio&lt;/code&gt; addon&lt;/a&gt; — install, TLS, BYO certs, distributed mode, logs,&#xA;autostart. Pick silo over MinIO if you follow Pigsty&amp;rsquo;s releases; the two can&#xA;coexist on one host (they share one port pool, assigned without collision).&lt;/p&gt;</description>
      </item>
    <item>
        <title>MinIO</title>
        <link>https://pgcli.pages.dev/docs/addon/minio/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/minio/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://min.io&#34;&gt;MinIO&lt;/a&gt; is S3-compatible object storage. pgcli runs it as a&#xA;&lt;strong&gt;standalone, top-level addon&lt;/strong&gt; — shared infrastructure, not a per-instance&#xA;sidecar — with the web console included. It defaults to &lt;strong&gt;single-node&lt;/strong&gt; mode and&#xA;supports a genuinely distributed &lt;strong&gt;cluster mode&lt;/strong&gt; across hosts&#xA;(&lt;a href=&#34;https://pgcli.pages.dev/docs/addon/minio/#distributed--cluster-mode&#34;&gt;see below&lt;/a&gt;). Either way it is a general-purpose&#xA;object store. &lt;a href=&#34;../silo/&#34;&gt;silo&lt;/a&gt; — Pigsty&amp;rsquo;s MinIO fork, kept wire-compatible —&#xA;is available as a sibling addon with the identical feature surface; the two&#xA;share one port pool and can coexist on a host.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Patroni Cluster Backup</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha-backup/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha-backup/</guid>
        <description>&lt;p&gt;This page walks the &lt;strong&gt;complete procedure for backing up a Patroni HA cluster&lt;/strong&gt;:&#xA;getting the backup infrastructure up with &lt;code&gt;pg backup setup&lt;/code&gt;, taking&#xA;full/incr/diff backups with &lt;code&gt;pg ha snapshot&lt;/code&gt;, and one operational pitfall — when a&#xA;replica&amp;rsquo;s &lt;code&gt;Replay LSN&lt;/code&gt; stalls and &lt;code&gt;pg ha status&lt;/code&gt; shows members disagreeing on LSN,&#xA;how to pull it back with &lt;code&gt;patronictl reinit&lt;/code&gt;. Command and mechanism details live in&#xA;&lt;a href=&#34;../ha/#backing-up-a-cross-host-leader&#34;&gt;Patroni HA&lt;/a&gt; and &lt;a href=&#34;../../backup/#s3-object-storage-repository&#34;&gt;Backup&lt;/a&gt;;&#xA;this page strings them into a path you can run end to end.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Redis</title>
        <link>https://pgcli.pages.dev/docs/addon/redis/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/redis/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://redis.io/&#34;&gt;Redis&lt;/a&gt; is the in-memory key-value store most applications&#xA;reach for when they need a cache, a session backend, leaderboards (sorted sets)&#xA;or atomic counters. pgcli runs it as a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt; with the&#xA;same CLI surface as the object stores (install / start / stop / logs /&#xA;autostart / remove), managed entirely through &lt;code&gt;pg.yaml&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;It is deliberately the simplest addon in the fleet:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;One container, one port, one password.&lt;/strong&gt; &lt;code&gt;requirepass&lt;/code&gt; is generated on the&#xA;first install and stored in &lt;code&gt;pg.yaml&lt;/code&gt; — an unauthenticated Redis is not a&#xA;reachable state.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Version selection.&lt;/strong&gt; It is the first version-selectable addon:&#xA;&lt;code&gt;--version 7|8&lt;/code&gt; resolves through a built-in table to a pinned&#xA;&lt;code&gt;docker.io/library/redis&lt;/code&gt; tag (7 → &lt;code&gt;7.4.11&lt;/code&gt;, 8 → &lt;code&gt;8.10.2&lt;/code&gt;, the default).&#xA;&lt;code&gt;--image&lt;/code&gt; still bypasses the table with any tag you like.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Persistence you can dial in.&lt;/strong&gt; By default the dataset is an RDB snapshot in&#xA;a bind-mounted host directory — it survives restarts, and survives&#xA;&lt;code&gt;pg addon remove&lt;/code&gt; (without &lt;code&gt;--clean-data&lt;/code&gt;) so reinstalling the same name&#xA;revives the data. &lt;code&gt;--aof&lt;/code&gt; adds the write-ahead log on top for crash-safe,&#xA;no-eviction stores, and &lt;code&gt;--save no&lt;/code&gt; turns snapshots off entirely (see&#xA;&lt;a href=&#34;https://pgcli.pages.dev/docs/addon/redis/#parameters&#34;&gt;Parameters&lt;/a&gt;).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Pick Redis for cache/session/ranking/counter workloads next to your PostgreSQL&#xA;instances; it is independent of the PG stack, coexists with any other addon,&#xA;and several instances (even across majors) can run on one host.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Patroni Cluster Restore</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha-restore/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha-restore/</guid>
        <description>&lt;p&gt;This page is the &lt;strong&gt;restore-side companion to &lt;a href=&#34;../ha-backup/&#34;&gt;Patroni Cluster Backup&lt;/a&gt;&lt;/strong&gt;.&#xA;Once a cluster has a stanza with WAL archiving (&lt;code&gt;pg backup setup&lt;/code&gt; + &lt;code&gt;pg ha snapshot&lt;/code&gt;),&#xA;&lt;code&gt;pg ha restore&lt;/code&gt; brings the whole cluster back to a point in time — the Patroni&#xA;counterpart of the single-instance &lt;a href=&#34;../../restore/&#34;&gt;&lt;code&gt;pg restore&lt;/code&gt;&lt;/a&gt;. It walks the&#xA;mechanism (why a cluster PITR is not just &lt;code&gt;pgbackrest restore&lt;/code&gt;), the safety&#xA;pre-check on where the leader lives, an end-to-end runbook, and the re-baseline&#xA;steps that must follow. Command/flag details also live in&#xA;&lt;a href=&#34;../../restore/#patroni-cluster&#34;&gt;Restore → Patroni cluster&lt;/a&gt;; this page strings them&#xA;into a procedure you can run.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Predixy</title>
        <link>https://pgcli.pages.dev/docs/addon/predixy/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/predixy/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://github.com/joyieldInc/predixy&#34;&gt;Predixy&lt;/a&gt; is a high-performance Redis&#xA;protocol proxy. pgcli runs it as a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt; whose job is&#xA;to take a &lt;a href=&#34;../redis/#native-cluster&#34;&gt;Redis native cluster&lt;/a&gt; — 3+ nodes, 16384&#xA;slots, &lt;code&gt;MOVED&lt;/code&gt; redirects — and hand it back to your applications as &lt;strong&gt;one plain&#xA;&lt;code&gt;redis://&lt;/code&gt; endpoint&lt;/strong&gt;. Clients do not need to be cluster-aware: no &lt;code&gt;-c&lt;/code&gt;, no&#xA;redirect handling, just connect and run commands.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Platform support:&lt;/strong&gt; like HAProxy and Redis, the Predixy addon needs &lt;strong&gt;Linux&#xA;host networking&lt;/strong&gt; to dial its backend nodes; it is not supported on macOS.&lt;/p&gt;</description>
      </item>
    <item>
        <title>HA Exec / psql</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha-exec/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha-exec/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg ha exec&lt;/code&gt; and &lt;code&gt;pg ha psql&lt;/code&gt; are the direct way to run SQL against a Patroni&#xA;cluster. They are the cluster-side twins of the single-instance&#xA;&lt;a href=&#34;../../exec-psql/&#34;&gt;&lt;code&gt;pg exec&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;../../exec-psql/&#34;&gt;&lt;code&gt;pg psql&lt;/code&gt;&lt;/a&gt;: you name&#xA;a scope, they resolve the target and connect. No &lt;code&gt;--dsn&lt;/code&gt; to hand-assemble, no&#xA;member container to &lt;code&gt;podman exec&lt;/code&gt; into, and — because the connection is plain TCP&#xA;— a leader or replica on &lt;strong&gt;another host&lt;/strong&gt; is just as reachable as a local one.&lt;/p&gt;</description>
      </item>
    <item>
        <title>pgAdmin 4</title>
        <link>https://pgcli.pages.dev/docs/addon/pgadmin/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/pgadmin/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://www.pgadmin.org/&#34;&gt;pgAdmin 4&lt;/a&gt; is PostgreSQL&amp;rsquo;s official web&#xA;administration UI — the browser console for browsing schemas, running SQL, and&#xA;watching servers. pgcli runs it as a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt; with the&#xA;same CLI surface as the other web/infra addons (install / start / stop / logs /&#xA;autostart / remove), managed entirely through &lt;code&gt;pg.yaml&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;It is the fleet&amp;rsquo;s one &lt;em&gt;UI&lt;/em&gt; addon, which shapes its design:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;A web app, not a database front.&lt;/strong&gt; pgAdmin dials the servers &lt;em&gt;you&lt;/em&gt; register&#xA;in its own UI; it does not front one specific PostgreSQL instance the way&#xA;&lt;a href=&#34;../postgrest/&#34;&gt;PostgREST&lt;/a&gt; or &lt;a href=&#34;../pgbouncer/&#34;&gt;PgBouncer&lt;/a&gt; do. That is why it is&#xA;a top-level-only addon (&lt;code&gt;addons.pgadmin.&amp;lt;name&amp;gt;&lt;/code&gt;) with no per-instance sidecar.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Its own login.&lt;/strong&gt; The web UI needs an email + password to sign in. That is&#xA;&lt;strong&gt;not&lt;/strong&gt; a PostgreSQL password — it is pgAdmin&amp;rsquo;s own account, auto-generated on&#xA;first install and stored in &lt;code&gt;pg.yaml&lt;/code&gt;. Retrieve it later with&#xA;&lt;code&gt;pg addon password pgadmin&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Persistent session store.&lt;/strong&gt; pgAdmin keeps its config, saved servers, and&#xA;browse history in a sqlite DB under a bind-mounted data dir. It survives&#xA;&lt;code&gt;pg addon remove&lt;/code&gt; (without &lt;code&gt;--clean-data&lt;/code&gt;) and is revived on reinstall.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Optional one-time seed.&lt;/strong&gt; &lt;code&gt;--dsn&lt;/code&gt; or &lt;code&gt;--pg-name &amp;lt;instance&amp;gt;&lt;/code&gt; pre-registers&#xA;one server in the UI&amp;rsquo;s &lt;code&gt;servers.json&lt;/code&gt; at install, so the browser opens with&#xA;that server already listed. It is a convenience, not a runtime coupling —&#xA;pgAdmin never blocks on it, and you can add/remove servers in the UI after.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Tip: one pgAdmin per database, spin up on demand.&lt;/strong&gt; A pgcli-managed&#xA;pgAdmin is a single lightweight container that starts in seconds and&#xA;consumes very little memory — cheap enough to treat as disposable. Rather&#xA;than running one shared pgAdmin with every server registered in it, create&#xA;a dedicated instance for the database you are working on right now, and&#xA;remove it when done:&lt;/p&gt;</description>
      </item>
    <item>
        <title>Example: HA Cluster with a Self-CA MinIO</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha-example-minio/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha-example-minio/</guid>
        <description>&lt;p&gt;This page is a &lt;strong&gt;worked example&lt;/strong&gt;, run end to end and verified: create a Patroni&#xA;HA cluster, stand up a MinIO addon that serves a &lt;strong&gt;bring-your-own domain&#xA;certificate&lt;/strong&gt; (a self-signed CA of our own making — the same shape as a&#xA;public-CA or corporate-CA cert, just without buying one), and point the cluster&amp;rsquo;s&#xA;pgBackRest backups and WAL archiving at it. Every command below is a real one&#xA;from the run; only hostnames, ports, passwords, and the certificate material are&#xA;genericized.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Nginx</title>
        <link>https://pgcli.pages.dev/docs/addon/nginx/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/nginx/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://nginx.org&#34;&gt;nginx&lt;/a&gt; is the HTTP reverse proxy that fronts multiple web&#xA;services — dashboards, APIs, admin panels — with path-based routing and&#xA;optional TLS termination. pgcli runs it as a &lt;strong&gt;standalone, top-level addon&lt;/strong&gt; with&#xA;the same CLI surface as the other web/infra addons (install / start / stop / logs&#xA;/ autostart / remove), managed entirely through &lt;code&gt;pg.yaml&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;It is the fleet&amp;rsquo;s HTTP &lt;em&gt;gateway&lt;/em&gt;, which shapes its design:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;A reverse proxy, not a load balancer.&lt;/strong&gt; Unlike &lt;a href=&#34;../haproxy/&#34;&gt;HAProxy&lt;/a&gt; — a&#xA;TCP load balancer in front of Patroni — nginx is an HTTP reverse proxy that&#xA;routes by URL path. Each &lt;code&gt;location&lt;/code&gt; block forwards to one upstream (web app,&#xA;API service, etc.), so clients reach multiple services through a single port.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;File-driven configuration.&lt;/strong&gt; pgcli renders &lt;code&gt;nginx.conf&lt;/code&gt; from the backends&#xA;you declare (or accepts a custom file via &lt;code&gt;--conf-file&lt;/code&gt;) and bind-mounts it&#xA;read-only into the official &lt;code&gt;nginx:1.27-alpine&lt;/code&gt; image. TLS is optional: when&#xA;enabled without a BYO cert, pgcli generates a self-signed leaf via &lt;code&gt;tlsca&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Independent log mounting.&lt;/strong&gt; Each backend gets its own access and error log&#xA;files (&lt;code&gt;access_&amp;lt;name&amp;gt;.log&lt;/code&gt;, &lt;code&gt;error_&amp;lt;name&amp;gt;.log&lt;/code&gt;) under a bind-mounted&#xA;&lt;code&gt;/var/log/nginx/&lt;/code&gt; directory, so per-service traffic is observable without&#xA;parsing a shared log.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Nginx-specific subcommands.&lt;/strong&gt; Beyond the generic addon lifecycle&#xA;(install/start/stop/remove), nginx exposes &lt;code&gt;test&lt;/code&gt; (validate config syntax via&#xA;&lt;code&gt;nginx -t&lt;/code&gt; using a temporary container), &lt;code&gt;reload&lt;/code&gt; (hot reload via&#xA;&lt;code&gt;nginx -s reload&lt;/code&gt;), and &lt;code&gt;exec&lt;/code&gt; (run arbitrary commands inside the container).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Platform support:&lt;/strong&gt; nginx works on both &lt;strong&gt;Linux&lt;/strong&gt; (host networking) and&#xA;&lt;strong&gt;macOS&lt;/strong&gt; (pgcli-net bridge with published ports). The upstream image is&#xA;multi-arch (amd64 + arm64), so any host architecture works.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Generating a Certificate — pg cert</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha-cert/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha-cert/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg cert&lt;/code&gt; mints a &lt;strong&gt;self-signed certificate&lt;/strong&gt; — its SubjectAltNames covering any&#xA;mix of DNS names and IP addresses you ask for — for any place you need TLS&#xA;without going through a CA: a dev or test server, an internal endpoint, a&#xA;service whose clients you control. The certificate it writes is a normal TLS&#xA;server leaf, usable anywhere.&lt;/p&gt;&#xA;&lt;p&gt;The use this docs tree exercises is pgBackRest&amp;rsquo;s S3 path: a Patroni cluster&amp;rsquo;s&#xA;backups push to an S3 store (MinIO or silo, typically) that must serve&#xA;&lt;strong&gt;TLS&lt;/strong&gt; — pgBackRest refuses plaintext S3 — and pgcli&amp;rsquo;s MinIO/silo addons can&#xA;serve a &lt;strong&gt;bring-your-own certificate&lt;/strong&gt; (&lt;code&gt;pg addon install minio --tls-cert ... --tls-key ...&lt;/code&gt;). The quickest way to get a cert to try that with is &lt;code&gt;pg cert&lt;/code&gt;:&lt;/p&gt;</description>
      </item>
    <item>
        <title>Grafana</title>
        <link>https://pgcli.pages.dev/docs/addon/grafana/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/grafana/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install grafana&lt;/code&gt; runs &lt;a href=&#34;https://grafana.com/oss/grafana/&#34;&gt;Grafana&lt;/a&gt; — the open-source observability dashboard — as a managed container from the official upstream image. Like pgAdmin it is a top-level addon: it is not attached to any one PostgreSQL instance and fronts none of them automatically — you add datasources and dashboards through the web UI. v1 ships the pure web UI: configuration is environment-only (the &lt;code&gt;GF_*&lt;/code&gt; variables), with no datasource or dashboard provisioning mounted.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Prometheus</title>
        <link>https://pgcli.pages.dev/docs/addon/prometheus/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/prometheus/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install prometheus&lt;/code&gt; runs &lt;a href=&#34;https://prometheus.io/&#34;&gt;Prometheus&lt;/a&gt; — the metrics collection and alerting backend — as a managed container from the official &lt;code&gt;docker.io/prom/prometheus&lt;/code&gt; image. Like Grafana it is a top-level addon: it fronts no single PostgreSQL instance (it scrapes many endpoints), so it is not attached to any one of them. The two are natural partners — Prometheus scrapes and stores, Grafana visualises — and share the same lifecycle shape (single container, host networking on Linux, one web port from its own pool, persistent data dir, autostart, logs).&lt;/p&gt;</description>
      </item>
    <item>
        <title>S3 Storage High Availability</title>
        <link>https://pgcli.pages.dev/docs/ha-cluster/ha-s3-storage/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/ha-cluster/ha-s3-storage/</guid>
        <description>&lt;p&gt;A Patroni cluster survives a node loss; the S3 repository its WAL and backups&#xA;stream into must survive one too, or &amp;ldquo;high availability&amp;rdquo; quietly ends at the&#xA;backup path. The store is a &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/minio/&#34;&gt;MinIO&lt;/a&gt; or&#xA;&lt;a href=&#34;https://pgcli.pages.dev/docs/addon/silo/&#34;&gt;silo&lt;/a&gt; addon (the two are interchangeable — silo is Pigsty&amp;rsquo;s&#xA;MinIO fork with the same feature surface). Two fault domains matter, and they&#xA;are &lt;strong&gt;orthogonal&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Fault&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Who absorbs it&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;A &lt;strong&gt;disk&lt;/strong&gt; dies inside a node&lt;/td&gt;&#xA;      &lt;td&gt;the drive-level EC under SNMD/MNMD, or the storage layer under MinIO&amp;rsquo;s data directory (ZFS)&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;A &lt;strong&gt;node&lt;/strong&gt; dies entirely&lt;/td&gt;&#xA;      &lt;td&gt;MinIO&amp;rsquo;s own erasure coding (EC) across hosts&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;This page records the shapes pgcli supports for combining the two, and how to&#xA;pick among them.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Alertmanager</title>
        <link>https://pgcli.pages.dev/docs/addon/alertmanager/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/alertmanager/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install alertmanager&lt;/code&gt; runs &lt;a href=&#34;https://prometheus.io/docs/alerting/latest/alertmanager/&#34;&gt;Alertmanager&lt;/a&gt; — the alert deduplication, grouping, routing and notification layer that sits downstream of Prometheus — as a managed container from the official &lt;code&gt;docker.io/prom/alertmanager&lt;/code&gt; image. Like Prometheus and Grafana it is a top-level addon: it fronts no single PostgreSQL instance, so it is not attached to any one of them. Prometheus and Alertmanager are the natural pair — Prometheus fires alerts, Alertmanager decides who gets notified and how — and this addon is Prometheus&amp;rsquo;s near-exact twin in shape (single container, host networking on Linux, one web port from its own pool, persistent data dir, autostart, logs, rendered config file + trailing CLI flags, SIGHUP reload, no web login).&lt;/p&gt;</description>
      </item>
    <item>
        <title>Gitea</title>
        <link>https://pgcli.pages.dev/docs/addon/gitea/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/gitea/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install gitea&lt;/code&gt; runs &lt;a href=&#34;https://about.gitea.com/&#34;&gt;Gitea&lt;/a&gt; — the&#xA;lightweight self-hosted Git service — as a managed container from the official&#xA;upstream image (&lt;code&gt;docker.io/gitea/gitea&lt;/code&gt;, rootful build). Like Grafana it is a&#xA;top-level addon: it is not attached to any one PostgreSQL instance — it fronts&#xA;none, though it can &lt;em&gt;use&lt;/em&gt; one as its metadata database (see &lt;code&gt;--dsn&lt;/code&gt; below).&#xA;One container serves the web UI, the Git HTTP traffic, and git-over-ssh on the&#xA;image&amp;rsquo;s OpenSSH &lt;code&gt;sshd&lt;/code&gt; (see &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/gitea/#git-ssh-optional&#34;&gt;Git SSH&lt;/a&gt; — that &lt;code&gt;sshd&lt;/code&gt; runs on&#xA;every instance whether or not &lt;code&gt;--ssh-port&lt;/code&gt; is set; the flag only makes it the&#xA;&lt;em&gt;live&lt;/em&gt; clone endpoint).&lt;/p&gt;</description>
      </item>
    <item>
        <title>VictoriaMetrics</title>
        <link>https://pgcli.pages.dev/docs/addon/victoriametrics/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/victoriametrics/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install victoriametrics&lt;/code&gt; runs &lt;a href=&#34;https://victoriametrics.com/&#34;&gt;VictoriaMetrics&lt;/a&gt; — a fast, Prometheus-compatible time-series database — as a managed container from the official &lt;code&gt;docker.io/victoriametrics/victoria-metrics&lt;/code&gt; image. Like Prometheus and Grafana it is a top-level addon: it fronts no single PostgreSQL instance (it ingests metrics from many sources), so it is not attached to any one of them. The three are natural partners — Prometheus scrapes, VictoriaMetrics stores long-term with superior compression, Grafana visualises — and share the same lifecycle shape (single container, host networking on Linux, one web port from its own pool, persistent data dir, autostart, logs).&lt;/p&gt;</description>
      </item>
    <item>
        <title>BeeGFS</title>
        <link>https://pgcli.pages.dev/docs/addon/beegfs/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/beegfs/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://www.beegfs.io/&#34;&gt;BeeGFS&lt;/a&gt; is a &lt;strong&gt;parallel filesystem&lt;/strong&gt; that chose the&#xA;easy route. It was born in 2004 at Fraunhofer ITWM in Germany — a research&#xA;group that needed Lustre, found its deployment and operations too heavy, and&#xA;wrote its own instead, with the goal set from day one: not the biggest scale,&#xA;but the least human effort to deploy and run. In 2014 the core team spun out&#xA;as the commercial company ThinkParQ, the product was renamed BeeGFS, and it&#xA;grew from an institute-internal tool into the shared storage you find on many&#xA;European universities and regional supercomputers.&lt;/p&gt;</description>
      </item>
    <item>
        <title>VMCluster</title>
        <link>https://pgcli.pages.dev/docs/addon/vmcluster/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/vmcluster/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install vmcluster&lt;/code&gt; runs &lt;a href=&#34;https://docs.victoriametrics.com/cluster-victoriametrics/&#34;&gt;VictoriaMetrics cluster edition&lt;/a&gt; — three components each in its own container from the official &lt;code&gt;docker.io/victoriametrics/{vminsert,vmselect,vmstorage}:v1.154.1-cluster&lt;/code&gt; images. Unlike the single-node &lt;code&gt;victoriametrics&lt;/code&gt; addon (one container, one port), this manages up to three containers with three separate images and five ports, supporting cross-host deployment and horizontal scaling.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Component&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Role&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;HTTP Port&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Internal TCP&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;vminsert&lt;/td&gt;&#xA;      &lt;td&gt;Ingestion — shards writes across all vmstorage nodes by metric hash&lt;/td&gt;&#xA;      &lt;td&gt;8480&lt;/td&gt;&#xA;      &lt;td&gt;Dials vmstorage:InternalInsertPort&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;vmselect&lt;/td&gt;&#xA;      &lt;td&gt;Queries — merges results from all vmstorage nodes&lt;/td&gt;&#xA;      &lt;td&gt;8481&lt;/td&gt;&#xA;      &lt;td&gt;Dials vmstorage:InternalSelectPort&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;vmstorage&lt;/td&gt;&#xA;      &lt;td&gt;Data storage (sharded, replicable)&lt;/td&gt;&#xA;      &lt;td&gt;8482&lt;/td&gt;&#xA;      &lt;td&gt;Listens on InternalInsertPort + InternalSelectPort&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;There is NO web login/password.&lt;/strong&gt; Like the single-node VictoriaMetrics, the&#xA;cluster edition ships &lt;strong&gt;no authentication at all&lt;/strong&gt;. Its HTTP API runs arbitrary&#xA;MetricsQL (a superset of PromQL), so remote-exposed instances are guarded&#xA;&lt;strong&gt;only by the network boundary&lt;/strong&gt; — your firewall, or &lt;code&gt;--listen 127.0.0.1&lt;/code&gt; for&#xA;loopback. Treat it like an unauthenticated read/write console.&lt;/p&gt;</description>
      </item>
    <item>
        <title>JuiceFS</title>
        <link>https://pgcli.pages.dev/docs/addon/juicefs/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/juicefs/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://juicefs.com/&#34;&gt;JuiceFS&lt;/a&gt; puts a real POSIX filesystem on top of object&#xA;storage: file data is split into chunks and stored in an S3 bucket, while a&#xA;separate &lt;strong&gt;metadata engine&lt;/strong&gt; (SQLite, Redis, PostgreSQL…) keeps the namespace,&#xA;file attributes and chunk maps. You get an ordinary directory you can &lt;code&gt;ls&lt;/code&gt;,&#xA;&lt;code&gt;cat&lt;/code&gt; and &lt;code&gt;grep&lt;/code&gt; — every write eventually lands as immutable objects in the&#xA;bucket. It solves the &amp;ldquo;I want a filesystem, but the bytes should live in S3&amp;rdquo;&#xA;problem: snapshots are cheap (objects are immutable), capacity is the bucket&amp;rsquo;s,&#xA;and the same bucket can be re-mounted from any host that knows the metadata&#xA;URL.&lt;/p&gt;</description>
      </item>
    <item>
        <title>VictoriaLogs</title>
        <link>https://pgcli.pages.dev/docs/addon/victorialogs/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/victorialogs/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install victorialogs&lt;/code&gt; runs &lt;a href=&#34;https://docs.victoriametrics.com/victorialogs/&#34;&gt;VictoriaLogs&lt;/a&gt; — a fast, cost-effective log database from the VictoriaMetrics family — as a managed container from the official &lt;code&gt;docker.io/victoriametrics/victoria-logs&lt;/code&gt; image. Like VictoriaMetrics and Prometheus it is a top-level addon: it fronts no single PostgreSQL instance (it ingests logs from many sources), so it is not attached to any one of them. VictoriaMetrics keeps metrics, VictoriaLogs keeps logs, Grafana visualises both — and all three share the same lifecycle shape (single container, host networking on Linux, one web port from its own pool, persistent data dir, restart policy).&lt;/p&gt;</description>
      </item>
    <item>
        <title>vlagent</title>
        <link>https://pgcli.pages.dev/docs/addon/vlagent/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/vlagent/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install vlagent&lt;/code&gt; runs &lt;a href=&#34;https://docs.victoriametrics.com/victorialogs/vlagent/&#34;&gt;vlagent&lt;/a&gt; — the official log agent of the VictoriaLogs family and the &lt;strong&gt;log&lt;/strong&gt; counterpart of &lt;code&gt;vmagent&lt;/code&gt; — as a managed container from the official &lt;code&gt;docker.io/victoriametrics/vlagent&lt;/code&gt; image. It is a top-level addon (it fronts no single PostgreSQL instance) and the natural partner of the &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/victorialogs/&#34;&gt;VictoriaLogs addon&lt;/a&gt;: VictoriaLogs stores logs, vlagent collects them from files or over HTTP and forwards them to one or more VictoriaLogs instances.&lt;/p&gt;&#xA;&lt;p&gt;Like VictoriaMetrics and VictoriaLogs there is &lt;strong&gt;no config file at all&lt;/strong&gt; — everything is passed as CLI flags after the image name. pgcli adds the file-collector wiring on top: every &lt;code&gt;--log-path&lt;/code&gt; is bind-mounted &lt;strong&gt;read-only at the same absolute path&lt;/strong&gt; inside the container, and &lt;code&gt;--include&lt;/code&gt;/&lt;code&gt;--exclude&lt;/code&gt; select files using vlagent&amp;rsquo;s &lt;strong&gt;native glob syntax&lt;/strong&gt; (not regular expressions).&lt;/p&gt;</description>
      </item>
    <item>
        <title>VLCluster</title>
        <link>https://pgcli.pages.dev/docs/addon/vlcluster/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/vlcluster/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install vlcluster&lt;/code&gt; runs &lt;a href=&#34;https://docs.victoriametrics.com/victorialogs/cluster/&#34;&gt;VictoriaLogs cluster edition&lt;/a&gt; — the horizontally scalable log database. Unlike the single-node &lt;code&gt;victorialogs&lt;/code&gt; addon (one container, one port), this manages up to three containers from &lt;strong&gt;the same image&lt;/strong&gt; (&lt;code&gt;docker.io/victoriametrics/victoria-logs:v1.53.0&lt;/code&gt;) and three HTTP ports per host. The role is selected entirely by flags.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;td-table-scroll td-table-scroll--static&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Component&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Role&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;HTTP Port&lt;/th&gt;&#xA;      &lt;th scope=&#34;col&#34;&gt;Talks to&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;vlinsert&lt;/td&gt;&#xA;      &lt;td&gt;Ingestion — shards writes across all vlstorage nodes by stream hash&lt;/td&gt;&#xA;      &lt;td&gt;9430&lt;/td&gt;&#xA;      &lt;td&gt;Dials every &lt;code&gt;vlstorage:StoragePort&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;vlselect&lt;/td&gt;&#xA;      &lt;td&gt;Queries — fans out LogsQL and merges results&lt;/td&gt;&#xA;      &lt;td&gt;9431&lt;/td&gt;&#xA;      &lt;td&gt;Dials every &lt;code&gt;vlstorage:StoragePort&lt;/code&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;vlstorage&lt;/td&gt;&#xA;      &lt;td&gt;Data storage (sharded, &lt;strong&gt;not replicated&lt;/strong&gt;)&lt;/td&gt;&#xA;      &lt;td&gt;9432&lt;/td&gt;&#xA;      &lt;td&gt;Serves &lt;code&gt;/internal/insert&lt;/code&gt; + &lt;code&gt;/internal/select/*&lt;/code&gt; on that one port&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;vlinsert and vlselect are stateless and dial the &lt;strong&gt;same single port&lt;/strong&gt; on each vlstorage node; there are no separate internal TCP ports like VMCluster&amp;rsquo;s &lt;code&gt;host:insertPort:selectPort&lt;/code&gt;. A storage node address is therefore just &lt;code&gt;host:storagePort&lt;/code&gt;.&lt;/p&gt;</description>
      </item>
    <item>
        <title>ZeroFS</title>
        <link>https://pgcli.pages.dev/docs/addon/zerofs/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/zerofs/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://github.com/Barre/ZeroFS&#34;&gt;ZeroFS&lt;/a&gt; is an S3-backed filesystem that&#xA;keeps &lt;strong&gt;everything inside the bucket&lt;/strong&gt;: instead of JuiceFS&amp;rsquo;s external metadata&#xA;engine, it runs its own LSM tree directly on object storage, and every object&#xA;is encrypted with a per-volume data key wrapped by your &lt;strong&gt;encryption&#xA;password&lt;/strong&gt;. Snapshots and consistency are handled by background compaction —&#xA;there is no database to back up, no Redis to keep alive. You lose neither&#xA;property than a normal filesystem gives you (it mounts via FUSE through a&#xA;local 9P hop), and the bucket alone is a complete, encrypted copy of the&#xA;volume.&lt;/p&gt;</description>
      </item>
    <item>
        <title>DuckDB</title>
        <link>https://pgcli.pages.dev/docs/addon/duckdb/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/duckdb/</guid>
        <description>&lt;p&gt;&lt;a href=&#34;https://duckdb.org/&#34;&gt;DuckDB&lt;/a&gt; is an embedded analytical database — often called&#xA;&amp;ldquo;SQLite for analytics&amp;rdquo;. It is a C++ columnar engine with vectorised execution&#xA;that queries Parquet, CSV, JSON and Arrow files directly, without a server&#xA;process. Think of it as a single-binary OLAP engine you point at your data:&#xA;&lt;code&gt;SELECT * FROM read_parquet(&#39;s3://bucket/data.parquet&#39;)&lt;/code&gt; works out of the box&#xA;once the &lt;code&gt;httpfs&lt;/code&gt; extension is loaded.&lt;/p&gt;&#xA;&lt;p&gt;As a pgcli addon, DuckDB is a &lt;strong&gt;host-binary&lt;/strong&gt; addon: there is no container and&#xA;no daemon. &lt;code&gt;pg addon install duckdb&lt;/code&gt; downloads the official CLI zip from GitHub&#xA;releases (sha256-verified; a &lt;code&gt;duckdb&lt;/code&gt; already on &lt;code&gt;PATH&lt;/code&gt; is reused), installs&#xA;the &lt;code&gt;httpfs&lt;/code&gt; extension (parquet and json are bundled in the binary), and&#xA;records the entry in &lt;code&gt;pg.yaml&lt;/code&gt;.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Node_exporter</title>
        <link>https://pgcli.pages.dev/docs/addon/nodeexporter/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/nodeexporter/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install nodeexporter&lt;/code&gt; runs &lt;a href=&#34;https://github.com/prometheus/node_exporter&#34;&gt;node_exporter&lt;/a&gt; — the official Prometheus exporter that publishes the &lt;strong&gt;host&amp;rsquo;s&lt;/strong&gt; CPU, memory, disk, network and filesystem metrics at &lt;code&gt;/metrics&lt;/code&gt; — as a managed container from the official &lt;code&gt;docker.io/prom/node-exporter&lt;/code&gt; image. Like Prometheus, VictoriaMetrics and Grafana it is a top-level addon: it describes the machine, not one PostgreSQL instance, so it is attached to none of them. It is the natural companion to a pgcli &lt;a href=&#34;../prometheus/&#34;&gt;Prometheus&lt;/a&gt; addon — node_exporter exposes, Prometheus scrapes.&lt;/p&gt;</description>
      </item>
    <item>
        <title>InfluxDB</title>
        <link>https://pgcli.pages.dev/docs/addon/influxdb/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/influxdb/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install influxdb&lt;/code&gt; runs &lt;strong&gt;InfluxDB 1.13.1 OSS&lt;/strong&gt; — a single-node time-series database with TSM storage and InfluxQL — as a managed container from pgcli&amp;rsquo;s own &lt;code&gt;ghcr.io/mars-base/pgcli/pgcli-influxdb&lt;/code&gt; image (the official linux/amd64 release binaries on Alpine). Like VictoriaMetrics, it is a top-level addon: it does not front a PostgreSQL instance.&lt;/p&gt;&#xA;&lt;p&gt;The addon is &lt;strong&gt;Linux/amd64 only&lt;/strong&gt; (the image is single-arch). InfluxDB 1.x has &lt;strong&gt;no clustering/HA&lt;/strong&gt;, &lt;strong&gt;no built-in web UI&lt;/strong&gt;, and upstream has put v1 into maintenance mode; pgcli pins the final 1.13.1 release. For new deployments consider &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/victoriametrics/&#34;&gt;VictoriaMetrics&lt;/a&gt; or &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/victorialogs/&#34;&gt;VictoriaLogs&lt;/a&gt; if you need a maintained, auth-free-but-modern engine; InfluxDB 1.x remains a good fit when you need InfluxQL compatibility with existing tooling.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Pg_exporter</title>
        <link>https://pgcli.pages.dev/docs/addon/pgexporter/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/pgexporter/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install pgexporter&lt;/code&gt; runs &lt;a href=&#34;https://pigsty.cc/docs/pg_exporter/&#34;&gt;pg_exporter&lt;/a&gt; — Pigsty&amp;rsquo;s PostgreSQL metrics exporter — as a managed container from the official &lt;code&gt;docker.io/pgsty/pg_exporter&lt;/code&gt; image. Where the &lt;a href=&#34;../nodeexporter/&#34;&gt;node_exporter&lt;/a&gt; addon describes the &lt;strong&gt;machine&lt;/strong&gt;, pg_exporter describes a &lt;strong&gt;database&lt;/strong&gt;: it connects to a PostgreSQL server and publishes ~460 &lt;code&gt;pg_*&lt;/code&gt; metrics (activity, locks, replication, bloat, WAL, per-database stats…) at &lt;code&gt;/metrics&lt;/code&gt;. Like Prometheus, VictoriaMetrics, Grafana and node_exporter it is a &lt;strong&gt;top-level addon&lt;/strong&gt;: it is attached to no instance of its own — instead it &lt;em&gt;points at&lt;/em&gt; a target it monitors.&lt;/p&gt;</description>
      </item>
    <item>
        <title>influx2tsdb</title>
        <link>https://pgcli.pages.dev/docs/addon/influx2tsdb/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/influx2tsdb/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install influx2tsdb&lt;/code&gt; runs &lt;strong&gt;influx2tsdb-proxy 1.3.2&lt;/strong&gt; — an InfluxDB 1.x&#xA;HTTP API adapter (Line Protocol writes and InfluxQL queries) that stores data in&#xA;PostgreSQL with the TimescaleDB extension — as a managed container from pgcli&amp;rsquo;s own&#xA;&lt;code&gt;ghcr.io/mars-base/pgcli/pgcli-influx2tsdb&lt;/code&gt; image. Unlike the &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/influxdb/&#34;&gt;InfluxDB addon&lt;/a&gt;,&#xA;there is no TSM engine: every point lives in a TimescaleDB hypertable, and the proxy&#xA;itself is &lt;strong&gt;stateless&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The add-on is &lt;strong&gt;Linux/amd64 only&lt;/strong&gt; (the image is single-arch, built from the upstream&#xA;release binary on &lt;code&gt;debian:12-slim&lt;/code&gt;). The proxy container can be recreated at any time;&#xA;the data survives because PostgreSQL holds it.&lt;/p&gt;</description>
      </item>
    <item>
        <title>ClickHouse</title>
        <link>https://pgcli.pages.dev/docs/addon/clickhouse/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/clickhouse/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install clickhouse&lt;/code&gt; runs &lt;strong&gt;ClickHouse 26.8 LTS&lt;/strong&gt; — a single-node columnar OLAP database — as a managed container from the official &lt;code&gt;docker.io/clickhouse/clickhouse-server&lt;/code&gt; multi-arch image. Like VictoriaMetrics and InfluxDB, it is a &lt;strong&gt;top-level addon&lt;/strong&gt;: it does not front a PostgreSQL instance.&lt;/p&gt;&#xA;&lt;p&gt;ClickHouse speaks two protocols on two ports: &lt;strong&gt;HTTP&lt;/strong&gt; (curl, JDBC/ODBC, many drivers) and the &lt;strong&gt;native TCP protocol&lt;/strong&gt; (&lt;code&gt;clickhouse-client&lt;/code&gt;). pgcli runs it with host networking, so both are plain host ports. &lt;strong&gt;Authentication is always enabled&lt;/strong&gt; — the install creates an admin account and stores its password in &lt;code&gt;pg.yaml&lt;/code&gt;.&lt;/p&gt;</description>
      </item>
    <item>
        <title>Kafka</title>
        <link>https://pgcli.pages.dev/docs/addon/kafka/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/kafka/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install kafka&lt;/code&gt; runs &lt;strong&gt;Apache Kafka 4.4.0&lt;/strong&gt; as a managed container from the official &lt;code&gt;docker.io/apache/kafka&lt;/code&gt; multi-arch image. Kafka 4.x is &lt;strong&gt;KRaft-only&lt;/strong&gt;: the metadata controller is built into the broker process (&lt;code&gt;process.roles=broker,controller&lt;/code&gt;, combined mode) and &lt;strong&gt;ZooKeeper is not installed or used&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Like ClickHouse, Kafka is a &lt;strong&gt;top-level addon&lt;/strong&gt; — it does not front a PostgreSQL instance. pgcli renders &lt;code&gt;server.properties&lt;/code&gt;, pins a KRaft cluster id, bind-mounts the data directory and runs the container on the host network. A single command installs a &lt;strong&gt;single combined node&lt;/strong&gt;; adding &lt;code&gt;--cluster&lt;/code&gt;, &lt;code&gt;--node-id&lt;/code&gt; and &lt;code&gt;--peer&lt;/code&gt; installs one node of a &lt;strong&gt;multi-host static controller quorum&lt;/strong&gt;, with every host running its own &lt;code&gt;pg addon install kafka&lt;/code&gt; (pgcli never SSHes). See &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/kafka/#multi-host-cluster&#34;&gt;Multi-host cluster&lt;/a&gt;.&lt;/p&gt;</description>
      </item>
    <item>
        <title>RabbitMQ</title>
        <link>https://pgcli.pages.dev/docs/addon/rabbitmq/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/rabbitmq/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install rabbitmq&lt;/code&gt; runs &lt;strong&gt;RabbitMQ 4.4.0&lt;/strong&gt; as a managed container from the official &lt;code&gt;docker.io/library/rabbitmq&lt;/code&gt; image (the &lt;code&gt;-management&lt;/code&gt; variant, which bundles the web UI and HTTP API). Like Kafka and ClickHouse, RabbitMQ is a &lt;strong&gt;top-level addon&lt;/strong&gt;: pgcli renders &lt;code&gt;rabbitmq.conf&lt;/code&gt;, owns the administrator account, bind-mounts the data directory and runs the container on the host network.&lt;/p&gt;&#xA;&lt;p&gt;The addon runs &lt;strong&gt;either a single node or one member of a multi-host cluster&lt;/strong&gt;. Clustering uses &lt;strong&gt;etcd peer discovery&lt;/strong&gt; (&lt;code&gt;rabbitmq_peer_discovery_etcd&lt;/code&gt;): you install one member per host with the same &lt;code&gt;--cluster&lt;/code&gt; name and the list of etcd endpoints, and the members find each other on first boot — no static peer list and no manual &lt;code&gt;join_cluster&lt;/code&gt;. Federation, shovel, MQTT and STOMP are not configured; advanced administration (vhosts, users, permissions, policies and exchanges) is done through the management UI or &lt;code&gt;pg addon rabbitmq shell&lt;/code&gt; + &lt;code&gt;rabbitmqctl&lt;/code&gt;. Common queue operations are wrapped by &lt;code&gt;pg addon rabbitmq queue&lt;/code&gt; (see &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/rabbitmq/#queues-and-messages&#34;&gt;Queues and messages&lt;/a&gt;). In cluster mode &lt;code&gt;declare&lt;/code&gt; creates &lt;strong&gt;quorum&lt;/strong&gt; queues by default (see &lt;a href=&#34;https://pgcli.pages.dev/docs/addon/rabbitmq/#clustering&#34;&gt;Clustering&lt;/a&gt;).&lt;/p&gt;</description>
      </item>
    <item>
        <title>RocketMQ</title>
        <link>https://pgcli.pages.dev/docs/addon/rocketmq/</link>
        <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
        
        <guid>https://pgcli.pages.dev/docs/addon/rocketmq/</guid>
        <description>&lt;p&gt;&lt;code&gt;pg addon install rocketmq&lt;/code&gt; runs &lt;strong&gt;Apache RocketMQ 5.x&lt;/strong&gt; as a managed addon from the official &lt;code&gt;docker.io/apache/rocketmq&lt;/code&gt; image. Like Kafka, ClickHouse and RabbitMQ it is a &lt;strong&gt;top-level addon&lt;/strong&gt; that does not front a PostgreSQL instance.&lt;/p&gt;&#xA;&lt;p&gt;Each instance is &lt;strong&gt;three containers on the host network&lt;/strong&gt;: a &lt;strong&gt;NameServer&lt;/strong&gt;, a &lt;strong&gt;broker&lt;/strong&gt; and a &lt;strong&gt;proxy&lt;/strong&gt;. The same shape is used in both modes, so ports, commands, logs and lifecycle behave identically:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Standalone&lt;/strong&gt; — one NameServer with no controller, one async master broker with no replicas, and a proxy. This is the quickest way to send and receive messages. The 4.x master/slave and DLedger broker deployment modes are &lt;strong&gt;not&lt;/strong&gt; used.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Multi-host cluster&lt;/strong&gt; — every NameServer embeds a &lt;strong&gt;DLedger (Raft) controller&lt;/strong&gt;, the brokers run in &lt;strong&gt;controller mode&lt;/strong&gt;, and one broker is elected master while another takes over automatically when it fails. The proxy is the client entry point. This is RocketMQ 5.x&amp;rsquo;s auto-failover deployment mode.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;There is no authentication and no TLS.&lt;/strong&gt; RocketMQ listens on host networking, and cluster ports are fixed. Anyone who can reach the NameServer, broker or proxy ports can read and write every topic. Run it only on a trusted private network or behind a firewall that restricts &lt;code&gt;9876&lt;/code&gt;, &lt;code&gt;9877&lt;/code&gt;, &lt;code&gt;10911&lt;/code&gt;, &lt;code&gt;10912&lt;/code&gt;, &lt;code&gt;8080&lt;/code&gt; and &lt;code&gt;8081&lt;/code&gt;. There is also no web UI and no ACL in this addon.&lt;/p&gt;</description>
      </item>
    
  </channel>
</rss>
