nodebb搭建 維護 discuz 資料遷移

bay1發表於2018-06-22

title: nodebb搭建,維護,discuz!資料遷移 date: 2018-06-03 00:45:26 tags: nodebb

為什麼選擇了NodeBB? 我也不知道~~~

NodeBB官方Github

NodeBB中文論壇

NodeBB官方文件

NodeBB中文文件

安裝

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

下方為nodebb映象的YAML

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的管理推薦使用中國的容器管理平臺,映象會直接拉取國內複製來的映象 工作室目前用的是www.daocloud.io/

拉取nodebb映象並生成容器後,再拉取一個mongodb映象作為資料庫容器 為了維護方便,單獨使用一個容器,以後的nodebb論壇的升級可以直接拉取新的版本映象 安裝新版本的時候填寫資料庫容器內網地址就行啦~

在成功生成mongodb容器後,要首先進入容器建立我們需要的資料庫名字和此資料庫相應的使用者密碼 官方也有介紹

下面是mongo映象的YAML,我們通過資料卷可以同步更新資料到宿主機

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 3T

然後我們通過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))

遷移指令碼完整部分(供參考)

相關文章