Redmine を LXC on Ubuntu 14.04で動かす
ゴール
非特権コンテナ
- root権限でコンテナを走らせたくない
- http://d.hatena.ne.jp/defiant/20140419/1397838711
dnsmasqでコンテナに固定IP
Redmineが動く
- 今回は3.0.3を使用
使用した環境
簡単な流れ
作業ログ
コンテナ準備
パッケージの更新
$ sudo apt-get update && sudo apt-get -y dist-upgrade
タイムゾーンの設定
$ cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
/etc/timezoneの中身をAsia/Tokyoに変更
パスワード生成&アカウント作成
$ cat /dev/urandom | tr -dc '[:alnum:]' | head -c 8 && echo $ sudo adduser container
LXCインストール
sudo apt-get install -y lxc systemd-services
↑systemd-servicesがないと非特権で動作しなかった
このときのsubuid/subgid
$ cat /etc/subuid /etc/subgid ubuntu:100000:65536 container:165536:65536 ubuntu:100000:65536 container:165536:65536
lxc-usernetの設定
$ vim /etc/lxc/lxc-usernet $ cat /etc/lxc/lxc-usernet # USERNAME TYPE BRIDGE COUNT container veth lxcbr0 20
containerユーザに切り替え
ubuntu@pkmine:~$ sudo -i -u container container@pkmine:~$
一般ユーザでコンテナを扱えるようにする設定
container@pkmine:~$ mkdir -p .config/lxc container@pkmine:~$ cp /etc/lxc/default.conf .config/lxc/ container@pkmine:~$ vim .config/lxc/default.conf container@pkmine:~$ cat .config/lxc/default.conf lxc.network.type = veth lxc.network.link = lxcbr0 lxc.network.flags = up lxc.network.hwaddr = 00:16:3e:xx:xx:xx lxc.id_map = u 0 165536 65536 lxc.id_map = g 0 165536 65536 container@pkmine:~$
★最後の2行を追記。/etc/subuid, subgidの設定と合うように書く。
dnsmasqでコンテナに固定IPを降る設定
(containerユーザからログアウトしておく) 1.dnsmasq.confを読み込むようにする
ubuntu@pkmine:~$ sudo cp /etc/default/lxc-net{,.bak} ubuntu@pkmine:~$ vim /etc/default/lxc-net ubuntu@pkmine:~$ diff /etc/default/lxc-net{,.bak} 24c24 < LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf --- > #LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf ubuntu@pkmine:~$
2.DHCP情報を書く
ubuntu@pkmine:~$ vim /etc/lxc/dnsmasq.conf ubuntu@pkmine:~$ cat /etc/lxc/dnsmasq.conf dhcp-host=redmine,10.0.3.10 dhcp-host=mysql,10.0.3.11
コンテナ作成
containerユーザーで行う。ここではMySQLとRedmineを動かすためのコンテナを用意する。ディストリはホスト同様Ubuntu14.04を使用する。
$ lxc-create -n mysql -t download -- --dist ubuntu --release trusty --arch amd64 $ lxc-create -n redmine -t download -- --dist ubuntu --release trusty --arch amd64
コンテナ起動
sudo -i -u container
でユーザー切り替えを行うとコンテナが起動しなかったため、ssh container@localhost
としてログインし直すことで可能となった。
$ lxc-start -n mysql -d $ lxc-start -n redmine -d
-d
を付けることでデーモンとして起動してくれる。これを忘れるとフォアグラウンドで立ち上がってしまいログインプロンプトが出てくる。デーモンとして起動した場合は自動的にrootでログインされる。
Redmine用mysql構築
コンテナに入る
$ lxc-attach -n mysql root@mysql#
MySQLのインストールと初期設定
# apt-get update # apt-get install mysql-server mysql-client
- rootパスワードは空欄にした
# mysql_secure_installation - Enter current password for root (enter for none): [Enter] Set root password? [Y/n] Y -> password Remove anonymous users? [Y/n] ->[Enter] Disallow root login remotely? [Y/n] ->[Enter] Remove test database and access to it? [Y/n] ->[Enter] Reload privilege tables now? [Y/n] ->[Enter]
Redmine用DB作成と資格情報の設定
# mysql -uroot -p Enter password: mysql> create database db_redmine default character set utf8; mysql> grant all on db_redmine.* to redmine@localhost identified by 'password'; mysql> grant all on db_redmine.* to 'redmine'@'%' identified by 'password'; mysql> exit
my.cnf設定
# vim /etc/mysql/my.cnf
[mysqld]セクション内に
character-set-server=utf8
を追記。
また、
bind-address: 127.0.0.1
↓
#bind-address: 127.0.0.1
とする。
[mysql]セクション内に
default-character-set=utf8
を追記。
MySQLの再起動
# service mysql restart
コンテナ起動時に自動で実行されるようにする
# update-rc.d mysql defaults
確認
# mysql -uroot -p mysql> show variables like 'character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
Redmine 3.0.3 インストール
mysqlコンテナから抜け(シェルから抜ければOK)redmineコンテナに移る(lxc-attach -n redmine)。
必要となるパッケージのインストール
# apt-get update # apt-get install -y wget build-essential libffi-dev libyaml-dev zlib1g-dev openssl libssl-dev mysql-client libmysqlclient-dev libcurl4-openssl-dev curl
Rubyのコンパイル&インストール
# cd /opt # wget ftp://ftp.ruby-lang.org/pub/ruby/2.2/ruby-2.2.0.tar.gz # tar zxf ruby-2.2.0.tar.gz # cd ruby-2.2.0 && ./configure && make && make install
使用するgemのインストール
# gem install bundle passenger --no-ri --no-rdoc
Redmineダウンロード&展開
# cd /opt # wget http://www.redmine.org/releases/redmine-3.0.3.tar.gz # tar zxf redmine-3.0.3.tar.gz
DB接続設定
# cd redmine-3.0.3/config # cp database.yml{.example,} # vim database.yml
↓のように変更
production: adapter: mysql2 database: db_redmine host: 10.0.3.11 username: redmine password: "password" encoding: utf8
Redmineに必要なライブラリのインストール
# cd /opt/redmine-3.0.3/ # bundle install --without development test --path vendor/bundle
もしrmagickが必要と怒られた場合
# apt-get install imagemagick libmagickcore-dev libmagickwand-dev # bundle install --without development test --path vendor/bundle
IPAフォントのインストール
# apt-get install fonts-ipafont
Redmine設定
# cp configuration.yml{.example,} # vim configuration.yml
↓追記部分(行頭の数字は行数を表す)
82 autologin_cookie_name: redmine_autologin 83 autologin_cookie_path: /redmine/ 84 autologin_cookie_secure: true 197 rmagick_font_path: /usr/share/fonts/truetype/fonts-japanese-gothic.ttf
Redmine初期設定
# bundle exec rake generate_secret_token # RAILS_ENV=production bundle exec rake db:migrate # bundle exec rake redmine:load_default_data RAILS_ENV="production"
↑3番目はデフォルトデータの読み込み。言語を聞かれるので"ja"を入力する。
Passengerのインストール
# gem install passenger --no-rdoc --no-ri # passenger-install-nginx-module
nginxをコンパイルしてもらう。/opt/nginxに展開してもらう。基本的にはずっとEnter。
Nginxの設定
# cd /opt/nginx/conf # vim nginx.conf
以下の通りに設定した。
server { ... location /redmine { index index.html index.htm; root /opt/redmine-3.0.3/; passenger_enabled on; passenger_base_uri /redmine; passenger_app_root /opt/redmine-3.0.3/; } ... }
nginxのinitスクリプトはどこかから落とす。 このあたりとか。 * https://gist.github.com/hisea/1548664
SSL通信の有効化
オレオレ証明書から始めてみる。
コンテナから抜け、ホスト上で操作する
nginxインストール
$ sudo apt-get install nginx
オレオレ証明書(自己署名証明書)の作成
$ sudo mkdir /etc/nginx/ssl $ sudo openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key $ sudo chmod 700 /etc/nginx/ssl
Nginxコンフィグ
$ sudo vim /etc/nginx/sites-available/default-ssl
server { listen 443; server_name localhost; root html; index index.html index.htm; ssl on; ssl_certificate /etc/nginx/ssl/nginx.pem; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; ssl_prefer_server_ciphers on; location / { try_files $uri $uri/ =404; } include /etc/nginx/sites-available/default-location-ssl/*; }
↑default-sslはsites-enableにシンボリックリンクを張る
$ sudo vim /etc/nginx/sites-available/default
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.html index.htm; server_name localhost; location / { try_files $uri $uri/ =404; } include /etc/nginx/sites-available/default-location/*; }
不要なコメントアウトは見づらいので消しておく。
include対象のディレクトリを作成
# mkdir /etc/nginx/sites-available/default-location # mkdir /etc/nginx/sites-available/default-location-ssl
まずはsslの設定から
$ sudo vim /etc/nginx/sites-available/default-location-ssl/redmine
新規作成。
location /redmine { index index.html index.htm; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://10.0.3.10; proxy_redirect off; }
↑proxy_passの部分にはコンテナのIPアドレスを入れる。
httpアクセス時の設定
$ sudo vim /etc/nginx/sites-available/default-location/redmine
location /redmine { rewrite ^ https://$http_host$request_uri? permanent; }
SSL v3の無効化
$ sudo vim /etc/nginx/nginx.conf
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ↓ ssl_protocols TLSv1 TLSv1.1 TLSv1.2; (Poodle対策)
nginxの再起動
# service nginx restart
エラーが起きた場合は/var/log/nginx/以下参照。
おしまい
http://<サーバアドレス>/redmineにアクセスしてみるとhttpsに切り替わり、アクセスできるようになっている。