在 Ubuntu 24.04 上如何通过 apt 安装 CouchDB 3.3 并启用 systemd 自启动?

解读

国内生产环境普遍要求“版本锁定 + 官方签名 + 开机自启”。Ubuntu 24.04 默认仓库尚未收录 3.3,因此必须手动引入 Apache 官方仓库并完成 GPG 校验;同时 systemd 已是系统默认初始化系统,enable 与 start 两步缺一不可。面试官通过此题考察候选人三点:

  1. 是否熟悉国内网络环境下“换源+代理”的常规操作;
  2. 能否正确区分 Debian 系“apt 仓库优先级”与“hold 锁定版本”机制;
  3. 是否理解 CouchDB 的 systemd unit 文件为何由软件包自带,而非手工编写。

知识点

  • **Apache CouchDB 官方仓库(https://apache.jfrog.io)**在国内可通过清华、中科大镜像加速
  • **APT pinning(/etc/apt/preferences.d/)**用于锁定 3.3 小版本,防止意外升级
  • **systemd 预设(preset)**与 systemctl enable --now 的语义差异
  • couchdb 用户与 couchdb 组由 .deb 包自动创建,数据目录 /opt/couchdb 权限 0750
  • /etc/couchdb/local.ini 是面试常问的配置文件,修改后无需 systemctl restart,HTTP PUT /_node/_config 可热加载,但初始安装阶段仍建议重启一次确认 unit 状态
  • journalctl -u couchdb -f 是现场排障必用命令,可观察 “Apache CouchDB 3.3.x” 字样确认版本

答案

  1. 准备仓库(root 下执行,国内建议先 export https_proxy

    sudo apt update && sudo apt -y install curl gnupg2
    curl https://couchdb.apache.org/repo/keys.asc | gpg --dearmor | sudo tee /usr/share/keyrings/couchdb-archive-keyring.gpg >/dev/null
    echo "deb [signed-by=/usr/share/keyrings/couchdb-archive-keyring.gpg] https://apache.jfrog.io/artifactory/couchdb-deb/ noble main" | sudo tee /etc/apt/sources.list.d/couchdb.list
    
  2. 锁定 3.3 小版本(防止进入 3.4/4.0)

    echo -e "Package: couchdb\nPin: version 3.3*\nPin-Priority: 1001" | sudo tee /etc/apt/preferences.d/couchdb
    
  3. 安装并开机自启

    sudo apt update
    sudo apt -y install couchdb=3.3.*
    sudo systemctl enable --now couchdb
    
  4. 验证

    systemctl is-enabled couchdb   # 应输出 enabled
    curl http://127.0.0.1:5984/    # 应返回 {"couchdb":"Welcome","version":"3.3.x"}
    

拓展思考

  • 如果公司规定“所有服务必须跑在非 root 用户”,而 systemd unit 默认 User=couchdb,你是否还需要修改?——不需要,官方包已遵守最小权限原则。
  • 当后续需要原地热升级到 3.3.3 补丁版,但业务要求零宕机,你会如何操作?——利用 集群滚动重启单节点 dpkg -i couchdb_3.3.3-1_amd64.deb 后执行 sudo -u couchdb couchdb -k 优雅重启,而非 systemctl restart。
  • 面试官可能追问:“假如 5984 端口被占用,如何修改端口并保证 systemd 识别?”——需编辑 /opt/couchdb/etc/local.d/port.ini 写入 [chttpd] port = 6984,再 systemctl reload couchdb(unit 支持 SIGUSR1 重载),而非直接改 /lib/systemd/system/couchdb.service。