利用dokku打造自己的私有云仓库和自动化部署

利用dokku打造自己的私有云仓库和自动化部署

dokku是什么?一句话概括就是一个几百行shell代码的高可扩展性的类Heroku的单服务器PAAS平台,利用它可以简化很多docker操作,更加方便我们维护一个docker driven的平台。

  1. 创建机器,选择Ubuntu系统,同时做好域名映射
  2. 安装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
# 如果选择用mysql作为gogs数据库需要执行下面这些
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
  1. 使用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页面完成gogsinstall,注意配置页面的各设置(mysql的配置地址可以用dokku mysql:info gogs查看。即使设置错了,也可以后期使用dokku enter gogs,在/data/gogs/conf/app.ini中直接修改),其中SSH 端口号2222HTTP 端口号3000,。
5. 创建drone应用,droneserver端和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
# server
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
# 这里同样适用sqlite作为数据库
# dokku mysql:create drone
# dokku mysql:link drone drone
## 暂时不能使用最新版本,坑了很久
# docker pull drone/drone:latest
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
# 配置drone的环境变量
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 config:set drone DRONE_OPEN=false DRONE_GOGS_PRIVATE_MODE=true DRONE_DATABASE_DRIVER=mysql DRONE_DATABASE_DATASOURCE='root:password@tcp(1.2.3.4:3306)/drone?parseTime=true' DRONE_HOST=https://drone.erguotou.me DRONE_GOGS=true DRONE_GOGS_URL=https://gogs.erguotou.me DRONE_SECRET=secret DRONE_ADMIN=username,password
dokku tags:deploy drone
# dokku proxy:ports-add drone http:80:8000
# dokku proxy:ports-remove drone http:443:443 http:8000:8000 http:80:80
dokku letsencrypt drone
# agent
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
## agent,暂时不能使用最新版,直接使用docker命令启动,看最新版源码里/ws/broker请求都没有了
# dokku apps:create drone-agent
# docker pull drone/agent:latest
# docker tag drone/agent:latest dokku/drone-agent:latest
# docker run -d -e DRONE_SERVER=wss://drone.erguotou.me/ws/broker -e DRONE_SECRET=password -e DRONE_TIMEOUT=15m -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name=drone-agent-docker drone/drone:0.7.3 agent
# 配置agent的环境变量
# dokku config:set drone-agent DRONE_SERVER=wss://drone.erguotou.me/ws/broker DRONE_SECRET=secret
# dokku storage:mount drone-agent /var/run/docker.sock:/var/run/docker.sock
# dokku tags:deploy drone-agent latest
  1. 检查应用运行情况
    可使用的命令
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
  1. 创建自己的应用
    dokku中创建对应的app dokku apps:create gift,完成域名映射,配置proxy:ports,使用Let's encrypt插件进行https加密,这些步骤就不多说了。接着在gogs中创建对应的一个仓库,记得项目根目录下要有一个.drone.yml文件(参考https://docs.drone.io/user-guide/进行配置),然后提交代码。
  2. 自动发布应用
    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
    # local
    scp ~/.ssh/id_rsa.pub [email protected]:/root/deploy.pub
    # server
    dokku ssh-keys:add deploy ./deploy.pub
  • 项目根目录新建一个ssh目录,然后将上一步生成的ssh公私钥复制进去
    1
    cp ~/.ssh/id_rsa* ./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 # 特别要注意这3行
    - 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 # 根据自己的项目选择合适的Dockerfile或者实现适合自己项目的Dockerfile,也可以使用buildpacks
    - 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了。

利用dokku打造自己的私有云仓库和自动化部署

https://blog.erguotou.me/dokku_ci_cd.html

作者

二锅头

发布于

2017-07-09

许可协议

CC BY-NC-SA 4.0

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×