Rocket.Chat从Snap迁移至Docker

Author Avatar
st 2021年04月19日
  • 在其它设备中阅读本文章

ST,你怎么又在折腾。

最近整理手里各种闲着的服务器,就把运行了Rocket.Chat的服务器迁移了一下,正好原先的snap安装模式管理起来我也不怎么习惯,就想着给换成docker,结果又是一大坑,折腾了一天才搞好,趁还记得步骤赶紧记下来。

参考链接

Migrating Rocket.Chat server from snap to docker
官方文档Docker-compose部分
官方文档反代部分
迁移似乎必须在新旧服务器版本完全一致的情况下才能实现。

备份旧服务器

运行service snap.rocketchat-server.rocketchat-server stop停止服务
然后运行service snap.rocketchat-server.rocketchat-mongo status | grep Active查看数据库是否正常运行
运行snap run rocketchat-server.backupdb备份数据库
这个数据库应该是包含了聊天记录、用户文件、系统配置之类所有内容,我恢复之后没觉得有少东西。
备份文件位置会在terminal中显示。

在新服务器上部署Rocket.Chat

在新服务器上新建一个文件夹用来存放相关文件,然后运行curl -L https://raw.githubusercontent.com/RocketChat/Rocket.Chat/develop/docker-compose.yml -o docker-compose.yml来获取docker-compose.yml。
编辑docker-compose.yml,主要修改rocketchat的ROOT_URL,取消mongo的dump文件夹注释,hubot的环境变量,traefik.frontend.rule似乎不改也行。
将备份的数据库移至./data/dump,运行tar xzf ./data/dump/rocketchat_backup_xxxxxxx.xxxx.tar.gz解压缩。
解压后会生成一个名为dump的文件夹,文件夹内会有一个名为parties的文件夹。
搞不懂为什么snap版的数据库要叫parties,有些开源程序还是有点让人难以理解。
运行mv ./dump/dump/parties ./dump/dump/rocketchat重命名文件夹。

恢复数据库

运行docker-compose up -d启动服务。
文章说要先运行docker-compose stop rocketchatdocker-compose stop hubot停止主程序和bot,但我有一次恢复完数据库再启动rocketchat似乎数据库又被重置了,后来尝试不停止rocketchat服务,也可以成功恢复数据库。
如果操作和我完全一致的话运行docker exec -it rocketchat_mongo_1 mongorestore --db=rocketchat /dump/dump/rocketchat --drop即可恢复数据库,或者可以用docker exec -it rocketchat_mongo_1 bash进入container,然后用ls确定文件位置再用mongorestore --db=rocketchat /dump/dump/rocketchat --drop恢复数据库,最后输入exit退出。

如果之前停止了服务,恢复完数据库后重新启动服务。

配置反代

反代配置不能直接复制文档,还得考虑签发证书的/.well-known/文件夹。
贴一下我的Apache配置。

<VirtualHost *:443>
    SSLEngine on
    ServerName chat.stsecurity.moe
    DocumentRoot /var/www/html/

    SSLCertificateFile /etc/apache2/ssl/rocketcert.cer
    SSLCertificateKeyFile /etc/apache2/ssl/rocketkey.key
    SSLCertificateChainFile /etc/apache2/ssl/rocketfullchain.cer

    SSLCACertificatePath /etc/apache2/ssl/
    SSLCACertificateFile /etc/apache2/ssl/rocketca.cer

    ErrorLog ${APACHE_LOG_DIR}/rocketchat-error.log
    CustomLog ${APACHE_LOG_DIR}/rocketchat-access.log combined

    Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/

    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /(.*)           ws://localhost:3000/$1 [P,L]

    <Location />
     ProxyPass http://localhost:3000/
     ProxyPassReverse http://localhost:3000/
     Require all granted
    </Location>

    <Location /.well-known/acme-challenge/>
     ProxyPass !
     AllowOverride None
     Require all granted
    </Location>
</VirtualHost>

Rewrite部分不能放在Location里面,不然IOS客户端没法登陆,应该是websocket连接的问题。
DocumentRoot以及Alias和第二个Location block都是为了签发证书用,这配置可能有点overkill,不过Alias肯定得加。

大功告成?

备份数据库用docker exec -it rocketchat_mongo_1 mongodump -o /dump然后tar cvf ./dbbackup.tar ./data/dump压缩文件夹。
暂时还没问题,希望别出点啥毛病。

本文链接:https://blog.stsecurity.moe/archives/195/
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.