dokku
是什么?一句话概括就是一个几百行shell代码的高可扩展性的类Heroku
的单服务器PAAS平台,利用它可以简化很多docker操作,更加方便我们维护一个docker driven
的平台。
- 创建机器,选择
Ubuntu
系统,同时做好域名映射
- 安装
dokku
1 2
| wget https://raw.githubusercontent.com/dokku/dokku/v0.14.5/bootstrap.sh sudo DOKKU_TAG=v0.14.5 bash bootstrap.sh
|
然后打开对应的域名,完成dokku
的初始化
3. 创建gogs
应用,参照https://dokku.github.io/tutorials/deploying-gogs-to-dokku
其中推送代码部分可以用tag
部署方式,所有命令如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| dokku apps:create gogs
dokku domains:add gogs gogs.erguotou.me
dokku proxy:ports-add gogs http:80:3000 dokku docker-options:add gogs deploy -p 2222:22 mkdir -p /var/lib/dokku/data/storage/gogs chown -R dokku:dokku /var/lib/dokku/data/storage/gogs dokku storage:mount gogs /var/lib/dokku/data/storage/gogs:/data
dokku plugin:install https://github.com/dokku/dokku-mysql.git mysql dokku mysql:create gogs dokku mysql:link gogs gogs
docker pull gogs/gogs docker tag gogs/gogs dokku/gogs dokku tags:deploy gogs
|
- 使用Let’s Encrypt进行https加密
1 2 3 4
| sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git dokku config:set --global [email protected] dokku letsencrypt gogs dokku letsencrypt:cron-job --add
|
完成之后打开web页面完成gogs
的install
,注意配置页面的各设置(mysql的配置地址可以用dokku mysql:info gogs
查看。即使设置错了,也可以后期使用dokku enter gogs
,在/data/gogs/conf/app.ini
中直接修改),其中SSH 端口号
填2222
,HTTP 端口号
填3000
,。
5. 创建drone
应用,drone
分server
端和agent
端
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 36 37 38 39 40
| export RPC_SECRET=09asudjfkqwn41u2389ahnoqwjn123 dokku apps:create drone
dokku domains:add drone drone.erguotou.me dokku proxy:ports-add drone http:80:80 https:443:80
docker pull drone/drone docker tag drone/drone dokku/drone dokku storage:mount drone /var/run/docker.sock:/var/run/docker.sock mkdir -p /var/lib/dokku/data/storage/drone chown -R dokku:dokku /var/lib/dokku/data/storage/drone dokku storage:mount drone /var/lib/dokku/data/storage/drone:/data
dokku config:set drone DRONE_GOGS_SERVER=https://gogs.erguotou.me DRONE_GIT_ALWAYS_AUTH=true DRONE_RUNNER_CAPACITY=1 DRONE_SERVER_PROTO=https DRONE_SERVER_HOST=drone.erguotou.me DRONE_RPC_SECRET=$RPC_SECRET
dokku tags:deploy drone
dokku letsencrypt drone
dokku apps:create drone-agent dokku storage:mount drone-agent /var/run/docker.sock:/var/run/docker.sock dokku config:set drone-agent DRONE_RPC_SERVER=https://drone.erguotou.me DRONE_RPC_SECRET=$RPC_SECRET docker pull drone/agent docker tag drone/agent dokku/drone-agent dokku tags:deploy drone-agent
|
- 检查应用运行情况
可使用的命令
1 2 3 4 5 6
| dokku proxy:report app dokku proxy:ports-remove app http:80:3000 dokku proxy:ports-add app http:80:3000 cat /home/dokku/app/nginx.conf dokku ps:stop app dokku ps:start app
|
- 创建自己的应用
在dokku
中创建对应的app dokku apps:create gift
,完成域名映射,配置proxy:ports
,使用Let's encrypt
插件进行https加密,这些步骤就不多说了。接着在gogs中创建对应的一个仓库,记得项目根目录下要有一个.drone.yml
文件(参考https://docs.drone.io/user-guide/进行配置),然后提交代码。
- 自动发布应用
CD可以有很多种方法,具体还得根据部署环境决定。可以直接用drone
中现有的插件去实现也可以自己去开发drone
的插件。下面记录的是以前的骚操作完成的项目部署方案。
上一步只能使用drone进行自动构建,要想将构建后的项目自动打包发布,还需要一些额外的操作(这里也是坑了自己好久,主要难题是如何将drone agent生成的文件发布到dokku git里,后来经人提醒可以通过共享ssh的方式,然后后续的共享ssh的操作也是摸索了好久才成功,可谓一路心酸)。
- 找1台虚机生成一份新的ssh公私钥对(也可以本地备份原来的,然后重新生成)
1
| ssh-keygen -t rsa -C "dokku-deploy"
|
- 将上一步生成的
id_rsa.pub
上传至服务器并添加到dokku中1 2 3 4
| scp ~/.ssh/id_rsa.pub [email protected]:/root/deploy.pub
dokku ssh-keys:add deploy ./deploy.pub
|
- 项目根目录新建一个
ssh
目录,然后将上一步生成的ssh公私钥复制进去
- 修改原来的
.drone.yml
,在原来build之后添加一些操作1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| - rm -rf ~/.ssh - mkdir -p ~/.ssh - cp ssh/* ~/.ssh - chmod 600 ~/.ssh/id_rsa - chmod 644 ~/.ssh/id_rsa.pub - ssh-keyscan erguotou.me >> ~/.ssh/known_hosts - ssh-keyscan 45.77.42.201 >> ~/.ssh/known_hosts - echo 'FROM ilyasemenov/dokku-static-site' > dist/Dockerfile - cd dist - git config --global user.email "[email protected]" - git config --global user.name "erguotou" - git init - git add ./ -A - git commit -m "auto build" - git remote add dokku [email protected]:gift - git push -u dokku master --force
|
至此就完成了自动化部署的工作,现在就可以访问https://gift.erguotou.me了。