"GDK_BACKEND does not match available displays"が出てX転送に失敗したときの確認事項

症状

タイトルの通り、SSH先でX転送しようとして GDK_BACKEND does not match available displaysとエラーが出た。 $DISPLAYという環境変数も空の状態。

[user@remote ~]$ firefox
Error: GDK_BACKEND does not match available displays
[user@remote ~]$ echo $DISPLAY

[user@remote ~]$ 

環境

  • リモート側OS: Arch Linux
  • OpenSSHのバージョン:openssh 7.3p1-1
  • ローカル側OS: Windows10
  • 使用クライアント: MobaXterm v9.1

sshd_configの設定確認

/etc/ssh/sshd_configに以下のオプションを追記する。

X11Forwarding yes

sshdを忘れずに再起動する。

[user@remote ~]$ sudo systemctl restart sshd

再ログイン

一度ログアウトし、再度SSHログインする。 $DISPLAY変数に情報が格納されるようになった。

[user@remote ~]$ echo $DISPLAY
localhost:10.0

これにて解決。

Pacemaker + Corosync on Ubuntu 14.04でHAクラスタを構成する

Ubuntu 14.04でPacemaker + Corosyncを用いてHAクラスタを組んでみたのでメモ。

Pacemakerとは

Linux-HA Japanさんが日本語情報をまとめています。

ざっくりいえば、

  • Pacemaker... アプリやノードやネットワークといったリソースを監視
  • Corosync... ノード同士を接続してクラスタを形成

という感じでしょうか。 歴史は以下のページに。

第1回 Pacemakerの歴史を見てみよう!:Pacemakerでかんたんクラスタリング体験してみよう!|gihyo.jp … 技術評論社

この記事で書くこと

  • PacemakerとCorosyncをインストール
  • Corosyncの初期設定(ノード同士が繋がるのを確認するところまで)

リソースの設定などは書きません。

参考にしたURL

環境

  • Ubuntu 14.04がインストールされたサーバ x3
    • 適当なサーバ2台以上あればOK

インストール(全ノード)

ClusterLabsのQuickStartを参考にやっていきます。 まずはaptを使ってインストールしていきましょう。

# apt install pacemaker corosync fence-agents

Corosyncの設定(全ノード)

クラスタ制御ツールCorosyncの設定をしていきます。 /etc/corosync/corosync.confに追記した部分は以下の通り。

# editor /etc/corosync/corosync.conf

totem {
...
        cluster_name: mycluster
        transport: udpu
        interface {
                ...
                bindnetaddr: 198.18.249.0
                ...
        }
}
...
quorum {
        ...
        two_node: 1
        wait_for_all: 1
        last_man_standing: 1
        auto_tie_breaker: 0
}
...
logging {
        ...
        debug: on
        ...
}
nodelist {
        node {
                ring0_addr: controller-ha
                nodeid: 101
        }
        node {
                ring0_addr: compute01
                nodeid: 102
        }
        node {
                ring0_addr: 198.18.249.121 
                nodeid: 103
        }
}

ポイント

  • bindnetaddr: 198.18.249.0
    • クラスタ間通信に使用する(Corosyncがバインドする)インターフェースに設定されているネットワークアドレス。
      • 自分のIPアドレス192.168.0.100/24であれば192.168.0.0と入力。
  • ring0_addr: controller-ha
    • ring0_addrの値にはIPアドレス or 名前解決可能なホスト名を入力。
  • nodeid: 101
    • 1つのノードに一意の番号を割り当てる。nodeidが被っているとクラスタが組めない。

この設定を全ノードに行います。1つのノードで設定して他ノードにコピーすればいいのか。

起動(全ノード)

Corosync起動→Pacemaker起動の流れ。

# corosync
# service pacemaker start

なぜかservice corosync startが何も反応なく、しかたなくプログラムを直接実行するという。。。 CorosyncがうまくいかないとPacemakerは落ちます。

クラスタ確認

本当にクラスタが組めているか確認します。操作はどれか1つのノードで行います。

# crm_mon
Last updated: Sun Dec 13 11:44:44 2015
Last change: Sat Dec 12 16:17:24 2015 via crm_attribute on controller-ha
Stack: corosync
Current DC: controller-ha (101) - partition with quorum
Version: 1.1.10-42f2063
3 Nodes configured
0 Resources configured


Online: [ compute01 198.18.249.121 controller-ha ]

設定したノードがすべてOnlineとなっていればOKです。

おまけ:Pacemakerのログを出力する

ログはdebug出力してほしい…君のすべてを知りたい…ということでおまけです。 (すべてを知りたければソースコードからお付き合いでしょうか。あるいは開発者と仲良くなることでしょうか。)

Pacemakerのログレベルについては/etc/default/pacemakerを編集することで設定できます。例によって変更点のみ。

# editor /etc/default/pacemaker
export PCMK_debug=yes
export PCMK_debugfile=/var/log/pacemaker.log
export PCMK_logpriority=debug

PCMK_logpriorityはなんとなく設定しましたが、syslogに出力するログレベルなのでなくてもいいかもです。

おしまい

「Corosyncの設定を全ノードしなきゃいけないの?スケールアウトするとき大変だ…」という人にはpacemaker-remoteというものもあります。 肝心のリソース設定は他の記事にお任せします…と思ったけれど、大体がCentOSでやっていてUbuntuでの日本語記事ってあんまりない気がするので、そのうちApacheのHAの設定やってみます。

ボーイミーツガール

こんにちは。

これは

この記事はwhywaita Advent Calendar 2015 12日目の記事です。 昨日は id:neotaso さんの 第1.0羽 「ひと目で、尋常でない第1羽と見抜いたよ」(Advent Calendarの記事) - neotaso’s blog でした。私は青山さん?という女性がすきです。あとは1羽のお風呂シーンで登場する"でっていう"ニキもすきです。

はじめに

このアドベントカレンダーのほとんどは、whywaita氏の良さを紹介するものか、氏に関係ない記事になるだろうと思っています。

せっかくなので彼に対する恨みつらみ妬み嫉みとかあることないこと適当に書いてみようと思います。

whywaita 女の子説

インターネットのみなさん、whywaitaという人間はおそらく女の子です。

私が彼を女の子と呼ぶにはいくつか理由があります。

1. にゃーん

(ツイ略)
女の子がいうとかわいい。
女の子がいうとかわいい。。。
でも「にゃーん」がありなら、犬っぽく「クゥーン」とか言ってもかわいいとおもいますよ、まる。

2. 手を振る

現実世界で彼と会うと、まず手を振ってくれます。 知人を見つけると皇族ばりに手を振ります。 相手がそれに気付かないと「気付いてくれなかった・・・」と寂しそうにつぶやきます。

3. 字がきれい

とても字がきれいです。読みやすいです。字が丸っこくてかわいらしいです。
ラブレターでも書かれたらおしまいです。要注意です。

4.「もっとお話したいなー」

なんか細かい部分は忘れましたが、ときどき「お前は彼女か!?」とツッコミを入れたくなるときがあります。
彼が姫だとしたら囲ってる男子はみなコロッと落ちてしまいます。危険です。

5. 女性声優の真似をする

whywaitaは女性声優の演技をシャドーイングします。早見さんのラジオのジングルをシャドーイングするのやめてください。怒りますよ。

6. 女の子役が得意

男を落とすテクニックを所持。

www.slideshare.net

というわけで

whywaitaは女の子です。
なんか他にも書こうとしてたことがあったような気がする。カラオケいくと低い音域から高い音域まで出るとか。ダイエットしろとか。痩せないとインターネッツ取り上げるぞとか。まあいいや。おしまい。

July Tech Festa 2015に行ってきました

JTF2015 (July Tech Festa) に行ってきました。

自分はお昼から参加しました。参加費1000円(早割だと500円)でフリードリンク、お菓子食べ放題、お弁当支給(ハンバーグ弁当とかタコライスとかいろいろあった)。非常に素晴らしいサービスでした。

どのセッションもとても興味深かったです。もっといろいろ見たかった。

以下、セッションのメモ。

Modern DevOps with Mackerel

by はてなCTO 田中さん

DevOpsとは?

CommunicationやCollaboration

  • アプリケーションエンジニアとインフラエンジニアの協調作業

チームの仲が悪くなる

  • それぞれがそれぞれの目標に最適化されてしまっている
    • 同じ目標に向くことが大切

Integraton, Automation, Measurement

  • 脱職人技*脱属人性
  • 効率向上
  • 再現を容易に
  • 誰かがやったことをそのまま再現できると、脱属人性につながる

Modern DevOpsとは?

  • 高速なテスト、デプロイ
  • インフラの自動化と効率向上
  • Immutable Infrastructure
  • Infrastructure as Code
    • 各社様々な取組

インフラの自動化と効率向上

  • 構築(新規、変更)あれいれたい!減らしたい!
  • 観測、監視

ここ2,3年で流行してるのが、下の2つ。

Immutable Infrastructure

  • できるだけサーバに状態を持たせない。
    • 可能なものと不可能なものがある。不可能な例→DB
    • Immutableにできれば考えることが減る。
  • 簡単に作り直せるように
  • The Twelve-Factor App(Heroku)の考え方

Infrastructure as Code

  • インフラの設定をコードで管理
    • 長いスパンでサーバを管理するには必須になってくる。

インフラ構築の道具

  • プロビジョニング
    • ansible/chef/puppet
  • CI
    • serverspec
  • デプロイ

デプロイの高速化

  • CIの活用
    • Jenkins/CI環境でイメージを自動作成
  • Docker, AWSならamiを用意しておくことで容易にデプロイ
  • ChatOps
    • チャットツールを中心としたオペレーション
      • Slackなど
      • bot活用
    • 誰がどういう作業をしているかわかる
    • ただしチャットツールが落ちると仕事が出来なくなったりする。github落ちても…

Staging環境への自動デプロイ

  • 自動デプロイ
    • git pushトリガでproxy設定まで自動化
  • 自動停止
    • ゴミを残さない

インフラ状態の一元管理

Mackerelとは

インフラの状態をAPIで取得可能

  • ホストの状態の更新はPOSTで出来る

tmux-sshでまとめてssh

  • APIを組み合わせて、一発で複数サーバにログインできる

Capistrano連携

  • deploy.rbにIPアドレス等をハードコーディングしなくていい

Ansible Dynamic Inventory

Webhook+hubot

  • アクションの自動化
  • アラート→再起動、など

AutoScaling

  • mackerle-agentを組み込むと自動的に反映される

監視ルールAPI

開発ツールクラウド

実行環境もクラウド

  • AWS、GCEなど

運用ツールクラウド

  • infrastructure as codeの推進
  • インフラの一元管理DBとしてのMackerel

ひしめき合うオープンソースPaaSを徹底解剖! PaaSの今と未来

by PaaS勉強会 草間さん

OpenPaaS

Cloud Foundry

  • VMwareOSSとして公開(2011年)

    • Public PaaS
      • IBM Bluemixなど
      • NTT-Com Cloundn PaaS
    • Private PaaS
  • DEMO

    • phpファイルをCloud Foundry上にデプロイ
    • $ cf push <app-name>
  • 別のPaaSサービスに向ける

    • $ cf api <APIサーバ>
    • 今回はcloudnからbluemixにAPIを変更した。
  • スケールも簡単

    • $ cf scale <app-name> -i <count of instance> -m <memory size>

CFのメリット

  • ベンダーロックインが防げる
  • たくさんのベンダーさんがサービスを提供している

CFのデメリット

  • オンプレにCFのデプロイが死ぬほど大変(1日かかったり)

  • Dockerは使えないの?

    • CFはDocker使ってない。次期バージョンでDocker imageサポート。
  • Dockerが使えるPaaSはないの?

    • OpenShift

OpenShift

  • RedHatが開発
  • OpenShift v3...Docker PaaSとして生まれ変わった。今までを捨てた。
  • KubernatesをコアにしたPaaS
    • Kubernatesの開発にRedHatが深くかかわっている。Kuberの概念を取り込み
  • JSONでいろいろ定義。長い。その分いろいろ設定できる。
  • Webhookにも対応。これはPaaSの中ではOpenShiftのみ。
  • 開発早い。
  • KubernatesをコアにしていてPaaSっぽさがない?

Deis

  • Docker + CoreOSをベースとしたPaaS

  • DEMO

    • $ deis create
      • git上にリモートrepoが設定される。
    • $ deis scale web=5
      • スケーリング
  • herokuライク。
  • スケジューリングが遅い。

Flynn

  • Docker PaaS
    • Heroku CloneのDokkuの開発者も関与
  • DEMO
    • $ flynn create
      • git上にリモートrepoが設定される。
  • Heroku互換のBuild Packを使ってる

  • メリット

    • シンプルかつモジュラーでカスタマイズしやすい
    • スケジューリングもDeisよりはやめ
    • スケール早い(3→5台で、2.2秒)
  • デメリット
    • 開発の継続力に不安
    • どこまでメンテし続けられるか
    • スケジューラが賢くない(デプロイ先をランダムで決める。ただその分早い)
  • 開発はほとんどGo。流行り。

4つ見てみて

  • どれも似たり寄ったり。
  • なんで?
    • "12 Factor App"というベストプラクティスがある。どのPaaSもこれを前提にしている。

PaaS使いたいなら

  • まずはPublic PaaS
  • Private PaaS構築は?

    • あまり実例ない。
    • 準備が死ぬほど大変。
    • 自由があまり効かない。
  • 優れた仕組みを積極的に取り入れていくのは大切。

    • Docker
    • 構成管理ツール
    • Fluentd
    • など
  • ただ規模が大きくなるにつれ複雑になり、メンテが出来なくなってくる。引継ぎコストも無視できなくなる。
  • 自前で似たような構成を作るならOpenPaaSを採用してダクトテープ(継ぎはぎのテープ)を捨てませんか。

OpenPaaSの未来

  • ネットワーキングの強化
    • あらゆるサービスの「ハブ」に

Redmine構築後のDBの文字コードをutf8mb4に変換して絵文字に対応する

動機

Redmine上で絵文字を記入し保存しようとすると…

f:id:jackson58:20150519014709p:plain f:id:jackson58:20150519014746p:plain

ゴール

  • 文字コードがutf8で初期化されたDBをutf8mb4に変換し、Redmineで絵文字(4バイト文字)が書き込めるようにする

参考リンク

前提

余談

  • RedmineRails + ActiveRecordなアプリケーションなので、似たような構成ならできるのではないでしょうか。

DBのバックアップ

Redmineを停止する

私の環境ではRedmineはnginx+Passenger上で動いているため、nginxを再起動する。

# service nginx stop

mysqlを停止する

# service mysql stop

データのバックアップ

# cp -rp /var/lib/mysql <バックアップ先>

my.cnfの変更

以下を[mysqld]セクションへ追記。

[mysqld]
character-set-server = utf8mb4
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

(innodb_large_prefixオプションによって、後述するキープレフィックスの制限を回避し3072バイトまで拡張できる)

mysqlを起動する

# service mysql start

DB情報を変数にあらかじめ追加する

# MYSQL_DB=db_redmine
# MYSQL_USER=redmine
# MYSQL_PASS=password
# CONVERT_SCRIPT_FILE=convert_script

文字コード変換用スクリプトの作成

# (echo 'alter database `'"$MYSQL_DB"'` default character set utf8mb4;'; mysql -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e "show tables" --batch --skip-column-names | xargs -I{} echo -e 'alter table `'{}'` ROW_FORMAT=DYNAMIC;\nalter table `'{}'` convert to character set utf8mb4;') > $CONVERT_SCRIPT_FILE

以下のような内容のconvert_scriptファイルが出来ている。

alter database `db_redmine` default character set utf8mb4;
alter table `attachments` ROW_FORMAT=DYNAMIC;
alter table `attachments` convert to character set utf8mb4;
alter table `auth_sources` ROW_FORMAT=DYNAMIC;
alter table `auth_sources` convert to character set utf8mb4;
alter table `boards` ROW_FORMAT=DYNAMIC;
alter table `boards` convert to character set utf8mb4;
...
  • 同じテーブルに対して二度処理を行っているが、それぞれ。
    • 前者(ROW_FORMAT=DYNAMIC)は、MySQL(InnoDB)では、ひとつのカラムのキープレフィックスの最大値が767バイトという制限があり、それを回避するための処理。
    • 後者(convert to...)はテーブルの文字コードを変更する処理。 である。

スクリプトの実行

# mysql -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB < $CONVERT_SCRIPT_FILE

エラーが起こらなければOK。

RedmineのDB設定の変更

# vim /path/to/redmine/config/database.yml
encoding: utf8
↓
encoding: utf8mb4

Redmineの再起動

私の環境ではnginx+Passenger上で動いているためnginxを再起動する

# service nginx restart

おしまい

f:id:jackson58:20150519014827p:plain

やはりナウでヤングで積極的でアグレッシブで柔軟でフレキシブルなマインドを持つ若者なので絵文字が使えると落ち着くのである。

thx! id:kuro_m88

LXCの非特権コンテナの移行

ゴール

  • 旧サーバにあるRedmineコンテナとMySQLコンテナを新サーバに移行

前提

参考リンク

kurochan-note.hatenablog.jp

旧サーバでやること

コンテナの停止

$ lxc-stop -n mysql
$ lxc-stop -n redmine

コンテナをtarで固める

$ cd /home/container/.local/share/lxc
$ sudo tar zcvf $HOME/mysql.tar.gz mysql
$ sudo tar zcvf $HOME/redmine.tar.gz redmine

↑sudoつけておく。使用するソフトウェアによっては自動的に独自のユーザを作ることもあり、所有者がバラバラでも正常に固めるため。

tarの転送

$ scp mysql.tar.gz redmine.tar.gz container@{移行先ホストのIP}:

コンテナ用DHCPファイルも移行

$ scp /etc/lxc/dnsmasq.conf container@{移行先ホストのIP}:

新サーバでやること

tarの展開

$ mkdir -p /home/container/.local/share/lxc
$ sudo tar --numeric-owner -xpzf /home/container/mysql.tar.gz -C /home/container/.local/share/lxc
$ sudo tar --numeric-owner -xpzf /home/container/redmine.tar.gz -C /home/container/.local/share/lxc

↑sudoつけること!忘れると所有者情報が更新されてしまう。

パーミッションの設定

$ sudo chown :container /home/container/.local/share/lxc/{mysql,mysql/config}
$ sudo chown :container /home/container/.local/share/lxc/{redmine,redmine/config}

.local/share/lxc/{mysql,redmine}になるように配置できていればOK。いなければ適宜配置。

lxcインストール

非特権で動かせるように。DHCPの設定をしてる場合はそれもする。

コンテナで使用しているsub uid/gidを確認

# cat /home/container/.local/share/lxc/mysql/config | grep lxc.id_map
lxc.id_map = u 0 165536 65536
lxc.id_map = g 0 165536 65536

sub uid/gidの追加

# sudo usermod -v 165536-231071 -w 165536-231071 container
↑確認したsub uid/gidから65535足した数値の範囲

おわり

移行完了。念のため一度再起動しておく。 確認として、移行先で

$ lxc-ls --fancy
NAME          STATE    IPV4        IPV6  AUTOSTART
--------------------------------------------------
mysql         STOPPED  -           -     NO
redmine       STOPPED  -           -     NO
$ ls -l /home/container/.local/share/lxc/mysql
total 16
drwxrwx---  3    165536 container 4096 May 13 01:18 ./
drwxr-xr-x  9 container container 4096 May 18 21:51 ../
-rw-rw-r--  1 container container  701 May 13 01:18 config
drwxr-xr-x 21    165536    165536 4096 May 18 19:56 rootfs/

となっていればOK。ほかのユーザとsub uid/gidが被ることがあるが大丈夫なのかなあ…

Redmine を LXC on Ubuntu 14.04で動かす

ゴール

使用した環境

  • OS: Ubuntu 14.04.2 Server
  • ユーザー名: ubuntu
    • あとでcontainerというユーザーを作成する

簡単な流れ

  • 非特権コンテナの準備
  • コンテナ作業
  • ホスト側でNginxの設定

作業ログ

コンテナ準備

パッケージの更新

$ 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ユーザーで行う。ここではMySQLRedmineを動かすためのコンテナを用意する。ディストリはホスト同様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でログインされる。

Redminemysql構築

コンテナに入る

$ 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作成と資格情報の設定

  • 作成するDB名: db_redmine
  • 作成するユーザー名: redmine
  • パスワード: password
# 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に切り替わり、アクセスできるようになっている。