说明:Vmoex
是一个仿V2ex
的开源二次元向的社区程序,使用的php
框架symfony3.4
版本,支持markdown
,主要为动漫、二次元、番剧的(还有萌萌哒的(●´ω`●)φ
)爱好者打造。由于作者的安装教程对新手有点不是很友好,所以这里博主就发个详细的安装教程,有需求的可以搭建一个玩玩。
截图
功能
github
登录- 邮箱验证、用户信息编辑功能
- 多国语言支持
- 丰富的后台管理功能
- 用户发帖、回复(支持@其他人)
- 站内即时聊天、无刷新获取通知
- 支持
markdown
- 会员主页、关注他人、发送私信给他人
安装
Github地址:https://github.com/yeskn-studio/vmoex-framework
环境要求:PHP 5.6+
、Mysql
、Nginx
、Redis
、Composer
、Nodejs
、Fileinfo
拓展等。
关于环境一些提示:
#由于作者留的数据库文件只兼容Mysql 5.6+,所以你内存如果超过1G,建议直接安装Mysql 5.6+;要是内存低于1G只能安装Mysql 5.5也没事,博主会提供兼容5.5的数据库文件。
#如果在Dev模式下运行是不需要Nginx的,不过不适合我们使用,所以下面主要使用Nginx的Web运行该程序。
#推荐安装环境PHP 7.2+、Mysql 5.6+
1、安装宝塔
#Centos系统
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh
#Ubuntu系统
wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh && sudo bash install.sh
#Debian系统
wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh && bash install.sh
安装完成后,进入面板,点击左侧软件管理,然后安装PHP 5.6+
、Nginx
、Mysql
、Redis
。
2、相关配置
找到左侧软件管理-PHP
管理-设置-安装Fileinfo
扩展。
#如果Fileinfo拓展安装失败,就是内存太小,我们可以添加swap,不适用于ovz
1、脚本添加,脚本地址:https://www.moerats.com/archives/722/。
2、面板添加,找到左侧软件管理-系统工具-安装Linux工具箱,然后进入工具箱添加。
点击左侧软件管理-PHP
设置-禁用函数-删除proc_open
和proc_get_status
。
点击左侧数据库-添加数据库,设置好数据库名、密码。
点击左侧网站-添加站点,数据库不创建,使用上面创建的即可。
3、安装Composer
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
4、安装依赖
安装Nodejs
:
#Debian、Ubuntu系统
curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install -y nodejs git
#CentOS系统
curl -sL https://rpm.nodesource.com/setup_10.x | bash -
yum install nodejs -y git
安装Bower
:
npm install -g bower
安装uglifyjs
:
npm install -g uglify-js
安装Yarn
:
npm install -g yarn
5、配置源码
#进入站点文件夹,路径自行修改后再运行
cd /www/wwwroot/www.moerats.com
#下载源码
git clone https://github.com/yeskn-studio/vmoex-framework.git
#将源码文件移动到根目录,如果有提示,enter就行
mv vmoex-framework/{,.}* ./
#修改runtime目录权限
chown -R www:www var web/avatar web/upload app/Resources/translations
#修改配置文件,不会使用nano编辑器的,可以通过面板的文件管理进行操作
nano app/config/parameters.yml.dist
配置文件大致修改如下:
1、填入你的数据库名称,用户名和密码。
2、填入secret值,且secret必须是没有规则的一些字符,还是不会的,直接填数据库密码吧。
3、关于redis_dsn参数,这里是建议设置密码的,毕竟Redis有漏洞,如果你不会使用Redis的,直接修改为redis_dsn: 'redis://localhost'
4、修改socket_host参数,将127.0.0.1修改为你的服务器ip,不然会有小问题。
5、修改cdn地址,参数assets_base_url: https://www.moerats.com,如果你开启SSL,就使用https,反之http
6、其它配置可根据你的需求自行开启。
6、开始安装
调整数据库文件:
#如果你安装的是Mysql 5.5版本数据库,需要先替换下源码的数据库文件,使用命令:
wget https://www.moerats.com/usr/down/vmoex_sql -O var/data/vmoex.sql
#如果你是Mysql 5.6+,可以直接使用源码里的数据库文件。
然后开始安装,使用命令:
#安装php依赖,期间会提示配置,检查无误可一路回车
composer install
#安装前端依赖
yarn install
#导入数据
php bin/console doctrine:database:init
#载入翻译数据
php bin/console translation:persist
#修改管理员密码
php bin/console change-password -u admin -p [password]
#清理缓存
chown -R www:www var
php bin/console cache:clear --env=prod
#创建静态资源文件
php bin/console assetic:dump --env=prod
#启动websocket
php bin/push-service.php start -d
然后点击面板左侧安全,开放websocket
的3120
端口即可。
7、Nginx设置
点击左侧网站-站点设置,进行如下修改:
1、网站目录:取消防跨站攻击,运行目录设置/web
2、伪静态:添加以下代码。
if (!-e $request_filename) {
rewrite ^(.*)$ /?$1 last;
break;
}
3、默认文档:可以删除全部,然后添加app.php。
4、SSL等其他设置可自行修改
最后我们打开站点就可以看到一个萌萌哒的论坛了,历史帖子,评论什么的可以在后台自行删除。
配置文件
站点运行后,配置文件为app/config/parameters.yml
, 需修改配置时请修改此文件,修改完后,需要重新清理缓存或者生成静态资源文件。
最后如果我们重启服务器后,还需要先开启websocket
,使用命令:
#进入站点文件夹,路径自行修改后再运行
cd /www/wwwroot/www.moerats.com
#启动websocket
php bin/push-service.php start -d
你好最后。#启动websocket
php bin/push-service.php start -d
出现错误
Workerman[bin/push-service.php] start in DAEMON mode
0 /www/wwwroot/lolitaer.com/vendor/workerman/workerman/Worker.php(502): WorkermanWorker::daemonize()1 /www/wwwroot/lolitaer.com/bin/push-service.php(156): WorkermanWorker::runAll()2 {main}pcntl_fork() has been disabled for security reasons in file /www/wwwroot/lolitaer.com/vendor/workerman/workerman/Worker.php on line 1123
PHP Fatal error: Uncaught Exception: setsid fail in /www/wwwroot/lolitaer.com/vendor/workerman/workerman/Worker.php:1130
Stack trace:
thrown in /www/wwwroot/lolitaer.com/vendor/workerman/workerman/Worker.php on line 1130
Fatal error: Uncaught Exception: setsid fail in /www/wwwroot/lolitaer.com/vendor/workerman/workerman/Worker.php:1130
0 /www/wwwroot/lolitaer.com/vendor/workerman/workerman/Worker.php(502): WorkermanWorker::daemonize()1 /www/wwwroot/lolitaer.com/bin/push-service.php(156): WorkermanWorker::runAll()2 {main}Stack trace:
thrown in /www/wwwroot/lolitaer.com/vendor/workerman/workerman/Worker.php on line 1130
执行 php bin/console change-password -u admin -p [password] 时报错,大佬怎么解决?
https://ftp.bmp.ovh/imgs/2020/12/c4c5b310b4279e56.jpg
先执行一段代码php bin/console doctrine:schema:update --force
再执行上述相关代码即可解决。
执行 php bin/console change-password -u admin -p 123456 还是报错
好像是数据表问题,你用的默认的?还是我留的数据库文件
用默认的。一直报错
那不太清楚了,可以去问问作者https://github.com/yeskn-studio/vmoex-framework/issues
[root@VM-0-11-centos bbs.kurumit3.top]# php bin/console translation:persist
In AbstractConnection.php line 155:
AUTH failed: ERR AUTH <password> called without any password configured for the default user.
Are you sure your configuration is correct? [tcp://localhost:6379]
出现了以上报错
好像是redis的配置问题,有有没有配置密码啥的?
php www/wwwroot/**/bin/console doctrine:database:create
php /www/wwwroot/**/bin/console doctrine:database:init
php /www/wwwroot/**/bin/console translation:persist
php /www/wwwroot/**/bin/console change-password -u admin -p 123456
php /www/wwwroot/**/bin/console assetic:dump --env=prod
以上命令都提示报错,示例如下:
PHP Warning: require(/www/wwwroot//bin/../vendor/autoload.php): failed to open stream: No such file or directory in /www/wwwroot//bin/console on line 15
Warning: require(/www/wwwroot//bin/../vendor/autoload.php): failed to open stream: No such file or directory in /www/wwwroot//bin/console on line 15
PHP Fatal error: require(): Failed opening required '/www/wwwroot//bin/../vendor/autoload.php' (include_path='.:/www/server/php/73/lib/php') in /www/wwwroot//bin/console on line 15
Fatal error: require(): Failed opening required '/www/wwwroot//bin/../vendor/autoload.php' (include_path='.:/www/server/php/73/lib/php') in /www/wwwroot//bin/console on line 15
[root@VM_0_14_centos config]# php bin/console doctrine:database:init
Could not open input file: bin/console
请问出现这问题怎么办,百度出来的把bin换成app也不行
这个不知道还能不能用,你可以看下作者提供的文档:https://vmoex-docs.yeskn.com/#/install
到创建静态资源文件时提示.css文件不存在怎么办呢?跟这位老哥的情况一模一样https://github.com/yeskn-studio/vmoex-framework/issues/10
这个吗bootstrap.min.css?下载地址:https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css,哪里缺,就补到哪个文件夹
php bin/console assetic:dump --env=prod
这里提示:
21:20:31 ERROR [console] Error thrown while running command "assetic:dump --env=prod". Message: "An error occurred while running:n'/usr/bin/node' '/usr/bin/uglifyjs' '-o' '/tmp/assetic_uglifyjs2_outupWYFg' '/tmp/assetic_uglifyjs2_inXcw5vf'nnError Output:nParse error at /tmp/assetic_uglifyjs2_inXcw5vf:45,4n const self = window.YesknPlugins;n ^nERROR: Unexpected token: keyword «const»n at JS_Parse_Error.get (eval at <anonymous> (/usr/lib/node_modules/uglify-js/tools/node.js:18:1), <anonymous>:71:23)n at fatal (/usr/lib/node_modules/uglify-js/bin/uglifyjs:303:27)n at run (/usr/lib/node_modules/uglify-js/bin/uglifyjs:246:9)n at Object.<anonymous> (/usr/lib/node_modules/uglify-js/bin/uglifyjs:172:5)n at Module._compile (internal/modules/cjs/loader.js:778:30)n at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)n at Module.load (internal/modules/cjs/loader.js:653:32)n at tryModuleLoad (internal/modules/cjs/load
说什么情况呢
讲真的没有看明白怎么安装。如果可以发我份文档谢谢博主。
这里就是我之前的安装文档
能不能加你QQ知道下?908507670
有人出现过这个情况吗,内存总是提示溢出
看修改下PHP参数,能不能缓解下?
php bin/console assetic:dump --env=prod
红色代码报错
In FilterException.php line 40:
An error occurred while running:
'/usr/bin/node' '/usr/bin/uglifyjs' '-o' '/tmp/assetic_uglifyjs2_out1LoSmf' '/tmp/assetic_uglifyjs2_in
b3yDrA'
Error Output:
const self = window.YesknPlugins; ^Parse error at /tmp/assetic_uglifyjs2_inb3yDrA:45,4
ERROR: Unexpected token: keyword «const»
at JS_Parse_Error.get (eval at <anonymous> (/usr/lib/node_modules/uglify-js/tools/node.js:20:1), <anonymous>:71:23)
at fatal (/usr/lib/node_modules/uglify-js/bin/uglifyjs:296:27) at run (/usr/lib/node_modules/uglify-js/bin/uglifyjs:239:9) at Object.<anonymous> (/usr/lib/node_modules/uglify-js/bin/uglifyjs:167:5) at Module._compile (internal/modules/cjs/loader.js:701:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10) at Module.load (internal/modules/cjs/loader.js:600:32) at tryModuleLoad (internal/modules/cjs/loader.js:539:12) at Function.Module._load (internal/modules/cjs/loader.js:531:3) at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)Input:
var $modal = $('.modal'); $modal.on('show.bs.modal', function () { $('body').addClass("modal-open-noscroll"); }); $modal.on('hidden.bs.modal', function () { $('body').removeClass("modal-open-noscroll"); });$(function () {
});
$.fn.findName = function (name) {
return $(this).find('[name='+name+']');};
$.fn.nameVal = function (name) {
return $(this).findName(name).val();};
$.fn.onPjax = function(event, $target, callback) {
$(this).off(event, $target); $(this).on(event, $target, callback);};
$.extend({
round: function (value, precision) { if (precision === undefined) { precision = 2; } var times = Math.pow(10, precision); return Math.round(value * times) / times }});
/**
@param name 插件名称@param callback 插件加载完后执行的函数@param refresh 重复获取时执行的函数@returns {*}*/
window.YesknPlugins.get = function (name, callback, refresh) {
const self = window.YesknPlugins; if (self[name].initialized === true) { if (refresh) refresh(self[name].result); if (callback) self[name].result = callback(eval(self[name].identifier)); return self[name]; } const scripts = self[name].scripts; const links = self[name].links; for (const key in scripts) { let scriptElm = document.createElement('script'); if (scripts.hasOwnProperty(key)) { scriptElm.setAttribute('src', scripts[key]); document.getElementsByTagName('head')[0].insertBefore(scriptElm, null); } if (key * 1 === scripts.length - 1) { scriptElm.onload = function () { if (callback) self[name].result = callback(eval(self[name].identifier)); }; } } for (const key in links) { let linkElm = document.createElement('link'); if (links.hasOwnProperty(key)) { linkElm.setAttribute('href', links[key]); linkElm.setAttribute('rel', 'stylesheet'); document.getElementsByTagName('head')[0].insertBefore(linkElm, null); } } self[name].initialized = true; return self[name];};
网络原因 导致node-sass出错
npm install node-sass --sass-binary-site=https://npm.taobao.org/mirrors/node-sass/
你先暂时看下官方安装文档,https://vmoex-docs.yeskn.com/,有空我更新下该教程和一些细节问题
官方貌似更新了教程,请大佬更新
还有我在执行bower install --allow-root这一步时报错
bower ENOENT No bower.json present
我大概看了下,你这步是之前的安装前端依赖,现在改成了yarn install,其它应该变化不大
如果站点需要迁移,如何无损迁移?
整个根目录+数据库备份,大概就这几个,如果你想不影响论坛访问的话,先修改本地Hosts,在另一台迁移完成后,再改DNS解析,这样访客丝毫感觉不到论坛已经搬家了。