Rat's

一个仿V2EX的开源二次元论坛程序:Vmoex安装教程
说明:Vmoex是一个仿V2ex的开源二次元向的社区程序,使用的php框架symfony3.4版本,支持markd...
扫描右侧二维码阅读全文
12
2018/12

一个仿V2EX的开源二次元论坛程序:Vmoex安装教程

说明:Vmoex是一个仿V2ex的开源二次元向的社区程序,使用的php框架symfony3.4版本,支持markdown,主要为动漫、二次元、番剧的(还有萌萌哒的(●´ω`●)φ)爱好者打造。由于作者的安装教程对新手有点不是很友好,所以这里博主就发个详细的安装教程,有需求的可以搭建一个玩玩。

截图

请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述

功能

  • github登录
  • 邮箱验证、用户信息编辑功能
  • 多国语言支持
  • 丰富的后台管理功能
  • 用户发帖、回复(支持@其他人)
  • 站内即时聊天、无刷新获取通知
  • 支持markdown
  • 会员主页、关注他人、发送私信给他人

安装

Github地址:https://github.com/yeskn-studio/vmoex-framework

环境要求:PHP 5.6+MysqlNginxRedisComposerNodejsFileinfo拓展等。

关于环境一些提示:
#由于作者留的数据库文件只兼容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+NginxMysqlRedis

2、相关配置
找到左侧软件管理-PHP管理-设置-安装Fileinfo扩展。

#如果Fileinfo拓展安装失败,就是内存太小,我们可以添加swap,不适用于ovz
1、脚本添加,脚本地址:https://www.moerats.com/archives/722/。
2、面板添加,找到左侧软件管理-系统工具-安装Linux工具箱,然后进入工具箱添加。

点击左侧软件管理-PHP设置-禁用函数-删除proc_openproc_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

然后点击面板左侧安全,开放websocket3120端口即可。

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
Vultr注册就送$50,可开日本/新加坡等机房,【点击注册】。
最后修改:2019 年 05 月 02 日 09 : 37 PM

发表评论

45 条评论

  1. haig233

    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:
    Parse error at /tmp/assetic_uglifyjs2_inb3yDrA:45,4

    const self = window.YesknPlugins; ^

    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:
    $(function () {

    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"); });

    });

    $.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];

    };

    1. Rat's
      @haig233

      你先暂时看下官方安装文档,https://vmoex-docs.yeskn.com/,有空我更新下该教程和一些细节问题

  2. haig233

    官方貌似更新了教程,请大佬更新
    还有我在执行bower install --allow-root这一步时报错
    bower ENOENT No bower.json present

    1. Rat's
      @haig233

      我大概看了下,你这步是之前的安装前端依赖,现在改成了yarn install,其它应该变化不大

      1. haig233
        @Rat's

        如果站点需要迁移,如何无损迁移?

        1. Rat's
          @haig233

          整个根目录+数据库备份,大概就这几个,如果你想不影响论坛访问的话,先修改本地Hosts,在另一台迁移完成后,再改DNS解析,这样访客丝毫感觉不到论坛已经搬家了。

  3. sky

    安装bower 报错npm WARN deprecated bower@1.8.8: We don't recommend using Bower for new projects. Please consider Yarn and Webpack or Parcel. You can read how to migrate legacy project here: https://bower.io/blog/2017/how-to-migrate-away-from-bower/
    /usr/bin/bower -> /usr/lib/node_modules/bower/bin/bower

    bower@1.8.81 package in 1.773s
    1. Rat's
      @sky

      这个不叫报错,只是警告而已,warn非error

  4. wangji

    请问我装好后删除里面的文章和用户提示错误要怎么解决?An exception occurred while executing 'DELETE FROM post WHERE id = ?' with params [12961]: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (bbs.comment, CONSTRAINT FK_9474526C4B89032C FOREIGN KEY (post_id) REFERENCES post (id))

    1. Liuker
      @wangji

      删除文章需要先删除评论。。。删除用户需要先删除用户的所有评论,还有chat等

    2. Rat's
      @wangji

      这个是外键约束,你百度下删除外键约束,或者等作者修复,已经告诉他了。

  5. Jobove

    大佬啊…… The source file "/www/wwwroot/bbs.jobove.xyz/app/../web/assets/lib/bootstrap/dist/css/bootstrap.min.css" does not exist.
    怎么办

    1. Rat's
      @Jobove

      这个不是很清楚,没遇到过。看错误是缺个css,能不能在指定的那个目录补一下

      1. Jobove
        @Rat's

        那个路径甚至不存在,就很迷

        1. Rat's
          @Jobove

          是不是没执行bower install这个命令

          1. 苍穹
            @Rat's

            这个目录没有 只有一个 webassetslibbootoastcss

            1. Rat's
              @苍穹

              可以去https://github.com/yeskn-studio/vmoex-framework/issues提下问题,作者回复很快

  6. SaQ

    了解了一下,看板娘是额外的...博主大大有时间的话能否出一个和Live2D有关的教程呢

    1. Rat's
      @SaQ

      这个现在都是插件显示了,所以没必要出

  7. SaQ

    大佬,看板娘不显示哎

    1. Rat's
      @SaQ

      看板娘多刷新下看看,一般是可以显示的

  8. bensoner

    为什么我安装完之后,浏览器打开链接,一直停在显示vmoex的界面,完了啥都没有呢?

    1. Rat's
      @bensoner

      配置文件里的cdn地址对不?

      1. bensoner
        @Rat's

        cdn那,我填http://www.xxx.com(我的网址),后面8000端口去掉了,是不是有问题?

        1. Rat's
          @bensoner

          那有可能是创建静态文件那步没做,php bin/console assetic:dump --env=prod,是否这样?

          1. bensoner
            @Rat's

            嗯嗯,是这步的问题,谢谢了啊

  9. Relaxe

    我今天按照文章教程安装了一遍,结果报错https://i.loli.net/2018/12/18/5c185bb4badc0.png

    1. Rat's
      @Relaxe

      貌似是php内存问题,你去软件管理那里,找到php,点击设置 ,调整memory_limit参数数值大点看看。然后重启php

      1. Relaxe
        @Rat's

        出现"500 Internal Server Error"了

        1. Rat's
          @Relaxe

          刚看了下,数据库有变动,已经更新我提供的数据库表了,你重新用我给的命令替换表,再使用php bin/console doctrine:database:init和php bin/console translation:persist重新导入数据库和载入翻译。

        2. Rat's
          @Relaxe

          这个貌似是数据库问题,我先看看。

          1. Relaxe
            @Rat's

            谢谢你,论坛装好了。但是许多地方打开后是404 Not Found

            1. Rat's
              @Relaxe

              伪静态规则加了没?

              1. Relaxe
                @Rat's

                没,好了,请问 接下来怎么进后台呢

                1. Rat's
                  @Relaxe

                  前台可以进,路径是/admin。

                  1. Relaxe
                    @Rat's

                    额 /admin以后 403 Forbidden

                    1. Rat's
                      @Relaxe

                      你重新导入数据库,之前作者把真管理员分配到了另一个用户,不是admin。所以会导致后台没权限。

  10. Relaxe

    这款论坛程序就是布局太紧凑了,希望作者能够改成v2ex那种宽一点d布局

    1. Rat's
      @Relaxe

      太宽的话,看板娘估计要挡住很多了。

  11. 海平面

    博主真的是无处不在

    1. Rat's
      @海平面

      后面差个水么。

      1. 海平面
        @Rat's

        不不不

  12. lexo

    这个不错哎,就是搭建有点麻烦

    1. Rat's
      @lexo

      还好吧,这个坑已经填好了,照着做就行了。

  13. xiaojingteng

    博主你更新是真的勤快,服气!!!收藏了!!!