## 开发环境安装教程 #### 安装maven 这里略过,请自行百度,maven的settings.xml 中的中央仓库地址建议修改为国内仓库地址,如阿里云的,这样有利于项目编译和打包速度 ``` alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central ``` #### 安装git 这里略过,请自行百度 #### 安装 idea 开发工具 社区版和收费版都可以, 百度自行下载安装 #### 下载代码 选择项目保存文件夹如 C:\Users\Administrator\Documents\project\hc 目录下,执行 ``` git clone https://github.com/java110/MicroCommunity.git ``` 或者 备份版本代码,主要是下载速度比较快 ``` git clone https://gitee.com/wuxw7/MicroCommunity.git ``` #### 编译代码 进入MicroCommunity目录下执行命令 ``` mvn clean install ``` 和 ``` mvn clean package ``` #### idea 打开代码 用maven的方式打开项目,在idea的设置中修改第一步安装的maven地址和settings.xml地址,点击OK,然后在idea的右上侧点击Maven选项, 点击Reimport All Maven Projects,重新导入maven依赖jar包 #### 安装mysql 推荐安装 5.6 版本mysql ,安装过程请自行百度,将 docs\db文件下的 TT 和 hc_community 文件导入到mysql中,有可能这个sql不是最新的, 你也可以加入群827669685,群文件获取最新的sql文件 #### 安装kafka 请自行百度安装 #### 安装 zookeeper 请自行百度安装 #### 安装Redis 请自行百度安装 #### 修改hosts kafka zookeeper Redis mysql 开源中间件 则将对应域名改为对应IP ``` 这里写mysql的IP dev.db.java110.com 这里写zookeeper的IP dev.zk.java110.com 这里写kafka的IP dev.kafka.java110.com 这里写redis的IP dev.redis.java110.com 127.0.0.1 api.java110.com 127.0.0.1 dev.java110.com ``` #### 启动相应服务 需要启动的服务有 service-eureka、service-api、service-order、service-community、 service-store、service-user、service-front、service-fee、service-common和service-job 找到服务下 src目录下 main/java/com/java110/您的服务名/XXApplicationStart.java 类打开 点击运行main方法就可以启动 注意:由于service-order 启动需要刷缓存所以比起其他服务 需要传 -Dcache 参数才可以, 具体参考地址 https://blog.csdn.net/u013713294/article/details/53020293 ## 生产环境安装教程 链接:https://pan.baidu.com/s/1sIPrxnwipF6ey_8k4rncWA 提取码:2e47 获取安装脚本 如果下载不下来,请加群827669685在群文件中【HC系统部署文档】中获取hcAutoInstall.tar 自动部署shell脚本部署 tar -xvf hcAutoInstall.tar 修改env.sh 中的相应IP和密码 sh install.sh ## 网友抒写安装部署(前后端分离) ### 一、 部署说明 1、 软硬件配置 硬件:云服务器最低配置4核16G 软件:需要安装 mysql + kafka + zookeeper + redis,docker可选 开源代码说明: HC小区后端代码 https://gitee.com/wuxw7/MicroCommunity HC小区前段代码 https://gitee.com/java110/MicrCommunityWeb HC智慧家庭(业主版) https://gitee.com/java110/WechatOwnerService HC掌上物业(物业版) https://gitee.com/java110/PropertyApp 分支说明(branch): 分支管理说明,master 为前后端未分离代码,back 为前后端分离后端代码 2、 新建账号 添加hc、 mysql、 redis、 zk 、kafka 用户 # 应用账户,安装docker,运行jar包 sudo adduser hc # 数据库 sudo adduser mysql sudo adduser redis sudo adduser zk sudo adduser kafka 修改密码 passwd hc 密码应符合大小写英文字母+特殊符号+数字,最短8位较好 Changing password for user hc. New password: 如 Yao@5937。 3、接下来赋予sudo权限,输入命令 sudo visudo 此命令意思是vim /etc/sudoers,但是会有sudo的校验,所以推荐上面的用法。 在文件中,找到下面这段,在root下添加上面添加的5个用户 ## Allow root to run any commands anywhere root ALL=(ALL) ALL 添加完后,如下 ## Allow root to run any commands anywhere root ALL=(ALL) ALL hc ALL=(ALL) ALL mysql ALL=(ALL) ALL redis ALL=(ALL) ALL zk ALL=(ALL) ALL kafka ALL=(ALL) ALL :wq 保存退出。 ### 二、 安装docker 1、切换hc用户,登录服务器 2、安装docker sudo yum install docker -y 查看docker版本 docker version > 疑问: > > 看docker的安装文章都是用yum install docker-ce 安装的,是因为ce是免费版。 但是当前时间2020/03/19,这个命令已经无法安装。 > > 那用 yum install docker -y 命令是安装的 CE 还是 EE 版本? 我的版本 [root@hostone /]# docker version Client: Version: 1.13.1 API version: 1.26 Package version: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 有句奇怪的话,问你docker咋没运行?别急,启动下 sudo systemctl start docker #启动docker sudo systemctl enable docker #开机启动docker sudo systemctl status docker #查看docker状态 再用docker version 看下 [root@hostone /]# docker version Client: Version: 1.13.1 API version: 1.26 Package version: docker-1.13.1-109.gitcccb291.el7.centos.x86_64 Go version: go1.10.3 Git commit: cccb291/1.13.1 Built: Tue Mar 3 17:21:24 2020 OS/Arch: linux/amd64 Server: Version: 1.13.1 API version: 1.26 (minimum version 1.12) Package version: docker-1.13.1-109.gitcccb291.el7.centos.x86_64 Go version: go1.10.3 Git commit: cccb291/1.13.1 Built: Tue Mar 3 17:21:24 2020 OS/Arch: linux/amd64 Experimental: false ok,很简单地安装完成了。 最后,创建docker用户组,赋权给hc用户 sudo groupadd docker sudo usermod -aG docker hc 切换到hc账户,查看docker状态 sudo docker ps 然后需要安装一个docker-comose,来启动,停止和重启应用 sudo yum install docker-compose docker启动、停止命令 # 启动 sudo systemctl start docker # 守护进程重启 sudo systemctl daemon-reload # 重启docker服务 sudo systemctl restart docker # 重启docker服务 sudo service docker restart # 关闭docker sudo systemctl stop docker ### 三、安装mysql 1、新开个mysql连接窗口,切换到mysql 用户。 2、下载安装mysql # 下载5.7 安装包 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm # 配置安装依赖 sudo yum localinstall -y mysql57-community-release-el7-8.noarch.rpm # 安装数据库 sudo yum install -y mysql-community-server # 数据库启动 sudo systemctl start mysqld # 查看数据库状态 systemctl status mysqld # 数据库启动 sudo systemctl enable mysqld 3、安装启动完成,查看密码 # 密码在mysql日志中 grep 'pass' /var/log/mysqld.log [mysql@iZ2zebthf35ejlps5v87ksZ ~]$ grep 'pass' /var/log/mysqld.log 2020-03-14T12:28:57.051218Z 1 [Note] A temporary password is generated for root@localhost: 8Gd 8Gd 就是我的初始密码了。 4、连接mysql # 连接mysql, 默认端口3306 mysql -u root -p 输入密码8Gd,进入mysql命令行,修改root密码 SET PASSWORD = PASSWORD('Db@369012'); mysql> SET PASSWORD = PASSWORD('Db@369012'); Query OK, 0 rows affected, 1 warning (0.00 sec) 5、创建hc用户,赋权 create user 'TT'@'%' identified by 'TT@HCvvMM33'; create user 'hc_community'@'%' identified by 'hc_community@HCvvMM33'; flush privileges; CREATE DATABASE `TT` ; grant all privileges on `TT`.* to 'TT'@'%' ; CREATE DATABASE `hc_community` ; grant all privileges on `hc_community`.* to 'hc_community'@'%' ; flush privileges; 6、启动配置 如果是5.7版本的mysql,导入时可能报错,需要修改my.cnf sudo vim /etc/my.cnf 修改内容如下,在[mysqld]下添加 # 导入大SQL文件 max_allowed_packet=900M # 解决5.6的SQL在5.7的执行错误 ERROR 1067 (42000) Invalid default value for 'end_time' sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 修改完后,重启mysql sudo systemctl restart mysqld systemctl status mysqld 7、导入最新的sql文件 连接TT用户,导入前后端分离版的SQL,文件名 > 分离版2020.3.18.sql 连接hc_community,导入SQL文件 > hc_community20200220.sql 四、安装java 1、切回hc用户登陆服务器 su - hc 2、上传java至/home/hc # 创建java文件夹 sudo mkdir –p /usr/local/java # 解压至/usr/local/java sudo tar zxvf jdk-8u131-linux-x64.tar.gz -C /usr/local/java 3、配置java环境 打开系统配置文件 sudo vim /etc/profile 在文件最后添加内容如下: export JAVA_HOME=/usr/local/java/jdk1.8.0_131 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 记得刷新变量环境 # 刷新变量环境 source /etc/profile 查看是否生效 [hc@iZ2zebthf35ejlps5v87ksZ java]$ echo $JAVA_HOME /usr/local/java/jdk1.8.0_131 五、安装redis 1、切换为redis用户,上传源码包至/home/redis # 查看当前路径 [redis@iZ2zebthf35ejlps5v87ksZ ~]$ pwd /home/redis # 查看当前路径下文件 [redis@iZ2zebthf35ejlps5v87ksZ ~]$ ll total 1684 -rw-rw-r-- 1 redis redis 1723533 Mar 14 21:03 redis-4.0.6.tar.gz 2、解压 tar zxvf redis-4.0.6.tar.gz 文件解压后,有个文件夹redis-4.0.6,如下: [redis@iZ2zebthf35ejlps5v87ksZ ~]$ ll total 1688 drwxrwxr-x 6 redis redis 4096 Dec 5 2017 redis-4.0.6 -rw-rw-r-- 1 redis redis 1723533 Mar 14 21:03 redis-4.0.6.tar.gz 3、编译安装 cd redis-4.0.6 sudo make prefix=/home/redis/redis-4.0.6 install 如果不用sudo,安装失败,信息如下 Hint: It's a good idea to run 'make test' ;) INSTALL install install: cannot create regular file ‘/usr/local/bin/redis-server’: Permission denied make[1]: *** [install] Error 1 make[1]: Leaving directory `/home/redis/redis-4.0.6/src' make: *** [install] Error 2 成功安装 make[1]: Entering directory `/home/redis/redis-4.0.6/src' CC Makefile.dep make[1]: Leaving directory `/home/redis/redis-4.0.6/src' make[1]: Entering directory `/home/redis/redis-4.0.6/src' Hint: It's a good idea to run 'make test' ;) INSTALL install INSTALL install INSTALL install INSTALL install INSTALL install make[1]: Leaving directory `/home/redis/redis-4.0.6/src' 4、redis配置修改 备份reids.conf cp redis.conf redis.conf_hc # 修改redis配置 vim redis.conf 修改内容如下 # 任何机器都可以访问,生产环境需改成特点ip访问 bind 0.0.0.0 # 密码 requirepass hc8866 # 守护进程 daemonize yes :wq 保存退出。 5、启动redis ./src/redis-server ./redis.conf 启动信息如下 [redis@iZ2zebthf35ejlps5v87ksZ redis-4.0.6]$ ./src/redis-server ./redis.conf 9490:C 14 Mar 22:45:12.384 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 9490:C 14 Mar 22:45:12.384 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=9490, just started 9490:C 14 Mar 22:45:12.384 # Configuration loaded 6、客户端连接redis ./src/redis-cli -p 6379 -a hc8866 连接成功内容如下 [redis@izbp117mtgmllet9ryobawz redis-4.0.6]$ ./src/redis-cli -p 6379 -a hc8866 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379> 推荐使用rdm等客户端工具查看redis数据。 六、安装zookeeper 1、切换为zk用户,上传源码包至/home/zk 2、解压 tar zxvf zookeeper-3.4.6.tar.gz 3、进入zk目录 cd zookeeper-3.4.6 4、准备启动conf cp ./conf/zoo_sample.cfg ./conf/zoo.cfg 5、启动zk ./bin/zkServer.sh start 启动信息如下 [zk@iZ2zebthf35ejlps5v87ksZ zookeeper-3.4.6]$ ./bin/zkServer.sh start JMX enabled by default Using config: /home/zk/zookeeper-3.4.6/bin/../conf/zoo.cfg Starting zookeeper ... STARTED 七、部署项目 1、切回应用账户hc,安装git sudo yum install git -y 2、安装maven sudo yum install maven -y 3、修改maven源为阿里源 sudo vim /usr/share/maven/conf/settings.xml 在mirrors标签下添加如下内容 alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central 4、下载代码 mkdir hcProject cd hcProject git clone https://gitee.com/wuxw7/MicroCommunity.git 5、编译代码 cd /home/hc/hcProject/MicroCommunity mvn clean install 6、修改redis配置 打开hcConf项目下所有 application-dev.yml,修改redis账号密码 端口没有修改则不用更换 7、替换ip 打开所有docker-compose.yml,如hcConf\Api\docker\docker-compose.yml > 这里推荐在windows下用nodePad++的文件查找替换功能,在目录下批量替换 > 如果喜欢在Linux修改的话,可以用sed 批量替换 将如下内容中的ip替换为对应的服务器ip extra_hosts: - "dev.java110.com:192.168.100.29" - "dev.db.java110.com:192.168.100.29" - "dev.zk.java110.com:192.168.100.29" - "dev.kafka.java110.com:192.168.100.29" - "dev.redis.java110.com:192.168.100.29" - "api.java110.com:192.168.100.29" 8、上传bin 和 hcConf 至目录/home/hc/hcProject 下 八、后端docker服务启动 1、下载修改后的yaoHcConf文件,解压后得到bin、hcConf目录,上传至hcProject 2、启动reset_all.sh 相比群里的原文件,增加了FrontService与eureka的服务。 > 吴老大说没必要每次都重启eureka服务,想想对于初次接触HC项目的小白们(比如我)来说,还是比价有难度的,所以把eureka加进去了,省事。 cd /home/hc/hcProject/bin chmod +x *.sh sudo ./reset_all.sh 3、docker 常用命令 启动后查看服务是否启动成功 # 查看所有正在运行容器 sudo docker ps # containerId 是容器的ID sudo docker stop containerId # 查看所有容器 sudo docker ps -a # 查看所有容器ID sudo docker ps -a -q # stop停止所有容器 sudo docker stop $(sudo docker ps -a -q) sudo docker stop $(sudo docker ps -aq) # remove删除所有容器 sudo docker rm $(sudo docker ps -a -q) # 删除所有镜像 sudo docker rmi $(sudo docker images -q) # 进入某个容器查看 sudo docker exec -i -t [containerId] /bin/bash # 示例 sudo docker exec -it [76ae97d878eb] /bin/bash 4、异常处理 * 1) network 异常 异常: > ERROR: Network java110-net declared as external, but could not be found. Please create the network manually using `docker network create java110-net` and try again. 解决方法: docker network create java110-net * 2)特殊字符问题 docker中容器未启动成功 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6632de00214f docker_frontserivce "/root/start_front..." 30 minutes ago Restarting (1) 2 minutes ago frontserivce-1 使用docker logs 查看日志 sudo docker logs -f --tail=100 76ae97d878eb 报错如下 standard_init_linux.go:178: exec user process caused "no such file or directory" 先停止了这个服务,然后去服务下(/home/hc/hcProject/app/FrontService)看看是什么问题,怀疑是启动脚本问题 sudo docker-compose -f /home/hc/hcProject/app/FrontService/docker/docker-compose.yml down; 发现是frontserivce的docker下的onStart.sh、start_front.sh脚本中出现了^M字符,使用dos2unix工具转换下。 cd /home/hc/hcProject/app/FrontService/docker sudo yum install dos2unix sudo dos2unix onStart.sh sudo dos2unix ./bin/start_front.sh 启动这个服务 sudo docker-compose -f /home/hc/hcProject/app/FrontService/docker/docker-compose.yml up -d --build --force-recreate; 如果没有down掉服务,也可使用重启命令 sudo docker-compose -f /home/hc/hcProject/app/FrontService/docker/docker-compose.yml restart; 在使用restart的脚本重启后发现又出现报错了,突然想到是源头脚本出了问题,restart的脚本又copy了一次hcConf下文件。 看了下果然如此,重新去除下特殊字符^M vi -b /home/hc/hcProject/hcConf/FrontService/docker/onStart.sh sudo dos2unix /home/hc/hcProject/hcConf/FrontService/docker/*.sh cd /home/hc/hcProject/bin sudo ./restart_all.sh * 3) yml 格式问题 启动之后又发现问题 2020-03-19 18:29:24.945 ERROR 8 --- [ main] o.s.boot.SpringApplication : Application run failed java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application-dev.yml' …… could not find expected ':' in 'reader', line 15, column 1: eureka: ^ at org.yaml.snakeyaml.scanner.ScannerImpl.stalePossibleSimpleKeys(ScannerImpl.java:466) 明显提示第15行的yml文件报错,查看了下,报错原文如下 password:hc8866 是因为password第冒号后没有空一格输入密码。 * 4) hosts问题 命运多舛,又出了问题 DiscoveryClient_FRONT-SERVICE/172.19.0.3:8012: registering service... 这次的问题是因为docker-compose.yml, 因为新版的前后端分离版本升级第关系,群文件的hcConf里没有FrontService,我从MicroCommunity拷贝了一个过去,但是没有启用extra_hosts,还是用第net_works导致。原文件片段如下: version: '2' services: frontserivce: container_name: frontserivce-1 build: context: . dockerfile: Dockerfile restart: always ports: - "8020:8020" volumes: - ../target/FrontService.jar:/root/target/FrontService.jar networks: - java110-net # mem_limit: 1024m # extra_hosts: # - "dev.java110.com:192.168.1.18" # - "dev.db.java110.com:192.168.1.18" # - "dev.zk.java110.com:192.168.1.18" # - "dev.kafka.java110.com:192.168.1.18" # - "dev.redis.java110.com:192.168.1.18" # - "api.java110.com:92.168.1.18" networks: java110-net: external: true 修改后如下 version: '2' services: frontserivce: container_name: frontserivce-1 build: context: . dockerfile: Dockerfile restart: always ports: - "8020:8020" volumes: - ../target/FrontService.jar:/root/target/FrontService.jar mem_limit: 1536m extra_hosts: - "dev.java110.com:47.96.141.41" - "dev.db.java110.com:47.96.141.41" - "dev.zk.java110.com:47.96.141.41" - "dev.kafka.java110.com:47.96.141.41" - "dev.redis.java110.com:47.96.141.41" - "api.java110.com:47.96.141.41" 47.96.141.41为docker服务器宿主机地址。 * 5) docker启动脚本问题 发现docker的8012端口启动了,但是其实真正的服务没有启动,log也没有报错,停留在 2020-03-20 14:22:55.501 INFO 1317 --- [ost-startStop-1] c.netflix.config.DynamicPropertyFactory : DynamicPropertyFactory is initialized with configuration sources: com.netflix.config.ConcurrentCompositeConfiguration@616da524 进入docker内部的bash看看 sudo docker exec -it frontserivce-1 /bin/bash 进入bash后,查看进程 ps -aux 发现并没有java -jar进程,在docker容器内手动启动下试试 java -jar -Dspring.profiles.active=dev -Xms512m -Xmx1024m target/FrontService.jar 竟然启动起来了,启动后内容如下 root@9018e70e1220:~# ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 21108 1508 ? Ss 14:28 0:00 /bin/bash /root/start_front.sh dev root 8 0.0 0.0 7456 632 ? S 14:28 0:00 tail -100f front.log root 38 0.0 0.0 21324 2148 ? Ss 14:36 0:00 /bin/bash root 66 9.4 4.5 4757012 733244 ? Sl+ 14:41 1:14 java -jar -Dspring.profiles.active=dev -Xms512m -Xmx1024m target/FrontService.jar 估计还是启动脚本有问题,需要回头排查下。 八、前端服务部署 1、down下来前端项目 git clone https://gitee.com/java110/MicrCommunityWeb.git 2、安装nodeJs环境 3、打开项目,修改app.js app.use('/callComponent',proxy('http://后端服务ip:8012',opts)); 修改ip端口为FrontService的服务端口 4、启动 与app.js统计目录下,输入命令编译启动 npm install npm start 打开ip:3000端口,查看前端页面 端口可以修改,在项目的 bin/www 文件中 var port = normalizePort(process.env.PORT || '3000'); ## 简单才是美网友贡献安装 #### 1. 安装 Java ``` # cd /opt # wget https://mirrors.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz # tar zxfv jdk-8u202-linux-x64.tar.gz # mkdir –p /usr/local/java # mv /opt/jdk1.8.0_202 /usr/local/java/1.8.0_202 # vim /etc/profile export JAVA_HOME=/usr/local/java/1.8.0_202 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH # source /etc/profile # java -version java version "1.8.0_202" Java(TM) SE Runtime Environment (build 1.8.0_202-b08) Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode) ``` #### 2. 安装 Maven ``` # cd /opt # wget https://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz # tar zxfv apache-maven-3.6.3-bin.tar.gz # mkdir –p /usr/local/maven # mv apache-maven-3.6.3 /usr/local/maven/3.6.3 # vim /etc/profile export MAVEN_HOME=/usr/local/maven/3.6.3 export PATH=$MAVEN_HOME/bin:$PATH # source /etc/profile # mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: /usr/local/maven/3.6.3 Java version: 1.8.0_202, vendor: Oracle Corporation, runtime: /usr/local/java/1.8.0_202/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-1127.el7.x86_64", arch: "amd64", family: "unix" ``` 配置镜像 ``` # vim /usr/local/maven/3.6.3/conf/settings.xml nexus-aliyun central Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public ``` #### 3. 安装 ZooKeeper ``` # cd /opt # wget https://downloads.apache.org/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz # tar zxfv zookeeper-3.4.14.tar.gz # mkdir -p /usr/local/zookeeper # mv zookeeper-3.4.14 /usr/local/zookeeper/3.4.14 ``` **注意**:3.5.x 依赖 Java 9 添加用户和目录 ``` # useradd -r -s /sbin/nologin zookeeper # mkdir -p /data/zookeeper # chown -R zookeeper:zookeeper /data/zookeeper # mkdir -p /etc/zookeeper # cp /usr/local/zookeeper/3.4.14/conf/zoo_sample.cfg /etc/zookeeper/zoo.cfg ``` 修改 /etc/zookeeper/zoo.cfg ``` # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/data/zookeeper ``` 配置环境变量 ``` # echo 'export PATH=/usr/local/zookeeper/3.4.14/bin:$PATH' >> /etc/profile # source /etc/profile ``` 配置 systemd ``` # vim /usr/lib/systemd/system/zookeeper.service [Unit] Description=ZooKeeper Server Documentation=https://zookeeper.apache.org/ After=network.target [Service] Type=forking User=zookeeper Group=zookeeper Environment=JAVA_HOME=/usr/local/java/1.8.0_202 Environment=ZOO_LOG_DIR=/data/zookeeper/logs Environment=ZOO_LOG4J_PROP=INFO,CONSOLE ExecStart=/usr/local/zookeeper/3.4.14/bin/zkServer.sh start /etc/zookeeper/zoo.cfg ExecStop=/usr/local/zookeeper/3.4.14/bin/zkServer.sh stop /etc/zookeeper/zoo.cfg KillMode=none PIDFile=/data/zookeeper/zookeeper_server.pid [Install] WantedBy=multi-user.target ``` **注意**: Environment=JAVA_HOME=jdk-install-dir 启动服务器 ``` # systemctl daemon-reload # systemctl start zookeeper # systemctl enable zookeeper ``` #### 4. 安装 Redis ``` # cd /opt # wget http://download.redis.io/releases/redis-4.0.14.tar.gz # tar xzf redis-4.0.14.tar.gz # cd redis-4.0.14 # make -j4 && make install # ll /usr/local/bin/redis* -rwxr-xr-x. 1 root root 2452112 May 2 21:40 /usr/local/bin/redis-benchmark -rwxr-xr-x. 1 root root 5777688 May 2 21:40 /usr/local/bin/redis-check-aof -rwxr-xr-x. 1 root root 5777688 May 2 21:40 /usr/local/bin/redis-check-rdb -rwxr-xr-x. 1 root root 2618136 May 2 21:40 /usr/local/bin/redis-cli lrwxrwxrwx. 1 root root 12 May 2 21:40 /usr/local/bin/redis-sentinel -> redis-server -rwxr-xr-x. 1 root root 5777688 May 2 21:40 /usr/local/bin/redis-server ``` 添加用户和目录 ``` # useradd -r -s /sbin/nologin redis # mkdir -p /data/redis # chown -R redis:redis /data/redis # mkdir -p /etc/redis # cp redis.conf /etc/redis/ ``` 修改 redis.conf ``` # vim /etc/redis/redis.conf # If you run Redis from upstart or systemd, Redis can interact with your # supervision tree. Options: # supervised no - no supervision interaction # supervised upstart - signal upstart by putting Redis into SIGSTOP mode # supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET # supervised auto - detect upstart or systemd method based on # UPSTART_JOB or NOTIFY_SOCKET environment variables # Note: these supervision methods only signal "process is ready." # They do not enable continuous liveness pings back to your supervisor. supervised systemd # The working directory. # # The DB will be written inside this directory, with the filename specified # above using the 'dbfilename' configuration directive. # # The Append Only File will also be created inside this directory. # # Note that you must specify a directory here, not a file name. dir /data/redis # By default, if no "bind" configuration directive is specified, Redis listens # for connections from all the network interfaces available on the server. # It is possible to listen to just one or multiple selected interfaces using # the "bind" configuration directive, followed by one or more IP addresses. # # Examples: # # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 # # ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the # internet, binding to all the interfaces is dangerous and will expose the # instance to everybody on the internet. So by default we uncomment the # following bind directive, that will force Redis to listen only into # the IPv4 lookback interface address (this means Redis will be able to # accept connections only from clients running into the same computer it # is running). # # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES # JUST COMMENT THE FOLLOWING LINE. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bind 127.0.0.1 # Optional. Such as: 0.0.0.0. # Require clients to issue AUTH before processing any other # commands. This might be useful in environments in which you do not trust # others with access to the host running redis-server. # # This should stay commented out for backward compatibility and because most # people do not need auth (e.g. they run their own servers). # # Warning: since Redis is pretty fast an outside user can try up to # 150k passwords per second against a good box. This means that you should # use a very strong password otherwise it will be very easy to break. # # requirepass password # Optional. ``` 配置 systemd ``` # vim /usr/lib/systemd/system/redis.service [Unit] Description=Redis Server Documentation=https://redis.io/ After=network.target [Service] Type=simple User=redis Group=redis ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli shutdown [Install] WantedBy=multi-user.target ``` 启动服务器 ``` # systemctl daemon-reload # systemctl start redis # systemctl enable redis ``` #### 5. 安装 Docker ``` # yum install -y yum-utils device-mapper-persistent-data lvm2 # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # yum install -y docker # groupadd docker # systemctl start docker # systemctl enable docker # docker run hello-world ``` 安装 docker-compose ``` # curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-compose # docker-compose --version docker-compose version 1.25.5, build 8a1c60f6 ``` #### 6. 安装 MySQL ``` # cd /opt # wget https://nchc.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz # wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.30.tar.gz # tar zxfv boost_1_59_0.tar.gz # tar zxfv mysql-5.7.30.tar.gz # yum install -y autoconf automake m4 libtool make cmake bison gcc openssl-devel ncurses-devel # cmake \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/opt/boost_1_59_0 \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/data/mysql/data \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DEXTRA_CHARSETS=all # make -j4 && make install ``` 添加用户和目录 ``` # useradd -r -s /sbin/nologin mysql # mkdir -p /data/mysql # chown mysql:mysql /data/mysql ``` 修改 my.cnf ``` # vim /etc/my.cnf - 关闭自动注释 :set fo-=r - 关闭自动缩进 :set noautoindent - 粘贴下面内容 # ~ # FROM: https://gist.github.com/fevangelou/fb72f36bbe333e059b66.js # # Optimized my.cnf configuration for MySQL/MariaSQL (on Ubuntu, CentOS etc. servers) # # by Fotis Evangelou, developer of Engintron (engintron.com) # # ~ Updated January 2020 ~ # # # The settings provided below are a starting point for a 2GB - 4GB RAM server with 2-4 CPU cores. # If you have different resources available you should adjust accordingly to save CPU, RAM & disk I/O usage. # # The settings marked with a specific comment or the word "UPD" (after the value) # should be adjusted for your system by using database diagnostics tools like: # # https://github.com/major/MySQLTuner-perl # or # https://github.com/RootService/tuning-primer (supports MySQL up to v5.7) # ~ [mysql] port = 3306 socket = /var/run/mysqld/mysqld.sock [mysqld] # Required Settings basedir = /usr/local/mysql bind_address = 0.0.0.0 # Change to 127.0.0.0 to allow local connections only datadir = /data/mysql max_allowed_packet = 256M max_connect_errors = 1000000 pid_file = /var/run/mysqld/mysqld.pid port = 3306 skip_external_locking skip_name_resolve socket = /var/run/mysqld/mysqld.sock # Enable for b/c with databases created in older MySQL/MariaDB versions (e.g. when using null dates) #sql_mode = ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES tmpdir = /tmp user = mysql # InnoDB Settings default_storage_engine = InnoDB innodb_buffer_pool_instances = 2 # Use 1 instance per 1GB of InnoDB pool size innodb_buffer_pool_size = 2G # Use up to 70-80% of RAM innodb_file_per_table = 1 innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_buffer_size = 16M innodb_log_file_size = 512M innodb_stats_on_metadata = 0 #innodb_temp_data_file_path = ibtmp1:64M:autoextend:max:20G # Control the maximum size for the ibtmp1 file #innodb_thread_concurrency = 4 # Optional: Set to the number of CPUs on your system (minus 1 or 2) to better # contain CPU usage. E.g. if your system has 8 CPUs, try 6 or 7 and check # the overall load produced by MySQL/MariaDB. innodb_read_io_threads = 64 innodb_write_io_threads = 64 # MyISAM Settings query_cache_limit = 4M # UPD - Option supported by MariaDB & up to MySQL 5.7, remove this line on MySQL 8.x query_cache_size = 64M # UPD - Option supported by MariaDB & up to MySQL 5.7, remove this line on MySQL 8.x query_cache_type = 1 # Option supported by MariaDB & up to MySQL 5.7, remove this line on MySQL 8.x key_buffer_size = 32M # UPD low_priority_updates = 1 concurrent_insert = 2 # Connection Settings max_connections = 100 # UPD back_log = 512 thread_cache_size = 100 thread_stack = 192K interactive_timeout = 180 wait_timeout = 180 # For MySQL 5.7+ only (disabled by default) #max_execution_time = 30000 # Set a timeout limit for SELECT statements (value in milliseconds). # This option may be useful to address aggressive crawling on large sites, # but it can also cause issues (e.g. with backups). So use with extreme caution and test! # More info at: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_execution_time # For MariaDB 10.1.1+ only (disabled by default) #max_statement_time = 30 # The equivalent of "max_execution_time" in MySQL 5.7+ (set above) # The variable is of type double, thus you can use subsecond timeout. # For example you can use value 0.01 for 10 milliseconds timeout. # More info at: https://mariadb.com/kb/en/aborting-statements/ # Buffer Settings join_buffer_size = 4M # UPD read_buffer_size = 3M # UPD read_rnd_buffer_size = 4M # UPD sort_buffer_size = 4M # UPD # Table Settings # In systemd managed systems like Ubuntu 16.04+ or CentOS 7+, you need to perform an extra action for table_open_cache & open_files_limit # to be overriden (also see comment next to open_files_limit). # E.g. for MySQL 5.7, please check: https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html # and for MariaDB check: https://mariadb.com/kb/en/library/systemd/ table_definition_cache = 40000 # UPD table_open_cache = 40000 # UPD open_files_limit = 60000 # UPD - This can be 2x to 3x the table_open_cache value or match the system's # open files limit usually set in /etc/sysctl.conf or /etc/security/limits.conf # In systemd managed systems this limit must also be set in: # /etc/systemd/system/mysqld.service.d/override.conf (for MySQL 5.7+) and # /etc/systemd/system/mariadb.service.d/override.conf (for MariaDB) max_heap_table_size = 128M tmp_table_size = 128M # Search Settings ft_min_word_len = 3 # Minimum length of words to be indexed for search results # Logging log_error = /data/mysql/mysql_error.log log_queries_not_using_indexes = 1 long_query_time = 5 slow_query_log = 1 # Disabled for production slow_query_log_file = /data/mysql/mysql_slow.log [mysqldump] # Variable reference # For MySQL 5.7: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html # For MariaDB: https://mariadb.com/kb/en/library/mysqldump/ quick quote_names max_allowed_packet = 64M ``` 配置环境变量 ``` # echo 'PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile # source /etc/profile ``` 初始化数据库 ``` # /usr/local/mysql/bin/mysqld --initialize --user=mysql ``` 获取初始密码 ``` # cat /data/mysql/mysql_error.log | grep root@localhost ``` 启动服务器 ``` # cp /opt/mysql-5.7.30/support-files/mysql.server /usr/local/bin/ # chmod ugo+x /usr/local/bin/mysql.server # mkdir -p /var/run/mysqld # chown -R mysql:mysql /var/run/mysqld # mysql.server start ``` 登陆服务器 ``` # mysql -uroot -p'NT!gwh.%c21N' ``` 修改 root 密码 ``` mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; ``` 创建数据库 ``` mysql> CREATE DATABASE `TT` CHARACTER SET `utf8` COLLATE `utf8_general_ci`; mysql> CREATE DATABASE `hc_community` CHARACTER SET `utf8` COLLATE `utf8_general_ci`; ``` 创建用户 ``` mysql> CREATE USER 'TT'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; mysql> GRANT ALL PRIVILEGES ON `TT`.* TO 'TT'@'%'; mysql> CREATE USER 'hc_community'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; mysql> GRANT ALL PRIVILEGES ON `hc_community`.* TO 'hc_community'@'%'; mysql> FLUSH PRIVILEGES; ``` 配置 systemd ``` # vim /usr/lib/systemd/system/mysql.service [Unit] Description=MySQL Server Documentation=https://www.mysql.com/ After=network.target [Service] Type=forking ExecStartPre=/usr/bin/mkdir -p /var/run/mysqld ExecStartPre=/usr/bin/chown -R mysql:mysql /var/run/mysqld ExecStart=/usr/local/bin/mysql.server start ExecReload=/usr/local/bin/mysql.server reload ExecStop=/usr/local/bin/mysql.server stop [Install] WantedBy=multi-user.target ``` 启动服务器 ``` # systemctl daemon-reload # systemctl start mysql # systemctl enable mysql ``` #### 7. 安装 HC 后端 导入数据库 ``` # mysql -uTT -ppassword mysql> use TT; mysql> source /opt/TT(分离版)20200420.sql; ``` ``` # mysql -uhc_communit -ppassword mysql> use hc_community; mysql> source /opt/hc_community(分离版)20200420.sql; ``` 安装环境 ``` # useradd hc # usermod -aG docker hc # mkdir /data/hc # chown -R hc:hc /data/hc # su hc $ cd /data/hc $ git clone https://gitee.com/wuxw7/MicroCommunity.git ``` 修改配置 ``` # vim /etc/hosts 192.168.0.114 dev.java110.com 192.168.0.114 dev.db.java110.com 192.168.0.114 dev.zk.java110.com 192.168.0.114 dev.kafka.java110.com 192.168.0.114 dev.redis.java110.com 192.168.0.114 api.java110.com ``` 备份配置 * 使用下面脚本备份配置文件 ``` $ cd /data/hc/MicroCommunity $ vim backup_config.sh #!/bin/sh mkdir -p ../MicroCommunity-config sourceDirs=(Api/docker \ CodeService/src/main/resources \ CommentService/src/main/resources \ CommonService/docker \ CommonService/src/main/resources \ CommunityService/docker \ CommunityService/src/main/resources \ FeeService/docker \ FeeService/src/main/resources \ FrontService/docker \ HardwareAdapationService/docker \ HardwareAdapationService/src/main/resources \ JobService/src/main/resources \ LogService/src/main/resources \ OrderService/docker \ OrderService/src/main/resources \ ReportService/docker \ ReportService/src/main/resources \ StoreService/docker \ StoreService/src/main/resources \ UserService/docker \ UserService/src/main/resources \ eureka/docker) targetPrefix="../MicroCommunity-config" targetDirs=(Api/ \ CodeService/src/main/ \ CommentService/src/main/ \ CommonService/ \ CommonService/src/main/ \ CommunityService/ \ CommunityService/src/main/ \ FeeService/ \ FeeService/src/main/ \ FrontService/ \ HardwareAdapationService/ \ HardwareAdapationService/src/main/ \ JobService/src/main/ \ LogService/src/main/ \ OrderService/ \ OrderService/src/main/ \ ReportService/ \ ReportService/src/main/ \ StoreService/ \ StoreService/src/main/ \ UserService/ \ UserService/src/main/ \ eureka/) sz=${#targetDirs[@]} for ((i=0; i<$sz; i+=1)) do echo "copy" ${sourceDirs[i]} "to" $targetPrefix/${targetDirs[i]} mkdir -p $targetPrefix/${targetDirs[i]} cp -R ${sourceDirs[i]} $targetPrefix/${targetDirs[i]} done ``` ``` $ sh backup_config.sh $ tree /data/hc/MicroCommunity-config ├── Api │   └── docker │   ├── docker-compose.yml ├── CodeService │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml ├── CommentService │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml ├── CommonService │   ├── docker │   │   ├── docker-compose.yml │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml ├── CommunityService │   ├── docker │   │   ├── docker-compose.yml │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml ├── eureka │   └── docker │   ├── docker-compose.yml ├── FeeService │   ├── docker │   │   ├── docker-compose.yml │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml ├── FrontService │   ├── docker │   │   ├── docker-compose.yml │   └── src │   └── main │   └── resources │   ├── application-dev.yml ├── HardwareAdapationService │   ├── docker │   │   ├── docker-compose.yml │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml ├── JobService │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml ├── LogService │   └── src │   └── main │   └── resources │   ├── application-dev.yml ├── OrderService │   ├── docker │   │   ├── docker-compose.yml │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml ├── ReportService │   ├── docker │   │   ├── docker-compose.yml │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml ├── StoreService │   ├── docker │   │   ├── docker-compose.yml │   └── src │   └── main │   └── resources │   ├── application-dev.yml │   ├── dataSource.yml └── UserService ├── docker │   ├── docker-compose.yml └── src └── main └── resources ├── application-dev.yml ├── dataSource.yml ``` 修改配置 * 按下面方式修改上面的所有配置文件 ``` $ vim OrderService/docker/docker-compose.yml - 替换本机地址 :%s/114/本机地址/g version: '2' services: centerservice: container_name: orderservice-1 build: context: . dockerfile: Dockerfile restart: always ports: - "8001:8001" volumes: - ../target/OrderService.jar:/root/target/OrderService.jar extra_hosts: - "dev.java110.com:192.168.0.114" - "dev.db.java110.com:192.168.0.114" - "dev.zk.java110.com:192.168.0.114" - "dev.kafka.java110.com:192.168.0.114" - "dev.redis.java110.com:192.168.0.114" - "api.java110.com:192.168.0.114" ``` ``` $ vim OrderService/src/main/resources/dataSource.yml - 替换 MySQL 用户和密码 dataSources: ds0: !!com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://dev.db.java110.com:3306/hc_community?useUnicode=true&characterEncoding=utf-8&useSSL=false username: mysql_username password: mysql_password ds1: !!com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://dev.db.java110.com:3306/TT?useUnicode=true&characterEncoding=utf-8&useSSL=false username: mysql_username password: mysql_username ``` ``` $ vim OrderService/src/main/resources/application-dev.yml - 替换 MySQL 用户和密码 - 替换 Redis 密码 spring: redis: password: redis_password datasource: url: jdbc:mysql://dev.db.java110.com:3306/TT?useUnicode=true&characterEncoding=utf-8&useSSL=false password: mysql_password username: mysql_username ``` 恢复配置 * 使用下面脚本恢复配置文件 ``` $ cd /data/hc/MicroCommunity $ vim restore_config.sh #!/bin/sh outputPrefix="../MicroCommunity-config" configDirs="Api \ CodeService \ CommentService \ CommonService \ CommunityService \ FeeService \ FrontService \ HardwareAdapationService \ JobService \ LogService \ OrderService \ ReportService \ StoreService \ UserService \ eureka" for configDir in $configDirs do echo "copy" $outputPrefix/$configDir "to" $configDir cp -R $outputPrefix/$configDir . done ``` ``` $ sh restore_config.sh ``` 配置脚本 ``` $ cd /data/hc/MicroCommunity ``` ``` $ vim rebuild_services.sh #!/bin/sh mvn clean install -Dmaven.test.skip=true args="up --build --no-start --force-recreate" services="eureka Api OrderService CommunityService CommonService StoreService UserService FrontService FeeService" for service in $services do docker-compose -f $service/docker/docker-compose.yml $args done ``` ``` $ vim restart_containers.sh #!/bin/sh sh reaction_containers.sh restart ``` ``` $ vim stop_containers.sh #!/bin/sh sh reaction_containers.sh stop ``` ``` $ vim down_containers.sh #!/bin/sh sh reaction_containers.sh down ``` ``` $ vim reaction_containers.sh #!/bin/sh args=$1 services="eureka Api OrderService CommunityService StoreService UserService FrontService FeeService" case "$args" in "restart") ;; "stop") ;; "down") ;; *) echo "Usage: sh reaction_containers.sh restart/stop/down" exit ;; esac for service in $services do sh reaction_container.sh $service $args done docker ps ``` ``` $ vim reaction_container.sh #!/bin/sh service=$1 args=$2 if [ "$service" == "" ] || [ "$args" == "" ] then echo "Usage: sh reaction_container.sh service restart/stop/down" exit fi docker-compose -f $service/docker/docker-compose.yml $args ``` 构建镜像 ``` $ sh rebuild_services.sh ``` 启动容器 ``` # 启动所有容器 $ sh restart_containers.sh # 启动单个容器 $ sh reaction_container.sh Api restart ``` 停止容器 ``` # 停止所有容器 $ sh stop_containers.sh # 停止单个容器 $ sh reaction_container.sh Api stop ``` 卸载容器 ``` # 卸载所有容器 $ sh down_containers.sh # 卸载单个容器 $ sh reaction_container.sh Api down ``` #### 8. 安装 HC 前端 安装环境 ``` # curl -sL https://rpm.nodesource.com/setup_10.x | bash - # yum install –y nodejs # su hc $ cd /data/hc $ git clone https://gitee.com/java110/MicroCommunityWeb.git ``` 启动前端 ``` $ cd /data/hc/MicroCommunityWeb $ npm install $ npm start ```