nodebb搭建,維護,discuz!數據遷移至mongo

原文連接php

爲何選擇了NodeBB?
我也不知道~~~ <!--more-->

NodeBB官方Githubhtml

NodeBB中文論壇node

NodeBB官方文檔python

NodeBB中文文檔nginx

安裝

此處的方式是Docker安裝部署( https://hub.docker.com/r/node...
不用考慮環境配置問題,可是相應的也會有一些弊端
好比文件的修改等變得麻煩

下方爲nodebb鏡像的YAMLgit

cumt:
  image: index.docker.io/nodebb/docker:v1.9.3
  privileged: false
  restart: always
  ports:
  - 4567:4567
  volumes:
  - /bbs/:/usr/src/app/config #爲了修改文件方便,加了一個文件夾方便和宿主機文件交換
  - /bbs/public/uploads:/usr/src/app/public/uploads #同步上傳的文件到宿主機

同時關於docker的管理推薦使用中國的容器管理平臺,鏡像會直接拉取國內複製來的鏡像
工做室目前用的是https://www.daocloud.io/github

拉取nodebb鏡像並生成容器後,再拉取一個mongodb鏡像做爲數據庫容器
爲了維護方便,單獨使用一個容器,之後的nodebb論壇的升級能夠直接拉取新的版本鏡像
安裝新版本的時候填寫數據庫容器內網地址就行啦~

在成功生成mongodb容器後,要首先進入容器建立咱們須要的數據庫名字和此數據庫相應的用戶密碼
官方也有介紹sql

下面是mongo鏡像的YAML,咱們經過數據卷能夠同步更新數據到宿主機mongodb

mongodb:
  image: library/mongo:3.4.15
  privileged: false
  restart: always
  ports:
  - 27017:27017
  volumes:
  - /var/lib/docker/volumes/mongoconfig/_data:/data/configdb
  - /var/lib/docker/volumes/mongodata/_data:/data/db

通常國內服務器會配置安全組,爲了方便你也能夠暫時開放mongodb容器外網端口
在本機遠程鏈接進行配置,這裏推薦一款windows可視化工具Robo 3Tdocker

而後咱們經過nginx代理設置咱們須要的域名就好了~

這樣安裝以後你就能夠配置本身的bbs了,這樣的方式會給咱們省去不少環境配置的麻煩

可能遇到的問題

  • 論壇一直顯示斷開鏈接

這時候你須要修改容器config.json裏面的url爲你的自定義域名

版本升級

nodebb並很差升級,按照官方文檔的操做咱們須要首先備份數據庫和用戶上傳文件
可是咱們使用了docker幾句能夠避免這些問題
而後咱們要作的就是更新docker鏡像並從新生成容器,配置相應的數據庫就好了
  • 須要注意的是咱們生成新的容器後要停用一切插件以防nodebb系統直接崩潰
./nodebb reset -a

數據庫維護和備份

定時備份數據庫並遷移到其餘機器是件很重要的事情 數據庫備份

因爲咱們使用的是docker容器,備份命令就須要鏈接咱們相應的內網地址

mongodump -h 172.22.0.12:27017 -u 用戶名 -p 密碼 --authenticationDatabase=數據庫名 -d 數據庫名
  • 咱們須要注意的是若是定時執行的腳本在宿主機,咱們須要在宿主機安裝mongo以支持mongodump命令
  • 同時這個定時備份腳本的成功輸出語句並不能正確的反應是否成功備份

咱們仍是最好按期檢查一下

若是你要恢復數據庫文件,咱們能夠經過咱們保存的備份文件上傳到新的mongodb外置的數據卷
即好比:
把備份文件放到宿主機的 /var/lib/docker/volumes/mongodata/_data
容器中直接打開 /data/db
而後解壓以後(tar -zxvf xxx.tar.gz)
運行
mongorestore -u nodebb -p yourpassword --authenticationDatabase=nodebb -d nodebb --drop dump/nodebb
便可

discuz!數據遷移到nodebb

舊的論壇數據庫是Mysql,徹底不一樣的數據庫類型,也是不可能同樣的數據庫字段
可是論壇的性質使得他們數據字段部分是相同的,咱們只須要過濾篩選咱們所須要的數據,而後經過NodeBB接口插件導入咱們要用的信息就好了
其實這個過程並不具備技術難度,只是比較複雜和麻煩
咱們首先須要熟悉Dz和nodebb數據庫各個字段 DZ數據庫字典

對於用戶的篩選

咱們都知道Mysql數據庫外鍵很方便咱們聯表或者關聯查詢,經過這種方式把咱們須要的用戶信息組成json
經過NodeBB接口post到mongodb(若是不使用api直接導入到mongo,咱們還要本身組合mongo字段)

因爲nodebb-api用戶新建只支持用戶名和密碼,郵箱的POST,咱們能夠新建成功後,記錄下新建成功的用戶uid,而後經過update用戶信息來更新用戶資料

關於用戶的頭像,論壇等cms通常都有本身的用戶頭像文件命名規則
對於dz論壇本身獲取頭像的的代碼以下,咱們能夠經過模仿流程來獲取頭像文件夾的路徑
function get_avatar($uid, $size = 'middle', $type = '') {
    $size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';
    $uid = abs(intval($uid));
    $uid = sprintf("%09d", $uid);
    $dir1 = substr($uid, 0, 3);
    $dir2 = substr($uid, 3, 2);
    $dir3 = substr($uid, 5, 2);
    $typeadd = $type == 'real' ? '_real' : '';
    return $dir1.'/'.$dir2.'/'.$dir3.'/'.substr($uid, -2).$typeadd."_avatar_$size.jpg";
}

===============================================
# python模仿流程
def get_avatar(uid):
    uid = str(abs(int(uid)))
    uid_length = len(uid)
    if uid_length < 9:
        uid = '0'*(9-uid_length)+uid
    dir1 = uid[0:3]
    dir2 = uid[3:5]
    dir3 = uid[5:7]
    dir4 = uid[7:9]
    old_avatar = os.path.join(
        basedir, 'avatar/'+dir1+'/'+dir2+'/'+dir3+'/'+dir4+'_avatar_middle.jpg')
    return old_avatar

...

if avatarstatus != 0:
    old_avatar = get_avatar(uid)
    new_avatar_address = '/assets/uploads/profile/%a-profileavatar.jpg' % adduser_uid
    new_avatar = os.path.join(basedir, 'profile/%a-profileavatar.jpg' % adduser_uid)
    shutil.copy(old_avatar, new_avatar)
    update_data["picture"] = new_avatar_address
    update_data["uploadedpicture"] = new_avatar_address

對於帖子和回覆的遷移

理論和以上同樣
咱們須要先研究清楚DZ數據庫字典,好比這樣的字典
咱們根據相應數據字段來組合咱們須要的mongodb字典
咱們須要注意的是,在這個表段的組合以後咱們也須要update相應的帖子資料
更新帖子的發表時間,以及發表做者(個人腳本里只更新了帖子的做者,沒有更新帖子發表字段,所以形成用戶沒有記錄帖子發表數,可是帖子詳情頁做者顯示正確)

帖子字典

  • 若是導入HTMLParser報錯,能夠參考下面的文件更新到python相應的Lib/site-packages文件夾中 HTMLParser報錯文件參考
  • 若是requests失敗,就增長time.sleep減小發送頻率
  • dz是s級別的時間戳,而nodebb是13位的毫秒級,轉換公式 reply_dateline = int(round(reply_dateline*1000))

遷移腳本完整部分(供參考)

相關文章
相關標籤/搜索