有关strapi的docker部署

相信过来看这个教程的肯定是跟我一样的全栈开发者或者是前端开发者吧。毕竟strapi这个框架真的纯粹是提供API的。。。以我的角度来看

废话太多了,马上进入主题吧。

首先我得指出,官方其实已经不再维护任何的docker镜像了,上次的更新已经是v3版本(3年前)。现在是完全不能用的存在,但是社区的镜像吧。。。很多时候其实还是不能直接用的,毕竟有个问题不得不指出--这个玩意的数据库是在初始化阶段配置的,而且内置的数据库只有sqlite...大家想必都知道这个东西用起来还是性能不够。所以最后还是得配置外部得数据库

strapi的数据库配置在v4是靠.env来实现的,在启动的时候通过读取node.js的process.env来实现加载。也就是说,你可以现在就去dockerhub上随便拉个镜像然后自己引出来.env文件来自己改一下就行了。如果你觉得这样就ok,那就可以左转dockerhub了

但是其未必有v4的镜像,而现在社区的插件几乎都不兼容v5。所以看你的选择了。

Dockerfile自建一个镜像

如题,这里介绍的方法是基于Dockerfile自己构建的。这是以下的信息

  • Strapi v4.25.22
  • node:20.19.4-trixie
  • Mysql Ver 8.0.43-0

前置步骤

更新包管理器

	# 更新包管理器
	sudo apt update && sudo apt upgrade -y
	 
	# 安装必要的工具
	sudo apt install -y curl git build-essential

node.js的安装

	# 安装 nvm 
	curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
	 
	# 重新加载配置
	source ~/.bashrc
	 
	# 安装 Node.js LTS 版本
	nvm ls-remote
	nvm install v20.19.4
    # v4支持的node版本为18.x-20.x,这个可以在限制内随意选择
	 
	# 验证安装
	node --version
	npm --version

Mysql的配置

这里选择主机部署Mysql

	# 安装 MySQL
	sudo apt install -y mysql-server
	 
	# 启动 MySQL
	sudo systemctl start mysql
	sudo systemctl enable mysql
	 
	# 配置 MySQL 安全性
	sudo mysql_secure_installation
	 
	# 登录 MySQL 创建数据库和用户
	sudo mysql
	 
	# 创建数据库
	CREATE DATABASE strapi_project;
	 
	# 创建用户并允许远程访问
	# 注意:在生产环境中应该限制允许访问的 IP 地址
	# 这里用 '%' 而不是 'localhost' 以允许远程连接
	 
	# 本来是 GRANT ALL PRIVILEGES ON strapi_project.* TO 'strapi'@'localhost';
	#         CREATE USER 'strapi'@'localhost' IDENTIFIED BY 'password';
	 
	CREATE USER 'strapi'@'localhost' IDENTIFIED BY 'password';  
	GRANT ALL PRIVILEGES ON strapi_project.* TO 'strapi'@'localhost';
	FLUSH PRIVILEGES;
	EXIT;

这里需要注意一下,就是在执行完这些操作之后。如果你也遇到和我一样在.env文件里将DATABASE_CLIENT=mysql2,之后依旧无法正常连接。那就得修改一下mysql的认证方法。将caching_sha2_password修改为mysql_native_password

ALTER USER 'strapi'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;

主要原因是mysql的客户端版本对于验证方法的兼容性的问题。虽然理论上使用mysql2也可以,但是实际就是。。。没办法在用官方的工具创建完项目后通过.env修改client来成功连接。

貌似是一个bug...社区里面也有人提及,官方似乎只是在v5的介绍说会全面兼容mysql2 client(其实是把mysql client直接弃用)。

Strapi的初始化

这里选择Strapi v4.25.22,因为这是官方最后更新的v4版本,算是最后的维护了,v5现在社区几乎都不怎么支持。而且。。。其实strapi出于自己的自托管业务,似乎对于自部署的用户有很多的功能限制,砍过一些功能,我觉得开源项目是需要盈利来维持的,但是我真的建议大家多关注一下官方的更新动态以及谨慎升级


npx create-strapi-app@v4.25.22 strapi

讲几点注意的:

  • 选择custom来自定义
  • 不要选择ssl认证!(证书配置复杂的搞死你!!!)
  • 除非你对mysql的网络配置与我不同,不然就全部默认

好的如果不是什么未来可能导致的依赖问题,你应该就安装好了。那么接下来就是

cd strapi #进入项目

Dockerfile的编写

嗯,注意这个是在strapi的创建出来的目录下.

# 使用 Node.js 官方基础镜像
FROM node:20.19.4-trixie
#如果你使用的是其他的镜像就要注意下面的包管理器了

# 安装必要系统依赖
RUN apt-get update && \
    apt-get install -y \
        build-essential gcc autoconf automake zlib1g-dev libpng-dev libvips-dev python3 && \
    rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /opt/app

# 复制项目依赖文件并安装依赖
COPY package*.json ./
RUN npm install

# 复制项目全部文件
COPY . .

# 设置环境变量为开发模式
ENV NODE_ENV=development

# 暴露 Strapi 默认端口
EXPOSE 1337

# 启动开发模式
CMD ["npm", "run", "develop"]
#初始建议这么整,不然生产模式下,API都难以测试。。。

这么搞完之后就到了docker-compose.yml,其实建议在生产环境下将mysql也使用docker部署一个。

services:
  strapi:
    image: strapi-dev:v1 #这个是我自己build出来的名字
    container_name: strapi-cms
    network_mode: host  # 直接使用主机网络,容器可访问主机服务(docker容器其实有一个指定的IP作为网桥来连接主机,我这里是偷懒了)
    environment:
      NODE_ENV: development
    volumes:
    # - ./strapi:/opt/app                     # 代码和配置
     - ./strapi-uploads:/opt/app/public/uploads  # 上传文件持久化
     - ./strapi-extensions:/opt/app/src/extensions  # 插件扩展持久化
    command: npm run develop

这样如果要开发就将/opt/app cp出来,并且解除volumes的注释就行了。

不出意外的话,现在就可以正常运行了,可喜可贺!