delete from hateblo.jp where 1=1;

タイトルに意味はありません。

Redmineをdockerで動かそう+サブディレクトリ

対象

  • redmineを動かしたい
  • host環境はできるだけ汚したくない→dockerで解決
  • 関連するサービスもdocker内で動かして、完結させたい→nginxを経由させる

対象外

以下については調査・検討中の事案につき、ここでは述べない

手順

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.」が出力されていることを確認しよう。
もし、問題がある場合は、上記のログより前に、実行ログが出力されるので、その内容を確認すること。

サブディレクトリの設定

config.ruを書き換えるのと、RAILS_RELATIVE_URL_ROOTの環境変数を設定する。
config.ruは調べる限り、変更が発生することが少ないので、上書き適用しても問題ないと考えた。
また、イメージはpassengerを使う構成になっていないといけない。

adminerはDBのメンテナンスツール。必要に応じて使う機能であるため、nginxからの参照はやめて、ポートマッピングで対応することにした。(シンボリックリンクや、Dockerfileに手を入れることも考えたが、単純なコマンドで対応することができないため、あきらめた。)

改変履歴

  • 2017/09/29
    • nginxのredmineポート指定の誤りを修正