Docker 部署

使用 Docker Compose 或 Docker CLI 部署 FlecBlog。

Docker Compose

Docker Compose 是最推荐的部署方式,一行命令即可启动全部服务。

前置要求

  • 已安装 Docker
  • 已安装 Docker Compose

验证安装:

docker --version
docker-compose --version

配置步骤

  1. 创建项目目录
mkdir -p /srv/flecblog
cd /srv/flecblog
  1. 创建 .env 配置文件
# 数据库密码(请修改为强密码)
DB_PASSWORD=your_database_password

# JWT 密钥(请修改为随机字符串)
JWT_SECRET=your_jwt_secret

# API 对外访问地址
API_URL=http://服务器IP:8080/api/v1
  1. 创建 docker-compose.yml
services:
  postgres:
    image: postgres:15-alpine
    container_name: flec_postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - flec-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

  server:
    image: talen8/flec-server:latest
    container_name: flec_server
    restart: unless-stopped
    environment:
      DB_HOST: postgres
      DB_PORT: 5432
      DB_NAME: postgres
      DB_USER: postgres
      DB_PASSWORD: ${DB_PASSWORD}
      JWT_SECRET: ${JWT_SECRET}
    ports:
      - "8080:8080"
    volumes:
      - /srv/flecblog:/app/data
    networks:
      - flec-network
    depends_on:
      postgres:
        condition: service_healthy

  blog:
    image: talen8/flec-blog:latest
    container_name: flec_blog
    restart: unless-stopped
    environment:
      NUXT_PUBLIC_API_URL: ${API_URL}
    ports:
      - "3000:3000"
    networks:
      - flec-network
    depends_on:
      - server

  admin:
    image: talen8/flec-admin:latest
    container_name: flec_admin
    restart: unless-stopped
    environment:
      API_URL: ${API_URL}
    ports:
      - "4000:4000"
    networks:
      - flec-network
    depends_on:
      - server

networks:
  flec-network:
    driver: bridge

volumes:
  postgres_data:
  1. 启动服务
docker-compose up -d
  1. 验证服务状态
docker-compose ps

正常情况下会看到四个服务都处于 Up 状态。

访问服务

  • 博客端:http://服务器IP:3000
  • 管理端:http://服务器IP:4000

初始账号 初始账号密码为 admin@example.com / 123456

常用操作

# 查看所有服务日志
docker-compose logs -f

# 查看指定服务日志
docker-compose logs -f server
docker-compose logs -f blog
docker-compose logs -f admin

# 重启服务
docker-compose restart

# 停止服务
docker-compose down

# 更新版本
# 拉取最新镜像
docker-compose pull

# 重启服务
docker-compose up -d

Docker CLI

如果你需要更灵活地控制各个服务,或者只想部署其中部分服务,可以使用 Docker 逐个部署。

创建网络

docker network create flec-network

部署 PostgreSQL

docker run -d \
  --name flec_postgres \
  --restart unless-stopped \
  --network flec-network \
  -e POSTGRES_DB=postgres \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=your_database_password \
  -v postgres_data:/var/lib/postgresql/data \
  postgres:15-alpine

部署后端

docker run -d \
  --name flec_server \
  --restart unless-stopped \
  --network flec-network \
  -e DB_HOST=flec_postgres \
  -e DB_PORT=5432 \
  -e DB_NAME=postgres \
  -e DB_USER=postgres \
  -e DB_PASSWORD=your_database_password \
  -e JWT_SECRET=your_jwt_secret \
  -p 8080:8080 \
  -v /srv/flecblog:/app/data \
  talen8/flec-server:latest

部署前端

后端服务启动成功后,即可部署博客端和管理端,这两个服务没有先后顺序要求,可以按需部署。

1. 博客端:

docker run -d \
  --name flec_blog \
  --restart unless-stopped \
  --network flec-network \
  -e NUXT_PUBLIC_API_URL=http://服务器IP:8080/api/v1 \
  -p 3000:3000 \
  talen8/flec-blog:latest

2. 管理端:

docker run -d \
  --name flec_admin \
  --restart unless-stopped \
  --network flec-network \
  -e API_URL=http://服务器IP:8080/api/v1 \
  -p 4000:4000 \
  talen8/flec-admin:latest

http://服务器IP:8080/api/v1 为 API 对外访问地址,暂时使用端口访问。

初始账号 初始账号密码为 admin@example.com / 123456

常用操作

查看状态

docker ps

查看日志

docker logs -f flec_server
docker logs -f flec_blog
docker logs -f flec_admin
docker logs -f flec_postgres

重启服务

docker restart flec_server
docker restart flec_blog
docker restart flec_admin
docker restart flec_postgres

停止和删除

docker stop flec_blog flec_admin flec_server flec_postgres
docker rm flec_blog flec_admin flec_server flec_postgres

更新版本

docker pull talen8/flec-server:latest
docker stop flec_server
docker rm flec_server
# 之后重新执行部署命令

外部访问

Docker 部署完成后,服务运行在服务器的 3000、4000、8080 端口。要让外部用户通过域名访问,需要进行以下配置。

域名准备

将域名解析到服务器 IP(以下用于对应参考):

  • blog.yourdomain.com → 博客端
  • admin.yourdomain.com → 管理端
  • api.yourdomain.com → 后端

Nginx 反向代理

# 博客端
server {
    listen 80;
    server_name blog.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

# 管理端
server {
    listen 80;
    server_name admin.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:4000;
        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;
    }
}

# 后端 API
server {
    listen 80;
    server_name api.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1: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;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

重载 Nginx

sudo nginx -t && sudo systemctl reload nginx

SSL 证书

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d blog.yourdomain.com -d admin.yourdomain.com -d api.yourdomain.com

更新 API 地址

配置完成后,由于前面 API 地址配置的是服务器端口地址,那么这里需要更新为代理的域名。

Docker Compose

修改 .env 文件中的 API_URL,如 https://api.yourdomain.com/api/v1,然后重启:

docker-compose up -d

Docker CLI

删除并重新创建容器,将部署命令中的端口地址修改为 https://api.yourdomain.com/api/v1

docker rm -f flec_blog flec_admin
# 重新执行部署命令

常见问题

执行 docker-compose up -d 后,容器没有全部启动成功怎么办?

先查看服务状态:

docker-compose ps

如果某个容器状态不是 Up,请继续查看日志:

docker-compose logs -f

也可以只查看指定服务日志:

docker-compose logs -f server
docker-compose logs -f blog
docker-compose logs -f admin
docker-compose logs -f postgres

通常可以根据日志内容快速定位问题,例如端口占用、环境变量配置错误、数据库连接失败等。


访问博客端或管理端时打不开页面怎么办?

请按以下顺序检查:

  1. 确认容器是否正常运行:
    docker-compose ps
    
  2. 确认服务器防火墙或云服务商安全组已放行对应端口:
    • 博客端:3000
    • 管理端:4000
    • 后端:8080
  3. 确认访问地址是否正确,例如:
    • http://服务器IP:3000
    • http://服务器IP:4000
  4. 如果已经配置了 Nginx 反向代理,请改为使用对应域名访问。

页面可以打开,但没有数据,或者请求接口失败怎么办?

这通常是 API_URL 配置错误导致的。

请检查 .env 文件中的 API_URL 是否填写正确,例如:

API_URL=http://服务器IP:8080/api/v1

如果已经配置了域名和 Nginx,应该改为:

API_URL=https://api.yourdomain.com/api/v1

修改后重新启动服务:

docker-compose up -d

如果是使用 Docker CLI 部署,则需要删除并重新创建 flec_blogflec_admin 容器。


执行 docker-compose 命令时提示命令不存在怎么办?

请先确认是否已正确安装 Docker Compose:

docker --version
docker-compose --version

如果系统中使用的是新版 Docker Compose 插件,可能需要使用:

docker compose version

此时可将文中的 docker-compose 命令替换为 docker compose 执行。


启动时提示端口被占用怎么办?

如果提示 3000、4000 或 8080 端口已被占用,说明宿主机已有其他服务正在使用这些端口。

修改 docker-compose.yml 中的端口映射,例如:

ports:
  - "3001:3000"

表示将宿主机 3001 端口映射到容器内的 3000 端口。

修改后重新启动:

docker-compose up -d

如果修改了博客端或管理端访问端口,请使用新的端口访问页面。


修改 .env 配置后为什么没有生效?

修改 .env 后,需要重新创建相关容器,配置才会生效。

建议执行:

docker-compose up -d

如果仍未生效,可以强制重新创建:

docker-compose up -d --force-recreate

如何确认后端 API 是否正常工作?

可以直接在浏览器或命令行中访问你配置的 API 地址进行测试,例如:

http://服务器IP:8080

或者在配置域名后访问:

https://api.yourdomain.com

如果能正常返回 Flec-Server 运行成功,说明后端服务已启动。

如果无法访问,请优先检查:

  • flec_server 容器是否正常运行
  • API_URL 是否填写正确
  • 防火墙或安全组是否已放行 8080
  • Nginx 反向代理是否配置正确

配置了域名后,为什么仍然访问的是服务器端口地址?

如果前面部署时 API_URL 填的是:

API_URL=http://服务器IP:8080/api/v1

那么在完成域名和 Nginx 配置后,需要将其改为正式域名地址:

API_URL=https://api.yourdomain.com/api/v1

然后重新启动前端相关服务,使配置生效。


配置 Nginx 后访问域名出现 502 怎么办?

502 Bad Gateway 一般表示 Nginx 没有成功连接到后端服务。

请重点检查以下内容:

  1. 对应容器是否正常运行:
    docker-compose ps
    
  2. Nginx 配置中的 proxy_pass 是否写对,例如:
    proxy_pass http://127.0.0.1:3000;
    proxy_pass http://127.0.0.1:4000;
    proxy_pass http://127.0.0.1:8080;
    
  3. Nginx 配置修改后是否已重载:
    sudo nginx -t && sudo systemctl reload nginx
    
  4. 服务端口是否确实在宿主机上监听。

配置 HTTPS 后页面仍提示不安全怎么办?

请检查:

  1. 域名是否正确解析到服务器 IP
  2. 证书是否申请成功
  3. Nginx 是否已正确加载证书配置
  4. 是否仍在使用 http:// 访问,而不是 https://

申请证书后,建议再次执行:

sudo nginx -t && sudo systemctl reload nginx

并使用浏览器重新访问对应域名。


重新部署后,数据还在吗?

如果你没有手动删除数据库卷,数据会保留。

本教程中的 PostgreSQL 使用的是 Docker 卷:

postgres_data

因此即使删除并重新创建容器,只要没有删除对应数据卷,数据库数据仍会保留。


为什么管理端或博客端更新后页面内容没有变化?

这通常有几种原因:

  1. 镜像没有成功拉取到最新版本
  2. 旧容器没有被重新创建
  3. 浏览器缓存未刷新
  4. 实际访问的仍然是旧域名、旧端口或旧服务

建议按以下顺序排查:

docker-compose pull
docker-compose up -d

如果仍无变化,可尝试强制重建:

docker-compose up -d --force-recreate

然后清理浏览器缓存后重新访问。