环境准备
注意:本节内容仅代表个人笔记,供大家参考,不是唯一的可行操作,也不保证保证记录所有操作。最好的方法是根据报错信息采取措施。
-
安装 Docker。
-
安装 Maven。
shbrew install maven
在我的环境里,以上指令会同时安装 OpenJDK 24,可供 Maven 直接使用。如果你的环境里没有这个功能,请自行安装 JDK。
-
安装 Node.js。
shbrew install node
部署后端
首先克隆后端仓库。
sh
git clone https://gitee.com/youlaiorg/youlai-boot.git
在仓库目录下,先尝试构建 Java 项目。
sh
mvn package
正常情况下,会报大量错误。
less
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/orange/Documents/GitHub/youlai-boot/src/main/java/com/youlai/boot/auth/controller/AuthController.java:[33,31] 变量 authService 未在默认构造器中初始化
[ERROR] /Users/orange/Documents/GitHub/youlai-boot/src/main/java/com/youlai/boot/common/result/Result.java:[29,15] 找不到符号
符号: 方法 setCode(java.lang.String)
位置: 类型为com.youlai.boot.common.result.Result<T>的变量 result
原因是项目依赖没有正确配置 Lombok 插件。解决方法是在 pom.xml
的 <build><plugnins>
标签中增加以下插件。
代码改动:增加 Lombok 插件
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.14.0</version>
<configuration>
<source>17</source>
<target>17</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
构建 Docker 镜像前,准备 Docker 基础镜像。在配置好网络环境后,根据 docker/docker-compose.yml
和 Dockerfile
,拉取以下镜像。
sh
docker pull mysql:8.0.29
docker pull redis:7.2.3
docker pull minio/minio:RELEASE.2024-07-16T23-46-41Z
docker pull openjdk:17
确保 Docker 基础镜像都被拉取后,可以开始构建镜像。注意 Dockerfile
中规定了,构建服务器程序的镜像时,是直接使用的编译好的 jar 包,不会在构建镜像时进行编译。
sh
docker buildx build -t youlai-boot:latest .
在运行中间件的 docker-compose
前,需要根据我们的技术需求对 docker/docker-compose.yml
进行一些更改。
-
删去 xxl-job-admin。
代码改动:删去 xxl-job-admin
yml# xxl-job-admin: # image: xuxueli/xxl-job-admin:2.4.0 # container_name: xxl-job-admin # restart: unless-stopped # environment: # PARAMS: '--spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456 --spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver' # volumes: # - ./xxljob/logs:/data/applogs # ports: # - 8080:8080 # networks: # - youlai-boot
-
使用命名卷存储数据。
代码改动:使用命名卷存储数据
ymlvolumes: mysql_data: {} redis_data: {} minio_data: {} # - ./mysql/data:/var/lib/mysql # 持久化 MySQL 数据 - mysql_data:/var/lib/mysql # 持久化 MySQL 数据 # - ./redis/data:/data - redis_data:/data # - ./minio/data:/data - minio_data:/data
-
使用 secrets 传递密码。
代码改动:使用 secrets 传递密码
ymlsecrets: db_root_password: file: ./secrets/db_root_password.txt minio_root_password: file: ./secrets/minio_root_password.txt secrets: - db_root_password environment: # - MYSQL_ROOT_PASSWORD=123456 #设置 root 用户的密码 - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password secrets: - minio_root_password environment: # - MINIO_ROOT_PASSWORD=minioadmin - MINIO_ROOT_PASSWORD_FILE=/run/secrets/minio_root_password
创建 docker/secrets/.gitkeep
,并修改 .gitignore
。
代码改动:更新 gitignore 忽视密码
bash
docker/secrets/*.txt
新建 docker/secrets/db_root_password.txt
和 docker/secrets/minio_root_password.txt
,在里面填入密码。
运行 docker-compose,初始化中间件。
sh
docker-compose -f docker/docker-compose.yml up
如果没有问题,后续可以使用以下命令在后台启动中间件。
sh
docker-compose -f docker/docker-compose.yml up -d
可以用以下命令关闭中间件。
bash
docker-compose -f docker/docker-compose.yml down
同理,服务器程序的密码需要通过 docker-compose 的 secrets 传递。需要修改 src/main/resources/application-dev.yml
和 src/main/resources/application-prod.yml
。为了安全,首先给数据库创建一个名为 youlai
的用户,单独分配密码,并对 youlai_boot
这个数据库分配 SELECT, INSERT, UPDATE, DELETE
权限。
sql
GRANT SELECT, INSERT, UPDATE, DELETE ON youlai_boot.* TO 'youlai'@'172.%';
FLUSH PRIVILEGES;
代码改动:配置文件中的密码使用环境变量
yaml
url: jdbc:mysql://mysql:3306/youlai_boot?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
username: youlai
password: ${DB_USER_PASSWORD}
yaml
redis:
database: 11
host: redis
port: 6379
password: 123456
yaml
endpoint: http://minio:9000
# 访问凭据
access-key: minioadmin
# 凭据密钥
secret-key: ${MINIO_ROOT_PASSWORD}
在 docker-compose 里增加服务器程序。
代码改动:在 compose 里增加服务器程序
yaml
db_user_password:
file: ./secrets/db_user_password.txt
yaml
youlai-boot:
image: youlai-boot:latest
container_name: youlai-boot
restart: unless-stopped
depends_on:
- mysql
- redis
- minio
secrets:
- db_user_password
- minio_root_password
environment:
- TZ=Asia/Shanghai
- SPRING_PROFILES_ACTIVE=prod
networks:
- youlai-boot
ports:
- 8989:8989
entrypoint:
- "sh"
- "-c"
- |
export DB_USER_PASSWORD=$(cat /run/secrets/db_user_password) && \
export MINIO_ROOT_PASSWORD=$(cat /run/secrets/minio_root_password) && \
java -Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom -jar /app.jar
部署前端
首先克隆前端仓库。
sh
git clone https://gitee.com/youlaiorg/vue3-element-admin
安装 pnpm。
sh
npm i -g pnpm
使用 pnpm 安装依赖包。
sh
pnpm i
为了方便本地调试,修改配置文件 .env.development
,使其指向本地服务器。
yaml
# VITE_APP_API_URL=https://api.youlai.tech # 线上
VITE_APP_API_URL=http://localhost:8989 # 本地
打包。
sh
npm run build
打包生成的文件在 dist/
目录下。
在服务器上部署前端和后端
首先为服务器安装宝塔面板。
在网站页中安装 Nginx。
在 Docker 页中安装宝塔 Docker 模块。
在文件页面将打包生成的 dist/
上传到 /www/wwwroot/
。
在网站页中添加 HTML 项目,根目录指定为 /www/wwwroot/dist
。至此,可以访问前端。
像本地一样克隆源码(可以用部署公钥)、拉取镜像、构建镜像、编排容器。
修改 HTML 项目的 Nginx 配置,增加后端接口的转发。
代码改动:增加 Nginx 转发
nginx
location /prod-api/ {
proxy_pass http://127.0.0.1:8989/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
尽管如此配置了,仍然需要在安全组中开放 8989 端口,否则验证码无法正常工作。