# 在Dokku上部署后端应用

本指南提供了详细的说明,教你如何在 Muyan Dokku PAAS 平台上部署后端应用。

# 部署步骤

# 在Dokku上创建新的后端应用:

  • 使用命令 ssh root@your-dokku-host登录到你的Dokku主机。
  • 使用命令 dokku apps:create samt-server创建新应用。

# 添加 persistent storage

  • 使用命令

    mkdir /home/dokku/vv_storage;dokku storage:mount samt-server /home/dokku/vv_storage/samt-server:/app/attachments

    将 persistent storage 挂载到你的应用,在 host 主机上的对应目录为 /home/dokku/vv_storage

  • 然后使用命令 dokku ps:restart samt-server 来重新启动应用,使该生效配置。

# 添加PostgreSQL插件:

  • (在Muyan PaaS平台上不需要) 使用命令 dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres添加 PostgreSQL 插件。
  • 使用命令 dokku postgres:create samt_postgres创建新的 PostgreSQL 服务。
  • 使用命令 dokku postgres:link samt_postgres samt-server将 PostgreSQL 服务链接到你的应用。

# 添加Redis插件:

  • (在Muyan PaaS平台上不需要) 使用命令 dokku plugin:install https://github.com/dokku/dokku-redis.git redis添加 Redis 插件。
  • 使用命令 dokku redis:create samt_redis创建新的 Redis 服务。
  • 使用命令 dokku redis:link samt_redis samt-server将 Redis 服务链接到你的应用。

# 添加LetsEncrypt插件:

  • (在Muyan PaaS平台上不需要) 使用命令dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git添加 LetsEncrypt 插件。
  • (在Muyan PaaS平台上不需要) 使用命令dokku config:set --no-restart samt-server DOKKU_LETSENCRYPT_EMAIL=<your_email_address>配置插件。
  • 使用命令 dokku domains:add samt-server samt-server.muyan.io 来添加域名 samt-server.muyan.io 到你的应用。
  • 使用命令 dokku letsencrypt:enable samt-server 添加 LetsEncrypt HTTPS 证书。

# 设置环境变量:

  • 使用命令 dokku config:set samt-server GRAILS_ENV=reviewGRAILS_ENV环境变量设置为 review
  • 使用命令 dokku config:set samt-server PAAS_VENDOR=dokkuPAAS_VENDOR环境变量设置为 dokku

# 将域名绑定到后端应用:

  • 使用命令 dokku domains:add samt-server samt-server.muyan.io将域名 samt-server.muyan.io 绑定到你的应用。

# 添加新的域名映射到前端并刷新LetsEncrypt:

  • 使用命令 dokku domains:add muyan samt.muyan.iosamt.muyan.io添加到前端应用。
  • 使用命令 dokku letsencrypt:enable muyan刷新前端应用的LetsEncrypt证书。

# 使用 GitHub Action 部署到 Dokku

以下的 github action 配置文件将在每次推送到 dev 分支时自动部署到 Dokku。

将以下名为deploy-to-dokku.yml的文件放在你的仓库的 .github/workflows 文件夹中。 确保已定义操作秘钥 DOKKU_SSH_PRIVATE_KEY 以成功部署。

name: Deploy to Dokku on samt-server.muyan.io

on:
  push:
    branches:
      - dev

jobs:

  cancel:
    name: 'Cancel Previous Runs'
    runs-on: ubuntu-latest
    timeout-minutes: 3
    steps:
      - uses: styfle/cancel-workflow-[email protected]
        with:
          all_but_latest: true
          access_token: ${{ github.token }}

  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout Code
      uses: actions/checkout@v3
      with:
        fetch-depth: 0

    - name: Deploy to Dokku
      uses: idoberko2/dokku-deploy-github-action@v1
      with:
        ssh-private-key: ${{ secrets.DOKKU_SSH_PRIVATE_KEY }}
        dokku-host: 'muyan.io'
        app-name: 'samt-server'
        remote-branch: 'dev'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 配置详情

配置项 描述
Dokku主机名 your-host-host 请根据实际情况进行更改
应用名称 samt-server Dokku 应用的名称
附件存储目录 /home/dokku/vv_storage/samt-server 该目录在容器中的 mount 目录为 /app/attachments
Postgres服务名称 samt_postgres PostgreSQL 服务的名称
Redis服务名称 samt_redis Redis 服务的名称
后端域名 samt-server.muyan.io 用于访问后端服务的域名
前端域名 samt.muyan.io 用于访问前端UI的域名(已部署)

# 环境变量

变量名 描述
PAAS_VENDOR dokku docker-entrypoint.sh 中使用的 PaaS 供应商标志

提示

需要确保种子数据中,如下两个配置的值正确,否则会导致附件上传失败,或者容器重启后, 已上传附件丢失。

  1. Key 为 attachment.storageEngine (名称: 附件存储引擎) 的 DynamicConfig 值为 LOCAL_FILE
  2. Key 为 attachment.local.folder (名称: 本地引擎存储目录) 的 DynamicConfig 值为 /app/attachments

提示

前端已经部署并可以访问。你只需要将域名 samt.muyan.io 绑定到前端应用,并启用 LetsEncrypt 证书。

# Dokku 命令参考

# 基本应用维护

  • 创建应用: dokku apps:create <应用名称>

  • 删除应用: dokku apps:destroy <应用名称>

  • 列出所有应用: dokku apps:list

  • 查看应用日志: dokku logs <应用名称>

  • 环境变量管理:

    • 查看应用的所有环境变量:dokku config <应用名称>
    • 为应用设置环境变量:dokku config:set <应用名称> KEY1=VALUE1 KEY2=VALUE2
    • 删除应用的环境变量:dokku config:unset <应用名称> KEY1 KEY2
  • 停止和启动应用:

    • 停止应用:dokku ps:stop <应用名称>
    • 启动应用:dokku ps:start <应用名称>
    • 重新启动应用:dokku ps:restart <应用名称>
  • 挂载磁盘:

    • 创建挂载点:dokku storage:mount <应用名称> /var/lib/dokku/data/storage:/app/storage 将 host 下的 /var/lib/dokku/data/storage 挂载到容器内的 /app/storage
    • 查看挂载点:dokku storage:list <应用名称> 查看应用的所有挂载点
    • 使挂载生效:dokku ps:restart <应用名称> 重启应用使挂载生效
    • 删除挂载点:dokku storage:unmount <应用名称> /app/storage 删除容器内的 /app/storage 挂载点
  • 应用的域名管理:

    • 为应用设置域名:dokku domains:add <应用名称> your-subdomain.yourdomain.com
    • 查看应用的所有域名:dokku domains:report <应用名称>
    • 删除应用的某个域名:dokku domains:remove <应用名称> your-subdomain.yourdomain.com
  • 查看 Dokku 的帮助: 对于任何命令,您都可以添加 --help 参数来查看命令的帮助和用法。

# Redis 插件

  • 创建 Redis 服务: dokku redis:create <服务名称>
  • 链接 Redis 服务到应用: dokku redis:link <服务名称> <应用名称>
  • 删除 Redis 服务: dokku redis:destroy <服务名称>
  • 查看 Redis 服务信息: dokku redis:info <服务名称>

# PostgreSQL 插件

  • 创建 PostgreSQL 服务: dokku postgres:create <服务名称>
  • 链接 PostgreSQL 服务到应用: dokku postgres:link <服务名称> <应用名称>
  • 删除 PostgreSQL 服务: dokku postgres:destroy <服务名称>
  • 查看 PostgreSQL 服务信息: dokku postgres:info <服务名称>

# Let's Encrypt 插件

  • 为应用设置邮箱(用于 Let's Encrypt 证书过期通知): dokku config:set --no-restart <应用名称> [email protected]
  • 为应用启用 Let's Encrypt: dokku letsencrypt:enable <应用名称>
  • 查看 Let's Encrypt 证书信息: dokku letsencrypt:ls
  • 更新 Let's Encrypt 证书: dokku letsencrypt:auto-renew <应用名称>

# 常见问题

# 如果后端服务无法访问该怎么办?

如果后端服务无法访问,检查 Dockerfile 中是否 EXPOSE 了任何端口。如果是,删除 EXPOSE 部分。Dokku 会自动处理端口映射。在 Dockerfile 中手动暴露特定端口会干扰 Dokku 的自动端口转发。

Last Updated: 2024/12/4 13:00:56