Rocket.Chat从Snap迁移至Docker
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 rocketchat
和docker-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/
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.