lili6507a书摘与小说
从零开始搭建风花站
历史档案 · 保留原帖文字 · 35 条回复
回复
风花站是基于水木的 KBS 系统和北邮人的 nForum 的移动端ui搭建的,在此再次感谢 KBS@newsmth xw2423@BYR 两位大佬无私授权使用代码!
本文是一个学习的备忘录,也希望让你同样感受这个小系统给我带来的快乐。
系统硬件
风花站放在一台旧电脑上,由于长期开机且放在客厅,所以为了零噪音将所有的风扇(包括cpu风扇)拆除,并拆除了显卡,使用一块120G的固态硬盘,以及一个300w的长城无风扇电源,使用 cpufreq 工具控制cpu运行的频率95%以上时间为 800MHZ低功耗运行,经测试冬天最低温度约27度,夏天约40度左右
系统搭建在ubuntu12.04(12年4月发布的,怀念那个黄金时期)的系统上,她使用了c作为后台、php5处理web相关,几乎未使用流行的数据库和js技术,
帖子保存在内存文件系统(tmpfs)里,并且将用户信息、版面信息、帖子索引都生成cache加速查找,当然会定期(每2小时)使用rsync工具进行同步到磁盘,防止意外断电丢失。
[21.11.26追加]
昨天停电固态硬盘坏掉了,重新安装12.04发现无法更新源的软件了,多次尝试后升级使用14.04镜像, 这个版本的php也没有升级到7.0,所以可以兼容旧软件
http://mirrors.163.com/ubuntu-releases/14.04.6/ubuntu-14.04.6-desktop-amd64.iso
怀念一下挂掉的12.04
[21.12.29再追加]
14.04 的php5.5版本有问题, 对gbk的不常见字符比如表情处理有误, 回退到12.04的php5.3.10-1ubuntu3.26
版本: ubuntu-12.04.5-desktop-amd64.iso
踩了几个坑记录一下:
1 官方的源已经失效, 使用
替换 sudo vim /etc/apt/sources.list
deb http://old-releases.ubuntu.com/ubuntu precise main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu precise-security main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu precise-updates main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu precise-proposed main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu precise-backports main restricted universe multiverse
2 启动后报错: '/boot/grub/ i386-PC/Normal.mod 'not found
进入usb的启动盘, 重新构建mbr
sudo mount /dev/sda /mnt
sudo grub-install /dev/sda --root-directory=/mnt
启动后如果报错,或者不能进入系统直到按回车
vi /etc/default/grub
注释掉 GRUB_HIDEN_TIMEOUT=0
修改 GRUB_TIMEOUT=10
然后
update-grub2
3
安装ubuntu12.04的php原始版本
sudo apt-get install php5-common=5.3.10-1ubuntu3.26 \
php5-cli=5.3.10-1ubuntu3.26 \
php5-curl=5.3.10-1ubuntu3.26 \
php5-dev=5.3.10-1ubuntu3.26 \
php5-gd=5.3.10-1ubuntu3.26 \
php5-mysql=5.3.10-1ubuntu3.26
后续内容主要分为安装、开发维护部分 (假设你学过一点谭浩强的c语言、听说过Linux是怎么回事 ^-^)
第一部分:
首先安装ubuntu12.04系统,可以安装在物理机上(推荐使用rufus制作一个usb启动盘, 也可以使用ubuntu下的usb-creator-gtk制作, 不过这个默认做了启动盘后没有剩余空间),也可以安装在虚拟机(VirtualBox)上体验一下,为了减少本文字数,已经把程序和数据放在度盘里,搭建起来会省点劲,并且定期将帖子和用户信息备份保存,可以进行数据的回滚。
当然后面的部分我也会在线重新搭建一次。
虽然是国庆前夕,但是仍然有个bug要解,相信我绝不会鸽,所以 ==
虚拟机推荐4G+内存,在实际风花站上 4G内存用于tmpfs,虚拟机分配5G内存,40G的磁盘空间,网络的话先选择桥接网卡,这样安装好了可以在虚拟机外面访问内部的http服务器
安装时选择语言为汉语,用户为 bbs,home用户选择不加密,时区为上海(自动探测出来的),分区的话暂时选择默认的即可,然后就开始安装了
中间有个下载语言支持,选择的暂不下载,一阵哗哗哗的打印后,大概不到10分钟后就安装好了
推荐物理磁盘小于2T,那么grub启动引导选择为安装到MBR即可,此后系统自动重启
ps:当然物理机安装的时候可以手动分区,将home目录单独分一个区,选择为reiserfs文件系统,对保存有大量小文件的系统性能比较好
虚拟机安装增强功能,主要是文件共享:Virtualbox标题栏 - 设备 - 安装增强功能,输入密码后即可自动安装,安装完成后右上角控制小按钮选择 - 关机 - 重启,再次启动后显卡驱动和共享文件夹功能即安装完毕,物理机器的话不需要选择安装显卡驱动了,因为不需要显示器
我这里安装增强功能后第一次启动白屏,强制重启一次就可以了
第一次启动系统提示是否升级,选择不升级,否则可能就升级为14.04系统了。。
Virtualbox控制栏 - 设置 - 共享文件夹, 添加一个共享文件夹,共享文件夹可以命名为share(下面的mount命令使用这个名字), 勾选上自动挂载和固定分配
设置 - 共享剪切板 - 双向,即可拷贝双向文字了
后续的命令行操作可以复制后直接在 Terminal 使用Shift+Insert粘贴
点击系统左上角第一个图标Dash,输入Terminal,选择第一项即终端
输入 sudo mount -t vboxsf share /mnt/
即可将共享的文件夹挂载到 /mnt 目录了
安装一些必要的包
将度盘下载的 mnt目录下的所有文件拷贝到 windows 的共享文件夹 share目录,比如我放在在 D:\share 目录下,为了后文方便,只拷贝文件夹下文件,不包括 mnt 目录
替换安装源为国内源
sudo cp /mnt/sources.list /etc/apt/sources.list
替换 .vimrc .bashrc配置文件
cp /mnt/.vimrc /mnt/.bashrc ~
替换编码配置,默认使用gb18030
sudo cp /mnt/local /var/lib/locales/supported.d/local
sudo dpkg-reconfigure locales
终端 - 设定字符编码 - 添加或删除 - 简体中文gb18030 - 添加到右侧
终端 - 设定字符编码 - 选择gb18030
此时当前目录下的几个中文目录可能显示乱码了,直接删除即可
rm ~/* -fr
万事俱备,安装的 php, nginx, mysql 等依赖库,可能会有10多分钟,此时可以去楼下买瓶快乐水
sudo /mnt/apt.sh
安装快结束时有一次要求输入密码,随意输入即可
解压缩风花站代码和数据,时间稍微有点长,我等得有点心焦,又去楼下买了瓶快乐水
cd ~ && tar Jxf /mnt/bbsbk_2020_09_28.tar.xz
替换下目录,这个操作真的有点。。
cd /home/ && sudo mv bbs bbs.bk && sudo mv bbs.bk/home/bbs/bk/bbs/ /home/ && cd
替换php和nginx的配置文件,替换完毕重启
cp /home/bbs.bk/home/bbs/bk/etc/* /etc/ -a
这里的配置修改其实是这样的:
1 /etc/php5/fpm/pool.d/www.conf
添加了和nginx交互的端口
listen = 127.0.0.1:9000
2
/etc/php5/fpm/php.ini ,文件结尾加入
[yaf]
extension=yaf.so
extension=libphpbbslib.so
3
vim /etc/php5/fpm/php.ini
加入
include_path = ".:/usr/share/php:/home/bbs/src/smarty-2.6.31/libs"
创建内存文件系统
首先备份
mv /home/bbs/boards /home/bbs/boards.bk
mv /home/bbs/src/nForum-2.0/app/tmp /home/bbs/src/nForum-2.0/app/tmp.bk
创建目录
mkdir -p /home/bbs/boards /home/bbs/cache /home/bbs/src/nForum-2.0/app/tmp
创建内存文件系统
sudo mount -t tmpfs -o size=3072m tmpfs /home/bbs/boards
sudo mount -t tmpfs -o size=256m tmpfs /home/bbs/cache
sudo mount -t tmpfs -o size=512M tmpfs /home/bbs/src/nForum-2.0/app/tmp
拷贝文件,稍慢,喝水
cp /home/bbs/boards.bk/* /home/bbs/boards -a
cp /home/bbs/src/nForum-2.0/app/tmp.bk/* /home/bbs/src/nForum-2.0/app/tmp -a
修改php模块待安装目录的权限
sudo chown bbs:bbs /usr/lib/php5 -R
安装Yaf
cd ~/src/yaf-yaf-2.3.2 && make install
安装 kbs 库
cd ~/src/kbs_bbs && make install
完事具备,检测下nginx,php是否已经启动
ps aux | grep nginx
ps aux | grep php
此时可以启动kbs了
cd && ./start.sh
查看进程是否成功启动
ps aux | grep misc
修改 windows的hosts
用记事本打开 C:\Windows\System32\drivers\etc
在文件末尾添加一行 (192.168.1.6替换成上面获取的ip)
192.168.1.6 yuzhouzhitie.net
保存退出
浏览器访问 yuzhouzhitie.net ,此时已经安装成功
访问 http://yuzhouzhitie.net/board/Tieba 页面可以看到最新的帖子为2020年9月28日
第二部分
首先几个常用目录介绍
/home/bbs 也就是 ~目录: 几乎所有的代码、数据都保存在这里
/home/bbs/home 保存每个用户的发帖,@信息,回复信息等
~/boards 保存各个版面的帖子
~/tieba 保存同步帖子的原始数据
~/src/kbs_bbs kbs代码目录
~/src/nForum-2.0 web前台代码目录
~/src/syn 同步脚本
如何同步贴吧帖子
~/src/syn 目录下有几个python脚本
tieba.py 负责爬去帖子,其中 tiezi 变量现在包含了10篇帖子,使用python2 tieba.py 下载10篇帖子全文,python2 tieba.py lastpage 仅爬去当天帖子
parse_backup.py 负责将帖子发布到风花站
syns_simple.sh 脚本调用前两个python程序并将图片同步
如何添加铁匠权限
~/bin/usercreate username 1/0
如何同步微信记录
首先使用itunes将手机备份,选择不加密,然后使用 楼月免费iTunes备份管理器.exe 工具将 微信聊天记录 - Documents - 000000目录后的一串32位的字母数字目录 - DB 目录选择并导出
将导出的DB目录压缩成zip文件,并上传到 ~/tieba 目录,解压zip文件
使用命令 python2 weixin-exporter.py 会将DB目录解析,并生成以当前时间为名字的目录,目录内为文本文件
将该目录压缩并导出,将文本文件整理并命名,名字会成为新发帖的目录(名字中不要包含符号 - , 可以使用下划线 _ )
将整理的txt文本放在文件夹(比如 QA.weixin.201007 ),并将该文件夹用7z存档为 tar 格式,上传到 ~/tieba目录并解压
修改 ~/src/syn/parse_backup.py 的行
postqa('/home/bbs/tieba/QA.weixin.201007', '0QAwechat')
该行语句将目录 QA.weixin.201007 下的文本发布到版面 0QAwechat
如何后台手动发帖
在 ~/src/syn 目录下有一个 push 文件,可以查看里面的示例内容为
/home/bbs/bin/postfile /tmp/postreal chuixuecao '大梦谁先觉?【吹血草的记录贴】' Tieba '2020-09-04 12:50:00' 400866 0 0
使用 postfile 工具,即可将 /tmp/postreal 文件内容以 chuixuecao 为用户、'大梦谁先觉?【吹血草的记录贴】'为发帖内容以指定的时间发帖追加到帖子 id 为 400866
也可以使用脚本 ~/src/syn/push.py 以批量形式发帖到指定版面
如何增加定时任务
使用命令 crontab -e 增加命令脚本
比如当前的计划任务
# for article backup, per 2h
0 */2 * * * rsync -av --delete /home/bbs/boards/ /home/bbs/boards.sync > /dev/null 2>&1 &
# for userid/board sync to disk
9 */2 * * * /home/bbs/bin/miscd flush > /dev/null 2>&1
# for search
*/20 * * * * /home/bbs/bin/btar > /dev/null 2>&1
25 */2 * * * /home/bbs/bin/genhot > /dev/null 2>&1
# top 100
30 */2 * * * /home/bbs/bin/btop 1 > /dev/null 2>&1
# for nginx log
10 */2 * * * /var/log/nginx/log_week.sh > /dev/null 2>&1
40 1 * * * /var/log/nginx/log_all.sh > /dev/null 2>&1
# for backup all data & program at night
40 1 * * * sudo rsync -av --delete --exclude=message-forum --exclude=bk --exclude=tmp.bk --exclude=boards.sync /home/bbs /home/bbs/bk > /dev/null 2>&1 &
# backup conf
50 1 * * * sudo rsync -av --delete /var/log/nginx/ /home/bbs/bk/var/log/nginx/ --exclude=nginxlogbk > /dev/null 2>&1 &
51 1 * * * sudo rsync -av --delete /etc/php5/ /home/bbs/bk/etc/php5/ > /dev/null 2>&1 &
52 1 * * * sudo rsync -av --delete /usr/conf/ /home/bbs/bk/etc/nginx/ > /dev/null 2>&1 &
# backup data only
40 2 * * * /home/bbs/sh/bk.sh > /tmp/1 2>&1
# auto update from baidu tieba
#13 5-22 * * * /home/bbs/src/syn/syns_simple.sh &
47 5-22 * * * /home/bbs/src/syn/syns_simple.sh &
#50 1 * * * /home/bbs/src/syn/syns.sh &
# kill for restart frpc
0 2 * * * killall -9 frpc &
# for score fluse
0 0 * * * /home/bbs/bin/flushscore &
# make nginx report
4 */1 * * * goaccess -f /var/log/nginx/access.log -o /home/bbs/src/nForum-2.0/www/pub/report_day.html &
# for ssh/web service
*/1 * * * * sh /home/bbs/src/frp/daemon.sh > /dev/null &
# for cache sync, per 2h
40 */2 * * * sudo rsync -av --delete /home/bbs/src/nForum-2.0/app/tmp/ /home/bbs/src/nForum-2.0/app/tmp.bk/ > /dev/null 2>&1 &
如何加精华
~/bin/setgood board groupid good[2-5]
比如 ~/bin/setgood Tieba 400866 4 即可将 帖子id为 400866 的 "大梦谁先觉?【吹血草的记录贴】"增加到精华帖,练功房版区
如何重置密码、修改用户名
后台使用非对称加密用户密码,非明文保存,用户忘记密码可以通过管理后台重置
telnet 127.0.0.1 输入 SYSOP 以及密码
按几次回车后到主菜单页面,按 A 键,进入系统管理功能表 - 按 I 键,进入修改用户数据,输入用户名比如 lili , 按B键修改密码,C键修改昵称,T键保存
然后按 ←键回到主菜单, G键退出即可
如何编辑帖子
比如如何编辑本篇帖子,在 ~/boards/notepad 目录搜索文字 "如何编辑帖子",然后使用vim工具编辑保存即可
cd ~/boards/notepad
grep "如何编辑帖子" . -r
vim M.1602132015.LA 修改保存
如何回退版面(涉及删除数据,操作需要小心)
版面文章数据通过上面的定时任务 /home/bbs/sh/bk.sh 在凌晨进行每日备份
备份的内容包括 ~/boards ~/home ~/.BOARDS ~/.PASSWDS
如果需要数据回滚,首先停止http服务器nginx
sudo service nginx stop
解压备份数据
cd /bk
tar Jxf boards.2020-10-08.tar.xz
删除当前版面数据、备份用户数据
rm ~/boards/* -fr
mv ~/home/ ~/home.bk
替换备份数据
cp /bk/home/bbs/boards/* ~/boards/ -a
mv home/bbs/home ~
重启nginx
sudo service nginx start
观察是否达到回退效果,如果正常,则删除备份数据
rm ~/home.bk -fr
后台如何编辑图片
首先在相应的版面比如 ~/boards/notepad 找到对应的帖子
使用命令 ~/bin/addimage ~/boards/notepad/M.1601510697.yr ~/0928.png 0 即可将图片 ~/0928.png 附加到对应的帖子
addimage 工具可以附加一个文件夹下所有图片,最后一个参数0/1指定第二个参数是否是目录
删除帖子附加图片只需要直接用vim打开帖子文件,删除图片保存即可(图片等附件是以8个0x00位开头)
第三部分、开发
帖子内容搜索的方法
由于有几十万篇发帖,如果每次搜索请求都搜索一次所有文件的话,那么性能是比较低的,所以我使用工具程序 btar 定时(每隔2小时)将帖子整理成一个文件 .ALL(boards目录下),并记录帖子对应的详细信息到 .ALL.index , 搜索请求时只需要在内存文件系统中搜索 .ALL 文件即可,搜索算法使用shift-or算法,比如铁吧的帖子有30Mb,搜索过程耗时小于0.1秒
关于web前端
前端代码使用php5,框架为yaf,修改代码无需编译,可以直接看到效果
常用的3个目录:
~/src/kbs_bbs/php
该目录文件为php扩展,响应php请求,向php传送帖子、版面、用户等信息, 该目录文件生成 libphpbbslib.so 会被php加载,如果有修改后需要编译、安装、重启php服务(cd ~/src/kbs_bbs && make install && sudo service php5-fpm restart)
~/src/nForum-2.0/lib/model 与php的c扩展(~/src/kbs_bbs/php)目录进行交互,获取底层数据
~/src/nForum-2.0/app/modules/Mobile/controllers 该目录封装调用上面的 model,
~/src/nForum-2.0/app/modules/Mobile/views 该目录文件直接对应 html