# 在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=review
将GRAILS_ENV
环境变量设置为review
。 - 使用命令
dokku config:set samt-server PAAS_VENDOR=dokku
将PAAS_VENDOR
环境变量设置为dokku
。
# 将域名绑定到后端应用:
- 使用命令
dokku domains:add samt-server samt-server.muyan.io
将域名samt-server.muyan.io
绑定到你的应用。
# 添加新的域名映射到前端并刷新LetsEncrypt:
- 使用命令
dokku domains:add muyan samt.muyan.io
将samt.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'
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 供应商标志 |
提示
需要确保种子数据中,如下两个配置的值正确,否则会导致附件上传失败,或者容器重启后, 已上传附件丢失。
- Key 为
attachment.storageEngine
(名称: 附件存储引擎) 的 DynamicConfig 值为LOCAL_FILE
- 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 的自动端口转发。