跳到主要内容
铁匠铺
lili6507a书摘与小说
返回历史档案
书摘与小说

从零开始搭建风花站

历史档案 · 保留原帖文字 · 35 条回复

风花站搭建 第一部分、安装 安装ubuntu12.04系统 安装一些必要的包 同步帖子 修改Host、验证 第二部分、维护 几个常用目录介绍 如何同步贴吧帖子 如何添加铁匠权限 如何同步微信记录 如何后台手动发帖 如何增加定时任务 如何加精华 如何重置密码、修改用户名 如何后台编辑帖子 如何回退版面 如何后台编辑图片 第三部分、开发 帖子内容搜索的方法 关于web前端 php调试 关于@检测 关于两个楼层间插贴 如何增加工具程序并编译
风花站是基于水木的 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

登录后分享你的想法