Skip to content

一. 搭建项目

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>

下载依赖

 mvn clean&&mvn package

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.shstop.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

三. 编写代码