Aurora 个人博客建站过程
Aurora 个人博客建站过程
项目:linhaojun857/aurora(基于 SpringBoot + Vue 的个人博客系统,⭐ 4600+) 服务器:2 核 2G · Ubuntu 24.04.1 LTS · 香港 部署方式:Docker Compose(原生安装内存更省,但这里按最终采用的 Docker 方案记录)
1. 架构说明
技术栈
| 层 | 技术 | 说明 |
|---|---|---|
| 后端 | SpringBoot 2.x + MyBatis-Plus | JDK 8,端口 8080 |
| 前端(前台) | Vue 3 + vue-cli 5 | aurora-blog,端口 80 |
| 前端(后台) | Vue 3 + vue-cli 5 | aurora-admin,端口 8001 |
| 数据库 | MySQL 8.0 | 库名 aurora |
| 缓存 | Redis 7.2 | 登录态/缓存 |
| 消息队列 | RabbitMQ(management) | 后端异步任务 |
| 反向代理 | Nginx | 静态文件 + /api 转发 |
搜索策略选了 MySQL(而非 Elasticsearch),2G 内存下能省 1G+。图片上传用 MinIO,登录方式为邮箱 + GitHub(QQ 未使用)。
容器架构
graph TD
A[浏览器] -->|前台 http://IP:80| N[Nginx]
A -->|后台 http://IP:8001| N
N -->|/api 反向代理| B[Backend SpringBoot :8080]
B --> M[(MySQL :3306)]
B --> R[(Redis :6379)]
B --> Q[RabbitMQ :5672]
5 个容器通过 Docker 内部网络用服务名互相访问(mysql、redis、rabbitmq、backend、nginx),只有 Nginx 的 80/8001 和后端的 8080 暴露到宿主机。
2. 服务器环境准备
2.1 确认系统
cat /etc/os-release # Ubuntu 24.04.1 LTS
2.2 云安全组(入方向)
| 端口 | 用途 | 授权 IP |
|---|---|---|
| 22 | SSH 登录 | 你的IP/32(建议) |
| 80 | 前台博客 | 0.0.0.0/0 |
| 8001 | 后台管理 | 你的IP/32(建议) |
| 8080 | 后端 API(测试) | 你的IP/32 或不开 |
出方向默认全放行,不用配。
2.3 加 swap(2G 小内存强烈建议)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
3. 本地打包(Mac)
服务器只有 2G,构建(尤其前端
npm run build)放本地做,服务器只跑运行时。
3.1 本地环境
| 工具 | 版本 | 用途 |
|---|---|---|
| JDK | 8(即 1.8) | 编译后端 |
| Maven | 任意(或用 IDEA 内置) | 打 jar |
| Node | 16 | 打前端 |
3.2 后端打包(IDEA)
- 改配置:见 3.4,先改
application.yml+application-prod.yml - 配 JDK 8:
File → Project Structure(⌘;)→ Project → SDK → 8(即 jdk 1.8)- 没有 JDK 8 就
Add SDK → Download JDK → Version 8
- 没有 JDK 8 就
- Maven 的 JRE 也要设 8:
Settings(⌘,)→ Build Tools → Maven → Runner → JRE → 8(这一步最容易漏,漏了编译报 Lombok 错) - Maven 面板 →
Lifecycle→ 双击clean→ 双击package - 产物:
aurora-springboot/target/aurora-springboot-0.0.1.jar
3.3 前端打包
# 修 sass 版本(否则报 "PostCSS received undefined")
cd aurora-vue/aurora-blog
npm install
npm install -D sass@1.32.13
npm run build
cd ../aurora-admin
npm install
npm install -D sass@1.32.13
npm run build
3.4 后端配置(关键)
application.yml(指向 prod):
spring:
application:
name: aurora-springboot
profiles:
active: prod
application-prod.yml 改这几处(地址用容器名,不是 localhost):
spring:
datasource:
url: jdbc:mysql://mysql:3306/aurora?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true
username: root
password: Aurora@2026
redis:
host: redis
password: Aurora@2026
rabbitmq:
host: rabbitmq
username: aurora
password: Aurora@2026
elasticsearch:
rest:
uris: http://localhost:9200 # 合法占位,不会被用到
search:
mode: mysql # 原来是 elasticsearch,必须改成 mysql
upload:
mode: minio
minio:
url: http://你的IP:9000/aurora/ # 末尾带 bucket 名 + 斜杠,否则图片 URL 会错
endpoint: http://minio:9000
accessKey: minioadmin
secretKey: minioadmin123
bucketName: aurora
⚠️
Aurora@2026是示例密码,生产环境请改掉,且要和 docker-compose.yml 保持一致。
4. Docker 部署
4.1 安装 Docker(Ubuntu 24.04)
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker blog # 重新登录后免 sudo 用 docker
4.2 镜像加速器(国内/香港必配)
Docker Hub 直连常超时,配加速器:
echo '{"registry-mirrors":["https://docker.m.daocloud.io"]}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker
docker info | grep -A3 "Registry Mirrors" # 验证
实测可用的站:
docker.m.daocloud.io。其他公共站(1panel、xuanyuan 等)常 403/429 限流,不稳定。
4.3 部署目录结构
~/aurora/
├── docker-compose.yml
├── aurora.sql # 数据库初始化脚本
├── backend/
│ ├── Dockerfile
│ └── aurora-springboot-0.0.1.jar
├── frontend/
│ ├── blog/ # 前台 dist
│ └── admin/ # 后台 dist
└── nginx/
└── nginx.conf
4.4 docker-compose.yml
services:
mysql:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: Aurora@2026
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: aurora
volumes:
- ./mysql-data:/var/lib/mysql
- ./aurora.sql:/docker-entrypoint-initdb.d/aurora.sql:ro
redis:
image: redis:7.2-alpine
restart: always
command: redis-server --requirepass Aurora@2026
volumes:
- ./redis-data:/data
rabbitmq:
image: rabbitmq:management # 注意:不是 3-management,那个 tag 不存在
restart: always
environment:
RABBITMQ_DEFAULT_USER: aurora
RABBITMQ_DEFAULT_PASS: Aurora@2026
volumes:
- ./rabbitmq-data:/var/lib/rabbitmq
minio:
image: minio/minio:latest
restart: always
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin123
volumes:
- ./minio-data:/data
ports:
- "9000:9000"
- "9001:9001"
backend:
build: ./backend
restart: always
depends_on:
- mysql
- redis
- rabbitmq
ports:
- "8080:8080"
nginx:
image: nginx:alpine
restart: always
ports:
- "80:80"
- "8001:8001"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./frontend/blog:/var/www/aurora/blog:ro
- ./frontend/admin:/var/www/aurora/admin:ro
depends_on:
- backend
4.5 backend/Dockerfile
FROM amazoncorretto:8
WORKDIR /app
COPY aurora-springboot-0.0.1.jar app.jar
ENTRYPOINT ["java", "-Xmx256m", "-Xms128m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
-Xmx256m限制 JVM 内存,2G 机器必须加,否则 OOM。
4.6 nginx/nginx.conf
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_max_body_size 50m;
gzip on;
gzip_min_length 1k;
gzip_comp_level 4;
gzip_types text/plain text/css application/javascript application/json image/jpeg image/png image/gif;
server {
listen 80;
server_name _;
root /var/www/aurora/blog;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location ^~ /api/ {
proxy_pass http://backend:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 8001;
server_name _;
root /var/www/aurora/admin;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location ^~ /api/ {
proxy_pass http://backend:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
5. 上传 + 启动
5.1 上传(Mac 本地执行)
# 3 个配置文件
scp ~/Desktop/project/Blog/aurora-deploy/docker-compose.yml blog@你的IP:~/aurora/
scp ~/Desktop/project/Blog/aurora-deploy/backend/Dockerfile blog@你的IP:~/aurora/backend/
scp ~/Desktop/project/Blog/aurora-deploy/nginx/nginx.conf blog@你的IP:~/aurora/nginx/
# 后端 jar
scp ~/Desktop/project/Blog/aurora/aurora-springboot/target/aurora-springboot-0.0.1.jar blog@你的IP:~/aurora/backend/
# 数据库脚本
scp ~/Desktop/project/Blog/aurora/aurora-springboot/sql/aurora.sql blog@你的IP:~/aurora/
# 前端 dist(注意 /. 是拷内容,别搞反 blog/admin)
scp -r ~/Desktop/project/Blog/aurora/aurora-vue/aurora-blog/dist/. blog@你的IP:~/aurora/frontend/blog/
scp -r ~/Desktop/project/Blog/aurora/aurora-vue/aurora-admin/dist/. blog@你的IP:~/aurora/frontend/admin/
5.2 启动
cd ~/aurora
docker compose up -d --build
第一次会拉镜像 + 构建后端 + MySQL 初始化(导入 aurora.sql),需几分钟。
5.3 验证
docker compose ps # 5 个服务都 Up
docker compose logs backend --tail 50 # 看到 Started ...Application / Tomcat started on 8080
浏览器访问:
- 前台:
http://你的IP/ - 后台:
http://你的IP:8001/(默认账号admin@163.com/123456,登录后立刻改密码)
6. 运维速查
cd ~/aurora
docker compose ps # 查看容器状态
docker compose logs -f backend # 实时看后端日志(Ctrl+C 退出)
docker compose restart # 重启所有
docker compose down # 停止(数据保留)
docker compose up -d # 再启动
docker compose up -d --build # 更新代码后重建
更新代码流程
- 本地改代码 → 重新打包 jar / dist
scp覆盖上传对应文件cd ~/aurora && docker compose up -d --build
数据备份
- 数据库数据在
~/aurora/mysql-data/(挂载卷) - Redis 在
redis-data/,RabbitMQ 在rabbitmq-data/ - 干净的数据库备份用 mysqldump:
docker compose exec mysql mysqldump -uroot -pAurora@2026 aurora > aurora-backup.sql
远程连接数据库(SSH 隧道)
默认不把 3306 暴露到公网,需要临时连库排查时走 SSH 隧道,用完关掉。
-
compose 已映射回环端口(
docker-compose.yml里已加127.0.0.1:3306:3306,只绑服务器本机,公网访问不到)。 -
建立隧道(Mac 本地执行,保持终端开着):
ssh -N -L 3306:127.0.0.1:3306 blog@你的IP断线自动重连 + 后台常驻可用 autossh:
brew install autossh autossh -M 0 -f -N -L 3306:127.0.0.1:3306 blog@你的IP -
连接:隧道建立后,数据库地址填
127.0.0.1:3306(不是服务器 IP)。- Host
127.0.0.1/ Port3306/ Userroot/ PasswordAurora@2026/ Databaseaurora - 命令行:
mysql -h 127.0.0.1 -P 3306 -uroot -pAurora@2026 aurora
- Host
-
GUI 推荐:免费首选 DBeaver(或 Mac 上更轻的 Sequel Ace);付费选 TablePlus / Navicat。这些 GUI 自带 SSH 隧道:连接配置里除 MySQL 页外,再填 SSH 页(
blog@你的IP:22+ 登录密码/密钥),数据库主机填127.0.0.1:3306即可,无需手动跑ssh -L。 -
安全建议:改掉
Aurora@2026弱密码;尽量不用 root,建只读账号blog_read。
待补充的功能
| 功能 | 现状 | 方案 |
|---|---|---|
| 图片上传 | ✅ 已配 MinIO(公开只读) | 完成 |
| GitHub 登录 | ✅ 已实现(OAuth) | 完成 |
| QQ 登录 | 未使用(图标保留) | 不配置 |
| 邮件通知 | Gmail SMTP 已配(待验证) | 已填 Gmail 应用密码 |
| 域名 + HTTPS | 未配置 | 买域名 + certbot 免费证书 |
7. 踩坑记录汇总
| # | 问题 | 报错/现象 | 解决 |
|---|---|---|---|
| 1 | 后端编译 JDK 版本 | IllegalAccessError: LombokProcessor ... module jdk.compiler does not export |
IDEA 里项目 SDK 和 Maven Runner 的 JRE 都设成 JDK 8(列表里叫 jdk 1.8) |
| 2 | 前端 sass 版本 | PostCSS received undefined instead of CSS string |
npm install -D sass@1.32.13,且用 Node 16(Node 24 太新) |
| 3 | application.yml 写错位置 | 真正配置在 application-prod.yml |
改 profiles.active: prod,改 prod 文件,别堆在 application.yml |
| 4 | 搜索策略 | 默认 elasticsearch,2G 跑不动 |
search.mode: mysql |
| 5 | ES 地址导致启动失败 | EsSearchStrategyImpl 无条件注入 ES 客户端 |
ES uris 填合法值 http://localhost:9200 |
| 6 | Docker Hub 被墙/路由差 | dial tcp ... i/o timeout |
配镜像加速器 docker.m.daocloud.io |
| 7 | rabbitmq 镜像 tag | 3-management 返回 403 |
该 tag 不存在,用 rabbitmq:management |
| 8 | 前台/后台 dist 上传错位 | 80 显示后台、8001 报 403 | 重新上传,blog→blog、admin→admin |
| 9 | 日志命令报错 | unknown flag: --no-pager |
用 docker compose logs backend --tail 50 |
| 10 | 重建后端后访问 502 | nginx 缓存了旧的后端 IP | docker compose restart nginx |
| 11 | MinIO 图片网页不显示 | bucket 默认私有,浏览器 403 | mc 设 anonymous set download local/aurora |
8. GitHub 登录(后加功能)
在原本「邮箱 + QQ」登录基础上,新增 GitHub OAuth 登录(QQ 需国内互联注册、服务器在香港也不方便,故改用 GitHub)。
后端改动
LoginTypeEnum加GITHUB(3, "GitHub登录", "githubLoginStrategyImpl")- 新建
GithubConfigProperties(prefixgithub)、GithubLoginVO(字段code) - 新建
GithubLoginStrategyImpl(继承AbstractSocialLoginStrategyImpl:用授权码换 token,再拉 GitHub 用户信息) UserAuthController加POST /users/oauth/github,UserAuthService/ServiceImpl加githubLogin
前端改动(aurora-blog)
config.ts加githubLogin(CLIENT_ID、REDIRECT_URI)Controls.vue登录弹窗加 GitHub 图标按钮(QQ 和 GitHub 两个 SVG 图标等大、居中、同一排)router/index.ts加/oauth/login/github回调路由OauthLogin.vue加 GitHub 回调处理(取route.query.code→ 调githubLogin接口)api.ts加githubLogin
配置(application-prod.yml)
github:
clientId: 你的ClientID
clientSecret: 你的ClientSecret
tokenUrl: https://github.com/login/oauth/access_token
userInfoUrl: https://api.github.com/user
GitHub OAuth App 申请
在 https://github.com/settings/developers 建 OAuth App:Homepage URL 填 http://你的IP/,Authorization callback URL 填 http://你的IP/oauth/login/github。
后台显示修复
aurora-admin 的 User.vue 里 loginType == 3 原本显示「微博」,改成「GitHub」,筛选下拉也加了 GitHub 选项。
相关踩坑
- 前端
Login.vue登录请求没有.catch(),后端报错会静默失败(表现为「没反应」) - 登录图标按钮用
justify-content: center需要给容器加width: 100%,否则按钮靠左
文档持续更新中:后续完善邮件验证、域名 HTTPS 后,再补充对应章节。