这是本节的多页打印视图。 .
应用
- 1: Supabase 企业级自建
- 2: Odoo:自建开源 ERP
- 3: Dify:AI 工作流平台
- 4: InsForge:AI 后端即服务
- 5: Hindsight:AI 长期记忆
- 6: FerretDB:MongoDB 协议
- 7: NocoDB:开源 Airtable
- 8: Teable:AI 无代码数据库
- 9: Gitea:自建简易代码托管平台
- 10: Wiki.js:维基百科站
- 11: Mattermost:开源团队协作
- 12: Maybe:自建个人财务
- 13: Immich:自建照片视频库
- 14: Metabase:BI 分析工具
- 15: Kong:API 网关
- 16: Registry:容器镜像缓存
- 17: JumpServer:开源堡垒机
- 18: ByteBase:模式迁移
- 19: pgAdmin:PostgreSQL 图形管理工具
- 20: PGWeb:网页客户端
- 21: PostgREST:自动 API
- 22: Electric:PostgreSQL 同步引擎
- 23: Jupyter:Notebook 与数据分析环境
- 24: PGLOG:PG自带日志分析应用
- 25: NOAA ISD 全球气象站历史数据查询
- 26: COVID-19 数据大盘
- 27: StackOverflow 调研
- 28: DB-Engine 热度分析
- 29: 云上算力价格计算器
Pigsty 的“应用”分为两类:
- 软件模板(Software Templates):
~/pigsty/app/<name>下的 Docker Compose 模板,用于拉起无状态业务组件。 - 数据应用(Applets):基于 PostgreSQL + Grafana 的分析样例,偏教学/演示属性。
应用模型
推荐使用以下流程部署应用:
app.yml 会将 app/<name> 模板复制到 /opt/<name>,并按 apps.<name>.conf 覆盖 .env,最后执行 docker compose up -d。
维护中的配置模板
当前源码中提供了以下应用配置模板(conf/app/*.yml、conf/supabase.yml 与 conf/app/supa.yml 软链接):
app/difyapp/odooapp/teableapp/mattermostapp/electricapp/maybeapp/immichapp/jumpserverapp/registryapp/insforgeapp/hindsightsupabase
这些模板开箱即用,且与 ./configure -c ...、./app.yml 工作流保持一致。
轻量 Compose 应用
对于 bytebase、gitea、jupyter、kong、metabase、minio、nocodb、pgadmin、pgweb、postgrest、pg_exporter、wiki 等应用,也可直接使用对应目录下的 Compose 模板。
FerretDB 是 PostgreSQL Mongo 模式 的 Docker APP 协议层,通过 mongo 配置模板配合 docker.yml 与 app.yml 部署。
如果你希望统一纳入 Pigsty IaC,可用 app.yml 指定应用目录:
关于历史 Applet
pglog、covid、db-engine、sf-survey、cloud、isd 等数据应用保留为参考示例,适合学习数据建模与可视化思路。
它们不再是主线“应用交付”方式;请优先使用上面的软件模板工作流。
1 - Supabase 企业级自建
Supabase 很好,拥有属于你自己的 supabase 则好上加好。 Pigsty 可以帮助您在自己的服务器上(物理机/虚拟机/云服务器),一键自建企业级 supabase —— 更多扩展,更好性能,更深入的控制,更合算的成本。
截至 2026-08,Supabase 的 官方自托管文档 推荐 Docker,并将其他实现归为社区项目;Pigsty 是独立的社区集成,目前不在该页面的项目列表中。
本教程需要您有 Linux 基础知识,否则建议直接使用 Supabase 云服务或 “Docker Compose” 自建。
简短版本
准备 Linux 系统,执行 Pigsty 标准单机安装 流程,选择 supabase 配置模板,依次执行:
安装完毕后,使用浏览器访问 8000 端口造访 Supa Studio,用户名 supabase,密码 pigsty。

检查清单
- 至少一台 2C4G 的服务器;完整 Supabase 栈建议 4C8G 或更高
- 带有静态内网 IPv4 地址
- 安装支持的 Linux 发行版
- 标准安装 Pigsty
- 修改配置文件,域名,密码,IP 地址
- 安装 Docker 模块,确保代理/镜像站可用
- 使用 Pigsty 提供的
app.yml拉起 Supabase
目录
Supabase是什么?
Supabase 是一个 BaaS (Backend as Service),开源的 Firebase,是 AI Agent 时代最火爆的数据库 + 后端解决方案。
Supabase 对 PostgreSQL 进行了封装,并提供了身份认证,消息传递,边缘函数,对象存储,并基于 PG 数据库模式自动生成 REST API;按需启用 pg_graphql 后,也可以提供 GraphQL API。
Supabase 旨在为开发者提供一条龙式的后端解决方案,减少开发和维护后端基础设施的复杂性。 它能让开发者告别绝大部分后端开发的工作,只需要懂数据库设计与前端即可快速出活! 开发者只要用 Vibe Coding 糊个前端与数据库模式设计,就可以快速完成一个完整的应用。
目前,Supabase 是 PostgreSQL 开源生态 中人气最高的开源项目之一;截至 2026-08,其 GitHub 仓库 已有超过十万 Star。 Supabase 也提供免费云服务额度;当前 免费计划 包含共享 CPU、500 MB 内存、500 MB 数据库额度与 1 GB 文件存储,具体配额以后续官方页面为准。
为什么要自建?
既然 Supabase 云服务这么香,为什么要自建呢?
最直观的原因是我们在《云数据库是智商税吗?》中提到过的:当数据、计算或可用性需求超出托管服务套餐的适用范围时,成本可能快速增长。 而且在当下,足够可靠的 本地企业级 NVMe SSD 在性价比上与 云端存储 有着三到四个数量级的优势,而自建能更好地利用这一点。
另一个重要的原因是 功能, Supabase 云服务的功能受限 —— 很多强力 PG 扩展因为多租户安全挑战与许可证的原因无法以云服务的形式。 故而尽管 扩展是 PostgreSQL 的核心特色,Supabase 官方当前只承诺 预配置 50 多个扩展,具体清单还会随平台版本变化。 而通过 Pigsty 自建的 Supabase 则提供了多达 575 个开箱即用的 PG 扩展。
此外,自主可控与规避供应商锁定也是自建的重要原因 —— 尽管 Supabase 虽然旨在提供一个无供应商锁定的 Google Firebase 开源替代,但实际上自建高标准企业级的 Supabase 门槛并不低。 Supabase 内置了一系列由他们自己开发维护的 PG 扩展。Supabase 在 2024 年收购了 Oriole 团队,并把 OrioleDB 作为可选 Public Alpha 提供;它不是生产环境默认内核,也不能表述为已计划替换原生 PostgreSQL。部分 Supabase 扩展和带补丁内核不由 PGDG 官方仓库提供。
这实际上是某种隐性的供应商锁定,阻止了用户使用除了 supabase/postgres Docker 镜像之外的方式自建,Pigsty 则提供开源,透明,通用的方案解决这个问题。
我们将 Supabase 自研与用到的 10 个缺失扩展打成开箱即用的 RPM/DEB 包,覆盖当前 supabase 模板声明支持的 Linux 发行版:EL 8/9、Debian 12、Ubuntu 22.04/24.04/26.04,以及 x86_64/aarch64 架构。
| 扩展 | 说明 |
|---|---|
pg_graphql | 提供 PG 内的 GraphQL 支持 (RUST),Rust 扩展,由 PIGSTY 提供,按需启用 |
pg_jsonschema | 提供 JSON Schema 校验能力,Rust 扩展,由 PIGSTY 提供 |
wrappers | Supabase 提供的外部数据源包装器捆绑包,Rust 扩展,由 PIGSTY 提供 |
index_advisor | 查询索引建议器,SQL 扩展,由 PIGSTY 提供 |
pg_net | 用 SQL 进行异步非阻塞 HTTP/HTTPS 请求的扩展 (supabase),C 扩展,由 PIGSTY 提供 |
vault | 在 Vault 中存储加密凭证的扩展 (supabase),C 扩展,由 PIGSTY 提供 |
pgjwt | JSON Web Token API 的 PG 实现 (supabase),SQL 扩展,由 PIGSTY 提供 |
pgsodium | 表数据加密存储 TDE,扩展,由 PIGSTY 提供 |
supautils | 用于在云环境中确保数据库集群的安全,C 扩展,由 PIGSTY 提供 |
pg_plan_filter | 使用执行计划代价过滤阻止特定查询语句,C 扩展,由 PIGSTY 提供 |
同时,我们在 Supabase 自建部署中默认 安装 绝大多数扩展,您可以参考可用扩展列表按需 启用。
新版模板会安装 pg_graphql 扩展包,但不再默认创建 pg_graphql 扩展对象;如果需要 GraphQL API,可以在目标数据库中执行 CREATE EXTENSION IF NOT EXISTS pg_graphql;,模板中的事件触发器会自动重建 graphql_public.graphql 入口与访问权限。
同时,Pigsty 还会负责好底层 高可用 PostgreSQL 数据库集群,高可用 Silo 对象存储集群的自动搭建,甚至是 Docker 容器底座的部署与 Nginx 反向代 理,域名配置 与 HTTPS证书签发。 您可以使用 Docker Compose 拉起任意数量的无状态 Supabase 容器集群,并将状态存储在外部 Pigsty 自托管数据库服务中。
在这一自建部署架构中,您获得了使用不同内核的自由(当前模板支持 PostgreSQL 15-18,默认 18),加装 575 个扩展的自由,扩容与伸缩 Supabase / Postgres / Silo 的自由, 免于数据库运维杂务的自由,以及免于供应商锁定,本地运行到地老天荒的自由。 而相比于使用云服务需要付出的代价,不过是准备服务器和多敲几行命令而已。
单节点自建快速上手
让我们先从单节点 Supabase 部署开始,我们会在后面进一步介绍多节点高可用部署的方法。
准备 一台全新 Linux 服务器,使用 Pigsty 提供的 supabase 配置模板执行 标准安装,
然后额外运行 docker.yml 与 app.yml 拉起无状态部分的 Supabase 容器即可(默认端口 8000/8443)。
在部署 Supabase 前请根据实际情况修改自动生成的 pigsty.yml 配置文件中的参数(域名与密码)
如果只是本地开发测试,可以先跳过,我们将在后面介绍如何通过修改配置文件来进一步定制。
如果配置无误,大约十分钟后,就可以在本地网络通过 http://<your_ip_address>:8000 访问到 Supabase Studio 图形管理界面了。
默认的用户名与密码分别是: supabase 与 pigsty。

注意事项:
- 在中国大陆地区,Pigsty 默认使用 1Panel 与 1ms 提供的 DockerHub 镜像站点下载 Supabase 相关镜像,可能会较慢。
- 你也可以自行配置 代理 与 镜像站,
cd /opt/supabase; docker compose pull手动拉取镜像。我们亦提供包含完整离线安装方案的 Supabase 自建专家咨询服务。 - 如果你需要使用的对象存储功能,那么需要通过域名与 HTTPS 访问 Supabase,否则会出现报错。
- 对于严肃的生产部署,请 务必 修改所有默认密码!
自建关键技术决策
以下是一些自建 Supabase 会涉及到的关键技术决策,供您参考:
使用默认的 单节点部署 Supabase 无法享受到 PostgreSQL / Silo 的高可用能力。 尽管如此,单节点部署相比官方纯 Docker Compose 方案依然要有显著优势: 例如开箱即用的监控系统,自由安装扩展的能力,各个组件的扩缩容能力,以及提供兜底数据库时间点恢复能力等。
Pigsty 的 Supabase 模板不启动上游 Compose 中的 db 与 supavisor 容器,也不使用 Supabase 自带连接池。
无状态容器直接通过 Pigsty 管理的 PostgreSQL 服务接入数据库;单节点模板中默认使用 5436 服务端口,它始终路由到当前主库。
模板中的 Logflare / Analytics 不再写入业务库的 postgres._analytics,而是使用独立的 _supabase 数据库与其中的 _analytics 模式。
这样可以避免 oban_jobs、oban_peers 等内部调度表落在项目库的 public 模式中,触发 Supabase Advisor 的 RLS 告警;相关位置由 LOGFLARE_DB 与 LOGFLARE_SCHEMA 控制。
Supabase Studio 的 Query Performance 页面会在 public, extensions 搜索路径下访问 pg_stat_statements。
Pigsty 仍然将 pg_stat_statements 扩展对象保留在 monitor 模式中,以兼容 pg_exporter 与现有监控面板;模板会在 extensions 模式中创建兼容视图与函数,供 Studio 使用。
如果您只有一台服务器,或者选择在云服务器上自建,Pigsty 建议您使用外部的 S3 替代本地的 Silo 作为对象存储,存放 PostgreSQL 的备份,并承载 Supabase Storage 服务。 这样的部署可在单机故障后提供小时级恢复的兜底路径;实际 RPO 取决于最近一次可恢复备份、WAL 归档状态与对象存储可用性,不能仅凭该拓扑承诺固定数值。
在严肃的生产部署中,Pigsty 建议使用至少 3~4 个节点的部署策略,确保 Silo 与 PostgreSQL 都使用满足企业级高可用要求的多节点部署。
在这种情况下,您需要相应准备更多节点与磁盘,并相应调整 pigsty.yml 配置清单中的集群配置,以及 supabase 集群配置中的接入信息,使用高可用接入点访问服务。
Supabase 的部分功能需要发送邮件,所以要用到 SMTP 服务。除非单纯用于内网,否则对于严肃的生产部署,建议使用 SMTP 云服务。自建的邮件服务器发送的邮件容易被标记为垃圾邮件导致拒收。
如果您的服务直接向公网暴露,我们强烈建议您使用真正的域名与 HTTPS 证书,并通过 Nginx 门户 访问。
接下来,我们会依次讨论一些进阶主题。如何在单节点部署的基础上,进一步提升 Supabase 的安全性、可用性与性能。
进阶主题:安全加固
Pigsty 基础组件
对于严肃的生产部署,我们强烈建议您修改 Pigsty 基础组件的密码。因为这些默认值是公开且众所周知的,不改密码上生产无异于裸奔:
grafana_admin_password:pigsty,Grafana 管理员密码pg_admin_password:DBUser.DBA,PG 超级用户密码pg_monitor_password:DBUser.Monitor,PG 监控用户密码pg_replication_password:DBUser.Replicator,PG 复制用户密码patroni_password:Patroni.API,Patroni 高可用组件密码haproxy_admin_password:pigsty,负载均衡器管控密码minio_secret_key:S3User.MinIO,Silo 根用户密钥etcd_root_password:Etcd.Root,Etcd 根用户密码- 此外,强烈建议您修改 Supabase 使用的 PostgreSQL 业务用户 密码,默认为
DBUser.Supa
以上密码为 Pigsty 组件模块的密码,强烈建议在安装部署前就设置完毕。
Supabase 密钥
除了 Pigsty 组件的密码,你还需要 修改 Supabase 的密钥,包括
JWT_SECRET:JWT 签名密钥,长度至少 32 个字符ANON_KEY:匿名用户的 JWT 凭据SERVICE_ROLE_KEY:服务角色的 JWT 凭据SUPABASE_PUBLISHABLE_KEY/SUPABASE_SECRET_KEY:新版不透明 API Key,未启用时可以留空JWT_KEYS/JWT_JWKS:非对称 JWT 密钥与 JWKS,未启用时可以留空ANON_KEY_ASYMMETRIC/SERVICE_ROLE_KEY_ASYMMETRIC:非对称签名 JWT,未启用时可以留空PG_META_CRYPTO_KEY:PostgreSQL Meta 服务的加密密钥,长度至少 32 个字符SECRET_KEY_BASE:Realtime 使用的随机密钥REALTIME_DB_ENC_KEY:Realtime 数据库加密密钥DASHBOARD_USERNAME:Supabase Studio Web 界面的默认用户名,默认为supabaseDASHBOARD_PASSWORD:Supabase Studio Web 界面的默认密码,默认为pigstyLOGFLARE_PUBLIC_ACCESS_TOKEN:Logflare 公开访问令牌,至少 32 个随机字符LOGFLARE_PRIVATE_ACCESS_TOKEN:Logflare 私有访问令牌,至少 32 个随机字符LOGFLARE_DB/LOGFLARE_SCHEMA:Logflare / Analytics 使用的内部数据库与模式,默认是_supabase/_analytics
这里请您务必参照 Supabase教程:保护你的服务 里的说明:
- 生成一个长度超过 40 个字符的
JWT_SECRET,并使用教程中的工具签发ANON_KEY与SERVICE_ROLE_KEY两个 JWT。 - 使用教程中提供的工具,根据
JWT_SECRET以及过期时间等属性,生成一个ANON_KEYJWT,这是匿名用户的身份凭据。 - 使用教程中提供的工具,根据
JWT_SECRET以及过期时间等属性,生成一个SERVICE_ROLE_KEY,这是权限更高服务角色的身份凭据。 - 如果您使用新版不透明 API Key 或非对称 JWT,请同步生成并填写
SUPABASE_PUBLISHABLE_KEY、SUPABASE_SECRET_KEY、JWT_KEYS、JWT_JWKS与对应的非对称ANON_KEY/SERVICE_ROLE_KEY。 - 指定一个32个字符以上的随机字符串密钥
PG_META_CRYPTO_KEY,用于加密 Studio UI 与 meta 服务的交互 SECRET_KEY_BASE至少 64 个字符;REALTIME_DB_ENC_KEY必须恰好 16 个字符。- 为
S3_PROTOCOL_ACCESS_KEY_ID与S3_PROTOCOL_ACCESS_KEY_SECRET生成独立随机凭据,不要复用对象存储管理员密码。 - 如果您使用的 PostgreSQL 业务用户使用了不同于默认值的密码,请相应修改
POSTGRES_PASSWORD的值 - 如果您的对象存储使用了不同于默认值的密码,请相应修改
S3_ACCESS_KEY与S3_SECRET_KEY的值 - 如果您将 Edge Functions 暴露给不可信客户端,请按需将
FUNCTIONS_VERIFY_JWT改为true。 API_EXTERNAL_URL现在应填写 Auth 服务的外部 URL,保留/auth/v1后缀,例如https://supa.pigsty.cc/auth/v1;SITE_URL与SUPABASE_PUBLIC_URL保持站点根 URL。- 当前模板的
PGRST_DB_SCHEMAS默认为public,graphql_public;storage模式由 Storage API 使用,不再通过 PostgREST 默认暴露。
Supabase 部分的凭据修改后,您可以重启 Docker Compose 容器以应用新的配置:
进阶主题:域名接入
如果你在本机或局域网内使用 Supabase,那么可以选择 IP:Port 直连 Kong 对外暴露的 HTTP 8000 端口访问 Supabase。
你可以使用一个内网静态解析的域名,但对于严肃的生产部署,我们建议您使用真域名 + HTTPS 来访问 Supabase。
在这种情况下,您的服务器应当有一个公网 IP 地址,你应当拥有一个域名,使用云/DNS/CDN 供应商提供的 DNS 解析服务,将其指向安装节点的公网 IP(可选默认下位替代:本地 /etc/hosts 静态解析)。
比较简单的做法是,直接批量替换占位域名(supa.pigsty)为你的实际域名,假设为 supa.pigsty.cc:
如果你没有事先配置好,那么重载 Nginx 和 Supabase 的配置生效即可:
修改后的配置应当类似下面的片段:
完整的域名/HTTPS 配置可以参考 证书管理 教程,您也可以使用 Pigsty 自带的本地静态解析与自签发 HTTPS 证书作为下位替代。
进阶主题:外部对象存储
您可以使用 S3 或 S3 兼容的服务,来作为 PGSQL 备份与 Supabase 使用的对象存储。这里我们使用一个 阿里云 OSS 对象存储作为例子。
Pigsty 提供了一个
terraform/spec/aliyun-s3.tf模板, 可以用于在阿里云上拉起一台服务器,以及一个 OSS 存储桶。
首先,修改 all.children.supabase.vars.apps.supabase.conf 中 S3 相关的配置,将其指向阿里云 OSS 存储桶:
同样使用以下命令重载 Supabase 配置:
您同样可以使用 S3 作为 PostgreSQL 的备份仓库,在 all.vars.pgbackrest_repo 新增一个 aliyun 备份仓库的定义:
然后在 all.vars.pgbackrest_method 中指定 aliyun。先核对现有备份,再在明确授权后对目标集群重新渲染 pgBackRest 配置、初始化 stanza,并立即建立新的全量恢复点:
旧仓库中的备份不会自动迁移;新仓库首次全量备份成功前存在恢复窗口缺口。完整步骤与注意事项见 PostgreSQL 备份仓库。
进阶主题:使用SMTP
你可以使用 SMTP 来发送邮件,修改 supabase 应用配置,添加 SMTP 信息:
不要忘了使用 ./app.yml -l supabase -t app_config,app_launch 重载配置。
进阶主题:真·高可用
经过这些配置,您拥有了一个带公网域名,HTTPS 证书,SMTP,PITR 备份,监控,IaC,以及 575 个扩展的企业级 Supabase (基础单机版)。 高可用的配置请参考 Pigsty 其他部份的文档,如果您懒得阅读学习,我们提供手把手扶上马的 Supabase 自建专家咨询服务 —— ¥2000 元免去折腾与下载的烦恼。
单节点的 RTO / RPO 依赖外部对象存储服务提供兜底,如果您的这个节点挂了,外部 S3 存储中保留了备份,您可以在新的节点上重新部署 Supabase,然后从备份中恢复。 这种拓扑可以提供小时级恢复的 兜底路径,但 RPO 取决于备份与 WAL 归档的实际状态,必须通过恢复演练验证,不能用“MB 级”作为固定承诺。
若目标是 RTO < 30s 且已确认事务在切换时不丢失,需要使用多节点,并显式选择 fast RTO 预设与 crit.yml 严格同步策略后进行故障演练;默认 norm 预设的目标是 RTO < 45s,异步复制不承诺 RPO=0。这涉及到:
- ETCD: DCS 需要使用三个节点或以上,才能容忍一个节点的故障。
- PGSQL: PGSQL 同步提交不丢数据模式,建议使用至少三个节点。
- INFRA:监控基础设施故障影响稍小,建议生产环境使用双副本
- Supabase 无状态容器本身也可以是多节点的副本,可以实现高可用。
在这种情况下,您还需要修改 PostgreSQL 与 Silo 的接入点,使用 DNS / L2 VIP / HAProxy 等 高可用接入点
关于这些部分,您只需参考 Pigsty 中各个模块的文档进行配置部署即可。
建议您参考 conf/ha/trio.yml 与 conf/ha/safe.yml 中的配置,将集群规模升级到三节点或以上。
2 - Odoo:自建开源 ERP
Odoo 是一个开源企业资源规划 (ERP) 软件,提供一整套业务应用程序,包括 CRM、销售、采购、库存、生产、会计和其他管理功能。Odoo 是一个典型的 Web 应用程序,使用 PostgreSQL 作为底层数据库。
您的所有业务,都在一个平台上,简单、高效且实惠
公开演示(不一定开放):http://odoo.pigsty.io, 用户名: test@pigsty.io, 密码: pigsty
快速开始
在运行兼容操作系统的全新 Linux x86 / ARM 服务器上执行:
Odoo 默认监听在 8069 端口,您可以通过浏览器访问 http://<ip>:8069。默认的用户名和密码都是 admin。
您可以在浏览器所在主机(/etc/hosts)添加一条解析记录 odoo.pigsty 指向您的服务器,这样您就可以通过 http://odoo.pigsty 访问 Odoo 网络界面了。
如果您想要通过 SSL/HTTPS 访问 Odoo,您需要使用真正的 SSL 证书,或者信任 Pigsty 自动生成的自签名 CA 证书。(当然,在 Chrome 浏览器中,您也可以使用敲击键入 thisisunsafe 来绕过证书验证)
配置模板
conf/app/odoo.yml 定义了一个模板配置文件,包含单个 Odoo 实例所需的资源。
基础
检查 .env 文件中的可配置环境变量:
然后使用以下命令启动 odoo:
访问 http://ddl.pigsty 或 http://10.10.10.10:8887
Makefile
使用外部 PostgreSQL
您可以为 Odoo 使用外部 PostgreSQL。Odoo 将在设置期间创建自己的数据库,因此您不需要这样做
并使用以下命令创建业务用户和数据库:
检查连接性:
暴露 Odoo 服务
通过 nginx 门户 暴露 odoo Web 服务:
Odoo 插件
社区中有很多 Odoo 模块可用,您可以通过下载并将它们放在 addons 文件夹中来安装它们。
您可以将 ./addons 目录挂载到容器中的 /mnt/extra-addons,然后下载并解压到 addons 文件夹,
要启用插件模块,首先进入 开发者模式
设置 -> 通用设置 -> 开发者工具 -> 激活开发者模式
然后转到 > 应用程序 -> 更新应用程序列表,然后您可以找到额外的插件并从面板安装。
演示
查看公共演示:http://odoo.pigsty.io,用户名:test@pigsty.io,密码:pigsty
如果您想通过 SSL 访问 odoo,您必须在浏览器中信任 files/pki/ca/ca.crt(或在 chrome 中使用肮脏的黑客 thisisunsafe)
3 - Dify:AI 工作流平台
Dify 是一个生成式 AI 应用创新引擎和开源 LLM 应用开发平台。它提供从 Agent 构建到 AI 工作流编排、RAG 检索和模型管理的能力,帮助用户轻松构建和运营生成式 AI 原生应用程序。
Pigsty 提供对自托管 Dify 的支持,允许您使用单个命令部署 Dify,同时将关键状态存储在外部管理的 PostgreSQL 中。您可以在同一个 PostgreSQL 实例中使用 pgvector 作为向量数据库,进一步简化部署。
app/dify模板最后验证的 Dify 版本:v1.15.0(2026-07-09)。模板包含一份针对 PostgreSQL 18 内置uuidv7()的 Dify 迁移脚本兼容补丁。
快速开始
在运行 兼容操作系统 的全新 Linux x86 / ARM 服务器上执行:
Dify 默认监听端口 5001。您可以通过浏览器访问 http://<ip>:5001 并设置您的初始用户凭据来登录。
Dify 启动后,您可以安装各种扩展、配置系统模型并开始使用它!
为什么要自托管
自托管 Dify 有很多原因,但主要动机是数据安全。Dify 提供的 DockerCompose 模板使用基本的默认数据库镜像,缺乏企业级功能,如高可用性、灾难恢复、监控、IaC 和 PITR 能力。
Pigsty 为 Dify 提供声明式部署,并可使用镜像解决中国地区的镜像访问问题。模板将 PostgreSQL 与 pgvector 交给 Pigsty 管理,
部署 Compose Redis、VictoriaMetrics/Grafana 监控与 Nginx 反向代理;满足公网 DNS、端口和 Certbot 配置后,还可申请 Let’s Encrypt 证书。
文件默认保存到 DIFY_DATA(/data/dify),也可按需接入 Silo/S3 对象存储。
当前模板把 PostgreSQL/pgvector 放在 Pigsty 管理的外部数据库中,并把 API 文件与插件数据定向到 DIFY_DATA(默认 /data/dify)。但 Compose 内置 Redis 的数据仍位于 /opt/dify/volumes/redis/data,Sandbox 依赖与 Certbot 数据也位于 /opt/dify/volumes/,因此整套应用并非完全无状态,备份时不能只保留数据库。
安装
让我们从单节点 Dify 部署开始。我们稍后将介绍生产高可用部署方法。
首先,使用 Pigsty 的 标准安装过程 安装 Dify 所需的 PostgreSQL 实例:
当您使用 ./configure -c app/dify 命令时,Pigsty 会根据 conf/app/dify.yml 模板和您当前的环境自动生成配置文件。
您应该根据实际需要在生成的 pigsty.yml 配置文件中修改密码、域名和其他相关参数,然后使用 ./deploy.yml 执行标准安装过程。
接下来,运行 docker.yml 安装 Docker 和 Docker Compose,然后使用 app.yml 完成 Dify 部署:
您可以在本地网络上通过 http://<your_ip_address>:5001 访问 Dify Web 管理界面。
首次登录时会提示设置默认用户名、邮箱和密码。
您也可以使用本地解析的占位符域名 dify.pigsty,或按照下面的配置使用带有 HTTPS 证书的真实域名。
配置
当您使用 ./configure -c app/dify 命令进行配置时,Pigsty 会根据 conf/app/dify.yml 模板和当前环境生成配置文件。以下快照与 v4.5.0 源模板同步:
---
#==============================================================#
# File : dify.yml
# Desc : pigsty config for running 1-node dify app
# Ctime : 2025-02-24
# Mtime : 2026-07-09
# Docs : https://pigsty.io/docs/app/dify
# License : Apache-2.0 @ https://pigsty.io/docs/about/license/
# Copyright : 2018-2026 Ruohang Feng / Vonng (rh@vonng.com)
#==============================================================#
# Last Verified Dify Version: v1.15.0 on 2026-07-09
# tutorial: https://pigsty.io/docs/app/dify
# how to use this template:
#
# curl -fsSL https://repo.pigsty.io/get | bash; cd ~/pigsty
# ./bootstrap # prepare local repo & ansible
# ./configure -c app/dify # use this dify config template
# vi pigsty.yml # IMPORTANT: CHANGE CREDENTIALS!!
# ./deploy.yml # install pigsty & pgsql
# ./docker.yml # install docker & docker-compose
# ./app.yml # install dify with docker-compose
#
# To replace domain name:
# sed -ie 's/dify.pigsty/dify.pigsty.cc/g' pigsty.yml
all:
children:
# the dify application
dify:
hosts: { 10.10.10.10: {} }
vars:
app: dify # specify app name to be installed (in the apps)
apps: # define all applications
dify: # app name, should have corresponding ~/pigsty/app/dify folder
file: # data directory to be created
- { path: /data/dify ,state: directory ,mode: 0755 }
conf: # override /opt/dify/.env config file
# change domain, mirror, proxy, secret key
NGINX_SERVER_NAME: dify.pigsty
# A secret key for signing and encryption, gen with `openssl rand -base64 42` (CHANGE PASSWORD!)
SECRET_KEY: sk-somerandomkey
# expose DIFY nginx service with port 5001 by default
DIFY_PORT: 5001
# where to store dify files? the default is ./volume, we'll use another volume created above
DIFY_DATA: /data/dify
# enable the upstream websocket sidecar, while keeping PostgreSQL/pgvector external
COMPOSE_PROFILES: collaboration
NEXT_PUBLIC_SOCKET_URL: ws://dify.pigsty
TRIGGER_URL: http://dify.pigsty
ENDPOINT_URL_TEMPLATE: http://dify.pigsty/e/{hook_id}
# proxy and mirror settings
#PIP_MIRROR_URL: https://pypi.tuna.tsinghua.edu.cn/simple
#SANDBOX_HTTP_PROXY: http://10.10.10.10:12345
#SANDBOX_HTTPS_PROXY: http://10.10.10.10:12345
# database credentials
DB_TYPE: postgresql
DB_USERNAME: dify
DB_PASSWORD: difyai123456
DB_HOST: 10.10.10.10
DB_PORT: 5432
DB_DATABASE: dify
DB_SSL_MODE: disable
VECTOR_STORE: pgvector
PGVECTOR_HOST: 10.10.10.10
PGVECTOR_PORT: 5432
PGVECTOR_USER: dify
PGVECTOR_PASSWORD: difyai123456
PGVECTOR_DATABASE: dify
PGVECTOR_MIN_CONNECTION: 2
PGVECTOR_MAX_CONNECTION: 10
# optional MinIO/S3 storage, disabled by default to avoid touching backup MinIO
#STORAGE_TYPE: s3
#S3_ENDPOINT: http://10.10.10.10:9000
#S3_BUCKET_NAME: dify
#S3_ACCESS_KEY: dify
#S3_SECRET_KEY: S3User.Dify
#S3_REGION: us-east-1
#S3_ADDRESS_STYLE: path
pg-meta:
hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
vars:
pg_cluster: pg-meta
pg_extensions: [ pgvector ]
pg_users:
- { name: dify ,password: difyai123456 ,pgbouncer: true ,roles: [ dbrole_admin ] ,superuser: true ,comment: dify superuser }
pg_databases:
- { name: dify ,owner: dify ,extensions: [ { name: vector } ] ,comment: dify main database }
- { name: dify_plugin ,owner: dify ,comment: dify plugin daemon database }
pg_hba_rules:
- { user: dify ,db: all ,addr: 172.16.0.0/12 ,auth: pwd ,title: 'allow dify access from local docker networks' }
pg_crontab: [ '00 01 * * * /pg/bin/pg-backup full' ] # make a full backup every 1am
infra: { hosts: { 10.10.10.10: { infra_seq: 1 } } }
etcd: { hosts: { 10.10.10.10: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } }
#minio: { hosts: { 10.10.10.10: { minio_seq: 1 } }, vars: { minio_cluster: minio } }
vars: # global variables
version: v4.5.0 # pigsty version string
admin_ip: 10.10.10.10 # admin node ip address
region: default # upstream mirror region: default|china|europe
node_tune: oltp # node tuning specs: oltp,olap,tiny,crit
pg_conf: oltp.yml # pgsql tuning specs: {oltp,olap,tiny,crit}.yml
docker_enabled: true # enable docker on app group
#docker_registry_mirrors: ["https://docker.1panel.live","https://docker.1ms.run","https://docker.xuanyuan.me","https://registry-1.docker.io"]
proxy_env: # global proxy env when downloading packages & pull docker images
no_proxy: "localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.pigsty,*.aliyun.com,mirrors.*,*.tsinghua.edu.cn"
#http_proxy: 127.0.0.1:12345 # add your proxy env here for downloading packages or pull images
#https_proxy: 127.0.0.1:12345 # usually the proxy is format as http://user:pass@proxy.xxx.com
#all_proxy: 127.0.0.1:12345
infra_portal: # domain names and upstream servers
home : { domain: i.pigsty }
#minio : { domain: m.pigsty ,endpoint: "${admin_ip}:9001" ,scheme: https ,websocket: true }
dify: # nginx server config for dify
domain: dify.pigsty # REPLACE WITH YOUR OWN DOMAIN!
endpoint: "10.10.10.10:5001" # dify service endpoint: IP:PORT
websocket: true # add websocket support
certbot: dify.pigsty # certbot cert name, apply with `make cert`
repo_enabled: false
node_repo_modules: node,infra,pgsql
# Dify v1.15.0 is patched in app/dify/patches for PostgreSQL 18's built-in uuidv7().
pg_version: 18
#----------------------------------------------#
# PASSWORD : https://pigsty.io/docs/setup/security/
#----------------------------------------------#
grafana_admin_password: pigsty
grafana_view_password: DBUser.Viewer
pg_admin_password: DBUser.DBA
pg_monitor_password: DBUser.Monitor
pg_replication_password: DBUser.Replicator
patroni_password: Patroni.API
haproxy_admin_password: pigsty
minio_secret_key: S3User.MinIO
etcd_root_password: Etcd.Root
...
检查清单
以下是您需要关注的配置项检查清单:
- 硬件/软件:准备所需的机器资源:Linux
x86_64/arm64服务器,主流 Linux 操作系统 的全新安装 - 网络/权限:SSH 免密登录访问权限,用户具有 免密 sudo 权限
- 确保机器在内网中有静态 IPv4 网络地址且可访问互联网
- 如果通过公网访问,确保您有可用的域名指向当前节点的 公网 IP 地址
- 确保使用
app/dify配置模板并根据需要修改参数configure -c app/dify,并输入节点的内网主 IP 地址,或通过-i <primary_ip>命令行参数指定
- 在生产环境中,您是否已经修改全部示例密码、应用密钥与数据库凭据?【必需】
grafana_admin_password:pigsty,Grafana 管理员密码pg_admin_password:DBUser.DBA,PG 超级用户密码pg_monitor_password:DBUser.Monitor,PG 监控用户密码pg_replication_password:DBUser.Replicator,PG 复制用户密码patroni_password:Patroni.API,Patroni HA 组件密码haproxy_admin_password:pigsty,负载均衡器管理密码
- 您是否修改了 PostgreSQL 集群业务用户密码和使用这些密码的应用程序配置?
- 默认用户名
dify和密码difyai123456是 Pigsty 为 Dify 生成的,请根据实际情况修改 - 在 Dify 的配置块中,请相应修改
DB_USERNAME、DB_PASSWORD、PGVECTOR_USER、PGVECTOR_PASSWORD等参数
- 默认用户名
- 您是否修改了 Dify 的默认加密密钥?
- 您可以使用
openssl rand -base64 42随机生成密码字符串并填入SECRET_KEY参数
- 您可以使用
- 您是否修改了 Dify 使用的域名?
- 将占位符域名
dify.pigsty替换为您的实际域名,例如dify.pigsty.cc - 您可以使用
sed -ie 's/dify.pigsty/dify.pigsty.cc/g' pigsty.yml修改 Dify 的域名
- 将占位符域名
域名和 SSL
如果您想使用带有 HTTPS 证书的真实域名,需要在 pigsty.yml 配置文件中修改:
infra_portal参数的dify域名- 最好指定一个邮箱地址
certbot_email用于接收证书过期通知 - 配置 Dify 的
NGINX_SERVER_NAME参数来指定您的实际域名
使用以下命令申请 Nginx 证书:
执行 app.yml 剧本重新部署 Dify 服务以使 NGINX_SERVER_NAME 配置生效。
文件备份
您可以使用 restic 备份 Dify 的文件状态。当前模板至少需要保留 /data/dify、/opt/dify/.env 与 /opt/dify/volumes/;其中后者包含 Compose Redis、Sandbox 依赖和可能存在的 Certbot 数据。PostgreSQL 中的 Dify 数据仍应使用 Pigsty/pgBackRest 单独备份。
创建 Restic 备份仓库后,您可以使用以下命令备份 Dify:
另一种方案是把 /data/dify 放在由 JUICE 模块管理的共享文件系统上。文件数据可以位于 Silo/S3,也可以位于 PostgreSQL 的 jfs_blob 表;后者并不是“大对象”存储。
若使用 PostgreSQL 同时保存 JuiceFS 元数据和文件数据,请先在 pg_databases 中声明并创建专用数据库和最小权限用户,再在 Dify 节点上声明实例。以下示例中的密码只是占位符,不能直接用于生产环境:
先分别对数据库创建与 JUICE 部署做检查,确认精确目标后再执行实际 playbook:
数据库创建、文件系统首次格式化和挂载都会改变目标环境,实际执行前必须确认备份、数据库名和主机组。部署后再启动 Dify,参见 JUICE 配置 与 PITR 一致性边界。直接挂载到已有非空的 /data/dify 之前,还必须先停止 Dify 并规划现有文件迁移。
参考
4 - InsForge:AI 后端即服务
InsForge 是面向 AI 编程代理的开源 Backend-as-a-Service 平台。它以 PostgreSQL 为核心,提供认证、数据库 API、文件存储、模型网关、边缘函数、站点部署和支付集成等能力,让应用可以跳过大部分后端样板代码。
Pigsty 提供 app/insforge 配置模板,将 InsForge OSS 的无状态服务运行在 Docker Compose 中,并把最关键的状态放入 Pigsty 托管的 PostgreSQL。这样可以继续使用 Pigsty 的高可用、备份恢复、监控、入口域名与基础设施能力,而不是把数据库藏在临时容器卷里。
当前模板面向 InsForge OSS v2.2.6,使用外部 PostgreSQL,默认暴露 InsForge Dashboard/API、PostgREST 和 Deno Runtime 三个服务。
快速开始
在运行 兼容操作系统 的全新 Linux x86 / ARM 服务器上执行:
安装完成后,默认访问地址为:
http://<your_ip_address>:7130http://isf.pigsty
默认管理员账号为 admin@example.com / pigsty。生产环境必须修改管理员账号、管理员密码、JWT 密钥、加密密钥和数据库密码。
如果您希望通过 isf.pigsty 访问,请在浏览器所在主机的 /etc/hosts 中添加解析:
如果要对公网暴露服务,建议使用真实域名与 HTTPS 证书,并按下文修改 infra_portal。
检查清单
- 准备一台全新 Linux 服务器,建议至少
2C4G,磁盘使用 SSD/NVMe。 - 确认服务器拥有静态内网 IPv4 地址,并能访问 GHCR / Docker Hub 或已配置镜像站。
- 执行
./configure -c app/insforge后,修改pigsty.yml中的默认密码、域名和密钥。 - 用
openssl rand -base64 32分别生成新的JWT_SECRET与ENCRYPTION_KEY。 - 将
POSTGRES_PASSWORD与pg_users中的dbuser_insforge用户密码保持一致。 - 如果通过公网访问,配置真实域名、HTTPS 证书和防火墙访问策略。
- 确认 PostgreSQL 扩展包安装正常,部署后检查
pig pb info。
架构
InsForge 模板默认将数据库和应用容器分离:
组件说明:
- InsForge App:
ghcr.io/insforge/insforge-oss:v2.2.6,提供 Dashboard 和主 API,监听7130。 - PostgREST:
postgrest/postgrest:v12.2.12,从 PostgreSQL schema 自动生成 REST API,宿主机端口为5430。 - Deno Runtime:
ghcr.io/insforge/deno-runtime:latest,用于边缘函数运行时,监听7133。 - PostgreSQL:由 Pigsty 管理,负责持久化状态、备份、监控和高可用。
配置模板
conf/app/insforge.yml 定义了单节点 InsForge 自建模板。默认拓扑包括:
insforge:InsForge、PostgREST、Deno Runtime 容器所在节点。pg-meta:Pigsty 托管的 PostgreSQL 数据库集群,包含 InsForge 所需角色、数据库和扩展。infra:Nginx 入口、Grafana、VictoriaMetrics 等基础设施。etcd:Patroni 所需的分布式配置存储。
关键配置摘录如下:
重要参数
app.yml 会把 app/insforge 目录复制到 /opt/insforge,并用 apps.insforge.conf 覆盖 /opt/insforge/.env。常见参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
JWT_SECRET | 示例密钥 | JWT 签名密钥,生产必须替换,建议 32 字符以上随机值 |
ENCRYPTION_KEY | 示例密钥 | 用于加密运行时凭据,生产必须替换,并与 JWT_SECRET 分开管理 |
ROOT_ADMIN_USERNAME | admin@example.com | Root 管理员账号 |
ROOT_ADMIN_PASSWORD | pigsty | Root 管理员密码,生产必须替换 |
POSTGRES_HOST / POSTGRES_PORT | 10.10.10.10 / 5432 | Pigsty PostgreSQL 入口 |
POSTGRES_DB | insforge | InsForge 数据库 |
POSTGRES_USER | dbuser_insforge | InsForge 连接 PostgreSQL 的业务用户 |
POSTGRES_PASSWORD | DBUser.Insforge | 业务用户密码,生产必须替换 |
INSFORGE_VERSION | v2.2.6 | InsForge OSS 镜像标签 |
DENO_RUNTIME_VERSION | latest | Deno Runtime 镜像标签 |
APP_PORT | 7130 | InsForge App 对外端口 |
POSTGREST_PORT | 5430 | PostgREST 对外端口 |
DENO_PORT | 7133 | Deno Runtime 对外端口 |
ACCESS_API_KEY | 空 | 可选 MCP / API 访问密钥,为空时由 InsForge 生成 |
ACCESS_ANON_KEY | 空 | 可选前端匿名访问密钥,设置时应以 anon_ 开头 |
OPENROUTER_API_KEY | 空 | 可选 OpenRouter 模型网关密钥 |
AWS_S3_BUCKET / S3_* | 空 | 可选对象存储配置 |
DENO_DEPLOY_TOKEN | 空 | 可选 Deno Deploy 集成 |
VERCEL_TOKEN / FLY_API_TOKEN | 空 | 可选站点部署与计算平台集成 |
STRIPE_* / RAZORPAY_* | 空 | 可选支付集成 |
生成生产密钥:
修改数据库密码时,请保证应用与数据库定义同步。例如:
ENCRYPTION_KEY 一旦用于生产数据后应保持稳定。更换它可能导致已经加密保存的 API Key、OAuth Token、函数密钥等运行时凭据无法解密。
数据库与权限
InsForge 数据库默认名为 insforge,所有者为 dbuser_insforge。模板会创建以下角色:
| 角色 | 登录 | 用途 |
|---|---|---|
dbuser_insforge | 是 | InsForge 应用连接 PostgreSQL 的业务用户,模板中授予 superuser |
anon | 否 | PostgREST 匿名角色 |
authenticated | 否 | PostgREST 已认证用户角色 |
project_admin | 否 | 服务密钥语义的管理角色,带 BYPASSRLS |
files/insforge.sql 会设置 PostgREST 角色权限、默认权限、project_admin 的 ACL,以及 public.reload_postgrest_schema() 辅助函数。该函数会执行:
用于通知 PostgREST 重新加载 schema。
InsForge 上游的 PostgreSQL 镜像会预置 insforge_pg_utils。Pigsty 当前模板没有依赖这个扩展包,而是使用 Pigsty 已提供的 pgcrypto、http、pg_cron,并让 InsForge 应用迁移负责运行时 schema。
服务端口与持久化
默认 Docker Compose 服务如下:
| 服务 | 容器 | 宿主机端口 | 说明 |
|---|---|---|---|
| InsForge App | insforge | 7130 | Dashboard 与主 API |
| PostgREST | insforge-postgrest | 5430 | 自动生成 REST API |
| Deno Runtime | insforge-deno | 7133 | 边缘函数运行时 |
默认 Docker 卷如下:
| 卷 | 挂载点 | 说明 |
|---|---|---|
storage-data | /insforge-storage | 本地文件存储 |
insforge-logs | /insforge-logs | 应用日志 |
deno_cache | /deno-dir | Deno 模块缓存 |
数据库连接默认来自 Docker 容器到 Pigsty 节点 10.10.10.10:5432。模板的 HBA 规则允许 172.16.0.0/12,覆盖 Docker 默认 bridge 与常见自定义 bridge 地址段。
域名与入口
模板默认在 infra_portal 中增加 InsForge 入口:
如果您使用真实域名,例如 insforge.example.com,可以批量替换:
然后应用 Nginx 入口配置:
如需申请 HTTPS 证书,请先确保域名解析到当前节点,再在 infra_portal.insforge 中加入或修改 certbot:
随后执行:
运维命令
InsForge 安装后位于 /opt/insforge,常用命令如下:
离线环境可以提前保存镜像:
默认产物位置:
/tmp/docker/insforge/postgrest.tgz/tmp/docker/insforge/insforge.tgz/tmp/docker/insforge/deno.tgz/tmp/insforge.tgz
在目标机器上加载镜像:
数据与备份
InsForge 的状态分为两类:
- 业务数据、用户、项目元数据、权限等:存放在 Pigsty PostgreSQL 数据库
insforge中。 - 本地文件与日志:存放在 Docker 卷
storage-data与insforge-logs中。
模板默认配置每日凌晨 1 点执行一次 PostgreSQL 全量备份:
部署后建议检查备份状态:
如果您将文件存储配置为 S3 / MinIO,文件对象由对应对象存储系统承载;如果保持本地卷,需要另外纳入主机层备份策略。
排障
查看容器状态:
查看日志:
检查 PostgreSQL 是否能从容器访问:
检查 HBA 规则是否包含 Docker 网段:
检查角色是否存在:
检查端口占用:
常见问题:
- 无法登录:确认
ROOT_ADMIN_USERNAME/ROOT_ADMIN_PASSWORD是否已被模板写入/opt/insforge/.env,并检查insforge容器日志。 - PostgREST 启动失败:确认
anon、authenticated、project_admin角色存在,并确认JWT_SECRET与 InsForge App 一致。 - 数据库连接失败:确认
POSTGRES_HOST、POSTGRES_PORT、POSTGRES_PASSWORD与pg_users中的配置一致,并检查 HBA 是否允许 Docker 网段。 - 上传或下载文件异常:如果使用 S3 / MinIO,检查
AWS_S3_BUCKET、S3_ENDPOINT_URL、S3_FORCE_PATH_STYLE与访问密钥配置。
参考
5 - Hindsight:AI 长期记忆
Hindsight 是面向 AI Agent 的 PostgreSQL-native 长期记忆服务。
Pigsty 提供 app/hindsight 配置模板(conf/app/hindsight.yml),默认使用 Pigsty 托管的 PostgreSQL,而不是 Hindsight 内置的开发数据库。
快速开始
默认访问地址:
- UI:
http://hs.pigsty或http://<IP>:9999 - API:
http://hs-api.pigsty或http://<IP>:8888
关键配置
conf/app/hindsight.yml 会在 apps.hindsight.conf 中覆盖 /opt/hindsight/.env。重点参数:
HINDSIGHT_API_PUBLISH_PORT:API 对外端口,默认8888HINDSIGHT_UI_PUBLISH_PORT:UI 对外端口,默认9999HINDSIGHT_DB_HOST/HINDSIGHT_DB_PORT/HINDSIGHT_DB_NAME/HINDSIGHT_DB_USER/HINDSIGHT_DB_PASSWORDHINDSIGHT_API_VECTOR_EXTENSION:默认pgvectorHINDSIGHT_API_TEXT_SEARCH_EXTENSION:默认nativeHINDSIGHT_API_LLM_PROVIDER:默认none
默认 none LLM Provider 只保证服务可启动;事实抽取、反思与整合能力需要配置 Ollama 或 OpenAI 兼容 API。
运维命令
参考
6 - FerretDB:MongoDB 协议
FerretDB 在 PostgreSQL 与 DocumentDB 扩展之上提供 MongoDB 兼容协议。Pigsty 的 app/ferretdb 只运行无状态协议代理;PostgreSQL、postgres 数据库、DocumentDB 扩展与后端登录用户必须预先存在,mongo 配置模板 会一次性准备这些依赖。
快速开始
另行安装 mongosh 或其他 MongoDB 兼容客户端后,使用模板声明的专用登录连接:
关键配置
请通过清单中的 apps.ferretdb.conf 覆盖模板变量,不要直接修改部署到 /opt/ferretdb/.env 的文件:
端口 5436 是 Pigsty 直连当前 PostgreSQL 主库的服务。Linux host-gateway 映射让容器通过本机接入,同时保留 Pigsty 的主库路由。MongoDB 端口默认只监听回环地址;远程客户端确有需要时再显式修改 FERRETDB_BIND_ADDR。
FerretDB 通过 PostgreSQL 验证用户身份,但目前不实现 MongoDB 授权语义,因此 MongoDB 角色不能提供访问隔离。模板也没有启用客户端 MongoDB TLS;将服务暴露到不可信网络前,必须配置证书与 FERRETDB_LISTEN_TLS* 变量。
FerretDB 发行版会指定首选 DocumentDB 版本,而 Pigsty 可能提供更新的兼容软件包。任一组件升级后,都应重新执行一次带身份验证的 CRUD 冒烟测试。
可选三节点拓扑
mongo 模板 包含一段默认注释的三节点 PostgreSQL / DocumentDB 集群:每个节点运行一个 FerretDB 容器,由 HAProxy 通过浮动入口 10.10.10.4:27017(mongo.pigsty)暴露标准端口。启用完整的 pg-mongo 与额外 etcd 成员后执行:
HAProxy 使用 TCP 级健康检查剔除停止或不可达的 FerretDB 进程;容器镜像内置的健康检查继续验证后端连接。生产部署还应使用共享的 Silo 或外部 S3 兼容 pgBackRest 仓库,确保 PostgreSQL 主库切换后仍能访问同一份备份历史。
参考
7 - NocoDB:开源 Airtable
NocoDB 是一个开源的 Airtable 替代方案,可以将任何数据库转变为智能电子表格。
它提供了丰富的用户界面,让您无需编写代码即可创建强大的数据库应用。NocoDB 支持 PostgreSQL、MySQL、SQL Server 等多种数据库,是构建内部工具和数据管理系统的理想选择。
快速开始
在 Pigsty 软件模板目录中提供了 NocoDB 的 Docker Compose 配置文件:
检查并修改 .env 配置文件(根据需要调整数据库连接等配置)。
启动服务:
访问 NocoDB:
- 默认地址: http://nocodb.pigsty
- 备用地址: http://10.10.10.10:8080
- 首次访问需要创建管理员账户
管理命令
Pigsty 提供了便捷的 Makefile 命令来管理 NocoDB 服务:
连接 PostgreSQL
NocoDB 可以连接到 Pigsty 管理的 PostgreSQL 数据库。
在 NocoDB 界面中添加新项目时,选择「External Database」,然后输入 PostgreSQL 连接信息:
连接成功后,NocoDB 会自动读取数据库的表结构,您可以通过可视化界面进行数据管理。
功能特性
- 智能电子表格界面:类似 Excel/Airtable 的用户体验
- 多种视图:网格、表单、看板、日历、画廊视图
- 协作功能:团队协作、权限管理、评论
- API 支持:自动生成 REST API
- 集成能力:支持 Webhook、Zapier 等集成
- 数据导入导出:支持 CSV、Excel 等格式
- 公式和验证:支持复杂的数据计算和验证规则
配置说明
NocoDB 的配置在 .env 文件中:
数据持久化
NocoDB 的元数据默认存储在外部 PostgreSQL 数据库中,应用数据也可以存储在 PostgreSQL 中。
如果使用本地存储,数据会保存在 /data/nocodb 目录中。
安全建议
- 修改默认密钥:在
.env文件中修改NC_AUTH_JWT_SECRET - 使用强密码:为管理员账户设置强密码
- 配置 HTTPS:生产环境建议启用 HTTPS
- 限制访问:通过防火墙或 Nginx 限制访问权限
- 定期备份:定期备份 NocoDB 元数据库
相关链接
- NocoDB 官网: https://nocodb.com/
- 官方文档: https://docs.nocodb.com/
- GitHub 仓库: https://github.com/nocodb/nocodb
- Pigsty 软件模板: https://github.com/pgsty/pigsty/tree/main/app/nocodb
8 - Teable:AI 无代码数据库
Teable 是面向团队协作的无代码数据库平台。
Pigsty 提供 app/teable 模板(conf/app/teable.yml),默认依赖 PostgreSQL + Silo + Docker(不依赖 Redis)。
快速开始
默认入口:
http://<IP>:8890http://tea.pigsty
关键配置
模板会将以下参数写入 /opt/teable/.env:
POSTGRES_HOST/POSTGRES_PORT/POSTGRES_DB/POSTGRES_USER/POSTGRES_PASSWORDPRISMA_DATABASE_URLPUBLIC_ORIGIN(对外访问地址)PUBLIC_DATABASE_PROXYTEABLE_PORT(默认8890)
运维命令
参考
- Teable 文档: https://help.teable.io/
- Pigsty 模板: https://github.com/pgsty/pigsty/blob/main/conf/app/teable.yml
9 - Gitea:自建简易代码托管平台
Gitea 是轻量级开源 Git 托管平台。
Pigsty 的 app/gitea 模板默认就是 PostgreSQL 外部数据库模式,通过 .env 中 GITEA_DB_* 参数连接数据库。
快速开始
默认入口:
- Web:
http://git.pigsty或http://<IP>:8889 - SSH:
<IP>:2222
数据库准备
连接串示例:
常用命令
参考
- Gitea 文档: https://docs.gitea.com/
- Pigsty 模板: https://github.com/pgsty/pigsty/tree/main/app/gitea
10 - Wiki.js:维基百科站
公开 Demo 地址:http://wiki.pigsty.cc

太长;不看
准备数据库
容器配置
Access
- Default Port for wiki: 9002
11 - Mattermost:开源团队协作
Mattermost 是开源团队协作平台,可作为 Slack 的私有化替代方案。
Pigsty 提供 app/mattermost 配置模板(conf/app/mattermost.yml),默认将应用状态存放到外部 PostgreSQL,并将文件目录持久化到主机路径。
快速开始
默认访问地址:
http://<IP>:8065http://mm.pigsty
首次访问需要在 Web 页面初始化管理员账号。
默认存储与连接
模板默认配置:
- PostgreSQL 连接:
POSTGRES_URL=postgres://dbuser_mattermost:DBUser.Mattermost@<IP>:5432/mattermost?... - 持久化目录:
/data/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes}
运维命令
参考
- Mattermost 文档: https://docs.mattermost.com/
- Pigsty 模板: https://github.com/pgsty/pigsty/blob/main/conf/app/mattermost.yml
12 - Maybe:自建个人财务
Maybe 是一个开源个人财务管理应用,可以用于维护账户、交易、预算、投资与家庭财务视图。Maybe 是典型的 Rails Web 应用,生产环境使用 PostgreSQL 保存业务数据,并使用 Redis 处理后台任务队列。
Pigsty 提供 app/maybe 模板,将 Maybe 的无状态 Web / Worker 容器接入 Pigsty 托管的 PostgreSQL,并用本地 Redis 承载 Sidekiq 队列。这样您可以把最重要的财务数据放在可备份、可监控、可恢复的 PostgreSQL 集群中,而不是放在一个临时 Docker 数据卷里。
Maybe 上游仓库已经归档,最新 release 为
v0.6.0。GHCR 目前发布stable与latest镜像标签;Pigsty 默认使用stable,即最新 release 语义的镜像。
快速开始
在运行 兼容操作系统 的全新 Linux x86 / ARM 服务器上执行:
Maybe 默认监听 5002 端口。安装完成后,您可以通过以下地址访问:
http://<your_ip_address>:5002http://maybe.pigsty
首次访问时,在登录页面选择创建账号,注册您的第一个家庭账户即可开始使用。
如果您希望通过 maybe.pigsty 访问,请在浏览器所在主机的 /etc/hosts 中添加解析:
如果要对公网暴露服务,建议使用真实域名与 HTTPS 证书,并按下文修改 infra_portal。
检查清单
- 准备一台全新 Linux 服务器,建议至少
2C4G,磁盘使用 SSD/NVMe。 - 确认服务器拥有静态内网 IPv4 地址,并能访问 GHCR / Docker Hub 或已配置镜像站。
- 执行
./configure -c app/maybe后,修改pigsty.yml中的默认密码、域名和密钥。 - 用
openssl rand -hex 64生成新的SECRET_KEY_BASE。 - 将
POSTGRES_PASSWORD与pg_users中的maybe用户密码保持一致。 - 如果通过公网访问,配置真实域名、HTTPS 证书和防火墙访问策略。
- 确认 PostgreSQL 备份任务正常,部署后检查
pig pb info。
配置模板
conf/app/maybe.yml 定义了单节点 Maybe 自建模板。默认拓扑包括:
maybe:Maybe Web / Worker / Redis 容器所在节点。pg-maybe:Pigsty 托管的 PostgreSQL 数据库集群。infra:Nginx 入口、Grafana、VictoriaMetrics 等基础设施。etcd:Patroni 所需的分布式配置存储。
关键配置摘录如下:
这里的 maybe_production 是 Maybe / Rails 上游默认的生产数据库名称。您也可以改成 maybe,但必须同时修改 POSTGRES_DB、pg_databases.name、pg_hba_rules.db 与所有文档/运维脚本中的引用。
重要参数
app.yml 会把 app/maybe 目录复制到 /opt/maybe,并用 apps.maybe.conf 覆盖 /opt/maybe/.env。常见参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
MAYBE_IMAGE | ghcr.io/maybe-finance/maybe | Maybe 镜像仓库 |
MAYBE_VERSION | stable | 镜像标签,建议生产保持 stable |
MAYBE_PORT | 5002 | 宿主机暴露端口 |
MAYBE_DATA | /data/maybe | 宿主机持久化目录 |
APP_DOMAIN | maybe.pigsty | Maybe 的默认入口域名占位 |
SECRET_KEY_BASE | 示例随机串 | Rails 加密签名密钥,生产必须替换 |
DB_HOST / DB_PORT | 10.10.10.10 / 5432 | Pigsty PostgreSQL 入口 |
POSTGRES_USER | maybe | Maybe 连接 PostgreSQL 的业务用户 |
POSTGRES_PASSWORD | MaybeFinance2026 | 业务用户密码,生产必须替换 |
POSTGRES_DB | maybe_production | Maybe 生产数据库 |
REDIS_VERSION | 7-alpine | 本地 Redis 镜像标签 |
生成生产密钥:
修改密码时,请保证应用与数据库定义同步。例如:
域名与入口
模板默认在 infra_portal 中增加 Maybe 入口:
如果您使用真实域名,例如 finance.example.com,可以批量替换:
然后应用 Nginx 入口配置:
如需申请 HTTPS 证书,请先确保域名解析到当前节点,再在 infra_portal.maybe 中加入 certbot:
随后执行:
运维命令
Maybe 安装后位于 /opt/maybe,常用命令如下:
web 容器启动时会自动执行 db:prepare,通常不需要手工迁移。升级镜像后,如果启动日志提示数据库迁移问题,可以先查看日志,再执行:
数据与备份
Maybe 的状态分为两类:
- 业务数据:存放在 Pigsty PostgreSQL 数据库
maybe_production中。 - 附件/缓存:宿主机目录
/data/maybe/storage与/data/maybe/redis。
模板默认配置每日凌晨 1 点执行一次 PostgreSQL 全量备份:
部署后建议检查备份状态:
如果您在生产环境中使用 Maybe 记录真实财务数据,请至少做到:
- 定期检查 PostgreSQL 备份是否成功。
- 将 pgBackRest 仓库放到可靠磁盘或对象存储中。
- 将
/data/maybe/storage纳入文件级备份,您可以使用 restic 备份到 s3 - 不要把
SECRET_KEY_BASE、数据库密码、API Key 泄露到公开仓库。
安全建议
Maybe 用于个人/家庭财务管理,数据敏感度很高。生产使用时建议:
- 修改所有 Pigsty 默认密码,尤其是
pg_admin_password、pg_monitor_password、patroni_password、haproxy_admin_password。 - 修改 Maybe 数据库用户密码
POSTGRES_PASSWORD。 - 使用新的
SECRET_KEY_BASE,不要沿用模板示例值。 - 对公网开放时启用 HTTPS,并限制管理端口访问。
- 如启用
OPENAI_ACCESS_TOKEN或SYNTH_API_KEY,请评估外部 API 成本与数据暴露边界。
Maybe 上游已经归档,适合对现有功能满意、偏本地长期自持的用户。如果您需要持续演进的新功能或银行自动同步能力,应提前评估上游维护状态。
参考
13 - Immich:自建照片视频库
Immich 是高性能自托管照片与视频管理应用,也是最流行的 Google Photos 开源替代品之一。 它提供 Web 与移动端上传、相册共享、时间线、地图、EXIF、RAW、LivePhoto、语义搜索、人脸识别与自动备份等能力,采用 AGPL-3.0 许可证。
Pigsty 的 app/immich 模板使用 Docker Compose 拉起 Immich 应用层,并使用 Pigsty 托管的 PostgreSQL 保存元数据。
当前模板按 Immich v3 组织,默认使用 VectorChord 作为相似图片、智能搜索与人脸检索的向量扩展。
相比 Immich 官方的单机 Compose 模板,这里的关键差异是:PostgreSQL 不再跑在应用容器里,而是交给 Pigsty 管理,从而获得监控、备份、PITR、扩展管理与高可用接入能力。
快速开始
Immich 建议至少 2C / 6GB 内存,流畅使用建议 4C / 8GB 内存;v3 的 amd64 机器学习镜像需要 x86-64-v2 指令集。生产环境建议使用 Linux 与本地 SSD。
在运行 兼容操作系统 的全新 Linux x86 / ARM 服务器上执行:
默认入口:
如果使用 photo.pigsty,请在浏览器所在主机添加 hosts 解析,或将模板中的域名替换为真实域名。
模板结构
conf/app/immich.yml 定义了单节点 Immich 自建模板。默认拓扑包括:
immich:Immich Server、Machine Learning 与本地 Valkey/Redis 容器所在节点。pg-immich:Pigsty 托管的 PostgreSQL 数据库集群。infra:Nginx 入口、Grafana、VictoriaMetrics 等基础设施。etcd:Patroni 所需的分布式配置存储。
应用容器包括:
immich-server:API、Web UI 与后台任务,默认监听宿主机2283端口。immich-machine-learning:CLIP 与人脸识别模型推理。redis:本地 Valkey 队列与缓存。
模板不会启动 Immich 上游 Compose 中的 PostgreSQL 容器;数据库由 Pigsty 通过 DB_URL 提供。
数据存储策略
Immich 的状态被拆成三层,请分别管理:
- 媒体文件:原图、原视频、缩略图、转码视频、头像与上传队列,保存在
UPLOAD_LOCATION对应的宿主机目录。 - PostgreSQL:保存用户、相册、资产、EXIF、文件路径、任务状态、人物、人脸与智能搜索向量等元数据。
- Valkey/Redis:保存队列、缓存与运行时状态,不应当作为权威数据源。
照片和视频本体不会写入 PostgreSQL。反过来,Immich 也不会把媒体目录当成唯一真相重新扫描出完整业务状态;数据库里保存的路径与元数据同样关键。
因此,一个可恢复的 Immich 备份必须同时包含 PostgreSQL 与媒体目录。只备份数据库会丢照片,只备份文件也无法可靠恢复相册、用户、分享、人脸与检索状态。
PostgreSQL
默认数据库连接与向量扩展:
模板会在 pg-immich 集群安装扩展包并创建数据库扩展:
vchord 需要通过 pg_libs 加入 shared_preload_libraries,模板已经配置:
这里默认使用直连 PostgreSQL 的 5432 端口。不要把 Immich 指向事务池模式的 PgBouncer;迁移、索引和预备语句场景下,直连 PostgreSQL 或 session pooling 更稳妥。
Immich 官方仍然把预置 PostgreSQL 视为高级用法,但同时明确这种模式可以解锁 pgBackRest / Barman 这类 WAL 流式备份。Pigsty 模板选择无超级用户路径:由 Pigsty 预先创建数据库、用户和扩展,Immich 业务用户不需要 PostgreSQL 超级用户权限。
媒体文件
Immich 上传的照片、视频、缩略图、转码文件和头像保存在宿主机目录,也就是模板中的 UPLOAD_LOCATION:
PostgreSQL 只保存元数据和文件路径。媒体文件不在 PostgreSQL 中,也不会被 pgBackRest 自动保护。
生产环境至少需要备份两层数据:
- PostgreSQL:使用 Pigsty pgBackRest / PITR。
- 媒体文件:对
/data/immich/library做完整文件级备份,覆盖其中的原图、上传队列、缩略图、转码文件、头像与其他生成资产。
如果需要更一致的组合备份,先停止 immich-server,再同时备份数据库和媒体目录。如果业务不能停止,则建议先备份数据库,再备份文件系统。
镜像与网络
默认镜像来自 GHCR 与 Docker Hub:
如果拉取镜像较慢或受限,请在 pigsty.yml 中配置 proxy_env 或 docker_registry_mirrors。
运维命令
安装后进入 /opt/immich:
如需固定具体 Immich 版本,在 pigsty.yml 中设置:
升级 Immich 或 VectorChord 前,请先阅读上游 release notes。VectorChord 包升级后,通常还需要在 immich 数据库中更新扩展并重建相关索引:
大型图库重建索引可能耗时较长,执行前请确认已有备份和维护窗口。
参考
- Immich 项目: https://github.com/immich-app/immich
- Immich 预置 PostgreSQL: https://docs.immich.app/administration/postgres-standalone/
- Immich 备份与恢复: https://docs.immich.app/administration/backup-and-restore/
- Pigsty Immich 模板: https://github.com/pgsty/pigsty/blob/main/conf/app/immich.yml
- Pigsty Docker 模块
- Pigsty Nginx 入口
14 - Metabase:BI 分析工具
Metabase 是一个快速、易用的开源商业智能工具,让您的团队无需 SQL 知识即可探索和可视化数据。
Metabase 提供友好的用户界面和丰富的图表类型,支持连接多种数据库,是企业数据分析的理想选择。
快速开始
在 Pigsty 软件模板目录中提供了 Metabase 的 Docker Compose 配置文件:
检查并修改 .env 配置文件:
启动服务:
访问 Metabase:
- 默认地址: http://metabase.pigsty
- 备用地址: http://10.10.10.10:3001
- 首次访问需要完成初始化设置
管理命令
Pigsty 提供了便捷的 Makefile 命令来管理 Metabase 服务:
连接 PostgreSQL
Metabase 可以连接到 Pigsty 管理的 PostgreSQL 数据库。
在 Metabase 初始化或添加数据库时,选择「PostgreSQL」,然后输入连接信息:
连接成功后,Metabase 会自动扫描数据库结构,您可以开始创建问题和仪表板。
功能特性
- 无需 SQL:通过可视化界面构建查询
- 丰富的图表类型:折线图、柱状图、饼图、地图等
- 交互式仪表板:创建美观的数据仪表板
- 自动刷新:定时更新数据和仪表板
- 权限管理:精细的用户和数据访问控制
- SQL 模式:高级用户可以直接编写 SQL
- 嵌入功能:将图表嵌入到其他应用
- 告警功能:数据变化自动通知
配置说明
Metabase 的配置在 .env 文件中:
建议:为 Metabase 使用独立的 PostgreSQL 数据库存储元数据。
数据持久化
Metabase 的元数据(用户、问题、仪表板等)存储在配置的数据库中。
如果使用 H2 数据库(默认),数据会保存在 /data/metabase 目录。强烈建议在生产环境中使用 PostgreSQL 作为元数据库。
性能优化
- 使用 PostgreSQL:替代默认的 H2 数据库
- 增加内存:通过
JAVA_OPTS=-Xmx4g增加 JVM 内存 - 数据库索引:为常查询的字段创建索引
- 结果缓存:启用 Metabase 的查询结果缓存
- 定时更新:合理设置仪表板的自动刷新频率
安全建议
- 修改默认凭据:修改元数据库的用户名和密码
- 启用 HTTPS:生产环境配置 SSL 证书
- 配置认证:启用 SSO 或 LDAP 认证
- 限制访问:通过防火墙限制访问
- 定期备份:备份 Metabase 元数据库
相关链接
- Metabase 官网: https://metabase.com/
- 官方文档: https://www.metabase.com/docs/
- GitHub 仓库: https://github.com/metabase/metabase
- Pigsty 软件模板: https://github.com/pgsty/pigsty/tree/main/app/metabase
15 - Kong:API 网关
Kong 是开源 API Gateway。
Pigsty 的 app/kong 模板使用 PostgreSQL 作为配置存储,并自动执行一次迁移任务(kong-migration)。
快速开始
默认端口:
- Proxy HTTP:
8000 - Proxy HTTPS:
8443 - Admin API:
8001
数据库准备
连接串示例:
常用命令
参考
- Kong 文档: https://docs.konghq.com/
- Pigsty 模板: https://github.com/pgsty/pigsty/tree/main/app/kong
16 - Registry:容器镜像缓存
Pigsty 提供 app/registry 配置模板(conf/app/registry.yml),用于部署:
- Docker Registry 缓存服务(默认
5000) - 可选管理 UI(默认
5080)
快速开始
默认入口:
- Registry API:
http://<IP>:5000或http://d.pigsty - Registry UI:
http://<IP>:5080或http://dui.pigsty
镜像数据目录默认为 /data/registry。
Docker 客户端配置
如果你使用 HTTP(无 TLS),Docker 需要显式信任该仓库:
修改 /etc/docker/daemon.json 后重启 Docker:
运维命令
app/registry/Makefile 默认在 /opt/registry 工作:
参考
- Docker Registry 文档: https://docs.docker.com/registry/
- Pigsty 模板: https://github.com/pgsty/pigsty/blob/main/conf/app/registry.yml
17 - JumpServer:开源堡垒机
JumpServer 是开源 PAM / 堡垒机系统,用于集中管理 SSH、RDP、数据库与 Web 资产访问。
Pigsty 的 app/jumpserver 模板使用 Docker Compose 运行 JumpServer 社区版应用层,并使用 Pigsty 托管的 PostgreSQL 作为持久后端数据库。
当前模板基于 JumpServer v4.10.16-ce,保留社区版 core、celery、koko、lion、chen、web 与本地 Redis,移除上游安装器中的内置 PostgreSQL 服务。
PostgreSQL、备份、监控、Nginx 入口和数据库生命周期由 Pigsty 管理。
快速开始
在运行 兼容操作系统 的全新 Linux x86 / ARM 服务器上执行:
容器启动后执行一次数据库迁移:
默认入口:
默认 Web 登录:
首次登录后应立即修改管理员密码。
部署前检查
- 准备一台新 Linux 服务器,建议至少
2C4G,生产环境建议更大内存并配置 Swap。 - 确认服务器 IP、DNS、NTP、SSH 与 sudo 可用。
- 确认能访问 Docker Hub,或已经配置
docker_registry_mirrors/proxy_env。 - 执行
./configure -c app/jumpserver后,修改pigsty.yml中的默认密码、SECRET_KEY、BOOTSTRAP_TOKEN与DOMAINS。 - 确认
DOMAINS包含浏览器实际访问的主机名或 IP,例如10.10.10.10:8080。 - 确认 PostgreSQL 备份任务正常,部署后检查
pig pb info或pgbackrest info。
配置模板
conf/app/jumpserver.yml 定义了单节点 JumpServer 自建模板。默认拓扑包括:
jumpserver:JumpServer 应用容器与本地 Redis 所在节点。pg-jumpserver:Pigsty 托管的 PostgreSQL 数据库集群。infra:Nginx 入口、Grafana、VictoriaMetrics 等基础设施。etcd:Patroni 所需的分布式配置存储。
app.yml 会将 app/jumpserver 复制到 /opt/jumpserver,使用 apps.jumpserver.conf 覆盖 /opt/jumpserver/.env,然后执行 docker compose up -d。
核心应用服务:
jms_core:Django API / Web 后端,监听容器内8080。jms_celery:异步任务、定时任务与后台队列。jms_web:Nginx Web 入口,默认映射宿主机8080。jms_koko:SSH / SFTP 终端入口,默认映射宿主机2222。jms_lion:Web Terminal 组件。jms_chen:WebSocket / 数据库终端支持组件。jms_redis:本地 Redis,用于缓存、队列与 Channels 后端。
关键参数
常见参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
JUMPSERVER_VERSION | v4.10.16-ce | JumpServer 社区版镜像版本 |
JUMPSERVER_DATA | /data/jumpserver | 应用持久化目录 |
DOMAINS | 10.10.10.10:8080,10.10.10.10,jump.pigsty | 允许登录的可信访问域名 / IP |
SECRET_KEY | 示例值 | 加密密钥,生产必须替换且长期保存 |
BOOTSTRAP_TOKEN | 示例值 | 组件注册令牌,生产必须替换且长期保存 |
DB_HOST / DB_PORT | 10.10.10.10 / 5432 | Pigsty PostgreSQL 入口 |
DB_USER / DB_NAME | jumpserver / jumpserver | 业务用户与业务数据库 |
DB_PASSWORD | DBUser.JumpServer | 业务用户密码,生产必须替换 |
DOCKER_SUBNET | 192.168.250.0/24 | JumpServer Compose 内部网段 |
REDIS_HOST | 192.168.250.2 | 本地 Redis 容器固定 IP |
CORE_HOST | http://192.168.250.4:8080 | JumpServer core 内部入口 |
HTTP_PORT | 8080 | Web 入口端口 |
SSH_PORT | 2222 | Koko SSH/SFTP 入口端口 |
CORE_WORKER | 2 | core Gunicorn worker 数,适配 2C4G 沙箱 |
CELERY_WORKER_COUNT | 2 | 每个 Celery 队列 worker 并发数 |
生成生产密钥示例:
SECRET_KEY 与 BOOTSTRAP_TOKEN 在生产数据存在后不要再更改。它们必须与数据库备份、/data/jumpserver、/opt/jumpserver/.env 一起保存;丢失原始 SECRET_KEY 后,数据库中的加密账号密钥可能无法恢复。
DB_PASSWORD 与 REDIS_PASSWORD 不要包含单引号或双引号,这与 JumpServer 官方安装器行为一致。
登录与 DOMAINS
JumpServer 会在登录流程中检查可信访问域名。DOMAINS 必须包含浏览器实际访问的 Host:
正常登录 URL:
如果登录页显示:
请检查 /opt/jumpserver/.env 与容器环境:
修正后需要重建 core 容器:
同时修改 pigsty.yml 或 conf/app/jumpserver.yml,否则下次执行 ./app.yml 会再次覆盖 /opt/jumpserver/.env。
不要用带 csrf_failure=1 的旧 URL 判断配置是否仍然错误;该页面会按照失败请求上下文显示 DOMAINS=... 提示。应使用正常登录页重新测试,必要时打开无痕窗口。
Docker 网络
模板使用固定 Docker bridge 网段:
固定 IP 有两个目的:
- 避免 JumpServer Python / Java 组件启动时遇到 Docker DNS 临时解析失败。
- 让 PostgreSQL HBA 规则可以精确放行应用网段。
PostgreSQL 看到的容器客户端来源是 192.168.250.0/24,因此模板包含:
如果 192.168.250.0/24 与现有网络冲突,需要同时修改:
DOCKER_SUBNET与各组件固定 IP。REDIS_HOST、CORE_HOST。pg_hba_rules.addr与pgb_hba_rules.addr。- 重新创建 Compose 网络与容器。
不要把 DB_HOST 设置为 127.0.0.1;在容器里这指向容器自身。请使用宿主机内网 IP 或 Pigsty L2 VIP。
PostgreSQL
JumpServer 4.x 使用 PostgreSQL,并要求 PostgreSQL 16 或更新版本。模板使用 Pigsty 创建数据库、用户、HBA、备份计划和可选 PgBouncer 入口。
应用数据库不需要额外 PostgreSQL 扩展:
模板中的 pg_version 可以按环境固定为 16、17 或更新主版本;JumpServer 的下限是 PostgreSQL 16。若使用高可用数据库形态,可以参考模板中注释的 pg_vip_enabled 示例,将应用侧 DB_HOST 指向主库 VIP。
JumpServer 的 Django 迁移与 Celery Beat 不适合 PgBouncer transaction pooling。默认使用 PostgreSQL 5432 直连;如需通过 PgBouncer,请为 jumpserver 用户使用 session pooling。
部署验证
安装后执行:
期望:
jms_core、jms_celery、jms_web、jms_redis、jms_koko、jms_lion、jms_chen均为healthy。make health返回status=true、db_status=true、redis_status=true。make migrate输出No migrations to apply,或完成缺失迁移。
数据库侧检查:
期望:
- Patroni 集群 Leader
running。 - PostgreSQL 版本为 16 或更新。
- JumpServer 迁移后 public schema 中有约 168 张表。
- pgBackRest stanza 状态为
ok。
常见问题
登录页提示 DOMAINS 配置错误
确认两层配置一致:
修改 .env 后必须重建 core 容器:
同时修改 Pigsty inventory 中的 apps.jumpserver.conf.DOMAINS,否则下次 ./app.yml 会覆盖。
admin / ChangeMe 无法登录
先区分两类错误:
- 页面顶部是
DOMAINS=...红框:这是域名 / CSRF 配置问题,不是密码问题。 - 表单提示用户名或密码错误:才是账号密码问题。
可在容器内验证默认密码是否仍然有效:
Web 返回 502
检查 core 与 web:
如果是首次启动时 core 日志目录竞争,确认 /data/jumpserver/core/data/logs 已存在。模板已预创建该目录。
容器反复重启或健康检查超时
2C4G 节点上 JumpServer 较吃内存,模板默认使用:
如果仍然出现 Gunicorn worker timeout、SIGKILL 或系统内存不足,请增加内存 / Swap,或继续降低 worker 数。查看资源:
运维命令
安装后进入 /opt/jumpserver:
升级 JumpServer 时不要只修改镜像标签,必须执行数据库迁移:
升级期间保持 SECRET_KEY 与 BOOTSTRAP_TOKEN 不变。
备份与恢复
JumpServer 状态分为两层:
- PostgreSQL 数据库:使用 Pigsty pgBackRest / PITR 备份。
- 应用文件:
/data/jumpserver与/opt/jumpserver/.env,包含日志、录像、组件数据、Redis 持久化和密钥。
恢复时应使用同一环境中的数据库、.env 与文件目录:
只恢复 PostgreSQL 而没有原始 SECRET_KEY,会导致 JumpServer 中加密保存的账号密钥无法正常解密。
社区版边界
本模板使用 PostgreSQL 作为 JumpServer 自身后端数据库,属于社区版自建部署路径。JumpServer 中“数据库资产管理”是另一项产品能力,和这里的后端数据库不是同一件事,请不要混淆。
参考
- JumpServer 项目: https://github.com/jumpserver/jumpserver
- JumpServer 安装器: https://github.com/jumpserver/installer
- Pigsty JumpServer 模板: https://github.com/pgsty/pigsty/blob/main/conf/app/jumpserver.yml
- Pigsty Docker 模块
- Pigsty Nginx 入口
18 - ByteBase:模式迁移
Bytebase 是数据库 Schema 变更与版本管理工具。
Pigsty 在 app/bytebase 中提供了可直接使用的 Compose 模板,默认监听 8887,并通过 BB_PGURL 连接外部 PostgreSQL。
快速开始
访问:
http://ddl.pigstyhttp://<IP>:8887
首次启动后,请按 Bytebase 向导初始化管理员账号。
外部 PostgreSQL
默认连接串示例:
可先在 Pigsty 中创建业务用户与数据库:
常用命令
参考
- Bytebase 文档: https://www.bytebase.com/docs/
- Pigsty 模板: https://github.com/pgsty/pigsty/tree/main/app/bytebase
19 - pgAdmin:PostgreSQL 图形管理工具
pgAdmin 是 PostgreSQL 的开源图形管理与开发工具。Pigsty v4.5.0 提供 app/pgadmin Docker Compose 模板,并可从当前清单生成服务器列表与密码文件。
模板默认登录名为 admin@pigsty.cc、密码为 pigsty,只适合本地演示。部署到共享网络或公网前,必须修改登录凭据、限制端口访问并配置 HTTPS。
快速开始
conf/meta.yml 默认在 app 组声明 pgAdmin。使用明确限定的目标执行部署:
默认端口为 8885,可从 http://<app_ip>:8885 访问。只有在 infra_portal、Nginx 与 DNS 已配置时,http://adm.pigsty 才是有效入口。
容器首次启动可能需要几十秒,可在应用节点检查:
应用配置
推荐在 pigsty.yml 的 app 组通过 apps.pgadmin.conf 覆盖 .env:
app.yml 会把模板复制到 /opt/pgadmin 并将覆盖项写入 /opt/pgadmin/.env。该文件包含登录密码,权限应保持为 0600。
当前模板使用未固定标签的 dpage/pgadmin4 镜像。生产环境应在 docker-compose.yml 中固定经过验证的版本或镜像摘要,并把镜像升级当作独立变更验证。
加载服务器列表
env_pgadmin 根据清单生成:
/infra/pgadmin/servers.json:PostgreSQL 实例列表/infra/pgadmin/pgpass:数据库管理员密码文件
默认 conf/meta.yml 中 infra 与 app 组指向同一台主机,因此 pgAdmin 可以直接只读挂载这两个文件。如果 pgAdmin 与 Infra 分离部署,应用节点不会自动拥有 /infra/pgadmin/;必须另行安全分发等价文件或自定义挂载,不能假设跨主机共享本地路径。
在默认同机拓扑中,可先重新生成列表,再让已启动的容器导入列表与密码:
pgpass 包含 pg_admin_username 的数据库凭据。请限制文件、备份和应用主机的访问范围;若不希望 pgAdmin 持有 DBA 凭据,应自行生成最小权限的连接定义。
域名与 HTTPS
在 infra_portal 中添加入口:
在明确限定的 Infra 组上更新 Nginx:
公网真实域名还需 DNS 指向服务器,并在 portal 条目中设置 certbot:
证书前置条件与续期方式参见 CA 与证书。不要把直接暴露的 8885 端口视为 HTTPS 入口。
状态与管理
在 /opt/pgadmin 中可使用:
Compose 模板没有为 /var/lib/pgadmin 配置持久卷。服务器清单可从 Pigsty 文件重新导入,但在 pgAdmin UI 中新增的偏好、用户与其他内部状态可能随容器重建而丢失;如需保留,应在变更模板后为该目录配置受保护的持久卷并纳入备份。

安全检查
- 修改默认 pgAdmin 登录名与密码,不在脚本、截图或工单中传播真实凭据。
- 默认端口映射会监听主机网络;用防火墙限制来源,公网入口使用 Nginx 与有效 HTTPS 证书。
- 保护
/infra/pgadmin/pgpass与/opt/pgadmin/.env,优先使用最小权限数据库角色。 - 固定并验证容器镜像版本,备份任何新增的 pgAdmin 持久状态。
- pgAdmin 能执行高权限 SQL;删除数据库、表或数据前仍需独立确认目标与近期备份。
20 - PGWeb:网页客户端
PGWeb 客户端
PGWeb 是一款基于浏览器的 PostgreSQL 客户端。Pigsty 在 app/pgweb 中提供了一个小型 Docker Compose 模板,把容器的 8081 端口发布到主机的 8886 端口。
当 cli.pigsty 门户项解析到 Infra 节点时,可打开 http://cli.pigsty,也可以直接访问 http://10.10.10.10:8886。公开演示地址为 http://cli.pigsty.cc。
PGWeb 会要求输入 PostgreSQL 连接 URL,例如:
这些字符串包含公开的演示默认密码并关闭 TLS。实际部署应使用最小权限账户、非默认密码和合适的 sslmode,
不要把未加额外访问控制的 PGWeb 容器或数据库凭据暴露给不可信网络。

快捷方式
模板附带的 Makefile 提供:
当前模板使用未固定版本的 sosedoff/pgweb 镜像;若正式环境要求部署可复现,应在 app/pgweb/docker-compose.yml 中固定镜像版本或摘要。
21 - PostgREST:自动 API
PostgREST 可以将 PostgreSQL schema 直接暴露为 REST API。
Pigsty 提供 app/postgrest 模板,默认端口 8884。
快速开始
默认入口:
http://<IP>:8884- 若配置了入口域名,可通过
http://api.pigsty访问
关键配置
.env 常用参数:
POSTGREST_DB_URI:数据库连接串POSTGREST_DB_SCHEMA:暴露的 schema(默认pigsty)POSTGREST_DB_ANON_ROLE:匿名角色POSTGREST_JWT_SECRET:JWT 密钥
Swagger UI(可选)
可单独拉起 Swagger UI 预览 API:
访问 http://<IP>:8882。
常用命令
参考
- PostgREST 文档: https://postgrest.org/en/stable/
- Pigsty 模板: https://github.com/pgsty/pigsty/tree/main/app/postgrest
22 - Electric:PostgreSQL 同步引擎
Electric 是 PostgreSQL 同步引擎,专注于将数据库变更高效分发到前端/边缘应用。
Pigsty 提供了 app/electric 配置模板(conf/app/electric.yml),可一键完成数据库、容器与入口配置。
快速开始
默认访问地址:
http://<IP>:8002http://elec.pigsty(按模板默认域名)
指标端口默认 8003(ELECTRIC_PROMETHEUS_PORT)。
关键配置
conf/app/electric.yml 会在 apps.electric.conf 中覆盖 /opt/electric/.env。常见参数:
DATABASE_URL:Electric 使用的 PostgreSQL 连接串(需要复制权限)ELECTRIC_PORT:Electric HTTP 服务端口(默认8002)ELECTRIC_PROMETHEUS_PORT:指标端口(默认8003)ELECTRIC_INSECURE:开发环境可设为true,生产环境建议关闭并使用密钥
运维命令
参考
- Electric 官网: https://electric-sql.com/
- Electric 文档: https://electric-sql.com/docs
- Pigsty 模板: https://github.com/pgsty/pigsty/blob/main/conf/app/electric.yml
23 - Jupyter:Notebook 与数据分析环境
JupyterLab 是交互式 Notebook、终端与数据分析环境。Pigsty v4.5.0 有两种不同的部署方式:
VIBE模块:由 Ansible 和 systemd 管理,适合 v4.5.0 的完整开发沙箱。app/jupyter:轻量的独立 Docker Compose 模板,本页介绍这一方式。
app/jupyter 不是默认 apps 清单项,且创建数据目录是独立步骤;不要直接假设 app.yml -e app=jupyter 能处理目录权限。

快速开始
可用 openssl rand -hex 32 生成强 Token。默认端口为 8888,从 http://<host_ip>:8888 访问。
只有在 infra_portal、Nginx 与 DNS 中配置了 lab.pigsty 时,该域名才可用。模板默认值 JUPYTER_TOKEN=pigsty 只能用于本地演示,生产环境必须更换。
当前模板
.env 的 v4.5.0 默认值为:
Compose 将宿主机 /data/jupyter 挂载到容器的 /home/jovyan/work,并把 Token 传给容器。latest 会随上游变化;生产环境应改为经过验证的具体镜像标签或摘要。
若需要 SciPy、R、Julia、TensorFlow、PyTorch 或 Spark,可使用 .env 中列出的其他 Jupyter Docker Stacks 镜像,但仍应固定版本并验证架构支持。
访问 PostgreSQL
在 Jupyter Terminal 中安装现代 Psycopg 驱动及可选分析库:
不要把真实密码写入 Notebook。以下示例通过隐藏输入获得连接串,只读取系统信息:
使用 Pandas 与 SQLAlchemy 查询系统统计视图:
这些示例只访问系统视图。读取业务表前,应得到数据所有者授权,并限制列、条件和结果规模。
持久化与依赖
只有 /home/jovyan/work 映射到 /data/jupyter。以下内容默认不会随容器重建持久化:
- 在容器环境中临时安装的 Python/Conda 包
work目录以外的 Notebook、配置与缓存- 容器自身的用户状态
生产环境应通过固定镜像、定制 Dockerfile 或可复现的依赖文件安装包,并单独备份 /data/jupyter。持久卷不能替代备份。
管理命令
在 ~/pigsty/app/jupyter 中:
make clean 会移除容器但保留 /data/jupyter;make purge 会递归删除 /data/jupyter,属于不可恢复的数据删除操作,执行前必须确认精确目录与近期备份。
安全建议
- 使用随机强 Token,保护
.env,不要禁用认证。 - 默认端口映射监听主机网络;用防火墙限制来源,优先通过 Nginx 与有效 HTTPS 证书访问。
- Notebook 可执行任意代码并访问挂载文件与数据库;只授予最小权限的数据库账号和宿主机目录。
- 固定镜像版本、扫描镜像并对依赖升级做可复现验证。
- 定期备份
/data/jupyter,并实际验证恢复到临时目录。
相关链接
24 - PGLOG:PG自带日志分析应用
PGLOG 是 Pigsty 自带的一个样例应用,固定使用 MetaDB 中 pglog.sample 表作为数据来源。您只需要将日志灌入该表,然后访问相关 Dashboard 即可。
Pigsty 提供了一些趁手的命令,用于拉取 csv 日志,并灌入样本表中。在元节点上,默认提供下列快捷命令:
接下来,您可以访问以下的连接,查看样例日志分析界面。
- PGLOG Overview:呈现整份 CSV 日志样本详情,按多种维度聚合。
- PGLOG Session:呈现日志样本中一条具体连接的详细信息。
catlog 命令从特定节点拉取特定日期的 CSV 数据库日志,写入 stdout
默认情况下,catlog 会拉取当前节点当日的日志,您可以通过参数指定节点与日期。
组合使用 pglog 与 catlog,即可快速拉取数据库 CSV 日志进行分析。
25 - NOAA ISD 全球气象站历史数据查询
如果您拥有数据库后不知道干点什么,不妨参试试这个开源项目:Vonng/isd
您可以直接复用监控系统 Grafana,以交互式的方式查阅近30000个地面气象站过去120年间的亚小时级气象数据。
这是一个功能完成的数据应用,可以查询全球30000个地表气象站从1901年来的气象观测记录。
项目地址:https://github.com/Vonng/isd
在线 Demo 地址:https://demo.pigsty.cc/d/isd-overview
快速上手
克隆本仓库
准备一个 PostgreSQL 实例
该 PostgreSQL 实例应当启用了 PostGIS 扩展。使用 PGURL 环境变量传递数据库连接信息:
获取并导入 ISD 气象站元数据
这是一份每日更新的气象站元数据,包含了气象站的经纬度、海拔、名称、国家、省份等信息,使用以下命令下载并导入。
获取并导入最新的 isd.daily 数据
isd.daily 是一个每日更新的数据集,包含了全球各气象站的日观测数据摘要,使用以下命令下载并导入。
请注意,直接从 NOAA 网站下载的原始数据需要经过 解析 方可入库,所以你需要下载或构建一个 ISD 数据 Parser。
加载解析好的 CSV 数据集
ISD Daily 数据集有一些脏数据与 重复数据,如果你不想手工解析处理清洗,这里也提供了一份解析好的稳定 CSV 数据集。
该数据集包含了截止到 2023-06-24 的 isd.daily 数据,你可以直接下载并导入 PostgreSQL 中,不需要 Parser,
更多数据
ISD 数据集有两个部分是每日更新的,气象站元数据,以及最新年份的 isd.daily (如 2023 年的 Tarball)。
你可以使用以下命令下载并刷新这两个部分。如果数据集没有更新,那么这些命令不会重新下载同样的数据包
你也可以使用以下命令下载并加载特定年份的 isd.daily 数据:
除了每日摘要 isd.daily, ISD 还提供了一份更详细的亚小时级原始观测记录 isd.hourly,下载与加载的方式与前者类似:
数据
数据集概要
ISD 提供了四个数据集:亚小时级原始观测数据,每日统计摘要数据,月度统计摘要,年度统计摘要
| 数据集 | 备注 |
|---|---|
| ISD Hourly | 亚小时级观测记录 |
| ISD Daily | 每日统计摘要 |
| ISD Monthly | 没有用到,因为可以从 isd.daily 计算生成 |
| ISD Yearly | 没有用到,因为可以从 isd.daily 计算生成 |
每日摘要数据集
- 压缩包大小 2.8GB (截止至 2023-06-24)
- 表大小 24GB,索引大小 6GB,PostgreSQL 中总大小约为 30GB
- 如果启用了 timescaledb 压缩,总大小可以压缩到 4.5 GB。
亚小时级观测数据级
- 压缩包总大小 117GB
- 灌入数据库后表大小 1TB+,索引大小 600GB+,总大小 1.6TB
数据库模式
气象站元数据表
每日摘要表
亚小时级原始观测数据表
ISD Hourly
解析器
NOAA ISD 提供的原始数据是高度压缩的专有格式,需要通过解析器加工,才能转换为数据库表的格式。
针对 Daily 与 Hourly 两份数据集,这里提供了两个 Parser: isdd and isdh。
这两个解析器都以年度数据压缩包作为输入,产生 CSV 结果作为输出,以管道的方式工作,如下所示:
用户界面
这里提供了几个使用 Grafana 制作的 Dashboard,可以用于探索 ISD 数据集,查询气象站与历史气象数据。
ISD Overview
全局概览,总体指标与气象站导航。

ISD Country
展示单个国家/地区内所有的气象站。

ISD Station
展示单个气象站的详细信息,元数据,天/月/年度汇总指标。
ISD Station Dashboard

ISD Detail
展示一个气象站原始亚小时级观测指标数据,需要 isd.hourly 数据集。
ISD Station Dashboard

26 - COVID-19 数据大盘
Covid 是 Pigsty 自带的,用于展示世界卫生组织官方疫情数据大盘的一个样例 Applet。
您可以查阅每个国家与地区 COVID-19 的感染与死亡案例,以及全球的疫情趋势。
概览
GitHub 仓库地址:https://github.com/Vonng/pigsty-app/tree/master/covid
在线 Demo 地址:https://demo.pigsty.cc/d/covid
安装
在管理节点上进入应用目录,执行 make 以完成安装。
其他一些子任务:
27 - StackOverflow 调研
概览
GitHub 仓库地址:https://github.com/Vonng/pigsty-app/tree/master/db
在线 Demo 地址:https://demo.pigsty.cc/d/sf-survey
28 - DB-Engine 热度分析
概览
GitHub 仓库地址:https://github.com/Vonng/pigsty-app/tree/master/db
在线 Demo 地址:https://demo.pigsty.cc/d/db-engine
29 - 云上算力价格计算器
概览
GitHub 仓库地址:https://github.com/Vonng/pigsty-app/tree/master/cloud
在线 Demo 地址:https://demo.pigsty.cc/d/ecs
文章地址:《剖析算力成本:阿里云真降价了吗?》
数据源
Aliyun ECS 价格可以在 价格计算器 - 定价详情 - 价格下载 中获取 CSV 原始数据。
模式
下载 阿里云 价格明细并导入分析
AWS EC2 同理,可以从 Vantage 下载价格清单:




