一. 搭建项目
IDEA: 2024.1.3
spring boot: 3.3.3
maven: 3.9.9
jdk: 22
fastjson: 2.0.32
redis:
msql: 8.0
dcoker: 27.2.1
Docker Compose: 2.29.3
vue:
nginx:1.26.2
1.1 创建本地项目
idea中,创建 spring boot 项目。
spring boot: 3.3.3
jdk:22
包名:com.moloom.moss
勾选组件:spring web
1.2 添加依赖
pom.xml 依赖
| <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.moloom</groupId>
<artifactId>MOSS</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>MOSS</name>
<description>mo Object Storage Service</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>22</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
<!-- moloom -->
<!--阿里Json类依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.32</version>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>3.3.3</version>
</dependency>
<!-- 由于SpringBoot 2.x中默认并没有使用Redis连接池,所以需要在pom.xml中添加commons-pool2的依赖 -->
<!--<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>-->
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.33</version>
</dependency>
<!-- 发邮件类依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
|
下载依赖
1.3 同步 github
先在github创建一个仓库,default branch 要是 master.
推送本地项目到仓库
| #先看本地有没有配置过 git 信息
git config list
#看能不能连上 github
ssh -T git@github.com
git remote add sshOrigin git@github.com:moloom/项目名.git
#添加文件
git add .
#提交
git commit -m "注释"
#推送 --force 强制覆盖仓库
git push sshOrigin master
|
二. 准备部署环境
该项目部署在云服务器上,且都是运行在docker容器内,所以需要先把部署脚本和更新代码脚本给写好。
moss 目录情况
| moss
├── backend
│ ├── Dockerfile
│ ├── jdk-22.0.1_linux-x64_bin.tar.gz
│ └── MOSS-1.7.1.jar
├── docker-compose.yaml
├── moss.conf
├── mysql
│ ├── Dockerfile
│ └── moss.sql
├── redis
├── start.sh
├── stop.sh
└── work_base_env #挂载的容器卷
├── mysql
│ ├── conf
│ │ └── my.cnf
│ ├── data
│ └── log
├── nginx
│ ├── conf
│ │ ├── conf.d
│ │ │ └── default.conf
│ │ └── nginx.conf
│ ├── html
│ └── logs
│ ├── access.log
│ └── error.log
└── redis
├── data
├── log
└── redis.conf
|
2. 编写 docker compose
由docker compose 对各服务进行编排管理
| services:
moss-backend:
build:
dockerfile: Dockerfile
context: ./backend
image: moss/backend:1.0
ports:
- "8803:8803"
environment:
JAVA_OPTIONS: ${JAVA_OPTIONS}
TZ: Asia/Shanghai
#user: root
privileged: true
networks:
- moss-net
- bridge0
restart: always
depends_on:
moss-mysql:
condition: service_healthy
moss-redis:
condition: service_started
moss-mysql:
build:
dockerfile: Dockerfile
context: ./mysql
image: moss/mysql:1.0
ports:
- "8806:3306"
volumes:
- /moss/mysql/log:/var/log/mysql
- /moss/mysql/data:/var/lib/mysql
- /moss/mysql/conf:/etc/mysql/conf.d
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: ${MYSQL_ALLOW_EMPTY_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
TZ: Asia/Shanghai
user: root
privileged: true
security_opt:
- seccomp:unconfined
networks:
- moss-net
restart: always
healthcheck:
test:
[
"CMD-SHELL",
"mysqladmin -uroot -p${MYSQL_ROOT_PASSWORD} ping -h localhost",
]
interval: 10s
timeout: 5s
retries: 3
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
moss-redis:
image: redis:6.0.8
ports:
- "8809:6379"
environment:
- TZ=Asia/Shanghai # 设置时区
volumes:
- /moss/redis/redis.conf:/etc/redis/redis.conf
- /moss/redis/data:/data
- /moss/redis/log:/etc/log
networks:
- moss-net
command: redis-server /etc/redis/redis.conf
privileged: true
depends_on:
moss-mysql:
condition: service_healthy
moss-frontend:
image: nginx:1.26.2
ports:
- "8800:80"
environment:
- TZ=Asia/Shanghai # 设置时区
volumes:
- /moss/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /moss/nginx/conf/conf.d:/etc/nginx/conf.d
- /moss/nginx/html:/usr/share/nginx/html
- /moss/nginx/logs:/var/log/nginx
depends_on:
moss-backend:
condition: service_started
networks:
- moss-net
- bridge0
networks:
moss-net:
driver: bridge
bridge0:
external: true
|
编写docker compose时还要创建相应的配置文件夹
3. 编写启动和停止moss的脚本
单单由docker compose 管理运行moss还不行,最好把如上docker compose 所在文件夹作为一个moss主目录,再创建一个 /moss 作为工作目录。start.sh和 stop.sh 就是用来构建工作目录,以及存储重要运行数据和日志的脚本
start.sh
| #!/bin/bash
# 2024-09-21
#执行脚本时的所在pwd
ORIGIN_PWD="$(pwd)"
# 脚本所在的pwd
LOCAL_PWD="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd $LOCAL_PWD
. ./.env
# moss 启动脚本,负责搭建工作目录,挂载容器卷,启动docker
#检查是否用root用户运行
echo `$DATE`"开始检查执行用户"
if [ "$(id -u)" -ne 0 ]; then
echo `$DATE`"当前用户不是root,请用root用户执行此脚本"
echo `$DATE`"安装程序已退出"
exit 1
fi
echo `$DATE`"检查到执行用户为$USER"
#创建工作目录
echo `$DATE`"开始准备 moss 工作目录"
rm -rfv $WORK_HOME
mkdir -p $WORK_HOME
cp -rf work_base_env/* $WORK_HOME
chown -R $USER:$USER_GROUP $WORK_HOME
echo `$DATE`"工作目录准备完毕"
#检查有没有安装docker和docker compose
if [ $(command -v docker) ]; then
if [ ! $(command -v docker compsoe) ]; then
echo `$DATE`"docker compose 未安装,请先安装docker compose再执行本脚本"
exit 1;
fi
else
echo `$DATE`"docker 未安装,请先安装docker再执行本脚本";
exit 1;
fi
# 运行服务
echo `$DATE`"正在启动服务"
docker compose up -d --build
code="$?"
if [ "$code" -eq 0 ]; then
echo `$DATE` "服务启动成功"
else
echo `$DATE` "服务启动失败,状态码:$code"
exit 1
fi
cd $ORIGIN_PWD
exit 0
|
stop.sh
| #!/bin/bash
#执行脚本时的所在pwd
ORIGIN_PWD="$(pwd)"
# 脚本所在的pwd
LOCAL_PWD="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd $LOCAL_PWD
. ./.env
#导出数据库
docker compose exec moss-mysql /bin/bash -c "mysqldump -u$MYSQL_USER -p$MYSQL_ROOT_PASSWORD --set-gtid-purged=off moss > /var/log/mysql/moss.sql"
#停止服务
echo `$DATE`"开始停止服务"
docker compose down
code="$?"
if [ "$code" -eq 0 ]; then
echo `$DATE` "服务已停止"
else
echo `$DATE` "服务停止失败,状态码:$code"
exit 1;
fi
echo `$DATE` "保存nginx 的log文件"
cp -rfv $NGINX_HOME/logs/* work_base_env/nginx/logs/
cp -fv $MYSQL_HOME/log/moss.sql mysql
#保存redis db文件
#删除工作目录
echo `$DATE`"开始删除工作目录"
rm -rf $WORK_HOME
echo `$DATE` "工作目录删除成功"
cd $ORIGIN_PWD
exit 0
|
三. 编写代码