# 一、系统环境

# 1. 目录介绍

/opt    
├── /common-tool              主要存放项目运行所依赖环境,全局公用(也可作部分项目私有)
│       └── nginx                         
|				└── html      项目前端代码(dist包) 
│       └── nacos             主要是docker挂载到宿主机的持久化数据     
│       └── influxdb1         同上      
│       └── influxdb2         同上      
│       └── mqtt              同上      
│       └── redis             同上      
│       └── ...                     
├── /kunyi                    存放项目jar包等(目前只放后端)

# 2. 系统环境介绍

# Java运行时环境
# 版本
root@KY-S-Server-01:/opt/common-tool# java -version
    openjdk version "1.8.0_442"
    OpenJDK Runtime Environment (build 1.8.0_442-8u442-b06~us1-0ubuntu1~22.04-b06)
    OpenJDK 64-Bit Server VM (build 25.442-b06, mixed mode)

# 路径
root@KY-S-Server-01:/opt/common-tool# whereis java
java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz
# Docker环境
# 版本
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# docker --version
Docker version 20.10.24, build 297e128

# 镜像源
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# cat /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors":
  [
       "https://1p98x5qc.mirror.aliyuncs.com",
       "https://registry.cn-shenzhen.aliyuncs.com",
       "https://docker.m.daocloud.io",
       "https://docker.imgdb.de",
       "https://docker.hlmirror.com"
  ]
}

# 注意,镜像源如果不可用,请 vim /etc/docker/daemon.json 更换,注意,切换镜像源后,需要重启dammon和重启docker服务
`sudo systemctl daemon-reload`
`sudo systemctl restart docker`
# 或者可以在docker pull的时候临时指定镜像源
`docker pull <mirror-url>/<image-name>:<tag>`
`docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest`

# Python环境
# 版本
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# python -V
Python 3.10.12

# 路径
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# whereis python
python: /usr/bin/python
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# whereis python3
python3: /usr/bin/python3 /usr/lib/python3 /etc/python3 /usr/share/python3 /usr/share/man/man1/python3.1.gz
# Matlab运行时环境
# 路径及版本
root@KY-S-Server-01:/opt/common-tool/nginx/conf/projects# which matlab
/usr/local/bin/matlab
/usr/local/MATLAB/R2021b/

# 二、项目依赖环境

# 1. 介绍

# 查看项目依赖环境(docker)
docker ps --filter "name=^mysql5.7$" \
          --filter "name=^nginx$"  \
          --filter "name=^mqtt$"   \ 
          --filter "name=^nacos$"  \
          --filter "name=^redis$"     \
          --filter "name=^influxdb2$"  \   江苏java后端微服务(if necessary )
          --filter "name=^jiangsu" \
IMAGE PORTS NAMES
jiangsu-lab-docker 0.0.0.0:5049->5049/tcp, :::5049->5049/tcp jiangsu-lab-server
influxdb:2.7.6 0.0.0.0:8086->8086/tcp, :::8086->8086/tcp influxdb2
redis:7.0.5 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
eclipse-mosquitto 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp mqtt
nacos/nacos-server:v2.0.3 0.0.0.0:5055->5055/tcp, :::5055->5055/tcp, 8848/tcp nacos
mysql:5.7 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql5.7
nginx 0.0.0.0:5014->80/tcp, :::5014->80/tcp nginx

# 2. 环境部署

# 1) Nginx
# docker容器
# 先执行一次默认nginx,以获取nginx默认配置文件
docker run -d -p 80:80 --name nginxTemp  nginx

# Copy相关文件夹及文件至宿主机
mkdir -p /opt/common-tool/nginx/html
mkdir -p /opt/common-tool/nginx/conf
mkdir -p /opt/common-tool/nginx/log
docker cp nginx:/usr/share/nginx/html /opt/common-tool/nginx/
docker cp nginx:/var/log/nginx /opt/common-tool/nginx/log
docker cp nginx:/etc/nginx /opt/common-tool/nginx/conf

# 删掉临时nginx的docker
docker rm nginxTemp

# 容器启动
docker run -d -p 80:80 --name nginx --restart=always \
  -v "/opt/common-tool/nginx/html:/usr/share/nginx/html" \
  -v "/opt/common-tool/nginx/conf:/etc/nginx" \
  -v "/opt/common-tool/nginx/log:/var/log/nginx" \
  nginx

## 注意:
如果出现报错“open() “/etc/nginx/nginx.conf“ failed (2: No such file or directory)”,是宿主机不存在相关文件的缘故。
                        
## 参考文章:
https://blog.csdn.net/weixin_45876462/article/details/128273148
https://blog.csdn.net/weixin_45876462/article/details/128273148#:~:text=Windows%E7%8E%AF%E5%A2%83%E4%B8%8B%20Docker%20Desktop%20%E5%AE%89%E8%A3%85%20Nginx%201%201.%20%E5%AE%89%E8%A3%85Docker,nginx%2Flogs%20%E6%97%A5%E5%BF%97%E7%9B%91%E6%B5%8B%20...%205%205.%20%E6%B5%8B%E8%AF%95%20%E4%BF%AE%E6%94%B9H%3A%5CEnvironment%5Cdocker%5Cmydata%5Cnginx%5Chtml%5Cindex.html%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E3%80%82%20%E6%95%88%E6%9E%9C%E5%B1%95%E7%A4%BA
# nginx配置
# nginx主要转发规则的配置(部分)

按照项目区分,根路径:/opt/common-tool/nginx/conf/projects,一个项目一个配置文件

# 文件: /opt/common-tool/nginx/conf/projects/jiangsu-lab.conf
# 原理: 因为外部环境只给了一个端口(搭配域名),所以服务器内部用url前缀来区别转发
# 注意:以江苏仿真实验室的配置为例,尽量要严格按照如下的转发规则配置,否则可能会转发失败(坑点很多)。


# 江苏仿真实验室
server {

	listen 80;
	server_name 192.168.0.195;
	
	location  /jiangsu-lab {
	   alias /usr/share/nginx/html/jiangsu-lab/;   
	   try_files $uri $uri/  /jiangsu-lab/index.html;
       index index.html index.htm;
	}
	
	location /jiangsu-lab/prod-api {
		rewrite ^/jiangsu-lab/prod-api(.*)$ $1 break;
		proxy_pass http://192.168.0.195:5049;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_connect_timeout 600s;
		proxy_read_timeout 600s;
		proxy_send_timeout 600s;
	
	}
	
	#  Nginx首页(默认根目录配置)
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }	
}

server {

	listen 80;
	server_name kunyienergy.com;

	location  /jiangsu-lab {
	  # rewrite ^/jiangsu-lab(/.*)$ $1 break;
	  # root /usr/share/nginx/html;
	  
	   alias /usr/share/nginx/html/jiangsu-lab/;  
	   try_files $uri $uri/  /jiangsu-lab/index.html;
       index index.html index.htm;
	}
	
	location /jiangsu-lab/prod-api {
		rewrite ^/jiangsu-lab/prod-api(.*)$ $1 break;
		proxy_pass http://192.168.0.195:5049;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_connect_timeout 600s;
		proxy_read_timeout 600s;
		proxy_send_timeout 600s;
	
	}
	
	#  Nginx首页(默认根目录配置)
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
	
}

# 2) Mysql
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...

# 容器启动
docker run  --privileged=true --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Ytzn@888#2022#@  -d  \
		    -v /opt/common-tool/mysql5.7/data:/var/lib/mysql \
			-v /opt/common-tool/mysql5.7/conf:/etc/mysql/ \
			-v /opt/common-tool/mysql5.7/log:/var/log/mysql \
			--restart=always  mysql:5.7 
# mysql配置
# 文件: /opt/common-tool/mysql5.7/conf/mysqld.cnf
# 注意,docker容器启动时可能使用的是默认配置文件  /etc/my.cnf (容器内的路径),如果挂载的配置文件没有生效,请直接修改容器内的这个配置文件

[mysqld]
lower_case_table_names = 1
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

max_connections=1000
max_allowed_packet = 200M
innodb_buffer_pool_size=2G
innodb_flush_log_at_trx_commit=2
transaction_isolation=READ-COMMITTED
read_rnd_buffer_size=1M
innodb_io_capacity_max = 8000
innodb_io_capacity = 4000
innodb_flush_method = O_DIRECT
innodb_log_file_size = 32M
innodb_log_buffer_size=16M

log-bin=mysql-binlog
server-id=1

default-time_zone='+8:00'

skip-log-bin
disable-log-bin

[mysqldump]
max_allowed_packet = 200M

[mysql]
no-auto-rehash
max_allowed_packet = 200M

# 数据库
mysql> show databases;
+------------------------------+
| Database                     |
+------------------------------+
| information_schema           |  
| cloud-lab-energy-acquisition |
| cloud-lab-nacos-config       |    nacos数据库(全局公用)
| jiangsu-common               |    江苏实验室...
| jiangsu-lab                  |    ... 
| jiangsu-query                |
| jiangsu-schedule             |
| mysql                        |
| performance_schema           |
| sys                          |
+------------------------------+
# 3) Nacos
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...

# 容器启动
docker run -d \
  --name nacos \
  -e MODE=standalone \
  -p 5055:5055 \
  -v /opt/common-tool/nacos/logs/:/home/nacos/logs \
  -v /opt/common-tool/nacos/conf/:/home/nacos/conf/ \
  --restart=always \
  nacos/nacos-server:v2.0.3
  
# 参考文章  https://blog.csdn.net/web2u/article/details/145107436
# 应用

nacos访问地址: http://192.168.0.195:5055/nacos/index.html
user/password: nacos/K---已脱敏----23!

注意:不同项目的配置文件请用GROUP隔离

# 4) Redis
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...

# 容器启动
docker run  -d --name=redis \
-v /opt/common-tool/redis/redis.conf:/etc/redis/redis.conf \
-v /opt/common-tool/redis/data:/data \
--workdir=/data -p 6379:6379 --restart=always  redis:7.0.5 \
redis-server /etc/redis/redis.conf
# 5) Mqtt
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...

# 容器启动
docker run  -d --name=mqtt  --volume=/opt/common-tool/mqtt/mosquitto.conf:/mosquitto/config/mosquitto.conf -p 1883:1883 --restart=always  eclipse-mosquitto /usr/sbin/mosquitto -c /mosquitto/config/mosquitto.conf
# 6) InfluxDB1
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...

# 容器启动
docker run -d -p 8084:8083  -p8085:8086  --name  influxdb1    --restart=always   influxdb:1.8.4
# 7) InfluxDB2
# docker容器
# 具体的环境准备方法可参考Nginx容器
# ...省略...

# 方法1.  容器启动(命令启动,这里面参数要注意)
docker run --name=influxdb2  
--env=DOCKER_INFLUXDB_INIT_MODE=setup --env=DOCKER_INFLUXDB_INIT_USERNAME=admin --env='DOCKER_INFLUXDB_INIT_PASSWORD=Ytzn@@2024##IFX' --env=DOCKER_INFLUXDB_INIT_ORG=YaTong --env=DOCKER_INFLUXDB_INIT_BUCKET=YaTong-Bucket --volume=/home/ubuntu/influxdb2/config:/etc/influxdb2:rw --volume=/home/ubuntu/influxdb2/data:/var/lib/influxdb2:rw --network=influxdb2_default -p 8086:8086 --restart=always --label='com.docker.compose.project=influxdb2' --label='com.docker.compose.service=influxdb' --label='com.docker.compose.project.config_files=docker-compose.yml' --label='com.docker.compose.config-hash=6760cc649b196ceb5dba3a2f112051c0e464caad62da7684d24e5e352b0ed020' --label='com.docker.compose.oneoff=False' --label='com.docker.compose.version=1.29.1' --label='com.docker.compose.container-number=1' --label='com.docker.compose.project.working_dir=/home/ubuntu/influxdb2' --runtime=runc --detach=true influxdb:2 influxd

# 方法2. 以docker-compose.yml启动 (/opt/common-tool/influxdb2/docker-compose.yml)
cd /opt/common-tool/influxdb2   
sudo docker-compose up -d

# 注意:目前是将云服务器的infludb2镜像端过来启动的。所以里面有云服务器的全部数据。

# 3. 项目部署

# 3.1 介绍

路径 : /opt/kunyi 项目的微服务数据、配置全部在此路径下

# 3.2 仿真实验室:微服务
# 1) 进入Dockerfile文件所在路径,先build镜像

cd /Dockerfile文件的同级路径 docker build -t jiangsu-lab-docker .

# 附1: Dockfile
# 使用 OpenJDK 1.8 官方镜像作为基础镜像
FROM openjdk:8-jre-alpine

# 设置工作目录
WORKDIR /app

# 将宿主机的 jar 包目录挂载到容器的工作目录(更新代码,直接在宿主机上换jar包货class文件后,重启docker即可)
VOLUME /opt/kunyi/jiangsu-lab/server:/app

# 开放5049端口
EXPOSE 5049

# 启动容器时执行的默认命令,按顺序启动 jar 包
# CMD ["sh", "-c", "java -jar /app/cloud-gateway.jar && java -jar /app/cloud-common.jar && java -jar /app/cloud-laboratory-core.jar && java -jar /app/cloud-data-gateway.jar && java -jar /app/cloud-data.jar && java -jar /app/cloud-query.jar && java -jar /app/cloud-schedule.jar"]

# 赋予启动脚本执行权限
COPY  run-server.sh /app/
RUN chmod +x /app/run-server.sh

# 调试:列出文件
RUN ls -l /app/run-server.sh

# 启动容器时执行的默认命令
CMD ["/app/run-server.sh"]
# 附2: run-server.sh(jar包微服务的脚本运行文件)
#!/bin/sh
# 用于启动项目的脚本
# updateTime:20240712
# created by sundi

# 开启UTF-8编码
export LANG=en_US.UTF-8

echo "正在执行程序,请勿关闭窗口......"

# 切换到微服务jar包的目录下
cd /app

# ------------------------ 设置变量 Start --------------------------------
# 设置服务器地址、端口等多个变量(仅在本脚本有效)
JAR_DIR="/app"
LOCAL_HOST="127.0.0.1"
MYSQL_PORT=3306
NACOS_PORT=5055
KUNYI_CLOUD_GATEWAY_PORT=5049
CLOUD_COMMON_PORT=5066
CLOUD_LAB_PORT=5048
CLOUD_DATA_GATEWAY_PORT=5044
CLOUD_DATA_PORT=5045
CLOUD_QUERY_PORT=5041
CLOUD_SCHEDULE_PORT=5013
# 设置重试次数和超时时间(秒)
MAX_RETRIES=6000
TIMEOUT=3

# ------------------------ 设置变量 End --------------------------------

# ------------------------ 启动Cloud-Gateway Start --------------------------------

echo "正在启动微服务:cloud-gateway......"
nohup java -Dfile.encoding=utf-8  -jar "$JAR_DIR/cloud-gateway.jar" > ./logs/cloud-gateway.run.log 2>&1 &

RETRY_COUNT=0
while ! nc -z $LOCAL_HOST $KUNYI_CLOUD_GATEWAY_PORT; do
    echo "cloud-gateway is starting..."
    sleep $TIMEOUT
    RETRY_COUNT=$((RETRY_COUNT + 1))
    if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
        echo "启动超过重试次数,退出尝试......"
        exit 1
    fi
done
echo "微服务:cloud-gateway启动成功......"

# ------------------------ 启动Cloud-Gateway  End --------------------------------



# ------------------------ 启动Cloud-common Start --------------------------------
echo "正在启动微服务:cloud-common......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-common.jar" > ./logs/cloud-common.run.log 2>&1 &

RETRY_COUNT=0
while ! nc -z $LOCAL_HOST $CLOUD_COMMON_PORT; do
    echo "cloud-common is starting..."
    sleep $TIMEOUT
    RETRY_COUNT=$((RETRY_COUNT + 1))
    if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
        echo "启动超过重试次数,退出尝试......"
        exit 1
    fi
done
echo "微服务:cloud-common启动成功......"
# ------------------------ 启动Cloud-common End --------------------------------

# ------------------------ 启动Cloud-lab Start --------------------------------
echo "正在启动微服务:cloud-lab......"
nohup java -Dfile.encoding=utf-8 -server -Xms2000m -Xmx2000m -jar "$JAR_DIR/cloud-laboratory-core.jar" > ./logs/cloud-laborator.run.log 2>&1 &

RETRY_COUNT=0
while ! nc -z $LOCAL_HOST $CLOUD_LAB_PORT; do
    echo "cloud-lab is starting..."
    sleep $TIMEOUT
    RETRY_COUNT=$((RETRY_COUNT + 1))
    if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
        echo "启动超过重试次数,退出尝试......"
        exit 1
    fi
done
echo "微服务:cloud-lab启动成功......"
# ------------------------ 启动Cloud-lab End --------------------------------

# ------------------------ 启动cloud-data-gateway Start --------------------------------

echo "正在启动微服务:cloud-data-gateway......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-data-gateway.jar" > ./logs/cloud-data-gateway.run.log 2>&1 &
echo "微服务:cloud-data-gateway启动成功......"
sleep 20
# 这个cloud-data-gateway 不开启端口,所以无法监听端口来确认它是否启动。所以这里用sleep的方法来模拟等待!!!
# ------------------------ 启动cloud-data-gateway End --------------------------------

# ------------------------ 异步启动剩余Cloud服务 Start --------------------------------
# 剩下的Service不需要同步启动,可以异步进行
echo "正在启动微服务:cloud-data......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-data.jar" > ./logs/cloud-data.run.log 2>&1 &
echo "微服务:cloud-data启动成功......"

echo "正在启动微服务:cloud-query......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-query.jar" > ./logs/cloud-query.run.log 2>&1 &
echo "微服务:cloud-query启动成功......"

echo "正在启动微服务:cloud-schedule......"
nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-schedule.jar" > ./logs/cloud-schedule.run.log 2>&1 &
echo "微服务:cloud-schedule启动成功......"

# ------------------------ 异步启动剩余Cloud服务 End --------------------------------

# echo "正在启动微服务:cloud-matlab......"
# nohup java -Dfile.encoding=utf-8 -server -Xms256m -Xmx256m -jar "$JAR_DIR/cloud-matlab.jar" > ./logs/cloud-matlab.run.log 2>&1 &
# echo "微服务:cloud-matlab启动成功......"
sleep 20

echo "全部项目启动完毕!"

wait
# 2) 启动项目微服务容器

docker run -d \
--name jiangsu-lab-server -p 5049:5049 \
-v /opt/kunyi/jiangsu-lab/server:/app jiangsu-lab-docker 

# 三、已部署

项目 url 用户名/密码 备注
江苏仿真实验室 http://kunyienergy.com:15014/jiangsu-lab/
http://192.168.0.195:5014/jiangsu-lab/
*
辽宁仿真实验室 http://kunyienergy.com:15014/liaoning-lab
http://192.168.0.195:5014/liaoning-lab/
* 待部署
光储直柔系统设计 http://kunyienergy.com:15014/gczr-pro
http://192.168.0.195:5014/gczr-pro/
* 待部署
江苏普查工具 ...... * 待部署
电能替代规划系统 ...... * 待部署
全流域科研项目 ...... * 待部署

# 四、其他

# 精准匹配查出仿真实验室需要启动的容器的命令
docker ps --filter "name=^mysql5.7$" --filter "name=^nginx$" --filter "name=^mqtt$"  --filter "name=^nacos$" --filter "name=^redis$"      --filter "name=^influxdb2$"     --filter "name=^jiangsu"  
# docker hub源,持续更新

https://blog.csdn.net/u014390502/article/details/143472743

# 启动influxDB的docker镜像

sudo docker-compose up -d