対象
- redmineを動かしたい
- host環境はできるだけ汚したくない→dockerで解決
- 関連するサービスもdocker内で動かして、完結させたい→nginxを経由させる
対象外
以下については調査・検討中の事案につき、ここでは述べない
- dockerで出力されるログの取扱い
- redmineとgitbucketの連携
- そうそうに解決しないといけない問題
- GitHub - mikoto20000/redmine_git_branch_hook: Redmine Git branch related to the issue (検証中...)
- 統合認証
- LDAP Authentication Settings · gitbucket/gitbucket Wiki · GitHub
- Samba 4.4.xでActive Directoryを1から立てる – OSAKANA TAROのメモ帳 (この辺をDockerfileにもっていけば...)
- docker pitkley/samba-ad-dc (確認中...)
- 自動起動
- バックアップ
手順
Play with Docker dockerを一時的に動かして楽しめる環境があるので、そこで実験をした。
場所は任意ディレクトリで作業を行うこと。
docker-compose.yml
注意1:パスワード等は非常に脆弱なものを使用しているので、適切に修正すること。DBのパスワードを変更する場合は、後述の事前実行コマンド内の内容も変更すること。
注意2:play-with-dockerでviを使って以下のコマンドを貼り付けるとautoindentが効いてしまうので、「:set noautoindent」としてから貼り付けると幸せになる可能性がある。
version: '3.1' services: redmine: image: redmine:3.4.2-passenger #ports: # - "8080:3000" environment: REDMINE_DB_POSTGRES: db REDMINE_DB_PASSWORD: redmine REDMINE_DB_USERNAME: redmine REDMINE_DB_DATABASE: redmine RAILS_RELATIVE_URL_ROOT: /redmine #SMTP_USER: address@hoge.com #SMTP_PASS: password # restart: always depends_on: - adminer links: - db volumes: - /usr/src/redmine/files - ./redmine_config.ru:/usr/src/redmine/config.ru gitbucket: image: f99aq8ove/gitbucket environment: GITBUCKET_DB_URL: jdbc:postgresql://db/gitbucket GITBUCKET_DB_USER: gitbucket GITBUCKET_DB_PASSWORD: gitbucket JAVA_OPTS: -Xmx1g GITBUCKET_OPTS: --prefix=/gitbucket depends_on: - adminer volumes: - /gitbucket ports: - "29418:29418" #- "8418:8080" links: - db db: image: postgres:9.6-alpine environment: POSTGRES_PASSWORD: example POSTGRES_USER: work volumes: - /var/lib/postgresql/data - ./postgres_create_db_users.sql:/docker-entrypoint-initdb.d/create_db_users.sql:ro adminer: image: adminer ports: - "8000:8080" links: - db depends_on: - db nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx_reverseproxy.conf:/etc/nginx/nginx.conf:ro links: - redmine - gitbucket #for debug #command: [nginx-debug, '-g', 'daemon off;']
nginx_reverseproxy.conf
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 20; gzip on; #include /etc/nginx/conf.d/*.conf; server { #server_name localhost; listen 80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location /gitbucket/ { proxy_pass http://gitbucket:8080/gitbucket/; } #location /adminer/ { # proxy_pass http://adminer:8080/adminer/; # #proxy_cookie_path /^/ /adminer/; #} location /redmine/ { proxy_pass http://redmine:3000/redmine/; } } } ##TCP traffic will be proxied a proxied server #server { # listen 29418; # proxy_pass gitbucket:29418; #}
事前実行スクリプト
echo "CREATE USER redmine PASSWORD 'redmine';" >> postgres_create_db_users.sql echo "CREATE DATABASE redmine;" >> postgres_create_db_users.sql echo "GRANT ALL PRIVILEGES ON DATABASE redmine TO redmine;" >> postgres_create_db_users.sql echo "CREATE USER gitbucket PASSWORD 'gitbucket';" >> postgres_create_db_users.sql echo "CREATE DATABASE gitbucket;" >> postgres_create_db_users.sql echo "GRANT ALL PRIVILEGES ON DATABASE gitbucket TO gitbucket;" >> postgres_create_db_users.sql echo "require ::File.expand_path('../config/environment', __FILE__)" > redmine_config.ru echo "map ActionController::Base.config.relative_url_root || \"/\" do" >> redmine_config.ru echo " run Rails.application" >> redmine_config.ru echo "end" >> redmine_config.ru
実行コマンド
# dockerを起動する docker-compose up -d # インスタンスをすべて削除する場合(volumeも削除しているので、注意) docker-compose stop docker-compose rm -v # 一部インスタンスに対する操作の場合(以下の例は、起動中のサービスを停止し、設定を変更して実行する) docker-compose stop nginx docker-compose rm -v nginx vi nginx_reverseproxy.conf docker-compose up -d nginx # 問題が起きた場合はログを確認する (例:nginxの場合で、起動ログに出力されているホスト名を参照する) docker-compose logs | grep nginx_1
tips
上記スクリプトを作成するにあたっての注意点など
DBへの初期データ投入
/docker-entrypoint-initdb.d 配下に*.sql、*.shを配置すると、DB初期化時に初期データを投入してくれる。
host側のsqlをコンテナ内とリンク(ro:読み取り専用)して、実行されるようにする。
docker-compose logs | grep db_1
db_1 | waiting for server to shut down....LOG: received fast shutdown request db_1 | LOG: aborting any active transactions db_1 | LOG: autovacuum launcher shutting down db_1 | LOG: shutting down db_1 | LOG: database system is shut down db_1 | done db_1 | server stopped db_1 | db_1 | PostgreSQL init process complete; ready for start up. db_1 | db_1 | LOG: database system was shut down at 2017-09-22 16:30:08 UTC db_1 | LOG: MultiXact member wraparound protections are now enabled db_1 | LOG: database system is ready to accept connections db_1 | LOG: autovacuum launcher started
上記のように、DBがいったんシャットダウンしているように見えるが、正常である。
正常であるかどうかを確認するには、「PostgreSQL init process complete; ready for start up.」が出力されていることを確認しよう。
もし、問題がある場合は、上記のログより前に、実行ログが出力されるので、その内容を確認すること。
改変履歴
- 2017/09/29
- nginxのredmineポート指定の誤りを修正
参考文献
- redmine
- gitbucket
- docker
- docker コマンド チートシート
- Docker の Data Volume まわりを整理する
- DockerのVolume機能について実験してみたことをまとめます
- Docker ComposeをDockerのswarm modeで使えるようになったので試してみた
- スタックを使ってみるのもいいかも。ログや管理について参考になる
- Docker compose ことはじめハンズオン
- 構成を作成する際に参考にした
- Docker Compose - docker-compose.yml リファレンス
- 構成を作成する際に参考にした。play-with-dockerではfrom_volumesが使えないので注意が必要。