似た記事は世にたくさんあるんですが、自分の備忘録も兼ねて記事化してみます。
といってもdocker-compose.yml貼り付けだけですけども💦
nginx配下でpathでrocketchat、jenkinsを振り分けつつ、SSL/TSLアクセラレータとしても機能させています。
rochetchat: https://hogehoge.com:8443/roccketchat/
rochetchat: https://hogehoge.com:8443/jenkins/
オレオレ証明書運用ですので、昨今のブラウザに怒られないように&アクセス制限をかけるためにCA証明書込のクライアント証明書(p12形式)配布の形態で運用しようとしています。
以下の流れで整備しました
- rocketchat公式の”docker-compose.yml”ベース
- jenkinsをサービスとして追加。定義はjenkins公式を参照。ビルドしてるのはjqをパッケージインストールしたかったから。
- nginxをサービスとして追加。
- 証明書を用意するまで非SSL/TSL
- nginxのproxy_pass機能確認後、個別のポートを閉じる(開けておくと動かなかった時に個別にアクセスできると便利)
- タイムゾーンは.env でTZ=Asia/Tokyo定義して全コンテナのenvironmentで反映。jenkinsだけはjava方式で別だて。
- pathによるバックエンドアプリへのproxy_pass切り替えはコメントの部分がポイント。nginx配下にした時hubotのユーザーがrocketchatでオフラインになって困った。
- rocketchatのROOT_URLを変更したら、「管理」->「設定」「全般」の「サイトURL」を更新すること。ROOT_URLの値は初回参照のみで以降db登録されたURLが使用される。
- ここのdocker-compose.ymlには書いていないけど、hubotはInternet先のjsアクセスに行くのでproxy下の場合はhubotコンテナに対してproxy設定が必要(別途機会があれば。http_proxy等の環境変数系で、.envへの定義とenvironmentへの反映です)
docker-compose.yml
version: '3' services: web: image: nginx volumes: - ./nginx/backendapps.template:/etc/nginx/templates/backendapps.template - ./nginx/certs:/etc/nginx/certs command: /bin/bash -c "envsubst < /etc/nginx/templates/backendapps.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" ports: # - 8081:8081 - 8443:8443 depends_on: - jenkins - rocketchat environment: - TZ rocketchat: image: rocketchat/rocket.chat:latest command: > bash -c "for i in `seq 1 30`; do node main.js && s=$$? && break || s=$$?; echo \"Tried $$i times. Waiting 5 secs...\"; sleep 5; done; (exit $$s)" restart: unless-stopped volumes: - ./rocketchat/uploads:/app/uploads environment: - TZ - PORT=3000 # rocketchatサーバーのrootがhttp://<host>:<port>/recketchat/ になるように # - ROOT_URL=http://localhost:3000/ - ROOT_URL=http://localhost:3000/rocketchat - MONGO_URL=mongodb://mongo:27017/rocketchat - MONGO_OPLOG_URL=mongodb://mongo:27017/local - MAIL_URL=smtp://smtp.email # - HTTP_PROXY=http://proxy.domain.com # - HTTPS_PROXY=http://proxy.domain.com depends_on: - mongo # nginxでhttps://<host FQDN>:8443/pathでrecketchat/jenkinsを振り分ける為個別ポートは閉じる # ports: # - 3000:3000 labels: - "traefik.backend=rocketchat" - "traefik.frontend.rule=Host: your.domain.tld" mongo: image: mongo:4.0 restart: unless-stopped environment: - TZ volumes: - ./rocketchat/data/db:/data/db #- ./data/dump:/dump command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1 labels: - "traefik.enable=false" # this container's job is just run the command to initialize the replica set. # it will run the command and remove himself (it will not stay running) mongo-init-replica: image: mongo:4.0 environment: - TZ command: > bash -c "for i in `seq 1 30`; do mongo mongo/rocketchat --eval \" rs.initiate({ _id: 'rs0', members: [ { _id: 0, host: 'localhost:27017' } ]})\" && s=$$? && break || s=$$?; echo \"Tried $$i times. Waiting 5 secs...\"; sleep 5; done; (exit $$s)" depends_on: - mongo # hubot, the popular chatbot (add the bot user first and change the password before starting this image) hubot: image: rocketchat/hubot-rocketchat:latest restart: unless-stopped environment: - TZ # hubotからの接続先を rocketchatサーバーrootの変更に合わせる # - ROCKETCHAT_URL=rocketchat:3000 - ROCKETCHAT_URL=rocketchat:3000/rocketchat - ROCKETCHAT_ROOM=GENERAL - ROCKETCHAT_USER=botuser - ROCKETCHAT_PASSWORD=botpass - BOT_NAME=botuser # you can add more scripts as you'd like here, they need to be installable by npm - EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics depends_on: - rocketchat labels: - "traefik.enable=false" volumes: - ./rocketchat/hubot/scripts:/home/hubot/scripts # this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier # ports: # - 3001:8080 jenkins: build: context: . dockerfile: ./docker/jenkins/Dockerfile restart: unless-stopped environment: - TZ # jenkinsサーバーのrootがhttp://<host>:<port>/jenkins/ になるように - JENKINS_OPTS=--prefix=/jenkins # - JAVA_OPTS=-Dhudson.model.DirectoryBrowserSupport.CSP= -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true -Duser.timezone=Asia/Tokyo # 認証ありproxy下でpuluginサイトアクセスが407エラーとなる場合の対処(Java11以降) - JAVA_OPTS=-Djdk.http.auth.tunneling.disabledSchemes= -Dhudson.model.DirectoryBrowserSupport.CSP= -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true -Duser.timezone=Asia/Tokyo volumes: - ./jenkins/jenkins_home:/var/jenkins_home # nginxでhttps://<host FQDN>:8443/pathでrecketchat/jenkinsを振り分ける個別ポートは閉じる # ports: # - 8080:8080 #traefik: # image: traefik:latest # restart: unless-stopped # command: > # traefik # --docker # --acme=true # --acme.domains='your.domain.tld' # --acme.email='your@email.tld' # --acme.entrypoint=https # --acme.storagefile=acme.json # --defaultentrypoints=http # --defaultentrypoints=https # --entryPoints='Name:http Address::80 Redirect.EntryPoint:https' # --entryPoints='Name:https Address::443 TLS.Certificates:' # ports: # - 80:80 # - 443:443 # volumes: # - /var/run/docker.sock:/var/run/docker.sock