Help us understand the problem. What is going on with this article?

docker-composeでNginx+Gitea+Droneを設定

docker-composeでNginx+Gitea+Droneを設定

Vagarnt上のCentOS7でdocker-composeを使ったNginx(リバースプロキシ)+Gitea+DroneCI(1.6.1)の環境を構築する際にハマったのでメモ。

そもそもポート番号が入っててもいいじゃん、IP直打ちでOKって人は読まないで大丈夫です。GiteaとDroneの公式のやり方で多分動くはず。公式以外でもググれば動くサンプルはあると思います。

事前準備と共通ルール

事前にこのページこのページを参考にオレオレ証明書を作っておく。
mac Catalinaは証明書の期限を10年にすると怒られるので825日で作成。Windowsは知らない。

Nginxのproxy_passで指定しやすいように、dockerコンテナはコンテナ名を付けるのと固定IP化をした。

Giteaの設定

SSLはNginxでやるのでGiteaのapp.iniをいじる必要は無かった。

docker-composeの設定

公式通り設定すれば何も問題無く起動するはず。
自分はGiteaのDBにMysql5.7を指定したので、インストール画面でMysqlコンテナのIP+ポート番号を入れる。

Nginxの設定

httpからhttpsへのリダイレクトはNginxの公式などで適当に。自分はGiteaをメインのドメインで動くように設定をした。
location内のproxy_passをdocker-composeで指定した固定IPとGiteaのポート番号にする。

nginx-default.conf
    location / {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host drone.example.com;
        proxy_pass       http://172.18.0.3:3000;
        proxy_redirect   off;
        proxy_buffering  off;
        chunked_transfer_encoding off;
     }

Giteaは特にハマること無く簡単に起動までイケる。

DroneCIの設定

ドキュメントが追いついていない印象。チャットdiscourseで検索した方が早く見つかるかも。

サブドメインで運用しようと思ったが、何故か接続出来なかったり、リダイレクトした時にGiteaが見れなくなったりどハマりした。

docker-composeの設定

extra_hostsにGiteaを入れたドメインとホスト(Vagrant)のIPを入れる

docker-compose.yml
container_name: drone-server
ports:
  - "8000:8000"
  - "9000:9000"
extra_hosts:
  - example.com:xxx.xxx.xxx.xxx(VAGRANT-IP)

8080→80のサンプルをよく見たが、自分の環境では動かなかった。
DroneのエージェントはDRONE_RPC_SERVERにポート番号も含める。

docker-compose.yml
DRONE_RPC_SERVER=drone-server:9000

Nginxの設定

httpからhttpsにリダイレクトする部分はサブドメインを直書き。

ngx-drone.conf
return 301 https://drone.example.com$request_uri;
ngx-drone.conf
    location / {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host drone.example.com;#サブドメインを直書き
        proxy_pass       http://172.18.0.4;#コンテナのIPのみ
        proxy_redirect off;
        proxy_buffering off;
        chunked_transfer_encoding off;
     }

動いてしまえばなんてことないが、Giteaの設定をした後だったのでproxy_passにポート番号を入れないのは気が付くのにスゴく時間が掛かった…。
OAuthの画面からリダイレクトしたらGiteaのドメインが見つからないエラーが出てしまいまた悩んでしまった…。

まとめ

Vagrantでこういう開発環境を構築する人っていないんだろうか…。
各技術の理解力が足りないのもあるが、問題の切り分けがムズく、とりあえず、ウェブブラウザで画面の確認をした所で力尽きた…。
もうIP直打ち、ポート番号丸見えでも良いじゃんw
最後に設定例のdocker-compose.ymlを。

docker-compose.yml
version: "3"
services:
  proxy:
    image: nginx:latest
    container_name: proxy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    networks:
      my_lo_net:
        ipv4_address: 172.18.0.1
    volumes:
      - ./nginx-cnf/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx-cnf/ngx-drone.conf:/etc/nginx/conf.d/ngx-drone.conf
      - ./certs:/etc/nginx/certs
  mysql:
    image: mysql:5.7.28
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    networks:
      my_lo_net:
        ipv4_address: 172.18.0.2
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxxxxxxxxxxxxxxxx
      - MYSQL_DATABASE=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=xxxxxxxxxxxxxxxxxxxx
    volumes:
      - ./gitea-db/:/var/lib/mysql
      - ./mysql-cnf:/etc/mysql/conf.d
  gitea:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - ./gitea-data:/data
    restart: always
    networks:
      my_lo_net:
        ipv4_address: 172.18.0.3
    ports:
      - "2222:22"
      - "3000:3000"
    depends_on:
      - mysql
  drone-server:
    image: drone/drone:latest
    container_name: drone-server
    ports:
      - "8000:8000"
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./drone-data/:/var/lib/drone/:rw
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_GITEA_SERVER=https://example.com
      - DRONE_GITEA_SKIP_VERIFY=true
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_AGENTS_ENABLED=true
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_SERVER_HOST=drone.example.com
      - DRONE_SERVER_PROTO=https
      - DRONE_GITEA_CLIENT_ID=xxxxxxxxxxxxxxxxxxxx
      - DRONE_GITEA_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxx
      - DRONE_RPC_SECRET=xxxxxxxxxxxxxxxxxxxx
      - DRONE_TLS_AUTOCERT=true
      - DRONE_USER_CREATE=username:xxxxx,admin:true
      - DRONE_GIT_USERNAME=xxxxx
      - DRONE_GIT_PASSWORD=xxxxx
      - DRONE_TLS_CERT=./certs/cert.pem
      - DRONE_TLS_KEY=./certs/privkey.pem
      #- DRONE_LOGS_DEBUG=true
      #- DRONE_LOGS_TRACE=true
      - TZ=Asia/Tokyo
    restart: always
    networks:
      my_lo_net:
        ipv4_address: 172.18.0.4
    extra_hosts:
      - example.com:xxx.xxx.xxx.xxx(VAGRANT-IP)
  drone-agent:
    image: drone/agent:latest
    container_name: drone-agent
    command: agent
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_SERVER=drone-server:9000
      - DRONE_RPC_SECRET=xxxxxxxxxxxxxxxxxxxx
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=drone-runner
      - DRONE_LOGS_DEBUG=true
      - TZ=Asia/Tokyo
    restart: always
    networks:
      my_lo_net:
        ipv4_address: 172.18.0.5
networks:
  my_lo_net:
    external: true
BKmamba
使い慣れているのはPHP、書いてて楽しいのはGolang。 SQLは出来るだけ標準で書くように心掛けてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした