技术笔记

手把手用 Docker Compose 部署一个全栈 Nuxt 3 博客

从零开始,用 Docker Compose 部署一套 Nuxt 3 + Hono + PostgreSQL 的全栈博客系统,包含 Nginx 反代、SSL 证书、Live2D 等完整配置。

2026-06-178 分钟阅读48 Views
手把手用 Docker Compose 部署一个全栈 Nuxt 3 博客

手把手用 Docker Compose 部署一个全栈 Nuxt 3 博客

这篇文章记录了我部署 龙的中二幻想空间 的全过程,从项目结构到上线踩坑。

项目结构

这套博客是 monorepo 架构:

dragon-blog/
├── apps/
│   ├── web/        # Nuxt 3 (SSR 前端)
│   ├── admin/      # Vue 3 SPA (后台管理)
│   └── api/        # Hono (API 服务)
├── packages/
│   ├── types/      # 共享类型定义
│   ├── utils/      # 工具函数
│   └── i18n/       # 国际化
├── docker/
│   └── nginx/      # Nginx 配置
├── docker-compose.yml
└── public/images/  # 静态资源

为什么选这套技术栈

  • Nuxt 3 — SSR 对 SEO 友好,Vue 生态成熟
  • Hono — 轻量级 Node.js API 框架,比 Express 快
  • PostgreSQL — 稳定可靠,社区支持强
  • Docker Compose — 一套命令部署所有服务

Docker Compose 配置

核心是 5 个容器:webadminapinginxpostgres

version: "3.8"
services:
  postgres:
    image: postgres:16-alpine
    volumes:
      - dragon_postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: dragon_archive
      POSTGRES_USER: dragon
      POSTGRES_PASSWORD: ${DB_PASSWORD}

  api:
    build: ./apps/api
    depends_on:
      - postgres
    environment:
      DATABASE_URL: postgres://dragon:${DB_PASSWORD}@postgres:5432/dragon_archive
    volumes:
      - dragon_uploads:/app/uploads

  web:
    build: ./apps/web
    depends_on:
      - api
    environment:
      API_BASE_URL: http://api:3001

  admin:
    build: ./apps/admin
    depends_on:
      - api

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./docker/nginx:/etc/nginx/conf.d
      - ./public:/var/www/public
      - dragon_uploads:/var/www/uploads
      - /etc/letsencrypt:/etc/letsencrypt:ro
    depends_on:
      - web
      - admin
      - api

踩坑记录

1. Nginx 反代跨域

前端走 jinlong.work,API 走 jinlong.work/api,后台走 houtai.jinlong.work。Nginx 统一反代解决跨域:

server {
    listen 443 ssl;
    server_name jinlong.work www.jinlong.work;

    location /api/ {
        proxy_pass http://api:3001/;
        proxy_set_header Host $host;
    }

    location / {
        proxy_pass http://web:3000;
    }
}

server {
    listen 443 ssl;
    server_name houtai.jinlong.work;

    location / {
        proxy_pass http://admin:8080;
    }
}

2. SSL 证书

三个子域名三张证书,用 Let’s Encrypt 单独签:

certbot certonly --standalone -d jinlong.work -d www.jinlong.work
certbot certonly --standalone -d houtai.jinlong.work

3. 图片存储

图片存在 Docker volume 里,Nginx 直接 serve public/images/ 目录。如果图片不更新,检查 nginx 缓存配置。

4. 重启 API 后商店数据不更新

这个博客的数据存在 cms-store.json 文件里,API 启动时读到内存。改了文件后必须重启容器:

docker compose restart api

总结

Docker Compose 部署的优点是可复现 — 换台服务器,git clone + docker compose up 就完事。

缺点是调试麻烦,日志要 docker logs 看,改配置要重启容器。但整体来说对于个人项目,这个方案够用了。

下一篇写 Live2D 接入踩的那些坑。

© 2026 龙的中二幻想空间 Dragon Fantasy Archive. All rights reserved.

归档标签分类ICP 备案 202400001号-1