Dokku This Smallest Paas Implementation

on 2024-07-01

Dokku 简介

The smallest PaaS implementation you've ever seen

Dokku helps you build and manage the lifecycle of applications

——《Dokku官方介绍

Dokku 是一个基于 Docker 的小型 PaaS 平台, 可以帮助你实现轻松的管理你的服务的生命周期, 包括创建数据库, 管理域名, 生成 HTTPS 密钥, 自动化编译部署等

安装 Dokku

官方推荐的安装方法有以下三种, 个人建议非 arch 系统使用 bash script

  1. bash script

    # for debian systems, installs dokku via apt-get
    wget https://raw.githubusercontent.com/dokku/dokku/v0.27.6/bootstrap.sh
    sudo DOKKU_TAG=v0.27.6 bash bootstrap.sh
    # Configure your server domain via `dokku domains:set-global`
    # and user access (via `dokku ssh-keys:add`) to complete the installation
    
  2. apt

    # install docker
    wget -nv -O - https://get.docker.com/ | sh
    # setup dokku apt repository
    wget -nv -O - https://packagecloud.io/dokku/dokku/gpgkey | apt-key add -
    export SOURCE="https://packagecloud.io/dokku/dokku/ubuntu/"
    export OS_ID="$(lsb_release -cs 2>/dev/null || echo "bionic")"
    echo "bionic focal jammy" | grep -q "$OS_ID" || OS_ID="bionic"
    echo "deb $SOURCE $OS_ID main" | tee /etc/apt/sources.list.d/dokku.list
    apt-get update
    # install dokku
    apt-get install dokku
    dokku plugin:install-dependencies --core # run with root!
    # Configure your server domain via `dokku domains:set-global`
    # and user access (via `dokku ssh-keys:add`) to complete the installation
    
  3. arch

    # install dokku via yay
    yay -S dokku
    

配置 Dokku

配置 SSH 密钥

  1. 生成密钥(可选)

    如果没有 SSH 密钥, 可用以下命令生成

    ssh-keygen
    # 输入命令后会让你输入 
    # 1. 密钥保存位置, 默认为 ~/.ssh
    # 2. 密钥密码, 可以直接回车
    # 3. 重复密钥密码
    

    完成后, 可以在 ~/.ssh 下看到 id_rsa.pubid_rsa, 即 SSH 公钥与私钥

  2. 向服务器导入密钥

    ssh-copy-id {{.your-server-user}}@{{.your-server-host}}
    # 例如 ssh-copy-id root@localhost
    

    输入命令后, 会要求你输入服务器密码, 完成后就会自动将公钥上传至服务端

  3. 将密钥添加至 Dokku

    使用步骤2中的服务器用户登录服务器, 然后输入以下命令

    cat ~/.ssh/authorized_keys | dokku ssh-keys:add admin
    

配置域名

使用以下命令配置 Dokku

dokku domains:set-global {{.your-server-host}}
# 例如 dokku domains:set-global xilin.icu

使用Dokku

创建应用程序

创建一个名为 blog 的应用

dokku apps:create blog

分配子域名

域名信息的常用操作

# 查询域名信息
dokku domains:report {{.your-app-name}}

# 删除域名
dokku domains:remove {{.your-app-name}} {{.domain}}

# 添加一个域名
dokku domains:add {{.your-app-name}} {{.domain}}

# 清空域名
dokku domains:clear {{.your-app-name}}

# 添加多个域名
dokku domains:set {{.your-app-name}} {{.domain-one}} {{.domain-two}}

通常为项目添加一个 www 的子域名

dokku domains:add blog www.xilin.icu

设置端口

端口管理常用操作

# 查询端口信息
dokku proxy:ports {{.your-app-name}}

# 删除端口
dokku proxy:ports-remove {{.your-app-name}} \
{{.protocol}}:{{.host-port}}:{{.container-port}}

# 添加端口
dokku proxy:ports-add {{.your-app-name}} \
{{.protocol}}:{{.host-port}}:{{.container-port}}

# 清除所有端口映射
dokku proxy:ports-clear {{.your-app-name}}

# 添加多个端口映射
dokku proxy:ports-set {{.your-app-name}} \
{{.protocol-one}}:{{.host-port-one}}:{{.container-port-one}} \
{{.protocol-two}}:{{.host-port-two}}:{{.container-port-two}}

默认会将容器内的 5000 端口, 映射到外部的 HTTP:80HTTPS:443 端口, 可以改为容器内的 80 端口

dokku proxy:ports-clear blog
dokku proxy:ports-set blog http:80:80 https:443:80

设置转发

通常我们并不直接使用二级域名, 而是使用 www 之类的三级域名

安装转发插件

dokku plugin:install https://github.com/dokku/dokku-redirect.git

转发常用操作

# 查看转发设置
dokku redirect {{.your-app-name}}

# 设置转发
dokku redirect:set {{.your-app-name}} {{.source}} {{.dest}}

# 清除转发
dokku redirect:unset {{.your-app-name}} {{.source}}

将我们的二级域名转发至三级域名

dokku redirect:set blog xilin.icu www.xilin.icu

设置SSL

Let's Encrypt is a non-profit certificate authority run by Internet Security Research Group (ISRG) that provides X.509 certificates for Transport Layer Security (TLS) encryption at no charge. It is the world's largest certificate authority, used by more than 265 million websites, with the goal of all websites being secure and using HTTPS. The Internet Security Research Group (ISRG), the provider of the service, is a public benefit organization. Major sponsors include the Electronic Frontier Foundation (EFF), the Mozilla Foundation, OVH, Cisco Systems, Facebook, Google Chrome, Internet Society, AWS, NGINX, and Bill and Melinda Gates Foundation. Other partners include the certificate authority IdenTrust, the University of Michigan (U-M), and the Linux Foundation.

——《Let's_Encrypt - 维基百科

Let's Encrypt 是一个免费签署 SSL 证书的机构, 向机构申请证书需要通过相关的验证, 同时申请的证书只有三个月的有效时间

因此 Dokku 使用 letsencrypt 插件管理 SSL 证书, 可以自动完成相关的验证, 同时会创建定时任务完成证书的续约

安装并配置 letsencrypt 插件

dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git

dokku config:set --global DOKKU_LETSENCRYPT_EMAIL={{.your-email}}

常用操作

# 开启证书管理
dokku letsencrypt:enable {{.your-app-name}}

# 关闭证书管理
dokku letsencrypt:disable {{.your-app-name}}

# 移除证书文件
dokku letsencrypt:cleanup {{.your-app-name}}

# 添加或移除自动续约任务
dokku letsencrypt:cron-job {{--add|--remove}}

为应用开启证书

dokku letsencrypt:enable blog

dokku letsencrypt:cron-job --add

使用项目

之后你可以在本地创建一个项目, 将 Dokku 作为一个远程仓库, 后续的修改直接推送至远程就可以完成自动部署

cd blog
git remote add dokku dokku@xilin.icu:blog
git push dokku main:master

Dokku 本身支持多种部署类型

个人偏好使用 Dockerfile, 只需要你在项目根目录下有一个 Dockerfile, 即可完成自动镜像构建与部署