# supabase

> 使用 Pigsty 托管的 PostgreSQL 自建 Supabase 开源 Firebase 替代方案

---

LLMS index: [llms.txt](/llms.txt)

---

`supabase` 配置模板提供了自建 Supabase 的参考配置，使用 Pigsty 托管的 PostgreSQL 作为底层存储。

更多细节，请参考 **[Supabase 自建教程](/docs/app/supabase/)**


--------

## 配置概览

- 配置名称： `supabase`
- 节点数量： 单节点
- 配置说明：使用 Pigsty 托管的 PostgreSQL 自建 Supabase
- 适用系统：`el8`, `el9`, `d12`, `u22`, `u24`, `u26`
- 适用架构：`x86_64`, `aarch64`
- PostgreSQL：`15`, `16`, `17`, `18`（模板默认 `18`）
- 相关配置：[`meta`](/docs/conf/meta/)，[`rich`](/docs/conf/rich/)

启用方式：

```bash
./configure -c supabase [-i <primary_ip>]
```


--------

## 配置内容

源文件地址：[`pigsty/conf/supabase.yml`](https://github.com/pgsty/pigsty/blob/main/conf/supabase.yml)

<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#==============================================================#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># File      :   supabase.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Desc      :   Pigsty configuration for self-hosting supabase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Ctime     :   2023-09-19</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Mtime     :   2026-07-09</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Docs      :   https://pigsty.io/docs/conf/supabase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># License   :   Apache-2.0 @ https://pigsty.io/docs/about/license/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Copyright :   2018-2026  Ruohang Feng / Vonng (rh@vonng.com)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#==============================================================#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># supabase is available on el8/el9/u22/u24/u26/d12 with pg15,16,17,18</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># tutorial: https://pigsty.io/docs/app/supabase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Usage:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   curl https://repo.pigsty.io/get | bash    # install pigsty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ./configure -c supabase   # use this supabase conf template</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ./deploy.yml              # install pigsty &amp; pgsql &amp; minio</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ./docker.yml              # install docker &amp; docker compose</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ./app.yml                 # launch supabase with docker compose</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">all</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">children</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># INFRA : https://pigsty.io/docs/infra</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">infra</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.10</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">infra_seq</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">repo_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">    </span><span class="c"># disable local repo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># ETCD : https://pigsty.io/docs/etcd</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">etcd</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.10</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">etcd_seq</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">etcd_cluster</span><span class="p">:</span><span class="w"> </span><span class="l">etcd</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">etcd_safeguard</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">  </span><span class="c"># enable to prevent purging running etcd instance</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># MINIO : https://pigsty.io/docs/minio</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">minio</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.10</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">minio_seq</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">minio_cluster</span><span class="p">:</span><span class="w"> </span><span class="l">minio</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">minio_users</span><span class="p">:</span><span class="w">                      </span><span class="c"># list of minio user to be created</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">access_key</span><span class="p">:</span><span class="w"> </span><span class="nt">pgbackrest  ,secret_key</span><span class="p">:</span><span class="w"> </span><span class="nt">S3User.Backup ,policy</span><span class="p">:</span><span class="w"> </span><span class="l">pgsql }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">access_key</span><span class="p">:</span><span class="w"> </span><span class="nt">s3user_meta ,secret_key</span><span class="p">:</span><span class="w"> </span><span class="nt">S3User.Meta   ,policy</span><span class="p">:</span><span class="w"> </span><span class="l">meta  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">access_key</span><span class="p">:</span><span class="w"> </span><span class="nt">s3user_data ,secret_key</span><span class="p">:</span><span class="w"> </span><span class="nt">S3User.Data   ,policy</span><span class="p">:</span><span class="w"> </span><span class="l">data  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># PostgreSQL cluster for Supabase self-hosting</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg-meta</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.10</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">pg_seq</span><span class="p">:</span><span class="w"> </span><span class="nt">1, pg_role</span><span class="p">:</span><span class="w"> </span><span class="l">primary }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">pg_cluster</span><span class="p">:</span><span class="w"> </span><span class="l">pg-meta</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">pg_users</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="c"># supabase roles: anon, authenticated, dashboard_user</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">anon           ,login</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">authenticated  ,login</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">dashboard_user ,login</span><span class="p">:</span><span class="w"> </span><span class="nt">false ,replication</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,createdb</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,createrole</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">service_role   ,login</span><span class="p">:</span><span class="w"> </span><span class="nt">false ,bypassrls</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="c"># supabase users: please use the same password</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">supabase_admin             ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;DBUser.Supa&#39; ,pgbouncer</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,inherit</span><span class="p">:</span><span class="w"> </span><span class="nt">true   ,roles</span><span class="p">:</span><span class="w"> </span><span class="nt">[ dbrole_admin ] ,superuser</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,replication</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,createdb</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,createrole</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,bypassrls</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">authenticator              ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;DBUser.Supa&#39; ,pgbouncer</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,inherit</span><span class="p">:</span><span class="w"> </span><span class="nt">false  ,roles</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">dbrole_admin, authenticated ,anon ,service_role ] }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">supabase_auth_admin        ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;DBUser.Supa&#39; ,pgbouncer</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,inherit</span><span class="p">:</span><span class="w"> </span><span class="nt">false  ,roles</span><span class="p">:</span><span class="w"> </span><span class="nt">[ dbrole_admin ] ,createrole</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">supabase_storage_admin     ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;DBUser.Supa&#39; ,pgbouncer</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,inherit</span><span class="p">:</span><span class="w"> </span><span class="nt">false  ,roles</span><span class="p">:</span><span class="w"> </span><span class="nt">[ dbrole_admin, authenticated ,anon ,service_role ] ,createrole</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">supabase_functions_admin   ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;DBUser.Supa&#39; ,pgbouncer</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,inherit</span><span class="p">:</span><span class="w"> </span><span class="nt">false  ,roles</span><span class="p">:</span><span class="w"> </span><span class="nt">[ dbrole_admin ] ,createrole</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">supabase_replication_admin ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;DBUser.Supa&#39; ,replication</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,roles</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">dbrole_admin ]}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">supabase_etl_admin         ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;DBUser.Supa&#39; ,replication</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,roles</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">pg_read_all_data, dbrole_readonly ]}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">supabase_read_only_user    ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;DBUser.Supa&#39; ,bypassrls</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,roles</span><span class="p">:</span><span class="w">   </span><span class="p">[</span><span class="w"> </span><span class="l">pg_read_all_data, dbrole_readonly ]}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">pg_databases</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">postgres</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">baseline</span><span class="p">:</span><span class="w"> </span><span class="l">supabase.sql</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">owner</span><span class="p">:</span><span class="w"> </span><span class="l">supabase_admin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">comment</span><span class="p">:</span><span class="w"> </span><span class="l">supabase postgres database</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">schemas</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">extensions ,auth ,realtime ,storage ,graphql_public ,supabase_functions ,_realtime ]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">extensions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pgcrypto         ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># cryptographic functions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_net           ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># async HTTP</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pgjwt            ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># json web token API for postgres</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">uuid-ossp        ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># generate universally unique identifiers (UUIDs)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pgsodium         ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># pgsodium is a modern cryptography library for Postgres.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">supabase_vault   ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># Supabase Vault Extension</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_jsonschema    ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># pg_jsonschema: Validate json schema</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">wrappers         ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># wrappers: FDW collections</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">http             ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># http: allows web page retrieval inside the database.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_cron          ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># pg_cron: Job scheduler for PostgreSQL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">timescaledb      ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># timescaledb: Enables scalable inserts and complex queries for time-series data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_tle           ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># pg_tle: Trusted Language Extensions for PostgreSQL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">vector           ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># pgvector: the vector similarity search</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pgmq             ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># pgmq: A lightweight message queue like AWS SQS and RSMQ</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">_supabase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">owner</span><span class="p">:</span><span class="w"> </span><span class="l">supabase_admin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">comment</span><span class="p">:</span><span class="w"> </span><span class="l">supabase internal analytics database</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">schemas</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">_analytics ]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">extensions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pgcrypto         ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions }</span><span class="w"> </span><span class="c"># cryptographic functions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># supabase required extensions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">pg_libs</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;timescaledb, pgsodium, plpgsql, plpgsql_check, pg_cron, pg_net, pg_stat_statements, auto_explain, pg_wait_sampling, pg_tle, plan_filter&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">pg_extensions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">pg18-main ,pg18-time ,pg18-gis ,pg18-rag ,pg18-fts ,pg18-olap ,pg18-feat ,pg18-lang ,pg18-type ,pg18-util ,pg18-func ,pg18-admin ,pg18-stat ,pg18-sec ,pg18-fdw ,pg18-sim ,pg18-etl]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">pg_parameters</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">cron.database_name</span><span class="p">:</span><span class="w"> </span><span class="l">postgres }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">pg_hba_rules</span><span class="p">:</span><span class="w"> </span><span class="c"># supabase hba rules, require access from docker network</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="nt">all ,db</span><span class="p">:</span><span class="w"> </span><span class="nt">postgres  ,addr</span><span class="p">:</span><span class="w"> </span><span class="nt">intra         ,auth</span><span class="p">:</span><span class="w"> </span><span class="nt">pwd ,title</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;allow supabase access from intranet&#39;    ,order</span><span class="p">:</span><span class="w"> </span><span class="m">50</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="nt">all ,db</span><span class="p">:</span><span class="w"> </span><span class="nt">postgres  ,addr</span><span class="p">:</span><span class="w"> </span><span class="nt">172.17.0.0/16 ,auth</span><span class="p">:</span><span class="w"> </span><span class="nt">pwd ,title</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;allow access from local docker network&#39; ,order</span><span class="p">:</span><span class="w"> </span><span class="m">50</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="nt">all ,db</span><span class="p">:</span><span class="w"> </span><span class="nt">_supabase ,addr</span><span class="p">:</span><span class="w"> </span><span class="nt">intra         ,auth</span><span class="p">:</span><span class="w"> </span><span class="nt">pwd ,title</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;allow supabase internal access from intranet&#39;    ,order</span><span class="p">:</span><span class="w"> </span><span class="m">50</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="w"> </span><span class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="nt">all ,db</span><span class="p">:</span><span class="w"> </span><span class="nt">_supabase ,addr</span><span class="p">:</span><span class="w"> </span><span class="nt">172.17.0.0/16 ,auth</span><span class="p">:</span><span class="w"> </span><span class="nt">pwd ,title</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;allow internal access from local docker network&#39; ,order</span><span class="p">:</span><span class="w"> </span><span class="m">50</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">pg_crontab</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s1">&#39;00 01 * * * /pg/bin/pg-backup full&#39;</span><span class="w">  </span><span class="c"># make a full backup every 1am</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s1">&#39;*  *  * * * /pg/bin/supa-kick&#39;</span><span class="w">       </span><span class="c"># kick supabase _analytics lag per minute: https://github.com/pgsty/pigsty/issues/581</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Supabase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># ./docker.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># ./app.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># the supabase stateless containers (default username &amp; password: supabase/pigsty)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">supabase</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">10.10.10.10</span><span class="p">:</span><span class="w"> </span>{}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">docker_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">                              </span><span class="c"># enable docker on this group</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c">#docker_registry_mirrors: [&#34;https://docker.1panel.live&#34;,&#34;https://docker.1ms.run&#34;,&#34;https://docker.xuanyuan.me&#34;,&#34;https://registry-1.docker.io&#34;]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">supabase                                    </span><span class="w"> </span><span class="c"># specify app name (supa) to be installed (in the apps)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">apps</span><span class="p">:</span><span class="w">                                             </span><span class="c"># define all applications</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">supabase</span><span class="p">:</span><span class="w">                                       </span><span class="c"># the definition of supabase app</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">conf</span><span class="p">:</span><span class="w">                                         </span><span class="c"># override /opt/supabase/.env</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c"># IMPORTANT: CHANGE JWT_SECRET AND REGENERATE CREDENTIAL ACCORDING!!!!!!!!!!!</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c"># https://supabase.com/docs/guides/self-hosting/docker#securing-your-services</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">JWT_SECRET</span><span class="p">:</span><span class="w"> </span><span class="l">your-super-secret-jwt-token-with-at-least-32-characters-long</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">ANON_KEY</span><span class="p">:</span><span class="w"> </span><span class="l">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">SERVICE_ROLE_KEY</span><span class="p">:</span><span class="w"> </span><span class="l">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">SUPABASE_PUBLISHABLE_KEY</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">SUPABASE_SECRET_KEY</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">JWT_KEYS</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">JWT_JWKS</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">ANON_KEY_ASYMMETRIC</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">SERVICE_ROLE_KEY_ASYMMETRIC</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">PG_META_CRYPTO_KEY</span><span class="p">:</span><span class="w"> </span><span class="l">your-encryption-key-32-chars-min</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">SECRET_KEY_BASE</span><span class="p">:</span><span class="w"> </span><span class="l">UpNVntn3cDxHJpq99YMc1T1AQgQpc8kfYTuRgBiYa15BLrx8etQoXz3gZv1/u2oq</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">REALTIME_DB_ENC_KEY</span><span class="p">:</span><span class="w"> </span><span class="l">supabaserealtime</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">DASHBOARD_USERNAME</span><span class="p">:</span><span class="w"> </span><span class="l">supabase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">DASHBOARD_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l">pigsty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c"># 32~64 random characters string for logflare</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">LOGFLARE_PUBLIC_ACCESS_TOKEN</span><span class="p">:</span><span class="w"> </span><span class="l">1234567890abcdef1234567890abcdef</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">LOGFLARE_PRIVATE_ACCESS_TOKEN</span><span class="p">:</span><span class="w"> </span><span class="l">fedcba0987654321fedcba0987654321</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">LOGFLARE_DB</span><span class="p">:</span><span class="w"> </span><span class="l">_supabase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">LOGFLARE_SCHEMA</span><span class="p">:</span><span class="w"> </span><span class="l">_analytics</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c"># postgres connection string (use the correct ip and port)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">POSTGRES_HOST</span><span class="p">:</span><span class="w"> </span><span class="m">10.10.10.10</span><span class="w">      </span><span class="c"># point to the local postgres node</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">POSTGRES_PORT</span><span class="p">:</span><span class="w"> </span><span class="m">5436</span><span class="w">             </span><span class="c"># access via the &#39;default&#39; service, which always route to the primary postgres</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">POSTGRES_DB</span><span class="p">:</span><span class="w"> </span><span class="l">postgres          </span><span class="w"> </span><span class="c"># the supabase underlying database</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">POSTGRES_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l">DBUser.Supa </span><span class="w"> </span><span class="c"># password for supabase_admin and multiple supabase users</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c"># expose supabase via domain name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">SITE_URL</span><span class="p">:</span><span class="w"> </span><span class="l">https://supa.pigsty                </span><span class="w"> </span><span class="c"># &lt;------- Change This to your external site URL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">API_EXTERNAL_URL</span><span class="p">:</span><span class="w"> </span><span class="l">https://supa.pigsty/auth/v1</span><span class="w"> </span><span class="c"># &lt;------- Auth service external URL, keep /auth/v1 suffix</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">SUPABASE_PUBLIC_URL</span><span class="p">:</span><span class="w"> </span><span class="l">https://supa.pigsty     </span><span class="w"> </span><span class="c"># &lt;------- DO NOT FORGET TO PUT IT IN infra_portal!</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c"># if using s3/minio as file storage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">S3_BUCKET</span><span class="p">:</span><span class="w"> </span><span class="l">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">GLOBAL_S3_BUCKET</span><span class="p">:</span><span class="w"> </span><span class="l">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">S3_ENDPOINT</span><span class="p">:</span><span class="w"> </span><span class="l">https://sss.pigsty:9000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">S3_ACCESS_KEY</span><span class="p">:</span><span class="w"> </span><span class="l">s3user_data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">S3_SECRET_KEY</span><span class="p">:</span><span class="w"> </span><span class="l">S3User.Data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">S3_FORCE_PATH_STYLE</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">S3_PROTOCOL</span><span class="p">:</span><span class="w"> </span><span class="l">https</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">S3_REGION</span><span class="p">:</span><span class="w"> </span><span class="l">stub</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">REGION</span><span class="p">:</span><span class="w"> </span><span class="l">stub</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">STORAGE_TENANT_ID</span><span class="p">:</span><span class="w"> </span><span class="l">stub</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">S3_PROTOCOL_ACCESS_KEY_ID</span><span class="p">:</span><span class="w"> </span><span class="l">s3user_data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">S3_PROTOCOL_ACCESS_KEY_SECRET</span><span class="p">:</span><span class="w"> </span><span class="l">S3User.Data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">MINIO_DOMAIN_IP</span><span class="p">:</span><span class="w"> </span><span class="m">10.10.10.10</span><span class="w">  </span><span class="c"># sss.pigsty domain name will resolve to this ip statically</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">PGRST_DB_SCHEMAS</span><span class="p">:</span><span class="w"> </span><span class="l">public,graphql_public</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">PGRST_DB_MAX_ROWS</span><span class="p">:</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">PGRST_DB_EXTRA_SEARCH_PATH</span><span class="p">:</span><span class="w"> </span><span class="l">public</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">IMGPROXY_AUTO_WEBP</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">FUNCTIONS_VERIFY_JWT</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">DOCKER_SOCKET_LOCATION</span><span class="p">:</span><span class="w"> </span><span class="l">/var/run/docker.sock</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c"># if using SMTP (optional)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c">#SMTP_ADMIN_EMAIL: admin@example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c">#SMTP_HOST: supabase-mail</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c">#SMTP_PORT: 2500</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c">#SMTP_USER: fake_mail_user</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c">#SMTP_PASS: fake_mail_password</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c">#SMTP_SENDER_NAME: fake_sender</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="c">#ENABLE_ANONYMOUS_USERS: false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c">#==============================================================#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Global Parameters</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c">#==============================================================#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># INFRA : https://pigsty.io/docs/infra</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v4.5.0                      </span><span class="w"> </span><span class="c"># pigsty version string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">admin_ip</span><span class="p">:</span><span class="w"> </span><span class="m">10.10.10.10</span><span class="w">                 </span><span class="c"># admin node ip address</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l">default                      </span><span class="w"> </span><span class="c"># upstream mirror region: default|china|europe</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">proxy_env</span><span class="p">:</span><span class="w">                            </span><span class="c"># global proxy env when downloading packages</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">no_proxy</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.pigsty,*.aliyun.com,mirrors.*,*.myqcloud.com,*.tsinghua.edu.cn&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># http_proxy:  # set your proxy here: e.g http://user:pass@proxy.xxx.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># https_proxy: # set your proxy here: e.g http://user:pass@proxy.xxx.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># all_proxy:   # set your proxy here: e.g http://user:pass@proxy.xxx.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">certbot_sign</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">                   </span><span class="c"># enable certbot to sign https certificate for infra portal</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">certbot_email</span><span class="p">:</span><span class="w"> </span><span class="l">your@email.com        </span><span class="w"> </span><span class="c"># replace your email address to receive expiration notice</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">infra_portal</span><span class="p">:</span><span class="w">                         </span><span class="c"># infra services exposed via portal</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">home      </span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="l">i.pigsty }   </span><span class="w"> </span><span class="c"># default domain name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">pgadmin   </span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="nt">adm.pigsty ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;${admin_ip}:8885&#34;</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">bytebase  </span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="nt">ddl.pigsty ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;${admin_ip}:8887&#34;</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c">#minio     : { domain: m.pigsty   ,endpoint: &#34;${admin_ip}:9001&#34; ,scheme: https ,websocket: true }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># Nginx / Domain / HTTPS : https://pigsty.io/docs/infra/admin/portal</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">supa </span><span class="p">:</span><span class="w">                              </span><span class="c"># nginx server config for supabase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">domain</span><span class="p">:</span><span class="w"> </span><span class="l">supa.pigsty              </span><span class="w"> </span><span class="c"># REPLACE IT WITH YOUR OWN DOMAIN!</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;10.10.10.10:8000&#34;</span><span class="w">      </span><span class="c"># supabase service endpoint: IP:PORT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">websocket</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">                   </span><span class="c"># add websocket support</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">certbot</span><span class="p">:</span><span class="w"> </span><span class="l">supa.pigsty             </span><span class="w"> </span><span class="c"># certbot cert name, apply with `make cert`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># NODE : https://pigsty.io/docs/node/param</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nodename_overwrite</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">             </span><span class="c"># do not overwrite node hostname on single node mode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">node_tune</span><span class="p">:</span><span class="w"> </span><span class="l">oltp                      </span><span class="w"> </span><span class="c"># node tuning specs: oltp,olap,tiny,crit</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">node_etc_hosts</span><span class="p">:</span><span class="w">                       </span><span class="c"># add static domains to all nodes /etc/hosts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="m">10.10.10.10</span><span class="w"> </span><span class="l">i.pigsty sss.pigsty supa.pigsty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">node_repo_modules</span><span class="p">:</span><span class="w"> </span><span class="l">node,pgsql,infra  </span><span class="w"> </span><span class="c"># use pre-made local repo rather than install from upstream</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">node_repo_remove</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">                </span><span class="c"># remove existing node repo for node managed by pigsty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#node_packages: [openssh-server]      # packages to be installed current nodes with latest version</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#node_timezone: Asia/Hong_Kong        # overwrite node timezone</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># PGSQL : https://pigsty.io/docs/pgsql/param</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg_version</span><span class="p">:</span><span class="w"> </span><span class="m">18</span><span class="w">                        </span><span class="c"># default postgres version</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg_conf</span><span class="p">:</span><span class="w"> </span><span class="l">oltp.yml                    </span><span class="w"> </span><span class="c"># pgsql tuning specs: {oltp,olap,tiny,crit}.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg_safeguard</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">                   </span><span class="c"># prevent purging running postgres instance?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg_default_schemas</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">monitor, extensions ]</span><span class="w"> </span><span class="c"># add new schema: extensions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg_default_extensions</span><span class="p">:</span><span class="w">                </span><span class="c"># default extensions to be created</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_stat_statements ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">monitor     }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pgstattuple        ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">monitor     }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_buffercache     ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">monitor     }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pageinspect        ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">monitor     }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_prewarm         ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">monitor     }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_visibility      ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">monitor     }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_freespacemap    ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">monitor     }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_wait_sampling   ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">monitor     }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># move default extensions to `extensions` schema for supabase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">postgres_fdw       ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">file_fdw           ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">btree_gist         ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">btree_gin          ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_trgm            ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">intagg             ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">intarray           ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- {<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">pg_repack          ,schema</span><span class="p">:</span><span class="w"> </span><span class="l">extensions  }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># BACKUP : https://pigsty.io/docs/pgsql/backup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">minio_endpoint</span><span class="p">:</span><span class="w"> </span><span class="l">https://sss.pigsty:9000</span><span class="w"> </span><span class="c"># explicit overwrite minio endpoint with haproxy port</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pgbackrest_method</span><span class="p">:</span><span class="w"> </span><span class="l">minio             </span><span class="w"> </span><span class="c"># pgbackrest repo method: local,minio,[user-defined...]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pgbackrest_repo</span><span class="p">:</span><span class="w">                      </span><span class="c"># pgbackrest repo: https://pgbackrest.org/configuration.html#section-repository</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">local</span><span class="p">:</span><span class="w">                              </span><span class="c"># default pgbackrest repo with local posix fs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/pg/backup                 </span><span class="w"> </span><span class="c"># local backup directory, `/pg/backup` by default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">retention_full_type</span><span class="p">:</span><span class="w"> </span><span class="l">count       </span><span class="w"> </span><span class="c"># retention full backups by count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">retention_full</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">                 </span><span class="c"># keep 2, at most 3 full backups when using local fs repo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">minio</span><span class="p">:</span><span class="w">                              </span><span class="c"># optional minio repo for pgbackrest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">s3                         </span><span class="w"> </span><span class="c"># minio is s3-compatible, so s3 is used</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_endpoint</span><span class="p">:</span><span class="w"> </span><span class="l">sss.pigsty          </span><span class="w"> </span><span class="c"># minio endpoint domain name, `sss.pigsty` by default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_region</span><span class="p">:</span><span class="w"> </span><span class="l">us-east-1             </span><span class="w"> </span><span class="c"># minio region, us-east-1 by default, useless for minio</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_bucket</span><span class="p">:</span><span class="w"> </span><span class="l">pgsql                 </span><span class="w"> </span><span class="c"># minio bucket name, `pgsql` by default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_key</span><span class="p">:</span><span class="w"> </span><span class="l">pgbackrest               </span><span class="w"> </span><span class="c"># minio user access key for pgbackrest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_key_secret</span><span class="p">:</span><span class="w"> </span><span class="l">S3User.Backup     </span><span class="w"> </span><span class="c"># minio user secret key for pgbackrest &lt;------------------ HEY, DID YOU CHANGE THIS?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_uri_style</span><span class="p">:</span><span class="w"> </span><span class="l">path               </span><span class="w"> </span><span class="c"># use path style uri for minio rather than host style</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/pgbackrest                </span><span class="w"> </span><span class="c"># minio backup path, default is `/pgbackrest`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">storage_port</span><span class="p">:</span><span class="w"> </span><span class="m">9000</span><span class="w">                </span><span class="c"># minio port, 9000 by default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">storage_ca_file</span><span class="p">:</span><span class="w"> </span><span class="l">/etc/pki/ca.crt </span><span class="w"> </span><span class="c"># minio ca file path, `/etc/pki/ca.crt` by default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">block</span><span class="p">:</span><span class="w"> </span><span class="kc">y</span><span class="w">                          </span><span class="c"># Enable block incremental backup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="kc">y</span><span class="w">                         </span><span class="c"># bundle small files into a single file</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">bundle_limit</span><span class="p">:</span><span class="w"> </span><span class="l">20MiB              </span><span class="w"> </span><span class="c"># Limit for file bundles, 20MiB for object storage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">bundle_size</span><span class="p">:</span><span class="w"> </span><span class="l">128MiB              </span><span class="w"> </span><span class="c"># Target size for file bundles, 128MiB for object storage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">cipher_type</span><span class="p">:</span><span class="w"> </span><span class="l">aes-256-cbc         </span><span class="w"> </span><span class="c"># enable AES encryption for remote backup repo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">cipher_pass</span><span class="p">:</span><span class="w"> </span><span class="l">pgBackRest          </span><span class="w"> </span><span class="c"># AES encryption password, default is &#39;pgBackRest&#39;  &lt;----- HEY, DID YOU CHANGE THIS?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">retention_full_type</span><span class="p">:</span><span class="w"> </span><span class="l">time        </span><span class="w"> </span><span class="c"># retention full backup by time on minio repo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">retention_full</span><span class="p">:</span><span class="w"> </span><span class="m">14</span><span class="w">                </span><span class="c"># keep full backup for the last 14 days</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">s3</span><span class="p">:</span><span class="w">                                 </span><span class="c"># you can use cloud object storage as backup repo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">s3                         </span><span class="w"> </span><span class="c"># Add your object storage credentials here!</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_endpoint</span><span class="p">:</span><span class="w"> </span><span class="l">oss-cn-beijing-internal.aliyuncs.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_region</span><span class="p">:</span><span class="w"> </span><span class="l">oss-cn-beijing</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_bucket</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;your_bucket_name&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_key</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;your_access_key&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_key_secret</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;your_secret_key&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">s3_uri_style</span><span class="p">:</span><span class="w"> </span><span class="l">host</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/pgbackrest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="kc">y</span><span class="w">                         </span><span class="c"># bundle small files into a single file</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">bundle_limit</span><span class="p">:</span><span class="w"> </span><span class="l">20MiB              </span><span class="w"> </span><span class="c"># Limit for file bundles, 20MiB for object storage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">bundle_size</span><span class="p">:</span><span class="w"> </span><span class="l">128MiB              </span><span class="w"> </span><span class="c"># Target size for file bundles, 128MiB for object storage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">cipher_type</span><span class="p">:</span><span class="w"> </span><span class="l">aes-256-cbc         </span><span class="w"> </span><span class="c"># enable AES encryption for remote backup repo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">cipher_pass</span><span class="p">:</span><span class="w"> </span><span class="l">pgBackRest          </span><span class="w"> </span><span class="c"># AES encryption password, default is &#39;pgBackRest&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">retention_full_type</span><span class="p">:</span><span class="w"> </span><span class="l">time        </span><span class="w"> </span><span class="c"># retention full backup by time on minio repo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">retention_full</span><span class="p">:</span><span class="w"> </span><span class="m">14</span><span class="w">                </span><span class="c"># keep full backup for the last 14 days</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># PASSWORD : https://pigsty.io/docs/setup/security/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#----------------------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">grafana_admin_password</span><span class="p">:</span><span class="w"> </span><span class="l">pigsty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">grafana_view_password</span><span class="p">:</span><span class="w"> </span><span class="l">DBUser.Viewer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg_admin_password</span><span class="p">:</span><span class="w"> </span><span class="l">DBUser.DBA</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg_monitor_password</span><span class="p">:</span><span class="w"> </span><span class="l">DBUser.Monitor</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg_replication_password</span><span class="p">:</span><span class="w"> </span><span class="l">DBUser.Replicator</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">patroni_password</span><span class="p">:</span><span class="w"> </span><span class="l">Patroni.API</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">haproxy_admin_password</span><span class="p">:</span><span class="w"> </span><span class="l">pigsty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">minio_secret_key</span><span class="p">:</span><span class="w"> </span><span class="l">S3User.MinIO</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">etcd_root_password</span><span class="p">:</span><span class="w"> </span><span class="l">Etcd.Root</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span></code></pre></div>

--------

## 安装过程

<div id="td-asciinema-0a721b947fd81d45cff1c4f554a747e1-1" class="td-asciinema td-max-width-on-larger-screens" data-td-asciinema
  data-timer-label="播放时间">
  <div class="td-asciinema__chrome">
    <span class="td-asciinema__lights" aria-hidden="true"><i></i><i></i><i></i></span>
    <span class="td-asciinema__title" dir="auto">demo/supabase.cast</span>
  </div>
  <div data-td-asciinema-player></div>
  <script type="application/json" data-td-asciinema-config>{"options":{"autoPlay":true,"fit":"width","loop":true,"markers":[0,"检查环境",11,"安装",43,"配置",307,"Docker",321,"域名",340,"App",350,"检查"],"preload":false,"speed":1.3,"startAt":0},"src":"/demo/supabase.cast","theme":"auto"}</script>
</div>



--------

## 配置解读

`supabase` 模板提供了完整的 Supabase 自建方案，让您可以在自己的基础设施上运行这个开源 Firebase 替代品。

**架构组成**：
- **PostgreSQL**：Pigsty 托管的生产级 PostgreSQL（支持高可用）
- **Docker 容器**：Supabase 无状态服务（Auth、Storage、Realtime、Edge Functions 等）
- **Silo**：由 MINIO 模块部署的 S3 兼容对象存储，用于文件存储和 PostgreSQL 备份
- **Nginx**：反向代理和 HTTPS 终止

**关键特性**：
- 使用 Pigsty 管理的 PostgreSQL 替代 Supabase 自带的数据库容器
- 支持 PostgreSQL 高可用（可扩展为三节点集群）
- 安装全部 Supabase 所需扩展（pg_net、pgjwt、pg_graphql、vector 等）
- 使用独立的 `_supabase` 数据库存储内部日志分析数据，并由 `supa-kick` 定时推进处理
- 集成 Silo 对象存储用于文件上传和备份
- 支持 HTTPS 和 Let's Encrypt 自动证书

**部署步骤**：

```bash
curl -fsSL https://repo.pigsty.cc/get | bash; cd ~/pigsty
./configure -c supabase                   # 使用 supabase 配置模板
./deploy.yml                              # 安装 Pigsty、PostgreSQL、Silo
./docker.yml -l supabase                  # 在 supabase 组安装 Docker
./app.yml -l supabase                     # 在 supabase 组启动容器
```

**访问方式**：

```bash
# Supabase Studio
http://<IP>:8000
http://supa.pigsty   (用户名: supabase, 密码: pigsty)

# 直接连接 PostgreSQL
psql postgres://supabase_admin:DBUser.Supa@10.10.10.10:5432/postgres
```

**适用场景**：
- 需要自建 BaaS (Backend as a Service) 平台
- 希望完全掌控数据和基础设施
- 需要企业级 PostgreSQL 高可用和备份
- 对 Supabase 云服务有合规或成本考虑

**注意事项**：
- **必须修改 JWT_SECRET**：使用至少 32 字符的随机字符串，并重新生成 ANON_KEY 和 SERVICE_ROLE_KEY
- 需要配置正确的域名（`SITE_URL`、`API_EXTERNAL_URL`）
- 生产环境建议启用 HTTPS（可使用 certbot 自动签发证书）
- Docker 网络需要能访问 PostgreSQL（已配置 172.17.0.0/16 HBA 规则）
