Aurora 个人博客建站过程

· coding · #博客搭建

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)

  1. 改配置:见 3.4,先改 application.yml + application-prod.yml
  2. 配 JDK 8:File → Project Structure(⌘;)→ Project → SDK → 8(即 jdk 1.8)
    • 没有 JDK 8 就 Add SDK → Download JDK → Version 8
  3. Maven 的 JRE 也要设 8:Settings(⌘,)→ Build Tools → Maven → Runner → JRE → 8(这一步最容易漏,漏了编译报 Lombok 错)
  4. Maven 面板 → Lifecycle → 双击 clean → 双击 package
  5. 产物: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

浏览器访问:


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        # 更新代码后重建

更新代码流程

  1. 本地改代码 → 重新打包 jar / dist
  2. scp 覆盖上传对应文件
  3. cd ~/aurora && docker compose up -d --build

数据备份

远程连接数据库(SSH 隧道)

默认不把 3306 暴露到公网,需要临时连库排查时走 SSH 隧道,用完关掉。

  1. compose 已映射回环端口(docker-compose.yml 里已加 127.0.0.1:3306:3306,只绑服务器本机,公网访问不到)。

  2. 建立隧道(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
    
  3. 连接:隧道建立后,数据库地址填 127.0.0.1:3306(不是服务器 IP)。

    • Host 127.0.0.1 / Port 3306 / User root / Password Aurora@2026 / Database aurora
    • 命令行:mysql -h 127.0.0.1 -P 3306 -uroot -pAurora@2026 aurora
  4. GUI 推荐:免费首选 DBeaver(或 Mac 上更轻的 Sequel Ace);付费选 TablePlus / Navicat。这些 GUI 自带 SSH 隧道:连接配置里除 MySQL 页外,再填 SSH 页(blog@你的IP:22 + 登录密码/密钥),数据库主机填 127.0.0.1:3306 即可,无需手动跑 ssh -L。

  5. 安全建议:改掉 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)。

后端改动

前端改动(aurora-blog)

配置(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 选项。

相关踩坑


文档持续更新中:后续完善邮件验证、域名 HTTPS 后,再补充对应章节。

← 全部文章