solo_Tomcat转docker并升级(问题好多!)

      之前solo一直老老实实地运行Tomcat上,上个月有功夫升级,从v3.6.1升级到v3.6.2但失败了,因没有时间之前也没来得及查找原因,最近想进行升级,又突然想试试用docker来运行,故开始折腾了……

一、Docker 安装(CentOS7)

      安装一些必要的系统工具:

1 sudo yum install -y yum-utils device-mapper-persistent-data lvm2

      添加软件源信息:

1 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

      更新 yum 缓存:

1 sudo yum makecache fast

      安装 Docker-ce:

1 sudo yum -y install docker-ce

      启动 Docker 后台服务

1 sudo systemctl start docker

      完成之后可以测试一下docker是否安装成功

二、停止运行Tomcat

      Tomcat路径下/bin目录下执行

1 ./shutdown.sh

      目前Tomcat端口号为8080

三、Docker部署solo

      按照官方文档来说,docker部署安装solo很简单。

1)获取最新镜像

1 docker pull b3log/solo

2)安装Mysql?

               原先已在docker容器外部进行了Mysql部署安装,现在只需要用即可

3)启动容器

      下面具体参数含义,详见官方文档

1 docker run --name solo \ 2 --network=host --env RUNTIME_DB="MYSQL" \ 3 --env JDBC_USERNAME="root" \ 4 --env JDBC_PASSWORD="XXX" \ 5 --env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \ 6 --env JDBC_URL="jdbc:mysql://localhost:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC" \ 7 b3log/solo --listen_port=8080 --server_scheme=https --server_host=aeneag.xyz --server_port=80

4)报错来了

1[INFO ]-[2019-07-16 15:55:15]-[org.b3log.solo.util.Markdowns:135]: [markdown-http] is not available, uses built-in [flexmark] for markdown processing. Please read FAQ section in user guide ([https://hacpai.com/article/1492881378588](https://hacpai.com/article/1492881378588)) for more details. 2[INFO ]-[2019-07-16 15:55:15]-[org.b3log.solo.SoloServletListener:99]: Solo is booting [ver=3.6.3, servletContainer=jetty/9.4.12.v20180830, os=Linux, isDocker=true, markdownHttpAvailable=false, pid=1, runtimeDatabase=MYSQL, runtimeMode=PRODUCTION, jdbc.username=root, jdbc.URL=jdbc:mysql://localhost:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC] 3[INFO ]-[2019-07-16 15:55:15]-[com.zaxxer.hikari.HikariDataSource:110]: HikariPool-1 - Starting... 4[INFO ]-[2019-07-16 15:55:16]-[com.zaxxer.hikari.HikariDataSource:123]: HikariPool-1 - Start completed. 5[INFO ]-[2019-07-16 15:55:16]-[org.b3log.solo.upgrade.V361_362:59]: Upgrading from version [3.6.1] to version [3.6.2].... 6[ERROR]-[2019-07-16 15:55:16]-[org.b3log.latke.repository.jdbc.JdbcRepository:261]: Update failed 7java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84 ' for column 'commentContent' at row 1 8at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) 9at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) 10at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) 11at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:955) 12at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:372) 13at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) 14at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) 15at org.b3log.latke.repository.jdbc.util.JdbcUtil.executeSql(JdbcUtil.java:91) 16at org.b3log.latke.repository.jdbc.JdbcRepository.update(JdbcRepository.java:259) 17at org.b3log.latke.repository.AbstractRepository.update(AbstractRepository.java:111) 18at org.b3log.solo.repository.CommentRepository.update(CommentRepository.java:93) 19at org.b3log.solo.repository.CommentRepository_$$_jvst36c_1a.*d31update(CommentRepository*$$*jvst36c_1a.java) 20at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 21at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 22at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 23at java.lang.reflect.Method.invoke(Method.java:498) 24at org.b3log.latke.ioc.JavassistMethodHandler.invoke(JavassistMethodHandler.java:116) 25at org.b3log.solo.repository.CommentRepository*$$*jvst36c_1a.update(CommentRepository*$$*jvst36c_1a.java) 26at org.b3log.solo.upgrade.V361_362.perform(V361_362.java:83) 27at org.b3log.solo.service.UpgradeService.upgrade(UpgradeService.java:85) 28at org.b3log.solo.service.UpgradeService*$$_jvst36c_a.*d8upgrade(UpgradeService*$$*jvst36c_a.java) 29at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 30at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 31at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 32at java.lang.reflect.Method.invoke(Method.java:498) 33at org.b3log.latke.ioc.JavassistMethodHandler.invoke(JavassistMethodHandler.java:116) 34at org.b3log.solo.service.UpgradeService*$$*jvst36c_a.upgrade(UpgradeService*$$*jvst36c_a.java) 35at org.b3log.solo.SoloServletListener.contextInitialized(SoloServletListener.java:111) 36at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:952) 37at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:558) 38at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:917) 39at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:370) 40at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1497) 41at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1459) 42at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:847) 43at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:287) 44at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545) 45at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 46at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138) 47at org.eclipse.jetty.server.Server.start(Server.java:416) 48at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:108) 49at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113) 50at org.eclipse.jetty.server.Server.doStart(Server.java:383) 51at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 52at org.b3log.solo.Starter.main(Starter.java:177) 53[ERROR]-[2019-07-16 15:55:16]-[org.b3log.solo.upgrade.V361_362:92]: Upgrade failed! 54org.b3log.latke.repository.RepositoryException: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84 ' for column 'commentContent' at row 1 55at org.b3log.latke.repository.jdbc.JdbcRepository.update(JdbcRepository.java:263) 56at org.b3log.latke.repository.AbstractRepository.update(AbstractRepository.java:111) 57at org.b3log.solo.repository.CommentRepository.update(CommentRepository.java:93) 58at org.b3log.solo.repository.CommentRepository*$$_jvst36c_1a.*d31update(CommentRepository*$$*jvst36c_1a.java) 59at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 60at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 61at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 62at java.lang.reflect.Method.invoke(Method.java:498) 63at org.b3log.latke.ioc.JavassistMethodHandler.invoke(JavassistMethodHandler.java:116) 64at org.b3log.solo.repository.CommentRepository*$$*jvst36c_1a.update(CommentRepository*$$*jvst36c_1a.java) 65at org.b3log.solo.upgrade.V361_362.perform(V361_362.java:83) 66at org.b3log.solo.service.UpgradeService.upgrade(UpgradeService.java:85) 67at org.b3log.solo.service.UpgradeService*$$_jvst36c_a.*d8upgrade(UpgradeService*$$*jvst36c_a.java) 68at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 69at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 70at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 71at java.lang.reflect.Method.invoke(Method.java:498) 72at org.b3log.latke.ioc.JavassistMethodHandler.invoke(JavassistMethodHandler.java:116) 73at org.b3log.solo.service.UpgradeService*$$*jvst36c_a.upgrade(UpgradeService*$$*jvst36c_a.java) 74at org.b3log.solo.SoloServletListener.contextInitialized(SoloServletListener.java:111) 75at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:952) 76at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:558) 77at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:917) 78at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:370) 79at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1497) 80at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1459) 81at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:847) 82at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:287) 83at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545) 84at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 85at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138) 86at org.eclipse.jetty.server.Server.start(Server.java:416) 87at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:108) 88at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113) 89at org.eclipse.jetty.server.Server.doStart(Server.java:383) 90at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 91at org.b3log.solo.Starter.main(Starter.java:177) 92Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84 ' for column 'commentContent' at row 1 93at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) 94at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) 95at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) 96at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:955) 97at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:372) 98at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) 99at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) 100at org.b3log.latke.repository.jdbc.util.JdbcUtil.executeSql(JdbcUtil.java:91) 101at org.b3log.latke.repository.jdbc.JdbcRepository.update(JdbcRepository.java:259) 102... 36 more 103[ERROR]-[2019-07-16 15:55:16]-[org.b3log.solo.service.UpgradeService:95]: Upgrade failed, please contact the Solo developers or reports this issue: [https://github.com/b3log/solo/issues/new](https://github.com/b3log/solo/issues/new) 104java.lang.Exception: Upgrade failed from version [3.6.1] to version [3.6.2] 105at org.b3log.solo.upgrade.V361_362.perform(V361_362.java:94) 106at org.b3log.solo.service.UpgradeService.upgrade(UpgradeService.java:85) 107at org.b3log.solo.service.UpgradeService*$$_jvst36c_a.*d8upgrade(UpgradeService*$$*jvst36c_a.java) 108at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 109at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 110at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 111at java.lang.reflect.Method.invoke(Method.java:498) 112at org.b3log.latke.ioc.JavassistMethodHandler.invoke(JavassistMethodHandler.java:116) 113at org.b3log.solo.service.UpgradeService*$$*jvst36c_a.upgrade(UpgradeService*$$_jvst36c_a.java) 114at org.b3log.solo.SoloServletListener.contextInitialized(SoloServletListener.java:111) 115at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:952) 116at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:558) 117at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:917) 118at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:370) 119at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1497) 120at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1459) 121at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:847) 122at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:287) 123at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545) 124at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 125at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138) 126at org.eclipse.jetty.server.Server.start(Server.java:416) 127at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:108) 128at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113) 129at org.eclipse.jetty.server.Server.doStart(Server.java:383) 130at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 131at org.b3log.solo.Starter.main(Starter.java:177) 132

5)解决报错

      读报错内容,你会发现commentContent这个地方有错,在github上发现有一个同样的错误,并和D哥交流,得知是数据库中有些表的字段字符集和排序规则不对,可能是之前升级没进行修复。
      b3_solo_comment表中的commentContent 字段,b3_solo_article表中的articleAbstract、articleContent、articleAbstractText 这三个字段,字符集改为 utf8mb4,排序规则用 utf8mb4_general_ci。
      这样该错误就会解决,同时想到了之前Tomcat上solo v3.6.1升级v3.6.2失败的原因,应该也是这个问题,之前Tomcat上升级造成的后果便是Tomcat直接运行失败,报jar包的错,也懒的管,直接退回v3.6.1

6)执行第3步,启动容器

      执行第三步之前,请把之前的solo删除,再执行第3步

1 docker rm solo

      这样容器启动成功,输入网址即可(之前Nginx配置8080,又docker设置8080,故无需更改输入网址即可打开solo)

7)皮肤配置

      下面这条命令可以在第3步的命令中加上,使用docker挂载目录命令,一定要弄明白前后的路径代表什么含义,前面代表寄宿机的路径,后面代表容器虚拟路径。因先入为主的原因一直认为后面代表寄宿机路径,搞了好久…… 这样就可以改皮肤了

1 --volume /opt/solo/skins/:/opt/solo/skins/

四、启动Tomcat

      因Tomcat上有另一个小项目,Tomcat仍需运行

1)删除solo项目

      Tomcatwebapps目录下的solo-v3.6.1项目文件

2)修改配置

      修改Tomcat配置文件,修改conf目录下server.xml文件,更改Tomcat端口号,8080-->8888,删除配置solo的节点,修改完毕

3)启动Tomcat

1 ./startup.sh //bin目录下

五、修改Nginx配置

      修改主要目的是Tomcat和docker同时都可以用域名访问
      Nginx原先配置如下:

1 upstream myblog{ 2 server localhost:8080; 3 } 4 server { 5 listen 80; 6 server_name aeneag.xyz www.aeneag.xyz; 7 rewrite ^/(.*)$ https://aeneag.xyz/$1 permanent; 8 } 9 server { 10 listen 443 ssl; 11 server_name aeneag.xyz www.aeneag.xyz; 12 root html; 13 index index.html index.htm; 14 ssl_certificate ../cert/aeneag.xyz.pem; 15 ssl_certificate_key ../cert/aeneag.xyz.key; 16 ssl_session_timeout 5m; 17 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; 18 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 19 ssl_prefer_server_ciphers on; 20 location / { 21 root html; 22 index index.html index.htm; 23 proxy_pass http://myblog$request_uri; 24 proxy_set_header Host $host:$server_port; 25 proxy_set_header X-Real-IP $remote_addr; 26 client_max_body_size 10m; 27 } 28 }

      现在修改为:

1 upstream myblog{ 2 server localhost:8080; 3 } 4 upstream myperson{ 5 server localhost:8888; 6 } 7 server { 8 listen 80; 9 server_name aeneag.xyz; 10 rewrite ^/(.*)$ https://aeneag.xyz/$1 permanent; 11 } 12 server { 13 listen 80; 14 server_name www.aeneag.xyz; 15 rewrite ^/(.*)$ https://www.aeneag.xyz/$1 permanent; 16 } 17 server { 18 listen 443 ssl; 19 server_name aeneag.xyz; 20 root html; 21 index index.html index.htm; 22 ssl_certificate ../cert/aeneag.xyz.pem; 23 ssl_certificate_key ../cert/aeneag.xyz.key; 24 ssl_session_timeout 5m; 25 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; 26 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 27 ssl_prefer_server_ciphers on; 28 location / { 29 root html; 30 index index.html index.htm; 31 proxy_pass http://myblog$request_uri; 32 proxy_set_header Host $host:$server_port; 33 proxy_set_header X-Real-IP $remote_addr; 34 client_max_body_size 10m; 35 } 36 } 37 server { 38 listen 443 ssl; 39 server_name www.aeneag.xyz; 40 root html; 41 index index.html index.htm; 42 ssl_certificate ../cert/aeneag.xyz.pem; 43 ssl_certificate_key ../cert/aeneag.xyz.key; 44 ssl_session_timeout 5m; 45 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; 46 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 47 ssl_prefer_server_ciphers on; 48 location / { 49 root html; 50 index index.html index.htm; 51 proxy_pass http://myperson$request_uri; 52 proxy_set_header Host $host:$server_port; 53 proxy_set_header X-Real-IP $remote_addr; 54 client_max_body_size 10m; 55 } 56 }

六、尾

      至此,soloTomcat转Docker并升级,还能同时运行已全部完成,花的不少时间,最耗时的就是解决错误,太费时间了 😰

今天你努力了吗
    评论
    0 评论
avatar

取消