# vibe

> VIBE AI 编程沙箱配置模板，集成 Code-Server、JupyterLab、Claude Code、Codex CLI 与 JuiceFS 的 Web 开发环境

---

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

---

`vibe` 配置模板提供了一个开箱即用的 **AI 编程沙箱**，集成了 Code-Server（Web VS Code）、JupyterLab、Claude Code 可观测能力、Codex CLI、JuiceFS 分布式文件系统，以及功能丰富的 PostgreSQL 数据库。


--------

## 配置概览

- 配置名称： `vibe`
- 节点数量： 单节点
- 配置说明：VIBE AI 编程沙箱，Code-Server + JupyterLab + Claude Code + Codex CLI + JuiceFS + PostgreSQL
- 适用系统：`el8`, `el9`, `el10`, `d12`, `d13`, `u22`, `u24`, `u26`
- 适用架构：`x86_64`, `aarch64`
- 相关配置：[`meta`](/docs/conf/meta/)

启用方式：

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


--------

## 配置内容

源文件地址：[`pigsty/conf/vibe.yml`](https://github.com/pgsty/pigsty/blob/main/conf/vibe.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      :   vibe.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Desc      :   Pigsty ai vibe coding sandbox</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Ctime     :   2026-01-19</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Mtime     :   2026-06-28</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Docs      :   https://pigsty.io/docs/conf/vibe</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"># VIBE CODING SANDBOX</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># PostgreSQL with related extensions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># Code-Server, Jupyter, Claude Code, optional Codex CLI</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"># Usage:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   curl https://repo.pigsty.io/get | bash</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ./configure -c vibe</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ./deploy.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ./juice.yml     # pgfs: juicefs on pgsql, mount on /fs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c">#   ./vibe.yml      # code-server, jupyter, claude-code, and codex cli</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 class="nt">infra</span><span class="p">:</span><span class="w"> </span>{<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">infra_seq</span><span class="p">:</span><span class="w"> </span><span class="nt">1 }} ,vars</span><span class="p">:</span><span class="w"> </span>{<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="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 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">etcd_seq</span><span class="p">:</span><span class="w"> </span><span class="nt">1  }} ,vars</span><span class="p">:</span><span class="w"> </span>{<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">pgsql</span><span class="p">:</span><span class="w"> </span>{<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="nt">primary } } ,vars</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">pg_cluster</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></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># optional modules</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#minio: { hosts: { 10.10.10.10: { minio_seq: 1 }} ,vars: { minio_cluster: minio }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#redis-ms:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#  hosts: { 10.10.10.10: { redis_node: 1 , redis_instances: { 6379: { }, 6380: { replica_of: &#39;10.10.10.10 6379&#39; } } } }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#  vars: { redis_cluster: redis-ms ,redis_password: &#39;redis.ms&#39; ,redis_max_memory: 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 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="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">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">dns_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">                  </span><span class="c"># disable dns service</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#blackbox_enabled: false            # disable blackbox exporter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#alertmanager_enabled: false        # disable alertmanager</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">infra_extra_services</span><span class="p">:</span><span class="w">               </span><span class="c"># home page navigation entries</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">Code Server  ,url</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;/code&#39;             ,desc</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;VS Code Server&#39;       ,icon</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;code&#39;</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">Jupyter      ,url</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;/jupyter&#39;          ,desc</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;Jupyter Notebook&#39;     ,icon</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;jupyter&#39;</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">Claude Code  ,url</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;/ui/d/claude-code&#39; ,desc</span><span class="p">:</span><span class="w"> </span><span class="nt">&#39;Claude Observability&#39; ,icon</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;claude&#39;</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"># NODE: https://pigsty.io/docs/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="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_dns_method</span><span class="p">:</span><span class="w"> </span><span class="l">none              </span><span class="w"> </span><span class="c"># do not setup dns</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,infra,pgsql</span><span class="w"> </span><span class="c"># add these repos directly to the singleton node</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">node_packages</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">openssh-server, juicefs, restic, rclone, uv, opencode, golang, asciinema, tmux ]</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 service</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">node_firewall_mode</span><span class="p">:</span><span class="w"> </span><span class="l">zone           </span><span class="w"> </span><span class="c"># default: trust intranet, expose selected public ports</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">node_firewall_public_port</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">22</span><span class="p">,</span><span class="w"> </span><span class="m">80</span><span class="p">,</span><span class="w"> </span><span class="m">443</span><span class="p">,</span><span class="w"> </span><span class="m">5432</span><span class="p">]</span><span class="w">    </span><span class="c"># expose 5432 for remote access, remove in production!</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"># PGSQL: https://pigsty.io/docs/pgsql</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 PostgreSQL Major Version is 18</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_packages</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="l">pgsql-main, patroni, pgbackrest, pg-exporter, pgbackrest-exporter ]</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_users</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">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="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  }</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="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="w"> </span><span class="l">postgis, timescaledb, vector, age ]}</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, pg_wait_sampling&#39;</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="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">all ,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;everyone intranet access with password&#39; ,order</span><span class="p">:</span><span class="w"> </span><span class="m">800</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># WARNING: devbox only. Remove world access in production.</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">all ,addr</span><span class="p">:</span><span class="w"> </span><span class="nt">world ,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;everyone world access with password&#39;    ,order</span><span class="p">:</span><span class="w"> </span><span class="m">900</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 class="p">[</span><span class="w"> </span><span class="s1">&#39;00 01 * * * /pg/bin/pg-backup full&#39;</span><span class="w"> </span><span class="p">]</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="nt">patroni_mode</span><span class="p">:</span><span class="w"> </span><span class="l">remove               </span><span class="w"> </span><span class="c"># remove patroni after deployment</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pgbouncer_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">            </span><span class="c"># disable pgbouncer pool</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pgbouncer_exporter_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">   </span><span class="c"># disable pgbouncer_exporter on pgsql hosts?</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pgbackrest_exporter_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">  </span><span class="c"># disable pgbackrest_exporter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pg_default_services</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">             </span><span class="c"># do not provision pg services</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#pg_reload: false                   # do not reload patroni/service</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></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"># OPTIONAL VIBE COMPONENTS</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">code_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">                </span><span class="c"># install &amp; enable code-server via vibe role</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">code_password</span><span class="p">:</span><span class="w"> </span><span class="l">DBUser.Meta</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">jupyter_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">             </span><span class="c"># enable jupyter (disabled by default, enable for vibe sandbox)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">jupyter_password</span><span class="p">:</span><span class="w"> </span><span class="l">DBUser.Meta</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">juice_instances</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">jfs</span><span class="p">:</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">/fs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">meta  </span><span class="p">:</span><span class="w"> </span><span class="l">postgres://dbuser_meta:DBUser.Meta@10.10.10.10:5432/meta</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">data  </span><span class="p">:</span><span class="w"> </span>--<span class="l">storage postgres --bucket 10.10.10.10:5432/meta --access-key dbuser_meta --secret-key DBUser.Meta</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">port  </span><span class="p">:</span><span class="w"> </span><span class="m">9567</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"># Claude Code is the default coding agent. Node.js is installed on demand when agents are enabled.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nodejs_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">              </span><span class="c"># standalone nodejs runtime</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">npm_packages</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">                  </span><span class="c"># extra global npm packages</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">codex_enabled</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">claude_enabled</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="c">#claude_env:                      # use 3rd party Anthropic-compatible API service</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#  ANTHROPIC_BASE_URL: https://open.bigmodel.cn/api/anthropic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#  ANTHROPIC_API_URL: https://open.bigmodel.cn/api/anthropic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#  ANTHROPIC_AUTH_TOKEN: your_api_service_token</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#  ANTHROPIC_DEFAULT_OPUS_MODEL: &#34;glm-5.2[1m]&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#  ANTHROPIC_DEFAULT_SONNET_MODEL: &#34;glm-5.2[1m]&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#  ANTHROPIC_DEFAULT_HAIKU_MODEL: &#34;glm-4.7&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c">#  CLAUDE_CODE_AUTO_COMPACT_WINDOW: &#34;1000000&#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="nn">...</span><span class="w">
</span></span></span></code></pre></div>


--------

## 配置解读

`vibe` 模板是一个面向 **AI 时代的 Web 编程沙箱**，让您可以在浏览器中完成开发、数据分析、AI 应用构建等任务。

**核心组件**：

| 组件                | 说明                                      | 访问方式                  |
|-------------------|-----------------------------------------|-----------------------|
| **Code-Server**   | VS Code 的 Web 版本，功能完整的代码编辑器             | `http://<ip>/code`    |
| **JupyterLab**    | 交互式数据科学笔记本，支持 Python/SQL                | `http://<ip>/jupyter` |
| **Claude Code**   | AI 编程助手运行环境与可观测性入口（可通过 `claude_env` 定制） | 终端 / 仪表盘              |
| **Codex CLI**     | OpenAI 代理编程 CLI；VIBE 只负责安装，不托管配置        | 终端                    |
| **JuiceFS**       | 基于 PostgreSQL 的分布式文件系统                  | 挂载点 `/fs`             |
| **PostgreSQL 18** | 功能丰富的数据库，安装 `pg18-main` + 全类别扩展包组       | `5432` 端口             |

**模板显式安装的节点工具**（`node_packages`）：

- `openssh-server`, `juicefs`, `restic`, `rclone`
- `uv`, `opencode`, `golang`
- `asciinema`, `tmux`

**PostgreSQL 扩展**：

此模板通过分类包组安装 PostgreSQL 18 的完整扩展集合：

```text
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
```

`meta` 业务库默认创建扩展为 `postgis`、`timescaledb`、`vector`，其余扩展可按需启用。


--------

## VIBE 模块组件

提供 AI 编程沙箱能力；`vibe.yml` 显式开启 Code-Server 与 Jupyter，默认安装 Claude Code 与 Codex CLI。

**Code-Server**：浏览器中的 VS Code

- 完整的 VS Code 功能，支持扩展安装
- 通过 Nginx 反向代理提供 HTTPS 访问
- 支持 Open VSX 和 Microsoft 扩展商店
- 模板显式参数：`code_enabled`, `code_password`
- 其余可选参数：`code_port`, `code_data`, `code_gallery`

**JupyterLab**：交互式计算环境

- 支持 Python/SQL/Markdown 笔记本
- 预配置 Python venv 数据科学库
- 通过 Nginx 反向代理提供 HTTPS 访问
- 模板显式参数：`jupyter_enabled`, `jupyter_password`
- 其余可选参数：`jupyter_port`, `jupyter_data`, `jupyter_venv`

**Claude Code**：AI 编程助手

- 使用模块默认行为完成 Claude 运行环境配置
- 可通过 `claude_env` 覆盖模型端点与 API 密钥
- 提供 `claude-code` 仪表盘监控使用情况

**Codex CLI**：AI 编程助手

- 由 `codex_enabled` 控制，默认启用
- VIBE 仅安装 `@openai/codex`，不写入 Codex 配置，也不接入 Claude Code 仪表盘


--------

## JuiceFS 文件系统

此模板使用 **JuiceFS** 提供分布式文件系统能力，特别之处在于：**元数据和数据都存储在 PostgreSQL 中**。

**架构特点**：

- **元数据引擎**：使用 PostgreSQL 存储文件系统元数据
- **数据存储**：使用 PostgreSQL 大对象（Large Object）存储文件数据
- **挂载点**：默认挂载到 `/fs` 目录（由 `juice_instances.jfs.path` 控制）
- **监控端口**：`9567` 提供 Prometheus 指标

**使用场景**：

- 代码项目的持久化存储
- Jupyter Notebook 的工作目录
- AI 模型和数据集的存储
- 多实例间的文件共享（扩展到多节点时）

**配置示例**：

```yaml
juice_instances:
  jfs:
    path  : /fs
    meta  : postgres://dbuser_meta:DBUser.Meta@10.10.10.10:5432/meta
    data  : --storage postgres --bucket 10.10.10.10:5432/meta --access-key dbuser_meta --secret-key DBUser.Meta
    port  : 9567
```


--------

## 部署步骤

```bash
# 1. 下载 Pigsty
curl -fsSL https://repo.pigsty.cc/get | bash; cd ~/pigsty

# 2. 使用 vibe 配置模板
./configure -c vibe

# 3. 修改密码（重要！）
vi pigsty.yml
# 修改 code_password、jupyter_password、数据库与基础设施默认密码

# 4. 部署基础设施和 PostgreSQL
./deploy.yml

# 5. 可选：部署 JuiceFS 文件系统
./juice.yml -l 10.10.10.10

# 6. 部署 VIBE 模块（Code-Server、JupyterLab、Claude Code、Codex CLI）
./vibe.yml -l 10.10.10.10
```


--------

## 访问方式

部署完成后，通过浏览器访问：

```bash
# Code-Server（VS Code Web）
https://<domain>/code/
# 使用已轮换的 code_password

# JupyterLab
https://<domain>/jupyter/
# 使用已轮换的 jupyter_password Token

# Claude Code 仪表盘
https://<domain>/ui/d/claude-code
# 使用已轮换的 Grafana 管理凭据

# PostgreSQL
psql 'host=<ip> port=5432 dbname=meta user=dbuser_meta sslmode=require'
```


--------

## 适用场景

- **AI 应用开发**：构建 RAG、Agent、LLM 应用
- **数据科学**：使用 JupyterLab 进行数据分析和可视化
- **远程开发**：在云服务器上搭建 Web IDE 环境
- **教学演示**：提供一致的开发环境供学员使用
- **快速原型**：快速验证想法，无需配置本地环境
- **Claude Code 可观测性**：监控 AI 编程助手的使用情况


--------

## 注意事项

- **必须修改密码**：`code_password` 和 `jupyter_password` 默认值仅供测试
- **Jupyter 安全边界**：模板监听 `0.0.0.0:8888`、允许任意 Origin、关闭 XSRF 校验，默认只依靠 Token；必须限制端口与门户来源，不得直接暴露公网
- **网络安全**：此模板默认开放 `5432`（`node_firewall_public_port`）且包含 `addr: world` HBA 规则，生产环境请删除这些公网入口，并在需要时为门户增加 Basic Auth
- **资源需求**：建议至少 2 核 4GB 内存，SSD 磁盘
- **精简架构**：此模板禁用了 Patroni、PgBouncer 等高可用组件，适合单节点开发环境
- **Claude API**：使用 Claude Code 需要配置 `claude_env` 中的 API 密钥
