为了方便部署,我们可以创建一个 Dockerfile 来打包我们的应用。这将允许我们在任何支持 Docker 的环境中轻松部署我们的博客系统。以下是创建 Dockerfile 和相关文件的步骤:

  1. 创建 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"]
  1. 创建 .dockerignore 文件

在项目根目录创建一个 .dockerignore 文件,以排除不需要复制到 Docker 镜像中的文件:

node_modules
npm-debug.log
.git
.gitignore
.env
  1. 更新 package. Json

确保你的 package.json 文件中有正确的启动脚本:

{
  "scripts": {
    "start": "bun run src/index.ts",
    "dev": "bun run --watch src/index.ts"
  }
}
  1. 创建 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"
  1. 创建 .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 中,以避免将敏感信息提交到版本控制系统。

  1. 构建和运行 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

这将构建镜像并启动容器。

  1. 部署注意事项
  • 数据库:确保你的 Turso 数据库是可以从你的部署环境访问的。
  • 环境变量:在部署环境中正确设置所有必要的环境变量。
  • HTTPS:在生产环境中,确保使用 HTTPS。你可能需要设置反向代理(如 Nginx)来处理 SSL 终止。
  • 持久化:考虑如何持久化数据,特别是如果你在容器中存储了任何数据(如上传的图片)。
  • 日志:配置适当的日志记录,以便于调试和监控。
  • 监控:考虑添加健康检查和监控解决方案。
  1. 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 设置将使你的博客系统更容易部署和扩展。它封装了所有依赖,确保了在不同环境中的一致性。然而,请记住在生产环境中适当地处理安全性、性能优化和数据持久化等问题。