# demo/saas

> 传统单节点 SaaS 组件组合示例，包含 PostgreSQL、Silo、Redis 与多应用入口

---

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

---

`demo/saas` 是一个传统的功能丰富单节点示例，预置多组业务用户、数据库和应用入口，用于展示 PostgreSQL、Silo、Redis、Docker 与 Portal 的组合方式。


--------

## 配置概览

- 配置名称：`demo/saas`
- 节点数量：单节点
- 模块：INFRA、ETCD、MINIO、PGSQL、REDIS、DOCKER
- 相关配置：[`rich`](/docs/conf/rich/)、[`supabase`](/docs/conf/supabase/)

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


--------

## 配置内容

源文件地址：[`pigsty/conf/demo/saas.yml`](https://github.com/pgsty/pigsty/blob/main/conf/demo/saas.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      :   saas.yml (1-node)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Desc      :   Feature rich 1-node template with all extensions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Ctime     :   2020-05-22</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Mtime     :   2025-12-12</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Docs      :   https://pigsty.io/docs/conf</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="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></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"># Clusters, Nodes, and Modules</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">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 class="c">#----------------------------------#</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># infra: monitor, alert, repo, etc..</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">docker_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">      </span><span class="c"># enabled docker with ./docker.yml</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></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 cluster for HA postgres DCS</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></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 (OPTIONAL backup repo)</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"># pgsql (singleton on current node)</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"># postgres cluster: pg-meta</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 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="nt">name</span><span class="p">:</span><span class="w"> </span><span class="nt">dbuser_meta     ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">DBUser.Meta     ,pgbouncer</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]    ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">pigsty admin user }</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="nt">dbuser_view     ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">DBUser.Viewer   ,pgbouncer</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_readonly] ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">read-only viewer for meta database }</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="nt">dbuser_grafana  ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">DBUser.Grafana  ,pgbouncer</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]    ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">admin user for grafana database    }</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="nt">dbuser_bytebase ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">DBUser.Bytebase ,pgbouncer</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]    ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">admin user for bytebase database   }</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="nt">dbuser_kong     ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">DBUser.Kong     ,pgbouncer</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]    ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">admin user for kong api gateway    }</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="nt">dbuser_gitea    ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">DBUser.Gitea    ,pgbouncer</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]    ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">admin user for gitea service       }</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="nt">dbuser_wiki     ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">DBUser.Wiki     ,pgbouncer</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]    ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">admin user for wiki.js service     }</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="nt">dbuser_noco     ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">DBUser.Noco     ,pgbouncer</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]    ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">admin user for nocodb service      }</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="nt">dbuser_odoo     ,password</span><span class="p">:</span><span class="w"> </span><span class="nt">DBUser.Odoo     ,pgbouncer</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]    ,comment</span><span class="p">:</span><span class="w"> </span><span class="nt">admin user for odoo service ,createdb</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>}<span class="w"> </span><span class="c">#,superuser: true}</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="nt">meta ,baseline</span><span class="p">:</span><span class="w"> </span><span class="nt">cmdb.sql ,comment</span><span class="p">:</span><span class="w"> </span><span class="nt">pigsty meta database ,schemas</span><span class="p">:</span><span class="w"> </span><span class="nt">[pigsty] ,extensions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>{<span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">vector},{name: postgis},{name: timescaledb}]}</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="nt">grafana  ,owner</span><span class="p">:</span><span class="w"> </span><span class="nt">dbuser_grafana  ,revokeconn</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">grafana primary database  }</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="nt">bytebase ,owner</span><span class="p">:</span><span class="w"> </span><span class="nt">dbuser_bytebase ,revokeconn</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">bytebase primary database }</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="nt">kong     ,owner</span><span class="p">:</span><span class="w"> </span><span class="nt">dbuser_kong     ,revokeconn</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">kong api gateway database }</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="nt">gitea    ,owner</span><span class="p">:</span><span class="w"> </span><span class="nt">dbuser_gitea    ,revokeconn</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">gitea meta database }</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="nt">wiki     ,owner</span><span class="p">:</span><span class="w"> </span><span class="nt">dbuser_wiki     ,revokeconn</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">wiki meta database  }</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="nt">noco     ,owner</span><span class="p">:</span><span class="w"> </span><span class="nt">dbuser_noco     ,revokeconn</span><span class="p">:</span><span class="w"> </span><span class="nt">true ,comment</span><span class="p">:</span><span class="w"> </span><span class="l">nocodb database     }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="c">#- {name: odoo     ,owner: dbuser_odoo     ,revokeconn: true ,comment: odoo main database  }</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></span><span class="line"><span class="cl"><span class="w">          </span>- {<span class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="nt">dbuser_view , db</span><span class="p">:</span><span class="w"> </span><span class="nt">all ,addr</span><span class="p">:</span><span class="w"> </span><span class="nt">infra ,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="s1">&#39;allow grafana dashboard access cmdb from infra nodes&#39;</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,pg_stat_statements, auto_explain&#39;</span><span class="w">  </span><span class="c"># add timescaledb to shared_preload_libraries</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">node_crontab</span><span class="p">:</span><span class="w">  </span><span class="c"># make one full backup 1 am everyday</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></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">redis-ms</span><span class="p">:</span><span class="w"> </span><span class="c"># redis classic primary &amp; replica</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 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">redis_node</span><span class="p">:</span><span class="w"> </span><span class="nt">1 , redis_instances</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">6379</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">}, 6380</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">replica_of</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;10.10.10.10 6379&#39;</span><span class="w"> </span>}<span class="w"> </span>}<span class="w"> </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 class="w"> </span><span class="nt">redis_cluster</span><span class="p">:</span><span class="w"> </span><span class="nt">redis-ms ,redis_password</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;redis.ms&#39; ,redis_max_memory</span><span class="p">:</span><span class="w"> </span><span class="l">64MB }</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="nt">vars</span><span class="p">:</span><span class="w">                               </span><span class="c"># global variables</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">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">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">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">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">minio        </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">m.pigsty    ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;${admin_ip}:9001&#34;</span><span class="w"> </span><span class="nt">,scheme</span><span class="p">:</span><span class="w"> </span><span class="nt">https ,websocket</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="nt">postgrest    </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">api.pigsty  ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;127.0.0.1:8884&#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">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;127.0.0.1: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">pgweb        </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">cli.pigsty  ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;127.0.0.1:8886&#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;127.0.0.1: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="nt">jupyter      </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">lab.pigsty  ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;127.0.0.1:8888&#34;</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="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">gitea        </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">git.pigsty  ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;127.0.0.1:8889&#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">wiki         </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">wiki.pigsty ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;127.0.0.1:9002&#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">noco         </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">noco.pigsty ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;127.0.0.1:9003&#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">supa         </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">supa.pigsty ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;10.10.10.10:8000&#34;</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="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">dify         </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">dify.pigsty ,endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;10.10.10.10:8001&#34;</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="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">odoo         </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">odoo.pigsty, endpoint</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;127.0.0.1:8069&#34;</span><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="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 Related Options</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">pgbackrest_method</span><span class="p">:</span><span class="w"> </span><span class="l">minio         </span><span class="w"> </span><span class="c"># use minio as backup repo instead of &#39;local&#39;</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 backup 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</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;</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 last 14 days</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="p">[</span><span class="w"> </span><span class="s2">&#34;${admin_ip} i.pigsty sss.pigsty&#34;</span><span class="w"> </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">dns_records</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s2">&#34;${admin_ip} api.pigsty adm.pigsty cli.pigsty ddl.pigsty lab.pigsty git.pigsty wiki.pigsty noco.pigsty supa.pigsty dify.pigsty odoo.pigsty&#34;</span><span class="w"> </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"># Safe Guard</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"># you can enable these flags after bootstrap, to prevent purging running etcd / pgsql instances</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"># prevent purging running etcd instance?</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? false by default</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"># Repo, Node, Packages</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">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 repo on admin node during repo bootstrap</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="nt">repo_extra_packages</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">pg17-core ,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_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="c">#pg_extensions: [ 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></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></span></code></pre></div>


--------

## 配置解读

模板预置 Grafana、Bytebase、Kong、Gitea、Wiki、NocoDB 与 Odoo 等数据库账号/数据库占位项，使用 Silo 作为 pgBackRest 仓库，并提供 Redis 主从示例和多个 Portal 域名。

这是兼容与参考用途的组合模板，并不等于所有应用都会自动安装。新部署优先选用 [`rich`](/docs/conf/rich/) 与对应的 `app/*` 专用模板；部署前删除不需要的账号、数据库和入口并更换所有密码。
