项目说明
后端:Spring Boot、Gradle
前端:Angular
数据库:MySQL、ElasticSearch
环境配置
Docker安装
运行sudo docker
检查服务器是否已经安装了Docker,若已经安装,则跳过该步骤
安装Docker依赖仓库
更新 apt 包索
sudo apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库:
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
添加 Docker 的官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
使用以下指令设置稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
安装 Docker Engine Community Edition
更新 apt 包索引。
sudo apt-get update
安装最新版本的 Docker Engine-Community 和 containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io
测试 Docker 是否安装成功,输入以下指令,打印出以下信息则安装成功:
sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
将用户加入Docker组
假设用户名为dcg
sudo usermod -aG docker dcg
为Docker添加国内镜像仓库
修改Docker 配置文件
sudo vi /etc/docker/daemon.json
修改为如下内容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
修改后按ESC
键,再输入:wq
,再按Enter
键保存并退出
之后最好重启一下
sudo servcie restart docker
在Docker中安装MySQL
拉取MySQL 镜像
docker pull mysql:8
创建MySQL容器
为MySQL选一个文件存放位置(可自定义位置)
mkdir -p ~/docker-mount/mysql
cd ~/docker-mount/mysql
创建容器,假设Root用户密码为Root123456
docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Root123456 -d mysql:8
创建MySQL配置文件:
cd conf
vi my.cnf
编写配置文件内容:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-name-resolve
default_authentication_plugin=mysql_native_password
# Custom config should go here
!includedir /etc/mysql/conf.d/
之后按ESC
键,再输入:wq
,再按Enter
键保存并退出
重启容器
docker restart mysql
为项目配置MySQL
进入MySQL Docker环境
docker exec -it mysql bash
进入MySQL
mysql -uroot -p #然后输入root的密码
添加项目所需的数据库
create database technology;
修改root账户,让其可以远程链接mysql
(以密码为Root123456
为例)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root123456' WITH GRANT OPTION;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root123456';
添加项目所需的账号
- 用户名
sciinfo
- 密码
science777Info
CREATE USER sciinfo
@%
IDENTIFIED BY 'science777Info'; GRANT ALL ON technology.* TO sciinfo
@%
WITH GRANT OPTION; FLUSH PRIVILEGES;
退出环境
exit;
exit
在Docker中安装ElasticSearch
拉取ElasticSearch镜像
docker pull elasticsearch:5.6
创建ElasticSearch容器
为ElasticSearch选一个文件存放位置(可自定义位置)
mkdir -p ~/docker-mount/es-5.6
cd ~/docker-mount/es-5.6
创建ElasticSearch配置文件:
cd conf
vi conf.yml
编写配置文件内容:
(假设本机地址为192.168.1.179
,且仅有一台ES实例)
cluster.name: "sciinfo-es"
node.name: 192.168.1.179
node.master: true
node.data: true
http.cors.enabled: true
http.cors.allow-origin: "*"
network.bind_host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
# 设置master所在机器的ip
network.publish_host: 192.168.1.179
# 广播地址
discovery.zen.ping.unicast.hosts: ["192.168.1.179"]
修改后按ESC
键,再输入:wq
,再按Enter
键保存并退出
调高虚拟内存大小,使ElasticSearch可运行
sudo sysctl -w vm.max_map_count=262144
同时,将上述虚拟内存设置加入系统配置,以便系统重启后依然有效
sudo vi /etc/sysctl.conf
在/etc/sysctl.conf
文件尾部添加如下配置
vm.max_map_count=262144
修改后按ESC
键,再输入:wq
,再按Enter
键保存并退出
最后,创建容器
docker run -d --name es-5.6 -p 9200:9200 -p 9300:9300 -v $PWD/conf/conf.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v $PWD/data:/usr/share/elasticsearch/data -v $PWD/logs/:/usr/share/elasticsearch/logs elasticsearch:5.6
输入一下命令验证ES是否启动
curl localhost:9200
若得到类似以下结果,则表示ElasticSearch启动成功
{
"name" : "192.168.1.179",
"cluster_name" : "sciinfo-es",
"cluster_uuid" : "mQJ5BL0DSGG7rIyUuWHs1g",
"version" : {
"number" : "5.6.16",
"build_hash" : "3a740d1",
"build_date" : "2019-03-13T15:33:36.565Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
若ES启动失败,则用以下命令检查日志,排查错误
docker logs es-5.6
安装中文分词插件
使用elasticsearch-analysis-ik分词插件
进入ElasticSearch容器
docker exec -it es-5.6 bash
安装分词插件
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.16/elasticsearch-analysis-ik-5.6.16.zip
安装JDK
使用以下命令检查服务器是否已经安装了JDK 8
java -version
JDK版本最好与项目使用的JDK版本匹配(JDK 8)
用以下命令安装JDK8
sudo apt install openjdk-8-jdk
安装Gradle(可选)
输入以下命令检查服务器是否已经安装了Gradle
gradle -v
使用以下命令下载Gradle
cd ~ # 切换到下载目录
wget https://services.gradle.org/distributions/gradle-4.10.2-all.zip
解压Gradle压缩包
sudo apt install unzip
sudo mkdir /opt/gradle
sudo unzip -d /opt/gradle gradle-4.10.2-all.zip
将Gradle加入系统环境变量
sudo vi /etc/profile
按i
键进入插入模式
在文件尾部添加如下内容
export PATH=$PATH:/opt/gradle/gradle-4.10.2/bin
修改后按ESC
键,再输入:wq
,再按Enter
键保存并退出
输入一下命令使修改的环境变量立即生效
source /etc/profile
查看gradle是否安装成功
gradle -v
数据迁移
将测试环境中的数据导入生产环境
数据导出
MySQL数据导出
在原MySQL容器所在机器上操作
输入以下命令将数据导出为technology.sql
文件
docker exec 容器名称 /usr/bin/mysqldump -u MySQL用户名 --password=MySQL密码 technology > technology.sql
ElasticSearch数据导出
需要使用elasticsearch-dump工具
首先安装npm包管理工具
sudo apt install npm
检查是否安装成功
npm -v
安装elasticsearch-dump
sudo npm install elasticdump -g
检查elasticsearch-dump是否安装成功
elasticdump
输出类似如下内容
Thu, 21 Nov 2019 11:41:37 GMT | Error Emitted => {"errors":["input
is a required input","output
is a required input"]}
使用如下命令导出ES数据到本地文件
假设:
- 数据源所在ElasticSearch服务器地址为:
192.168.1.127:9200
- 输出文件路径为
/home/dcg/sciinfo-es-backup.json
elasticdump --input=http://192.168.1.127:9200 --output=/home/dcg/sciinfo-es-backup.json --limit 10000
数据导入
MySQL数据导入
从本地SQL文件(technology.sql
)导入MySQL
cat technology.sql | docker exec -i mysql /usr/bin/mysql -u root --password=Root23456 technology
ElasticSearch数据导入
从本地文件sci-info-backup.json
导入
使用elasticsearch-dump工具,例子:目标ES服务器地址为(http://192.168.1.179:9200
)
elasticdump --output=http://192.168.1.179:9200 --input=sciinfo-es-backup.json --limit 10000
运行程序
后端程序
运行jar包
nohup java -jar sci-info-backend.jar >/dev/null &
若没有jar包,则可使用gradle build
编译打包源码生成
前端程序
使用nginx
若没有,则使用apt安装
sudo apt install nginx
将前端项目(istic
)存放到一个特定目录中,例如~/www/istic
在/etc/nginx
文件夹下配置配置文件
在http模块中新建一个server,具体配置示例如下,端口可自己指定:
http {
##
# 省略之前内容,仅插入以下内容
##
server {
listen 5934; # 项目端口
server_name sci-info-front;
location / {
root /home/dcg/www/istic; #前端项目路径
index index.html;
try_files $uri $uri/ /index.html;
}
location ^~ /sci-info/ {
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Fowarded-For $remote_addr;
proxy_pass http://localhost:5933/;
}
}
##
# 省略之后内容
##
}
最后可在浏览器访问该项目,若访问被拒绝,可考虑开启防火墙指定端口