Docker 部署
Docker Compose
Docker Compose 是最推荐的部署方式,一行命令即可启动全部服务。
前置要求
- 已安装 Docker
- 已安装 Docker Compose
验证安装:
docker --version
docker-compose --version
配置步骤
- 创建项目目录
mkdir -p /srv/flecblog
cd /srv/flecblog
- 创建 .env 配置文件
# 数据库密码(请修改为强密码)
DB_PASSWORD=your_database_password
# JWT 密钥(请修改为随机字符串)
JWT_SECRET=your_jwt_secret
# API 对外访问地址
API_URL=http://服务器IP:8080/api/v1
- 创建 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}
API_URL: ${API_URL}
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:
- 启动服务
docker-compose up -d
- 验证服务状态
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 \
-e API_URL=http://服务器IP:8080/api/v1 \
-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
通常可以根据日志内容快速定位问题,例如端口占用、环境变量配置错误、数据库连接失败等。
访问博客端或管理端时打不开页面怎么办?
请按以下顺序检查:
- 确认容器是否正常运行:
docker-compose ps - 确认服务器防火墙或云服务商安全组已放行对应端口:
- 博客端:3000
- 管理端:4000
- 后端:8080
- 确认访问地址是否正确,例如:
http://服务器IP:3000http://服务器IP:4000
- 如果已经配置了 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_blog 和 flec_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 没有成功连接到后端服务。
请重点检查以下内容:
- 对应容器是否正常运行:
docker-compose ps - 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; - Nginx 配置修改后是否已重载:
sudo nginx -t && sudo systemctl reload nginx - 服务端口是否确实在宿主机上监听。
配置 HTTPS 后页面仍提示不安全怎么办?
请检查:
- 域名是否正确解析到服务器 IP
- 证书是否申请成功
- Nginx 是否已正确加载证书配置
- 是否仍在使用
http://访问,而不是https://
申请证书后,建议再次执行:
sudo nginx -t && sudo systemctl reload nginx
并使用浏览器重新访问对应域名。
重新部署后,数据还在吗?
如果你没有手动删除数据库卷,数据会保留。
本教程中的 PostgreSQL 使用的是 Docker 卷:
postgres_data
因此即使删除并重新创建容器,只要没有删除对应数据卷,数据库数据仍会保留。
为什么管理端或博客端更新后页面内容没有变化?
这通常有几种原因:
- 镜像没有成功拉取到最新版本
- 旧容器没有被重新创建
- 浏览器缓存未刷新
- 实际访问的仍然是旧域名、旧端口或旧服务
建议按以下顺序排查:
docker-compose pull
docker-compose up -d
如果仍无变化,可尝试强制重建:
docker-compose up -d --force-recreate
然后清理浏览器缓存后重新访问。