Strapi 无头 CMS 搭建教程
Strapi 是目前最流行的开源 Node.js 无头 CMS 之一,提供了可视化的内容类型构建器和功能完善的管理面板。开发者可以通过 Strapi 快速设计内容结构,自动生成 REST 和 GraphQL API,然后在任何前端框架中使用这些 API 展示内容。本文将介绍如何在搬瓦工 VPS 上部署 Strapi。部署前请确保已安装好 Docker 和 Docker Compose。
一、系统要求
- 操作系统:Ubuntu 20.04+ 或 Debian 11+。
- 内存:至少 2GB,建议 4GB(Strapi 构建时需要较多内存)。
- 磁盘:至少 15GB 可用空间。
- Node.js:如果不使用 Docker,需要 Node.js 18 或 20。
二、使用 Docker Compose 部署
创建项目目录:
mkdir -p /opt/strapi
cd /opt/strapi
创建 docker-compose.yml 文件:
cat > /opt/strapi/docker-compose.yml <<'EOF'
version: '3.8'
services:
postgres:
image: postgres:15-alpine
restart: always
environment:
POSTGRES_DB: strapi
POSTGRES_USER: strapi
POSTGRES_PASSWORD: your_db_password
volumes:
- postgres_data:/var/lib/postgresql/data
strapi:
image: strapi/strapi:latest
restart: always
depends_on:
- postgres
ports:
- "1337:1337"
environment:
DATABASE_CLIENT: postgres
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_NAME: strapi
DATABASE_USERNAME: strapi
DATABASE_PASSWORD: your_db_password
APP_KEYS: "key1,key2,key3,key4"
API_TOKEN_SALT: "your-api-token-salt"
ADMIN_JWT_SECRET: "your-admin-jwt-secret"
TRANSFER_TOKEN_SALT: "your-transfer-token-salt"
JWT_SECRET: "your-jwt-secret"
NODE_ENV: production
volumes:
- strapi_data:/srv/app
volumes:
postgres_data:
strapi_data:
EOF
生成所需的随机密钥:
# 生成 APP_KEYS(需要 4 个 base64 编码的密钥,用逗号分隔)
for i in {1..4}; do openssl rand -base64 16; done
# 生成其他密钥
openssl rand -hex 32
三、原生 Node.js 部署(可选)
如果不想使用 Docker,也可以直接通过 Node.js 部署:
# 安装 Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
# 创建 Strapi 项目
npx create-strapi-app@latest my-project --quickstart --no-run
cd /opt/strapi/my-project
# 构建并启动
NODE_ENV=production npm run build
NODE_ENV=production npm run start
四、启动 Strapi
cd /opt/strapi
docker compose up -d
首次启动需要较长时间来初始化数据库和构建管理面板。查看日志:
docker compose logs -f strapi
当看到类似 "Strapi started" 的信息时,表示启动成功。
五、配置 Nginx 反向代理
apt install nginx certbot python3-certbot-nginx -y
cat > /etc/nginx/sites-available/strapi <<'EOF'
server {
listen 80;
server_name cms.yourdomain.com;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:1337;
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;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
EOF
ln -s /etc/nginx/sites-available/strapi /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
certbot --nginx -d cms.yourdomain.com
六、初始化管理面板
访问 https://cms.yourdomain.com/admin,首次访问会要求创建超级管理员账户。登录后你会看到以下核心功能模块:
- Content-Type Builder:可视化设计内容类型结构。
- Content Manager:管理已创建的内容。
- Media Library:上传和管理媒体文件。
- Settings:配置角色、权限、Webhook 等。
七、创建内容类型
在 Content-Type Builder 中创建新的内容类型。例如创建一个 "Article" 类型:
- title:短文本(必填)。
- content:富文本。
- slug:UID 字段(基于 title 自动生成)。
- cover:媒体字段(单个图片)。
- category:关系字段(多对一)。
- published_at:日期时间字段。
保存后 Strapi 会自动重启并生成对应的 API 端点。
八、配置 API 权限
默认情况下,所有 API 端点都需要认证才能访问。在 Settings > Roles > Public 中配置公开访问权限:
- 勾选 Article 的 find 和 findOne 权限,允许公开读取文章列表和详情。
- 创建(create)、更新(update)、删除(delete)等操作保持需要认证。
九、API 使用示例
# 获取文章列表
curl https://cms.yourdomain.com/api/articles
# 带筛选和分页
curl "https://cms.yourdomain.com/api/articles?filters[category][name][\$eq]=tech&pagination[page]=1&pagination[pageSize]=10&sort=publishedAt:desc"
# 带关联数据
curl "https://cms.yourdomain.com/api/articles?populate=category,cover"
十、数据备份与升级
# 备份数据库
docker exec strapi-postgres-1 pg_dump -U strapi strapi > /opt/strapi/backup_$(date +%Y%m%d).sql
# 升级 Strapi
cd /opt/strapi
docker compose pull
docker compose up -d
十一、常见问题
构建内存不足
Strapi 在构建管理面板时需要较多内存。如果内存不足导致构建失败,可以创建 swap 空间:
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
管理面板加载缓慢
确保 NODE_ENV 设置为 production,生产模式下管理面板会使用预构建的静态文件。
总结
Strapi 是一款成熟且功能丰富的无头 CMS,拥有活跃的社区和丰富的插件生态。在搬瓦工 VPS 上部署 Strapi 后,你可以快速为博客、企业官网、电商等项目构建内容管理后端。建议选择 2GB 以上内存的方案。更多教程请参考:Directus 部署、Wiki.js 部署、BookStack 部署。选购搬瓦工 VPS 请参考全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的循环折扣。