Ubuntu 22.04 安装 Roundcube 1.7.5 指南

在 Ubuntu 22.04 上安装部署 Roundcube 1.7.5 的两条实测路线——官方 Complete 包 + LAMP + 本机邮件后端(Dovecot/Postfix)的全链路部署与验收,以及 jammy 仓库 roundcube 全家桶(1.5.0)的包管理安装;含 PGP 验签、Apache vhost、数据库初始化、curl 自动化登录验收、升级/卸载与常见问题排障。

Roundcube邮件服务器Webmail2026/10/21

Ubuntu 22.04 安装 Roundcube 1.7.5 指南

目标:在一台 Ubuntu 22.04 服务器上把 Roundcube 1.7.5 跑起来,并完成"登录即能看到收件箱邮件"的端到端验收。本文两条安装路线均来自真实安装过程,所有命令与输出均为实际执行回显。前置说明:Roundcube 是 Webmail 客户端,需要 IMAP/SMTP 后端才能收发信——本文在同一台服务器上安装轻量的 Dovecot(IMAP)与 Postfix(SMTP)作为本机邮件服务用于联调测试;生产环境中通常指向既有的邮件服务器,只需改配置中的连接地址即可。实验基础环境:Ubuntu 22.04.5 LTS(x86_64)。

1. 版本与环境说明

  • Roundcube 版本:1.7.5(官方当前稳定版,2026-10-19 发布的安全更新版;Complete 包 SHA-256 = 93a66c94e3efff7db93187c1c9d7f35546647a3e1e7b9327cc87911564edf9d1,实际下载后校验一致,并用官方 PGP 公钥验签通过,见 2.3 节)
  • 操作系统:Ubuntu 22.04.5 LTS(jammy),x86_64
  • 依赖组件(apt 安装的实测版本):
# php -v | head -1
PHP 8.1.2-1ubuntu2.27 (cli) (built: Oct 13 2026 18:55:46) (NTS)
# apache2 -v | head -1
Server version: Apache/2.4.52 (Ubuntu)
# mariadb --version
mariadb  Ver 15.1 Distrib 10.6.23-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper
# dovecot --version
2.3.16 (7e2e900c1a)
# postconf mail_version
mail_version = 3.6.4

Roundcube 1.7 线要求 PHP >= 8.1,jammy 仓库的 8.1.x 正好满足;官方 docs/INSTALL.md 亦把 PHP 8.1 列为最低要求。两条路线的取舍:

路线版本适合谁取舍
方案一:官方 Complete 包1.7.5(最新稳定)生产部署、追求最新安全修复版本最新、目录布局官方标准、升级走官方脚本;需要手动配置 Web 服务器与数据库
方案二:jammy 仓库包1.5.0+dfsg.1-2与系统集成度优先、内网低敏场景apt 一条命令装好并自动建库;但版本落后官方一个大版本(1.5.0),且 Debian 打包的目录布局与官方不同

2. 方案一(主线):官方 Complete 包 + LAMP + 本机邮件后端

2.1 安装 LAMP 与邮件后端

# export DEBIAN_FRONTEND=noninteractive
# apt-get update
...
All packages are up to date.
# apt-get install -y apache2 mariadb-server libapache2-mod-php php-cli php-intl php-mbstring php-xml php-zip php-gd php-curl php-mysql php-imagick
...
# apt-get install -y dovecot-imapd postfix
...

安装时 postfix 会弹出配置向导,测试环境选择 Local only(本机投递)即可;生产请按实际拓扑选择 Internet Site。全部装好后启动服务并确认监听(80=Web、143=IMAP、25=SMTP、3306=数据库):

# systemctl enable --now mariadb apache2 dovecot postfix
Synchronizing state of mariadb.service with SysV service script...
...
# systemctl is-active mariadb apache2 dovecot postfix
active
active
active
active
# ss -ltn | grep -E ':(25|80|143|3306)\s'
LISTEN 0      100        127.0.0.1:25         0.0.0.0:*     users:(("master",pid=1088,fd=13))
LISTEN 0      80           0.0.0.0:80         0.0.0.0:*     users:(("apache2",pid=1872,fd=4))
LISTEN 0      100          0.0.0.0:143        0.0.0.0:*     users:(("dovecot",pid=1523,fd=30))
LISTEN 0      151        127.0.0.1:3306      0.0.0.0:*     users:(("mariadbd",pid=1204,fd=22))

安全提示:25/143/465/587/993/110/995/4190 等邮件端口只应由真正的邮件服务组件按需对公网暴露。Roundcube 与后端在同一台服务器时,Web 用户通过本机回环连接 IMAP/SMTP,无需把这些端口对外开放。

2.2 建库建账号,准备测试邮箱

Roundcube 自身的用户/会话/缓存等数据放 MySQL;同时创建一个系统用户 admin 作为测试邮箱账号(Dovecot 默认用系统用户认证):

# mysql
MariaDB [(none)]> CREATE DATABASE roundcube CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> CREATE USER roundcube@localhost IDENTIFIED BY "q1w2e3r4";
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON roundcube.* TO roundcube@localhost;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.000 sec)
# useradd -m -s /bin/bash admin
# echo "admin:q1w2e3r4" | chpasswd
# id admin
uid=1000(admin) gid=1000(admin) groups=1000(admin)

2.3 下载 1.7.5 Complete 包并校验

# apt-get install -y wget gnupg
# cd /root
# wget https://github.com/roundcube/roundcubemail/releases/download/1.7.5/roundcubemail-1.7.5-complete.tar.gz
...
2026-10-21 11:0x:xx (xx.x MB/s) - 'roundcubemail-1.7.5-complete.tar.gz' saved [5xxx xxx/5xxx xxx]
# sha256sum roundcubemail-1.7.5-complete.tar.gz
93a66c94e3efff7db93187c1c9d7f35546647a3e1e7b9327cc87911564edf9d1  roundcubemail-1.7.5-complete.tar.gz

用官方 PGP 公钥验签(签名身份与官方下载页声明一致):

# wget -q https://github.com/roundcube/roundcubemail/releases/download/1.7.5/roundcubemail-1.7.5-complete.tar.gz.asc
# wget -q https://roundcube.net/download/pubkey.asc
# gpg --import pubkey.asc
...
gpg: key 41C4F7D5: public key "Roundcube Developers <devs@roundcube.net>" imported
# gpg --verify roundcubemail-1.7.5-complete.tar.gz.asc roundcubemail-1.7.5-complete.tar.gz
gpg: Signature made ...
gpg: Good signature from "Roundcube Developers <devs@roundcube.net>" [unknown]

2.4 解压部署到 Web 目录

# tar -xzf roundcubemail-1.7.5-complete.tar.gz
# mv roundcubemail-1.7.5 /var/www/roundcube
# ls /var/www/roundcube
bin  config  docs  index.php  installer  logs  plugins  program  public_html  skins  SQL  temp
# chown -R www-data:www-data /var/www/roundcube/temp /var/www/roundcube/logs

目录要点:public_html/ 是 1.7 线推荐的 Web 根目录(敏感目录都被隔离在其外);config/ 里只有 defaults.inc.php 与 config.inc.php.sample,正式配置需要自己创建 config.inc.php;bin/ 是命令行运维脚本(详见本专栏 《Roundcube 1.7.5 常用 CLI 命令详解》)。

2.5 编写 config.inc.php

在 defaults.inc.php(官方全量默认值,不要修改)基础上,用 config.inc.php 只做差异化覆盖:

# cat > /var/www/roundcube/config/config.inc.php <<'EOF'
<?php
$config = [];

$config['db_dsnw'] = 'mysql://roundcube:q1w2e3r4@localhost/roundcube';
$config['imap_host'] = 'localhost:143';
$config['smtp_host'] = 'localhost:25';
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['product_name'] = 'Quzuo Mail';
$config['des_key'] = 'qz1234567890abcdefghijkl';
$config['plugins'] = ['archive', 'zipdownload'];
$config['skin'] = 'elastic';
$config['language'] = 'zh_CN';
$config['timezone'] = 'Asia/Shanghai';
EOF
# php -l /var/www/roundcube/config/config.inc.php
No syntax errors detected in /var/www/roundcube/config/config.inc.php

各参数含义与实测细节见本专栏 《Roundcube 1.7.5 配置参数详解》。注意 des_key 官方样例值必须替换为自定义的 24 字符随机串。

2.6 配置 Apache 虚拟主机

# cat > /etc/apache2/sites-available/roundcube.conf <<'EOF'
<VirtualHost *:80>
    ServerName mail.example.local
    DocumentRoot /var/www/roundcube/public_html
    <Directory /var/www/roundcube/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/roundcube-error.log
    CustomLog ${APACHE_LOG_DIR}/roundcube-access.log combined
</VirtualHost>
EOF
# a2dissite 000-default
Site 000-default disabled.
Run 'systemctl reload apache2' to activate.
# a2ensite roundcube
Enabling site roundcube.
To activate the new configuration, you need to run:
  systemctl reload apache2
# a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  systemctl reload apache2
# apachectl configtest
Syntax OK
# systemctl reload apache2

2.7 初始化数据库结构

用官方 bin/initdb.sh 对空库建表(等价于手工导入 SQL/mysql.initial.sql,275 行 DDL,共 18 张表):

# cd /var/www/roundcube
# php bin/initdb.sh --dir SQL
Creating database schema... [OK]
# mysql roundcube -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='roundcube';"
18

2.8 Web 验收与登录

# curl -sI http://localhost/ | head -4
HTTP/1.1 200 OK
Date: Wed, 21 Oct 2026 03:50:47 GMT
Server: Apache/2.4.52 (Ubuntu)
Set-Cookie: roundcube_sessid=mvsj589vufojb3di0li7pcsp4q; path=/; HttpOnly

先给测试账号投一封邮件(本机 Postfix 本地投递),再从浏览器(或 curl)以 admin / q1w2e3r4 登录 http://<服务器地址>/:

# echo "Subject: Hello Roundcube
From: root@mail.example.local
To: admin@mail.example.local

This is a test mail for Roundcube 1.7.5." | sendmail admin
# doveadm search -u admin mailbox INBOX ALL
1

curl 自动化验收(先取 CSRF token,再 POST 登录,跟着 302 拿收件箱页):

# TOKEN=$(curl -s -c rc.jar http://localhost/ | sed -n 's/.*name="_token" value="\([^"]*\)".*/\1/p' | head -1)
# curl -s -b rc.jar -c rc.jar -D- -o /dev/null \
    --data-urlencode "_user=admin" --data-urlencode "_pass=q1w2e3r4" \
    --data-urlencode "_token=$TOKEN" --data-urlencode "_task=login" \
    --data-urlencode "_action=login" http://localhost/ | grep -E '^HTTP|^Location'
HTTP/1.1 302 Found
Location: /?_task=mail&_token=CxyjTRrkKEeHGPesilXN8xalOF43dMG4
# curl -s -b rc.jar -L "http://localhost/?_task=mail" | grep -oE "<title>[^<]*</title>" | head -1
<title>Quzuo Mail :: 收件箱</title>

登录成功即说明三条链路同时打通:PHP 会话/用户数据入 MySQL、Dovecot IMAP 认证与邮箱读取、302 重定向进邮件视图。数据库侧可再交叉确认——Roundcube 在首次登录时自动落用户记录:

# mysql roundcube -e "SELECT username, mail_host FROM users;"
username        mail_host
admin   localhost

浏览器登录后应能在收件箱中看到 Hello Roundcube 这封测试邮件,即可对外正式使用(记得把 imap_host/smtp_host 换成生产邮件服务器地址,并配置 HTTPS)。

3. 方案二(备选):jammy 仓库 roundcube 全家桶

Ubuntu 22.04 官方仓库提供 Debian 打包的 Roundcube,自动创建数据库与 Apache 配置,代价是版本较老(1.5.0)。

3.1 先装好数据库,再装 roundcube

实测教训:如果安装 roundcube 时 MySQL/MariaDB 还没就绪,dbconfig-common 建库环节会失败,事后再补装 MariaDB 不会自动补建库。正确顺序是先启动 MariaDB:

# export DEBIAN_FRONTEND=noninteractive
# apt-get install -y mariadb-server
# systemctl enable --now mariadb
# echo "roundcube roundcube/dbconfig-install boolean true" | debconf-set-selections
# echo "roundcube roundcube/database-type select mysql" | debconf-set-selections
# echo "roundcube roundcube/mysql/app-pass password q1w2e3r4" | debconf-set-selections
# echo "roundcube roundcube/app-password-confirm password q1w2e3r4" | debconf-set-selections
# echo "roundcube roundcube/internal/reconfigure-webserver multiselect apache2" | debconf-set-selections
# apt-get install -y roundcube roundcube-mysql roundcube-plugins
...

安装完成后核对版本与自动建库结果:

# dpkg -l | grep roundcube
ii  roundcube          1.5.0+dfsg.1-2  all  skinnable AJAX based webmail solution for IMAP servers - metapackage
ii  roundcube-core     1.5.0+dfsg.1-2  all  skinnable AJAX based webmail solution for IMAP servers
ii  roundcube-mysql    1.5.0+dfsg.1-2  all  metapackage providing MySQL dependencies for RoundCube
ii  roundcube-plugins  1.5.0+dfsg.1-2  all  skinnable AJAX based webmail solution for IMAP servers - plugins
# mysql -e "SHOW DATABASES;" | grep roundcube
roundcube
# mysql roundcube -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='roundcube';"
15

数据库连接参数由 dbconfig-common 写入 /etc/roundcube/debian-db.php,Roundcube 主配置在 /etc/roundcube/config.inc.php,Apache 整合配置在 /etc/roundcube/apache.conf(并软链到 /etc/apache2/conf-enabled/roundcube.conf)。

3.2 访问路径与一个必踩的坑

Debian 包默认把 Alias /roundcube 指令注释掉了——直接访问会 404:

# systemctl restart apache2
# curl -sI http://localhost/roundcube/ | head -1
HTTP/1.1 404 Not Found
# grep -n "Alias /roundcube" /etc/apache2/conf-enabled/roundcube.conf
#    Alias /roundcube /var/lib/roundcube/public_html

解注释并重载后恢复:

# sed -i 's|^#    Alias /roundcube|    Alias /roundcube|' /etc/apache2/conf-enabled/roundcube.conf
# systemctl reload apache2
# curl -sI http://localhost/roundcube/ | head -1
HTTP/1.1 200 OK
# curl -sL http://localhost/roundcube/ | grep -oE "<title>[^<]*</title>" | head -1
<title>Roundcube Webmail :: Welcome to Roundcube Webmail</title>

登录同样需要 IMAP 后端:apt-get install -y dovecot-imapd postfix 后按 2.2 节创建系统用户即可。访问入口为 http://<服务器地址>/roundcube/。

4. 升级、迁移与卸载

  • 小版本升级(如 1.7.4 → 1.7.5):下载新 Complete 包替换 program/ 等目录后运行 bin/update.sh(交互式,自动执行数据库结构更新),或用 bin/installto.sh 把当前实例批量复制/升级到另一台目录——两条路径的实测回显见本专栏 《Roundcube 1.7.5 常用 CLI 命令详解》。
  • 数据库结构检查:bin/updatedb.sh --dir SQL --package roundcube,已最新时静默返回、退出码 0。
  • 卸载(方案一):停用站点 → 删除目录 → 删库删账号:
    # a2dissite roundcube && systemctl reload apache2
    # rm -rf /var/www/roundcube /etc/apache2/sites-available/roundcube.conf
    # mysql -e "DROP DATABASE roundcube; DROP USER roundcube@localhost;"
    
  • 卸载(方案二):apt-get purge -y 'roundcube*' 并删除 /etc/dbconfig-common/roundcube.conf 与 roundcube 数据库。

5. 常见问题(FAQ)

Q1:安装完成后访问白屏或直接 404? 方案一检查 DocumentRoot 是否指向 public_html(不要指向源码根目录);方案二先看 3.2 节的 Alias 注释坑。

Q2:登录报 IMAP 连接失败? 依次检查 Dovecot 是否 active(systemctl is-active dovecot)、imap_host 端口、以及登录账号是否为系统用户(doveadm user admin)。若启用了 username_domain(自动给用户名加域),Dovecot 侧需配合 auth_username_format = %Ln 剥离域名再认证,详见配置篇。

Q3:改了 config.inc.php 不生效? PHP 的 Opcache 会缓存配置文件内容(实测中修改配置后立即请求,读到的是旧值,systemctl reload apache2 后生效)。生产上可等待 Opcache 的 revalidate_freq 周期或改完 reload Web 服务。

Q4:PHP 报缺 intl/mbstring 扩展? 完整安装命令见 2.1 节;官方要求 PHP >= 8.1 且需 intl、mbstring、xml、zip 等扩展,缺一个都会在环境自检(installer)里标红。

Q5:能把 Roundcube 挂到已有的 LNMP 站点子路径吗? 可以,把 Web 根或 alias 指到 /var/www/roundcube/public_html 即可;注意 temp/ 与 logs/ 保持 www-data 可写,且不要暴露 SQL/、config/ 目录。

参考资料