Ruyu-Blog部署文档
准备
- 一台至少2核4g的服务器(项目系统CentOS7)
- 安装git的本机
后端:
- MySQL 8.0
- Redis >= 7.2.3
- RabbitMQ Latest
1.环境准备
1.1.安装Docker
官方网站地址:https://docs.docker.com/engine/install/#server命令:
下载所需工具包
sudo yum install -y yum-utils
设置阿里云镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 Docker Engine(遇到选择一路按y回车)
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动 Docker 服务
sudo systemctl start docker
测试是否安装成功(正确显示版本表示安装成功)
docker -v
设置国内镜像
vi /etc/docker/daemon.json
添加
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn"
],
"live-restore": true
}
依次执行以下命令,重新启动 Docker 服务。
systemctl daemon-reload
service docker restart
检查是否生效
docker info
是否有以下信息:
安装 Docker Compose
我们一般都是通过docker compose来安装中间件,所以这个必不可少。会比较慢,可手动下载
下载地址:https://github.com/docker/compose/releases/download/1.28.6/docker-compose-Linux-x86_64 下载后执行命令 :
cd /usr/local/bin
rz #直接通过rz导入文件
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
测试是否安装成功:
docker-compose --version
ps:记住把文件的名字改为:docker-compose
1.1.1.遇到问题
- 报错 Error: Nothing to do
解决办法,更新yum源:
yum -y update
1.2.部署Mysql
创建挂载目录
#创建挂载目录
mkdir -p /data/mysql/data;
mkdir -p /data/mysql/conf;
创建yml文件
vim /data/mysql/docker-compose.yml
填入配置
version: '3'
services:
mysql:
image: mysql:8.0 #mysql版本
container_name: mysql
volumes:
- /data/mysql/data:/var/lib/mysql
- /data/mysql/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 123456 #root用户密码
TZ: Asia/Shanghai
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
创建配置文件
vim /data/mysql/conf/my.cnf
[mysqld]
default-storage-engine=INNODB # 创建新表时将使用的默认存储引擎
character-set-server=utf8mb4 # 设置mysql服务端默认字符集
pid-file = /var/run/mysqld/mysqld.pid # pid文件所在目录
socket = /var/run/mysqld/mysqld.sock # 用于本地连接的socket套接字
datadir = /var/lib/mysql # 数据文件存放的目录
symbolic-links=0
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 定义mysql应该支持的sql语法,数据校验等!
# 允许最大连接数
max_connections=200
# 同一局域网内注意要唯一
server-id=3306
# 开启二进制日志功能 & 日志位置存放位置`/var/lib/mysql`
#log-bin=mysql-bin
log-bin=/var/lib/mysql/mysql-bin
# binlog格式
# 1. STATEMENT:基于SQL语句的模式,binlog 数据量小,但是某些语句和函数在复制过程可能导致数据不一致甚至出错;
# 2. MIXED:混合模式,根据语句来选用是 STATEMENT 还是 ROW 模式;
# 3. ROW:基于行的模式,记录的是行的完整变化。安全,但 binlog 会比其他两种模式大很多;
binlog_format=ROW
# FULL:binlog记录每一行的完整变更 MINIMAL:只记录影响后的行
binlog_row_image=FULL
# 日志文件大小
max_binlog_size=100M
# 定义清除过期日志的时间(这里设置为7天)
expire_logs_days=7
# ================= ↑↑↑ mysql主从同步配置end ↑↑↑ =================
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4 # 设置mysql客户端默认字符集
到对应目录下启动容器
cd /data/mysql
docker-compose up -d
看见以下信息代表成功
记得防火墙开对应的端口号 !!!一定要记得换端口和复杂密码,不然等着被比特币勒索!!!
navicate测试链接成功
最后新建一个数据库,把项目目录下的sql文件放进去运行!!!
1.3.部署Redis
创建挂载目录
#创建挂载目录
mkdir -p /data/redis
创建yml文件
vim /data/redis/docker-compose.yml
填入配置
version: '3'
services:
redis:
image: redis:7.2.3
container_name: redis
restart: always
ports:
- 6379:6379
volumes:
- /data/redis/redis.conf:/etc/redis/redis.conf
- /data/redis/data:/data
- /data/redis/logs:/logs
command: ["redis-server","/etc/redis/redis.conf"]
创建挂载的配置文件
vim /data/redis/redis.conf
protected-mode no
port 6379
timeout 0
#rdb配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /data
appendonly yes
appendfsync everysec
#设置你的redis密码
requirepass 123456
注意:protected-mode no 不加,无法连接! 到对应目录下启动容器
cd /data/redis
docker-compose up -d
#如果需要强制重新构建
docker-compose up --force-recreate -d
记得防火墙开启对应的端口!!!
使用工具测试连接
1.4.部署RabbitMQ
安装镜像
docker pull rabbitmq
根据下载的镜像创建和启动容器
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq
参数说明:
-d 后台运行容器;
--name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
--hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
查看正在运行容器
docker ps
进入容器内部
比如我自己的:docker exec -it a78657b2e2e1 /bin/bash
docker exec -it 容器id /bin/bash
运行web插件
rabbitmq-plugins enable rabbitmq_management
浏览器运行
默认用户名和密码是guest
解决:⚠ All stable feature flags must be enabled after completing an upgrade. [Learn more]
全部启用
解决不显示图表问题
正常首页应该是这样
解决方法:
- 查看所有容器(看id)
docker ps -a
- 进入容器内部
docker exec -it 容器id /bin/bash
- 进入指定目录
cd /etc/rabbitmq/conf.d/
- 修改 management_agent.disable_metrics_collector = false
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
- 退出容器
exit
- 重启容器
docker restart 容器Id
修改密码:
- 进入容器内部
- 查看RabbitMQ当前的用户列表
rabbitmqctl list_users
- 修改密码
rabbitmqctl change_password 用户名 '[密码]'
1.5.部署Minio
创建挂载目录
#创建挂载目录
mkdir -p /data/minio
创建yml文件
vim /data/minio/docker-compose.yml
填入配置
version: '3'
services:
minio:
image: "minio/minio"
container_name: minio
ports:
- "9000:9000" # api 端口
- "9001:9001" # 控制台端口
environment:
MINIO_ROOT_USER: admin # 管理后台用户名
MINIO_ROOT_PASSWORD: 12345678 # 管理后台密码,最小8个字符
MINIO_COMPRESS: "off" # 开启压缩 on 开启 off 关闭
MINIO_COMPRESS_EXTENSIONS: "" # 扩展名 .pdf,.doc 为空 所有类型均压缩
MINIO_COMPRESS_MIME_TYPES: "" # mime 类型 application/pdf 为空 所有类型均压缩
volumes:
- /data/minio/data:/data/ # 映射当前目录下的data目录至容器内/data目录
- /data/minio/config:/root/.minio/ # 映射配置目录
command: server --address ':9000' --console-address ':9001' /data # 指定容器中的目录 /data
privileged: true
到对应目录下启动容器
cd /data/minio
docker-compose up -d
#如果需要强制重新构建
docker-compose up --force-recreate -d
打开对应的控制台: http://ip:9001/记得服务器防火墙开启9000,9001端口!!!使用对应的账号密码登录!
创建一个对应的桶
设置访问权限
填写
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::blog"
]
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::blog"
],
"Condition": {
"StringEquals": {
"s3:prefix": [
"*"
]
}
}
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::blog/**"
]
}
]
}
创建密钥
密钥只要第一次可见,创建后记得保存好
1.6.部署音乐后端
- 拉取镜像
docker pull binaryify/netease_cloud_music_api
- 运行
docker run -p 3000:3000 --name netease_cloud_music_api -d binaryify/netease_cloud_music_api
记得服务器防火墙开启对应端口!!!
1.7.部署一言接口
可选,官网的一言接口有qps限制,想使用流畅一点就自己部署一个
官方部署文档:https://developer.hitokoto.cn/sentence/deploy.html
一言官方提供了各种部署方式,自己选一个,官网使用 Docker
部署
2.申请第三方登录
2.1.Gitee
设置 > 第三方应用
应用回调地址
http://[后端地址]:[端口]/oauth/gitee/callback
2.2.Github
Settings/Developer Settings > OAuth Apps
回调地址填写方式与Gitee一致,记得生成密钥后保存,只有第一次可见!!!
3.申请邮件发送
3.1.QQ
邮箱设置找到 **POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,**去开启服务,得到密钥
3.2.163
进入设置,找到 POP3/SMTP/IMAP
ps: 可以先申请 IMAP/SMTP服务
试一下是否可行,不行就使用另外一个
4.本地运行项目
4.1.拉取项目
项目地址:kuailemao/Ruyu-Blog
小白请下载最新的发行版本
命令:
git clone git@gitee.com:kuailemao/ruyu-blog.git
4.2.运行后端
使用idea打开,下载后端依赖
resources目录下新建application-dev.yml
添加配置
spring:
security:
jwt:
key: jwt-key
# jwt 的有效时间(天)
expire: 7
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://[数据库IP]:[数据库端口]/blog?useSSL=false&allowPublicKeyRetrieval=true
username: root
password: [数据库密码]
data:
redis:
# redis 端口
port: 6379
# redis 地址
host:
# redis 密码
password:
# redis连接超时时间(毫秒)
timeout: 10000
# 数据库索引,默认为0
database: 1
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
rabbitmq:
# rabbitmq 地址
host:
# rabbitmq 端口
port: 5672
# rabbitmq 用户名
username:
# rabbitmq 密码
password:
listener:
simple:
retry:
enabled: true #是否开启消费者重试
max-attempts: 3 #最大重试次数
initial-interval: 6000 #重试间隔时间(单位毫秒)
multiplier: 2 #间隔时间乘子,间隔时间*乘子=下一次的间隔时间,最大不能超过设置的最大间隔时间
max-interval: 10000 #重试最大时间间隔(单位毫秒)
# 邮箱队列名称
queue:
email: email_queue
log-login: log_login_queue
log-system: log_system_queue
# 邮箱交换机名称
exchange:
email: email_exchange
log: log_exchange
# 邮箱路由键
routingKey:
email: email_routing_key
log-login: log_routing_key_login
log-system: log_routing_key_system
mail:
host: smtp.qq.com
username: # 不可透露,邮件发送账号
password: # 不可透露,邮件发送账号密钥
chat-gpt:
email: # 不可透露
password: # # 不可透露
properties:
mail.smtp.auth: true
mail.smtp.starttls.enable: true
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
quartz:
# 将 Quartz 持久化方式修改为 jdbc
job-store-type: jdbc
properties:
org:
quartz:
scheduler:
# 实例节点 ID 自动生成
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
dataSource: quartz_jobs
dataSource:
quartz_jobs:
driver: com.mysql.cj.jdbc.Driver
URL: jdbc:mysql://[数据库IP]:[数据库端口]/blog?useSSL=false&allowPublicKeyRetrieval=true
user: root
password: [数据库密码]
mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
# 逻辑删除
logic-delete-field: isDeleted
# 逻辑删除值
logic-delete-value: 1
# 逻辑未删除值
logic-not-delete-value: 0
# id 自增
id-type: auto
# springdoc-openapi项目配置,访问 http://127.0.0.1:8088/doc.html
springdoc:
swagger-ui:
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs:
path: /v3/api-docs
group-configs:
- group: 'default'
paths-to-match: '/**'
packages-to-scan: xyz.kuailemao
oauth:
# gitee 登录
gitee:
client-id:
client-secret:
redirect-uri:
# gitub 登录
github:
client-id:
client-secret:
redirect-uri:
web:
index:
# 网站前端首页
path: http://kuailemao.xyz/
# knife4j的增强配置,不需要增强可以不配
knife4j:
enable: true
setting:
language: zh_cn
http_pool:
max_total: 200
default_max_per_route: 100
connect_timeout: 5000
connection_request_timeout: 1000
socket_timeout: 65000
validate_after_inactivity: 2000
# 连接 minio
minio:
# 访问地址
endpoint:
accessKey:
secretKey:
# 桶名称
bucketName:
把上面准备好的环境找到对应的地方配置好各种ip跟端口或者密钥
看到以下信息,恭喜你,后端启动成功!
4.3.运行前端
前提具备条件:
- pnpm >= 8.12.0
- node >= 16.17.0
4.3.1.运行前台
- 找到打开
kuailemao-blog
目录
右键打开终端
运行命令
pnpm install
pnpm run dev
看到访问链接后恭喜你运行成功!!!
效果如上,简单吧(滑稽)
4.3.2.运行后台
与上面同样的方式,找到kuailemao-admin
文件夹,打开终端 运行命令:
pnpm install
pnpm dev
看到访问路径表示运行成功
效果如下:
4.3.3.音乐模块
开源地址:https://github.com/XiangZi7/KM-Music-Player
这个页面是单独部署的并非集成在项目内,需要的自己参考开源大佬的文档部署
5.部署
5.1.部署后端
5.1.1.项目打包
idea运行打包命令
得到一个打包好的Jar包
5.1.2.服务器部署
新建文件夹后进入
mkdir /blog/backend
cd /blog/backend
上传打包文件
rz # Enter
把你打包好的后端Jar包上传
新建 Dockerfile
vim Dockerfile
填入配置
# 使用官方的OpenJDK 17镜像作为基础镜像
FROM openjdk:17
# 设置工作目录
WORKDIR /app
# 复制项目的jar文件到容器中
COPY blog-backend-0.0.1-SNAPSHOT.jar /app/app.jar
# 暴露应用运行的端口
EXPOSE 8088
# 运行Spring Boot应用
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
构建镜像
docker build . -t ruyu-blog-hd
运行
docker run --name ruyu-blog-hd -d -p 8088:8088 ruyu-blog-hd
检查是否成功
docker ps
记得服务器防火墙开启对应端口!!!
5.2.部署前台
找到 kuailemao-blog 目录下面的生产环境配置文件
VITE_SERVE:项目后端地址 VITE_FRONTEND_URL:前台域名(没有配就填写正确ip) VITE_MUSIC_SERVE:音乐播放器的后端地址 VITE_MUSIC_FRONTEND_URL:音乐模块的前端地址(没有就不填写,把音乐模块去掉) 部署前测试
先在 .env.development 开发环境中,使用部署好的后端尝试是否能正确运行
测试没问题,打包:
5.2.1.项目打包
使用上面方法在 kuailemao-blog 目录下打开 cmd 终端
运行打包命令
pnpm build
等待打包完成,根目录下面出现 dist 命令
5.2.2.项目部署
回到服务器,运行命令
mkdir /blog/blog-qt
cd /blog/blog-qt/
把打包好的 dist 文件夹上传
rz
新建 Dockerfile
vim Dockerfile
填入配置
FROM nginx
MAINTAINER 博客前台
RUN rm /etc/nginx/conf.d/default.conf
ADD default.conf /etc/nginx/conf.d/
COPY dist/ /usr/share/nginx/html/
新建 nginx 配置文件
vim default.conf
填入配置
# 定义HTTP服务器
server {
listen 80; # 监听端口
server_name localhost; # 域名
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
# 配置代理路径
location /api/ {
proxy_pass http://[域名/ip+端口]/; # 转发请求的目标地址
proxy_set_header Host $host; # 设置请求头中的Host字段
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 设置HTTP头中的X-Forwarded-For字段,表示客户端真实IP,多个IP用逗号隔开
proxy_set_header X-Real-IP $remote_addr; # 设置请求头中的X-Real-IP字段,表示客户端真实IP
}
# 配置代理路径
location /wapi/ {
proxy_pass http://[域名/ip+端口]/; # 转发请求的目标地址,音乐后端
}
# 配置错误页面
error_page 404 /404.html; # 404错误页
location = /404.html {
internal; # 不接受外部访问
root /usr/share/nginx/html; # 404错误页文件所在目录
}
}
如果有域名,并且后台不想使用另外一个端口访问,假如 88,因为服务器只有一个 80端口,就可以使用nginx转发,如下配置
# 定义HTTP服务器
server {
listen 80; # 监听端口
server_name kuailemao.xyz; # 域名
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
# 配置代理路径
location /api/ {
proxy_pass http://[域名/ip+端口]/; # 转发请求的目标地址,项目后端
proxy_set_header Host $host; # 设置请求头中的Host字段
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 设置HTTP头中的X-Forwarded-For字段,表示客户端真实IP,多个IP用逗号隔开
proxy_set_header X-Real-IP $remote_addr; # 设置请求头中的X-Real-IP字段,表示客户端真实IP
}
# 配置代理路径
location /wapi/ {
proxy_pass http://[域名/ip+端口]/; # 转发请求的目标地址,音乐后端
}
# 配置错误页面
error_page 404 /404.html; # 404错误页
location = /404.html {
internal; # 不接受外部访问
root /usr/share/nginx/html; # 404错误页文件所在目录
}
}
# 二级域名反向代理,访问后台
server {
listen 80;
server_name blog.kuailemao.xyz;
location / {
proxy_pass http://kuailemao.xyz:81/; # 实际的后台路径
client_max_body_size 100M;
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_set_header X-Forwarded-Proto $scheme;
}
}
使用第二种方法记得服务器那边也要解析二级域名!!!
如果部署的是v1.4.0版本前端引入了gzip压缩需要在nginx里面也配置(http的内层/server的内层)
gzip on; # 启用 Gzip 压缩
gzip_disable "msie6"; # 禁用 IE6 的 Gzip 压缩
gzip_vary on; # 在响应头中添加 Vary: Accept-Encoding
gzip_proxied any; # 压缩代理服务器的响应
gzip_comp_level 6; # 压缩级别(1-9,默认值为 1)
gzip_buffers 16 8k; # 压缩缓冲区大小
gzip_http_version 1.1; # 启用 Gzip 的 HTTP 版本
gzip_types text/plain text/css application/json application/javascript text/xml application/xml+rss text/javascript image/svg+xml; # 要压缩的文件类型
构建镜像
docker build . -t blog-qt
运行
docker run --name blog-qt -d -p 80:80 blog-qt
测试是否成功
docker ps
前台效果
二级域名反向代理,后台访问效果
5.3.后台部署
找到对应的生产环境配置文件
VITE_APP_BASE_URL:后端地址 VITE_APP_DOMAIN_NAME:文件上传地址,也就是 minio 地址,使用9000端口 测试
可以根前台一样先把开发环境配置(.env.development)改成服务器的配置,测试是否可以正确使用
5.3.1.项目打包
打包命令
pnpm build
看见以下信息后表示打包成功
5.3.2.后台部署
回到服务器,运行命令
mkdir /blog/blog-ht
cd /blog/blog-ht
使用 rz 把打包好的 dist 文件上传到该目录 新建 Dockerfile
vim Dockerfile
填入配置
FROM nginx
MAINTAINER 博客后台
RUN rm /etc/nginx/conf.d/default.conf
ADD default.conf /etc/nginx/conf.d/
COPY dist/ /usr/share/nginx/html/
新建 default.conf 配置文件
vim default.conf
填入配置
server {
listen 81;
server_name _;
# gzip config
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
root /usr/share/nginx/html;
include /etc/nginx/mime.types;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://[域名/ip+端口]/; # 项目后端地址
client_max_body_size 100M;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
构建镜像
docker build . -t blog-ht
运行
docker run --name blog-ht -d -p 81:81 blog-ht
检查是否运行成功
docker ps
查看效果
不管前台还是后台,配置了域名就使用域名访问,没配置就使用ip+端口也可以!!!
6.最后
如果你以上都成功了,那么恭喜你,成功部署了我的博客项目!!! 因为群里面可能小白毕竟多,这份部署文档可能就写的比较详细,我也花了很多心思,每个服务其实都有很多不同的部署方法,我在这里选择了最简单,最不容易出错的 Docker 容器的部署方法,如果有大佬的话就适当跳过就好了,如果发现有问题或者有什么缺陷,大家都可以在交流群里面提出来。 这个项目花费了我大量精力,项目不敢保证一定没有问题,但是会持续优化更新,大家也可以在群里面提建议。 在这里也感谢各位的支持与认可,如果可以,希望能给小弟两颗星星,开源不易,感谢大家!!!gitee&github地址:https://gitee.com/kuailemao/ruyu-bloghttps://github.com/kuailemao/Ruyu-Blog