分类
项目开发

常见项目从零开始环境搭建记录

项目说明

后端: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/;
        }
    }
    ##
    # 省略之后内容
    ##
}

最后可在浏览器访问该项目,若访问被拒绝,可考虑开启防火墙指定端口

分类
杂七杂八

世界,您好!

记录一下,在2019年最后一天,把本站搭建好啦~