ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

在 Ubuntu 上安装 FerretDB:PostgreSQL / SQLite 后端部署完整指南

在 Ubuntu 上安装 FerretDB:PostgreSQL / SQLite 后端部署完整指南 后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载FerretDB 是一款开源的文档数据库它让 MongoDB 的语法与生态在 PostgreSQL或 SQLite之上得以延续你既可以使用mongosh、MongoDB 驱动与既有习惯去读写数据又可以把数据真正掌握在自己手里。本篇指南以 FerretDB v1.12.1Ubuntu 22.04 arm64为基线完整走一遍在 Ubuntu 上安装 PostgreSQL 后端、配置数据库与账号、通过.deb包安装 FerretDB、用systemd托管服务、经mongosh连接并验证数据落库的每一步文末还额外演示 SQLite 后端的使用方式并结合当前仓库源码讲解全部配置标志与常见安全加固点。读完你将能够在自己的 Ubuntu 服务器上独立完成一套可运行的 FerretDB 环境搭建。前置条件Ubuntu 系统本教程基于 Ubuntu 22.04arm64验证amd64 的安装步骤一致仅在下载包架构上有所区分。非 root 用户建议提前准备好一个拥有sudo权限的非 root 账号后续所有系统级操作安装包、配置systemd都经由sudo完成。mongoshMongoDB Shell用于连接与操作 FerretDB 实例需提前安装到本机。安装开始前先确保系统与软件包索引是最新的sudo apt update sudo apt upgradeStep 1安装并初始化 PostgreSQL 后端本指南主要演示PostgreSQL 后端。如果系统尚未安装 PostgreSQL先通过包管理器安装sudo apt install postgresql安装完成后可用psql --version确认版本。教程验证环境中输出为psql (14.9 (Ubuntu 14.9-0ubuntu0.22.04.1))版本号随发行版仓库略有不同不影响后续操作。FerretDB 连接 PostgreSQL 时要求数据库中已存在一个名为ferretdb的库并配好对应的认证凭据。为此先以 PostgreSQL 超级用户身份进入默认实例sudo -u postgres psql进入后你将看到类似下面的交互提示~$ sudo -u postgres psql psql (14.9 (Ubuntu 14.9-0ubuntu0.22.04.1)) Type help for help. postgres#在postgres#提示符下依次执行三条 SQL请把username、password替换成你自己的账号与密码CREATE ROLE username WITH PASSWORD password;CREATE DATABASE ferretdb;GRANT ALL PRIVILEGES ON DATABASE ferretdb TO username;第一条创建数据库角色即后续 FerretDB 与mongosh使用的登录账号第二条创建名为ferretdb的数据库第三条把该库的全部权限授予该角色。至此 PostgreSQL 后端就绪。用\q退出psql再用新账号连回ferretdb库做一次连通性验证psql -h localhost -U username -d ferretdb成功连接后输出大致如下psql (14.9 (Ubuntu 14.9-0ubuntu0.22.04.1)) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type help for help. ferretdb版本提示教程基于 v1.12.1FerretDB 直接把 MongoDB 文档映射为 PostgreSQL 中的表以_jsonb字段存储 BSON 文档而当前仓库主线已演进到 v2改为依赖 PostgreSQL 的 DocumentDB 扩展见 website/docs/installation/ferretdb/deb.md 中的说明但它同样需要先准备 PostgreSQL 与数据库凭据本节初始化流程依然适用。Step 2下载并安装 FerretDBFerretDB 官方 releases 页面提供amd64与arm64两种架构的.deb包请根据 Ubuntu 的 CPU 架构选择。本教程使用 FerretDB v1.12.1 的arm64deb 包用wget或curl下载均可wget FerretDB 官方 releases 页面中对应版本的下载地址或者用curl-L跟随重定向-J使用服务器文件名-O写为本地文件curl -LJO FerretDB 官方 releases 页面中对应版本的下载地址在ferretdb-arm64.deb所在目录执行安装sudo apt install ./ferretdb-arm64.deb安装完成后用ferretdb --version验证ferretdb --version version: v1.12.1 commit: d1486f2b5d86eadfa6d148752b14fdde49cb5db9 branch: unknown dirty: true package: deb debugBuild: false输出中的version、commit、package等字段来自编译期注入的构建信息。运行ferretdb --help可以查看全部配置标志——FerretDB 的所有运行时行为几乎都由这些标志控制。v1.12.1 的完整输出如下~$ ferretdb --help Usage: ferretdb Flags: -h, --help Show context-sensitive help. --version Print version to stdout and exit. --handlerpg Backend handler: pg, sqlite ($FERRETDB_HANDLER). --modenormal Operation mode: normal, proxy, diff-normal, diff-proxy ($FERRETDB_MODE). --state-dir. Process state directory ($FERRETDB_STATE_DIR). --listen-addr127.0.0.1:27017 Listen TCP address ($FERRETDB_LISTEN_ADDR). --listen-unix Listen Unix domain socket path ($FERRETDB_LISTEN_UNIX). --listen-tls Listen TLS address ($FERRETDB_LISTEN_TLS). --listen-tls-cert-file TLS cert file path ($FERRETDB_LISTEN_TLS_CERT_FILE). --listen-tls-key-file TLS key file path ($FERRETDB_LISTEN_TLS_KEY_FILE). --listen-tls-ca-file TLS CA file path ($FERRETDB_LISTEN_TLS_CA_FILE). --proxy-addr Proxy address ($FERRETDB_PROXY_ADDR). --debug-addr127.0.0.1:8088 Listen address for HTTP handlers for metrics, pprof, etc ($FERRETDB_DEBUG_ADDR). --postgresql-urlpostgres://127.0.0.1:5432/ferretdb PostgreSQL URL for pg handler ($FERRETDB_POSTGRESQL_URL). --postgresql-new Use new PostgreSQL backend ($FERRETDB_POSTGRESQL_NEW). --sqlite-urlfile:data/ SQLite URI (directory) for sqlite handler ($FERRETDB_SQLITE_URL). --log-levelinfo Log level: debug, info, warn, error ($FERRETDB_LOG_LEVEL). --[no-]log-uuid Add instance UUID to all log messages ($FERRETDB_LOG_UUID). --[no-]metrics-uuid Add instance UUID to all metrics ($FERRETDB_METRICS_UUID). --telemetryundecided Enable or disable basic telemetry. See https://beacon.ferretdb.io ($FERRETDB_TELEMETRY). --test-records-dir Testing: directory for record files ($FERRETDB_TEST_RECORDS_DIR). --test-disable-filter-pushdown Experimental: disable filter pushdown ($FERRETDB_TEST_DISABLE_FILTER_PUSHDOWN). --test-enable-sort-pushdown Experimental: enable sort pushdown ($FERRETDB_TEST_ENABLE_SORT_PUSHDOWN). --test-telemetry-urlhttps://beacon.ferretdb.io/ Telemetry: reporting URL ($FERRETDB_TEST_TELEMETRY_URL). --test-telemetry-undecided-delay1h Telemetry: delay for undecided state ($FERRETDB_TEST_TELEMETRY_UNDECIDED_DELAY). --test-telemetry-report-interval24h Telemetry: report interval ($FERRETDB_TEST_TELEMETRY_REPORT_INTERVAL). --test-telemetry-report-timeout5s Telemetry: report timeout ($FERRETDB_TEST_TELEMETRY_REPORT_TIMEOUT). --test-telemetry-package Telemetry: custom package type ($FERRETDB_TEST_TELEMETRY_PACKAGE).配置标志速查表上述标志中日常部署最常用的是以下几组以当前仓库文档 website/docs/configuration/flags.md 为准标志与环境变量一一对应标志说明环境变量默认值--postgresql-urlPostgreSQL 连接 URLFERRETDB_POSTGRESQL_URLpostgres://127.0.0.1:5432/postgres--listen-addrMongoDB 协议 TCP 监听地址设为空或-可关闭FERRETDB_LISTEN_ADDR127.0.0.1:27017--listen-unixMongoDB 协议 Unix 套接字路径FERRETDB_LISTEN_UNIX空--listen-tls/--listen-tls-cert-file/--listen-tls-key-file/--listen-tls-ca-fileTLS 监听地址与证书、密钥、CA 文件FERRETDB_LISTEN_TLS_*空--debug-addr指标、pprof 等 HTTP 调试服务监听地址FERRETDB_DEBUG_ADDR127.0.0.1:8088--mode运行模式normal / proxy / diff-normal / diff-proxyFERRETDB_MODEnormal--state-dir状态目录存放 UUID、telemetry 等状态文件FERRETDB_STATE_DIR.--auth可否定是否启用认证FERRETDB_AUTH启用--log-level日志级别debug / info / warn / errorFERRETDB_LOG_LEVELinfo--telemetry是否上报基础遥测数据FERRETDB_TELEMETRYundecided关键设计FerretDB 没有配置文件一切配置都来自命令行标志同时每个标志都有等价的FERRETDB_*环境变量见 cmd/ferretdb/main.go 中kong.DefaultEnvars(FERRETDB)的注册逻辑这让它在容器、systemd、云原生编排场景下可以非常自然地用环境变量注入配置。版本差异--handler选择 pg / sqlite 后端与--sqlite-url是 v1.12.1 时代的标志从当前仓库 cmd/ferretdb/main.go 的 CLI 结构看主线版本已移除这两个标志改用固定的 PostgreSQLDocumentDB后端并新增了--postgresql-url-file、--listen-data-api-addr、--listen-mcp-addr、--otel-*等标志。因此--handler、--sqlite-url仅对 v1.12.1 有效升级到 v2 后请使用--postgresql-url系列配置。Step 3启动 FerretDB下面分别演示两种启动方式终端直启与systemd托管。方式一终端直接启动在创建systemd服务前先在终端用显式标志试跑一次。--postgresql-url中的用户名、密码要替换成 Step 1 中创建的凭据ferretdb --postgresql-urlpostgres://username:passwordlocalhost/ferretdb其余必要标志使用默认值--modenormal、--listen-addr127.0.0.1:27017。启动日志大致如下~$ ferretdb --postgresql-urlpostgres://username:passwordlocalhost/ferretdb 2023-10-19T12:48:23.2020100 INFO ferretdb/main.go:253 Starting FerretDB v1.12.1... {version: v1.12.1, commit: d1486f2b5d86eadfa6d148752b14fdde49cb5db9, branch: unknown, dirty: true, package: deb, debugBuild: false, buildEnvironment: {-buildmode:exe,-compiler:gc,CGO_ENABLED:0,GOARCH:arm64,GOOS:linux,go.version:go1.21.2,vcs:git,vcs.time:2023-10-10T12:15:18Z}, uuid: d66f7807-aec3-406a-9779-2b5ec190e65a} 2023-10-19T12:48:23.2140100 INFO telemetry telemetry/reporter.go:148 The telemetry state is undecided; the first report will be sent in 1h0m0s. Read more about FerretDB telemetry and how to opt out at https://beacon.ferretdb.io. 2023-10-19T12:48:23.2170100 INFO debug debug/debug.go:86 Starting debug server on http://127.0.0.1:8088/ 2023-10-19T12:48:23.2170100 INFO listener clientconn/listener.go:97 Listening on TCP 127.0.0.1:27017 ...日志中的关键信息与源码逐一对应Starting FerretDB ...一行由 cmd/ferretdb/main.go 的启动流程输出包含版本、commit、构建环境与实例 UUIDdebug server对应--debug-addr的 HTTP 调试服务Listening on TCP 127.0.0.1:27017则由监听器打印——在 internal/clientconn/listener.go 中Listen会按配置分别创建 TCP / Unix / TLS 三类监听器并逐一打印监听地址。若启动失败例如连不上 PostgreSQL 或凭据错误进程会直接报错退出此时先回头检查 Step 1 的账号、库名与权限。方式二使用systemd托管把 FerretDB 交给systemd管理后可以实现开机自启、崩溃自动重启、统一日志等能力。:::caution 请确保存在一个带sudo权限的非 root 用户来运行服务。如果还没有可以这样创建sudo adduser ferret sudo usermod -aG sudo ferret su - ferret:::在/etc/systemd/system目录下新建服务文件User应设为你的非 root 用户sudo nano /etc/systemd/system/ferretdb.service内容如下[Unit] DescriptionFerretDB service Afternetwork-online.target Wantsnetwork-online.target [Service] Userferret ExecStart/usr/bin/ferretdb --postgresql-urlpostgres://username:password127.0.0.1:5432/ferretdb Restartalways [Install] WantedBymulti-user.target说明[Unit]段声明服务依赖网络就绪network-online.target避免开机时因网络未就绪而启动失败[Service]段指定以ferret用户运行安全最小权限原则ExecStart传入后端连接串Restartalways保证进程异常退出后自动拉起[Install]段将服务挂到multi-user.target配合下面的enable实现开机自启。随后依次执行sudo systemctl daemon-reload sudo systemctl enable ferretdb sudo systemctl start ferretdbdaemon-reload让systemd重新读取新增的服务文件enable注册开机自启start立即启动。查看运行状态与实时日志sudo systemctl status ferretdb sudo journalctl -u ferretdb -f更优实践当前仓库的.deb/.rpm包其实已自带systemd单元见 website/docs/installation/ferretdb/deb.md单元内通过EnvironmentFERRETDB_POSTGRESQL_URL...这类变量给出示例配置。官方推荐用sudo systemctl edit ferretdb生成 override 配置而不是直接修改单元文件这样升级时不会被覆盖——例如要改用 Unix 套接字监听可在 override 中写EnvironmentFERRETDB_LISTEN_UNIX/var/lib/ferretdb/ferretdb.sock见 website/docs/installation/ferretdb/systemd.md。由于每个标志都有环境变量等价物systemd场景下优先用Environment传递FERRETDB_*变量比在ExecStart里拼长串参数更易维护。Step 4通过mongosh连接 FerretDBFerretDB 运行起来后另开一个终端用与 Step 1 相同的用户名和密码通过 MongoDB 连接串连接mongosh mongodb://username:passwordlocalhost:27017/ferretdb?authMechanismPLAIN成功连接后mongosh会显示如下信息~$ mongosh mongodb://username:passwordlocalhost:27017/ferretdb?authMechanismPLAIN Current Mongosh Log ID: 65304b6bb7bd5de804c5e34e Connecting to: mongodb://credentialslocalhost:27017/ferretdb?authMechanismPLAINdirectConnectiontrueserverSelectionTimeoutMS2000appNamemongosh2.0.2 Using MongoDB: 6.0.42 Using Mongosh: 2.0.2 For mongosh info see: https://docs.mongodb.com/mongodb-shell/ ------ The server generated these startup warnings when booting 2023-10-18T21:17:31.774Z: Powered by FerretDB v1.12.1 and PostgreSQL 14.9. 2023-10-18T21:17:31.774Z: Please star us on GitHub: https://github.com/FerretDB/FerretDB. 2023-10-18T21:17:31.774Z: The telemetry state is undecided. 2023-10-18T21:17:31.774Z: Read more about FerretDB telemetry and how to opt out at https://beacon.ferretdb.io. ------ ferretdb提示符变为ferretdb即表示连接成功。关于认证机制需要说明两点v1.12.1 教程演示的连接串使用了authMechanismPLAIN从当前仓库 website/docs/security/authentication.md 看FerretDB本身不存储用户凭据而是把认证完全委托给 PostgreSQL——客户端连接时提供的用户名/密码必须是 PostgreSQL 中真实存在的角色客户端侧支持的认证机制为SCRAM-SHA-256连接串中通常无需显式指定mongosh会自动协商。--no-auth/FERRETDB_AUTHfalse可以关闭认证但那样任何连接者都能访问数据不建议在生产环境使用。Step 5插入文档并在 PostgreSQL 侧验证FerretDB 兼容 MongoDB 命令与查询可以放心执行你熟悉的 MongoDB 操作。通过mongosh插入一条文档ferretdb db.playerstats.insertOne({futbin_id : 7,player_name : Vieri, player_extended_name : Christian Vieri, quality : Gold - Rare, revision : Icon, overall : 88 }) { acknowledged: true, insertedId: ObjectId(65305ac1b116d06ab74d6a33) } ferretdb db.playerstats.find() [ { _id: ObjectId(65305ac1b116d06ab74d6a33), futbin_id: 7, player_name: Vieri, player_extended_name: Christian Vieri, quality: Gold - Rare, revision: Icon, overall: 88 } ] ferretdbinsertOne返回的insertedId由 FerretDB 自动生成ObjectIdfind()能按 MongoDB 语义完整读回文档。回到 PostgreSQL 侧看看这条文档在数据库里长什么样。用 Step 1 的账号连接ferretdb库并切换 schemaferretdb set search_path to ferretdb; SET ferretdb \dt List of relations Schema | Name | Type | Owner -------------------------------------------------------- ferretdb | _ferretdb_database_metadata | table | username ferretdb | playerstats_0f3be573 | table | username ferretdb | test_afd071e5 | table | username (3 rows) ferretdb SELECT * from playerstats_0f3be573;可以看到 FerretDB 为playerstats集合创建了对应的 PostgreSQL 表表名带哈希后缀以避免命名冲突文档被完整存入_jsonb列_jsonb ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {$s: {p: {_id: {t: objectId}, overall: {t: int}, quality: {t: string}, revision: {t: string}, futbin_id: {t: int}, player_name: {t: string}, player_extended_name: {t: string}}, $k: [_id, futbin_id, player_name, player_extended_name, quality, revision, overall]}, _id: 65305ac1b116d06ab74d6a33, overall: 88, quality: Gold - Rare, revision: Icon, futbin_id: 7, player_name: Vieri, player_extended_name: Christian Vieri} (1 row)值得留意的是存储格式$s字段schema记录了每个字段的类型标签objectId、int、string$k记录字段顺序正文则是实际数据。FerretDB 通过这种带类型信息的 BSON 表示在 PostgreSQL 的关系模型中保住了文档数据库的类型语义与字段顺序这也是它能以「MongoDB 协议 PostgreSQL 存储」方式工作的核心设计之一。Bonus在 Ubuntu 上用 SQLite 后端运行 FerretDB除了 PostgreSQLv1.12.1 还支持SQLite 后端。与 PostgreSQL 不同SQLite 是无服务端serverless的——不需要单独的数据库服务进程数据直接落盘为文件。启动时只需切换--handlerferretdb --handlersqlite如果data目录尚不存在请先创建默认 SQLite 数据目录由--sqlite-urlfile:data/控制mkdir data随后用不带认证参数、也更简单的连接串连接mongodb://localhost:27017/ferretdb连接后同样会得到ferretdb提示符Step 5 中的插入、查询操作完全通用~$ mongosh mongodb://username:passwordlocalhost:27017/ferretdb?authMechanismPLAIN Current Mongosh Log ID: 65304b6bb7bd5de804c5e34e Connecting to: mongodb://credentialslocalhost:27017/ferretdb?authMechanismPLAINdirectConnectiontrueserverSelectionTimeoutMS2000appNamemongosh2.0.2 Using MongoDB: 6.0.42 Using Mongosh: 2.0.2 ------ The server generated these startup warnings when booting 2023-10-18T21:17:31.774Z: Powered by FerretDB v1.12.1 and PostgreSQL 14.9. 2023-10-18T21:17:31.774Z: Please star us on GitHub: https://github.com/FerretDB/FerretDB. 2023-10-18T21:17:31.774Z: The telemetry state is undecided. 2023-10-18T21:17:31.774Z: Read more about FerretDB telemetry and how to opt out at https://beacon.ferretdb.io. ------ ferretdbv1.12.1 时期 SQLite 后端尚不支持认证用户名密码不会生效这一点在选择后端做多用户生产部署时需要留意SQLite 更适合单机、轻量、评估性场景。同样地该能力属于 v1.12.1 的--handler体系当前仓库主线已不再提供--handler/--sqlite-url标志参见上文「版本差异」说明。生产化建议日志、遥测与安全加固遥测TelemetryFerretDB 默认上报匿名基础使用数据帮助项目改进兼容性。--telemetry有三种状态enabled、disabled、undecided默认。undecided下首条报告会延迟 1 小时发送给你留出决定时间关闭方式包括--telemetrydisable、环境变量FERRETDB_TELEMETRYdisable、DO_NOT_TRACKtrue或运行时执行db.disableFreeMonitoring()详见 website/docs/telemetry.md。TLS 加密若客户端与服务端之间走公网或不可信网络应通过--listen-tls、--listen-tls-cert-file、--listen-tls-key-file启用 TLS 监听--listen-tls-ca-file还可开启客户端证书校验对应实现见 internal/clientconn/listener.go 中的tlsConfig。systemd服务里同样用EnvironmentFERRETDB_LISTEN_TLS...注入。监控与调试默认127.0.0.1:8088的 debug 服务提供 Prometheus 指标与 pprof 性能采样生产环境请勿将其暴露到公网。连接池参数当前版本在连接 PostgreSQL 时若未显式设置pool_min_conns默认为 10、pool_max_conns默认为 50application_name固定为FerretDBtimezone固定为UTC见 website/docs/configuration/flags.md这些细节对长连接较多的高并发场景有一定参考价值。结语至此你已经在 Ubuntu 上完整走通了 FerretDB 的部署链路安装并初始化 PostgreSQL创建ferretdb库与专用账号→ 下载安装对应架构的.deb包 → 通过命令行标志或systemd服务启动 → 用mongosh连接并写入文档 → 在 PostgreSQL 侧确认数据落库。如果只想快速做本地评估SQLite 后端一条命令即可跑起来。部署完成只是开始FerretDB 作为一个开源项目欢迎你在此基础上继续探索其配置标志的完整组合TLS、认证、日志级别、遥测开关并参阅仓库内的 配置文档 与 安装文档 深化理解当遇到问题时源码中的 启动入口、组件装配逻辑 与 监听器实现 是定位问题的最佳线索。赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐如何在Ubuntu系统上快速部署Photoshop CC 2022完整安装指南如何在Ubuntu系统上快速部署Photoshop CC 2022完整安装指南 在Linux系统上运行专业图像编辑软件一直是个技术难题。现在通过这个开源项目dae部署实战在CentOS/Alpine/Ubuntu上的完整安装教程dae是基于eBPF技术的高性能网络传输解决方案能够在Linux系统上实现高效的网络流量处理。本教程将详细介绍在CentOS 7、Alpine Linux和U如何三步把网盘文件变成直下地址LinkSwift 网盘直链解析指南如何三步把网盘文件变成直下地址LinkSwift 网盘直链解析指南 网盘直链怎么获取LinkSwift 是一个用 JavaScript 写的浏览器油猴脚本前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表