为了方便部署,我们可以创建一个 Dockerfile 来打包我们的应用。这将允许我们在任何支持 Docker 的环境中轻松部署我们的博客系统。以下是创建 Dockerfile 和相关文件的步骤:
- 创建 Dockerfile
在项目根目录创建一个名为 Dockerfile 的文件,内容如下:
# 使用 Bun 的官方镜像作为基础镜像
FROM oven/bun:1 as base
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 bun.lockb(如果存在)
COPY package.json bun.lockb ./
# 安装依赖
RUN bun install --frozen-lockfile
# 复制源代码
COPY . .
# 构建应用(如果需要的话)
# RUN bun run build
# 暴露端口
EXPOSE 3000
# 运行应用
CMD ["bun", "run", "src/index.ts"]- 创建 .dockerignore 文件
在项目根目录创建一个 .dockerignore 文件,以排除不需要复制到 Docker 镜像中的文件:
node_modules
npm-debug.log
.git
.gitignore
.env
- 更新 package. Json
确保你的 package.json 文件中有正确的启动脚本:
{
"scripts": {
"start": "bun run src/index.ts",
"dev": "bun run --watch src/index.ts"
}
}- 创建 docker-compose. Yml 文件(可选)
如果你想使用 Docker Compose 来管理你的应用和数据库,可以创建一个 docker-compose.yml 文件:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- TURSO_DATABASE_URL=${TURSO_DATABASE_URL}
- TURSO_AUTH_TOKEN=${TURSO_AUTH_TOKEN}
- JWT_SECRET=${JWT_SECRET}
- SMTP_HOST=${SMTP_HOST}
- SMTP_PORT=${SMTP_PORT}
- SMTP_SECURE=${SMTP_SECURE}
- SMTP_USER=${SMTP_USER}
- SMTP_PASS=${SMTP_PASS}
volumes:
- ./src:/app/src
- ./public:/app/public
depends_on:
- db
db:
image: turso/turso-local:latest
volumes:
- ./data:/var/lib/turso
ports:
- "5432:5432"- 创建 .env 文件
创建一个 .env 文件来存储环境变量:
TURSO_DATABASE_URL=your_database_url
TURSO_AUTH_TOKEN=your_auth_token
JWT_SECRET=your_jwt_secret
SMTP_HOST=your_smtp_host
SMTP_PORT=your_smtp_port
SMTP_SECURE=true_or_false
SMTP_USER=your_smtp_username
SMTP_PASS=your_smtp_password
确保将 .env 文件添加到 .gitignore 中,以避免将敏感信息提交到版本控制系统。
- 构建和运行 Docker 镜像
现在你可以构建和运行 Docker 镜像了:
# 构建镜像
docker build -t my-blog-app .
# 运行容器
docker run -p 3000:3000 --env-file .env my-blog-app如果你使用 Docker Compose:
docker-compose up --build这将构建镜像并启动容器。
- 部署注意事项
- 数据库:确保你的 Turso 数据库是可以从你的部署环境访问的。
- 环境变量:在部署环境中正确设置所有必要的环境变量。
- HTTPS:在生产环境中,确保使用 HTTPS。你可能需要设置反向代理(如 Nginx)来处理 SSL 终止。
- 持久化:考虑如何持久化数据,特别是如果你在容器中存储了任何数据(如上传的图片)。
- 日志:配置适当的日志记录,以便于调试和监控。
- 监控:考虑添加健康检查和监控解决方案。
- CI/CD 集成
如果你使用 CI/CD 系统,你可以创建一个工作流来自动构建和部署你的 Docker 镜像。例如,使用 GitHub Actions:
创建 .github/workflows/deploy.yml 文件:
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build and push Docker image
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
run: |
docker build -t username/my-blog-app:latest .
echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin
docker push username/my-blog-app:latest
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
docker pull username/my-blog-app:latest
docker stop my-blog-app || true
docker rm my-blog-app || true
docker run -d --name my-blog-app -p 3000:3000 --env-file .env username/my-blog-app:latest记得在 GitHub 仓库的 Secrets 中设置必要的密钥。
这个 Docker 设置将使你的博客系统更容易部署和扩展。它封装了所有依赖,确保了在不同环境中的一致性。然而,请记住在生产环境中适当地处理安全性、性能优化和数据持久化等问题。