メンターを任されたエンジニアのブログ

ある日メンターを任された3流エンジニアのブログ

環境構築:GitLab+Rocket.Chat+Taiga on Docker - Taiga編

はじめに言っておきますが、失敗しました。

なんで失敗すんだよ、俺が教えてやんよ、っていう方はご教示いただけると幸いです。

Taigaとは

かんばん方式のプロジェクト管理ツールです。
スクラム開発に適している、という評判を聞いて採用しました。

Docker-Composeでいれる

公式では、Dockerイメージはありません。
ただ、公式ページには、以下のような記載があります。

Docker is not officially supported by the Taiga development team but a docker script has been developed by Iván Pedrazas,
another docker script has been developed by Hylke Visser, and yet another docker script has been developed by Benjamin Hutchins.

Taiga: Other ways to setup initial environment

というわけで、頑張って作ってくれた人がいるので、それを参考にすることにしました。

※ちなみに、Vagrantイメージはあるらしく、そっちの方が確実かもしれません。

# git clone https://github.com/htdvisser/taiga-docker.git
# cd taiga-docker
# vi taiga.yml

data:
  image: tianon/true
  volumes:
    - /var/lib/postgresql/data
    - /usr/local/taiga/media
    - /usr/local/taiga/static
    - /usr/local/taiga/logs
db:
  image: postgres
  environment:
    POSTGRES_USER: taiga
    POSTGRES_PASSWORD: password
  volumes_from:
    - data
taigaback:
  build: taiga-back
  hostname: $HOSTNAME # ホスト名を入れる
  environment:
    SECRET_KEY: examplesecretkey
    EMAIL_USE_TLS: 'True'
    EMAIL_HOST: smtp.gmail.com
    EMAIL_PORT: 587
    EMAIL_HOST_USER: hoge@gmail.com #自分のgmailアドレス
    EMAIL_HOST_PASSWORD: password #パスワードを入力
  links:
    - db:postgres
  volumes_from:
    - data
  ports:
    - 0.0.0.0:8000:8000
taigafront:
  build: taiga-front-dist
  hostname: $HOSTNAME
  links:
    - taigaback
  volumes_from:
    - data
  ports:
    - 0.0.0.0:8080:80

LDAP連携用の設定をいれる

これをしないと好きなだけアカウント作られてしまうんじゃないか、と思って設定。

# cd taiga-back #taiga-dockerの直下にあるtaigaのバックエンド
# vi Dockerfile
FROM python:3.4

MAINTAINER Hylke Visser <htdvisser@gmail.com>

# Install dependencies
RUN \
  apt-get update -qq && \
  apt-get install -y netcat && \
  rm -rf /var/lib/apt/lists/* && \
  pip install circus gunicorn

# Install taiga-back
RUN \
  mkdir -p /usr/local/taiga && \
  useradd -d /usr/local/taiga taiga && \
  git clone https://github.com/taigaio/taiga-back.git /usr/local/taiga/taiga-back && \
  mkdir /usr/local/taiga/media /usr/local/taiga/static /usr/local/taiga/logs && \
  cd /usr/local/taiga/taiga-back && \
  git checkout stable && \
  pip install -r requirements.txt && \
  pip install taiga-contrib-ldap-auth && \ # <- これを追加
  touch /usr/local/taiga/taiga-back/settings/dockerenv.py && \
  touch /usr/local/taiga/circus.ini

# Add Taiga Configuration
ADD ./local.py /usr/local/taiga/taiga-back/settings/local.py

# Configure and Start scripts
ADD ./configure /usr/local/taiga/configure
ADD ./start /usr/local/taiga/start
RUN chmod +x /usr/local/taiga/configure /usr/local/taiga/start

VOLUME /usr/local/taiga/media
VOLUME /usr/local/taiga/static
VOLUME /usr/local/taiga/logs

EXPOSE 8000

CMD ["/usr/local/taiga/start"]

----------------------------------

# vi local.py

from .common import *

from .dockerenv import *

# THROTTLING
#REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"] = {
#    "anon": "20/min",
#    "user": "200/min",
#    "import-mode": "20/sec"
#}

## 以下追記
INSTALLED_APPS += ["taiga_contrib_ldap_auth"]

LDAP_SERVER = 'ldap://LDAPHOST'
LDAP_PORT = 389

# Full DN of the service account use to connect to LDAP server and search for login user's account entry
# If LDAP_BIND_DN is not specified, or is blank, then an anonymous bind is attempated
LDAP_BIND_DN = 'CN=admin,DC=hoge,DC=com'
LDAP_BIND_PASSWORD = 'PASSWD'   # eg.
# Starting point within LDAP structure to search for login user
LDAP_SEARCH_BASE = 'OU=People,DC=hoge,DC=com'
# LDAP property used for searching, ie. login username needs to match value in sAMAccountName property in LDAP
LDAP_SEARCH_PROPERTY = 'uid'
LDAP_SEARCH_SUFFIX = None # '@example.com'

# Names of LDAP properties on user account to get email and full name
LDAP_EMAIL_PROPERTY = 'mail'
LDAP_FULL_NAME_PROPERTY = 'cn'


-------------------------------------------

# cd ../taiga-front-dist
# vi configure

# cat configure
#!/bin/bash

cat > /etc/nginx/upstream.conf <<EOL

upstream taiga-back {
  server ${TAIGABACK_PORT_8000_TCP_ADDR}:8000;
}

EOL

# Configure HTTP or HTTPS for nginx proxy
WEB_CONFIG=web-${SCHEME:-http}.conf
sed -i "/include .*.conf;/c\  include ${WEB_CONFIG};" /etc/nginx/nginx.conf

mkdir -p /etc/nginx/ssl
[ ! -z "${SSL_CRT}" ] && echo "${SSL_CRT}" > /etc/nginx/ssl/ssl.crt
[ ! -z "${SSL_KEY}" ] && echo "${SSL_KEY}" > /etc/nginx/ssl/ssl.key

PUBLIC_REGISTER_ENABLED=${PUBLIC_REGISTER_ENABLED:-true}
API=${API:-/api/v1/}
DEBUG=${DEBUG:-false}

cat > /usr/local/taiga/taiga-front-dist/dist/conf.json <<EOL

{
    "api": "${API}",
    "eventsUrl": null,
    "eventsMaxMissedHeartbeats": 5,
    "eventsHeartbeatIntervalTime": 60000,
    "debug": $DEBUG,
    "debugInfo": false,
    "defaultLanguage": "en",
    "themes": ["taiga"],
    "defaultTheme": "taiga",
    "publicRegisterEnabled": ${PUBLIC_REGISTER_ENABLED},
    "feedbackEnabled": true,
    "privacyPolicyUrl": null,
    "termsOfServiceUrl": null,
    "maxUploadFileSize": null,
    "contribPlugins": [],
    "loginFormType": "ldap"  # ここを追加
}


EOL

-------------------------------

# cd ../
# docker-compose -f taiga.yml build
# dokcer-compose -f taiga.yml up -d

はい。簡単。
あ、Gmailをメールサーバとして使用する場合、Gmailの「セキュリティの低いアプリからのログイン許可」みたいな設定をしないとダメです。

で。ここから、hostname:8080にアクセスするわけですが、、、

ダメポイント

1.新規プロジェクトが作れない

本当に笑うしかなかった。何度やって500エラー。
ログをみないとわからない。ボタンが無反応なだけだから。

新規ユーザだと作れない、というissueが出ていたように見える。
でもクローズされてたみたいだけど。。。

2.2度目のログインでNG

これな。
一回ログアウトして、再度入り直そうとすると、
「あんたのメアド、すでに使われてまっせ」と言われる。
そりゃ、そうだ、新規ユーザじゃないんだから。

でも、新規ユーザ登録のフローに入ってしまうらしく、NG。
LDAPのユーザ情報にTaiga用ユーザ情報で必須なものが抜けているのかな。
いや、「もう登録されている」という判定になるんだから、問題ないはずか。

そんなこんなで諦めました。
GMAILのアカウントとパスワードを設定ファイルに書くのも、なんか怖いし。
誰かにSSHで不正ログインされたら、もう、アウトでしょ。

Kanboardに切り替えます。
こっちは実績ありなので。

環境構築:Nginxでリバースプロキシとか(寄り道)

どうも、メンターです。
今日、メンティとの顔合わせと半年後の目標を決めてきました。

LPICを受けたい」と言う彼に対して、「そんなのなくてもLinuxいじれるよ」と一蹴しました。
だって、もう、俺は動いているんだもん(勝手に)。

というわけで。
スクラムアジャイル開発)で、Node.jsで、Webアプリ開発をやることにしました。

チャットもね、すんなり使えるようになったし。めでたし、めでたし。

とはいかない。

スクラム開発だとデイリースクラムが必須であり、
その場がチャットベースになることは、まぁ、良いとして。

問題は私の仕事場は、Rocket.chatの3000番ポートにアクセスできなかった。
なぜか。
80番でないからだろうねぇ、きっと。。。

わけもわからない外部サーバのわけわからんポートにはアクセスできないようになっているんだね。
よく出来ているよ、本当に。

前置きは長くなったけど、Nginxを使って、80->3000のポートフォワーディング的なことをします。

Nginx on Docker

Nginx用に作業場を作っておくと良い。
コンフィグファイルとか作るから。

その作業場でコマンドを打っていく。

# docker run --name nginx -d nginx
# mkdir nginx
# docker cp nginx:/etc/nginx/nginx.conf nginx/nginx.conf
# docker rm nginx

docker cpを使って、デフォルトのコンフィグを持ってきている。
特に必要なければ、やらなくても良い。

次に、リバースプロキシの設定を作成する

# mkdir nginx/conf.d
# vi nginx/conf.d/chat.conf


server {
    server_name (バーチャルホスト名);
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    location / {
        proxy_pass http://(ホスト名):3000;
    }
}

バーチャルホスト名には、DNSのAレコードを設定
私の場合、chatというAレコードを設定しているので、chat.hoge.co.jpという感じ
hoge.co.jpドメイン名で設定しているヤツね。

f:id:hatman62:20160617000306p:plain

nginx.confは、特にいじらなくてもOKだった。
必要に応じて編集してくださいな。

じゃ、起動します

# docker run --name nginx -p 80:80 \
 -v `pwd`/nginx/nginx.conf:/etc/nginx/nginx.conf:ro  \
 -v `pwd`/nginx/conf.d:/etc/nginx/conf.d:ro \
 -d nginx

わかりづらそうなオプションの意味を解説していくと、

-p 80:80 : ホストOSの80番ポートのアクセスをコンテナの80番として渡すよ
-v XXXX:YYYY:ro : XXXがホストのファイルパス、YYYがコンテナ上でのファイルパス。roは読み取り専用の意

で、起動後、chat.hoge.co.jpにアクセスすると、無事、チャットが見れるようになりました。
これで職場で見れるようになると嬉しいなぁ。。。無理かなぁ。。。

環境構築:GitLab+Rocket.Chat+Taiga on Docker ー RocketChat編

登場人物

  • GitLab : バージョン管理
  • Rocket.Chat : Webチャット
  • Taiga : プロジェクト管理

こんな感じでやりたいと思います。
Taigaは入れた事ないけど、、、ま、なんとかなるさ。

DockerとDocker Composeを入れる

私がごちゃごちゃ言うより、公式を見た方が早い。
kernelのバージョン(現時点では3.10以上)に注意してくださいね。

Docker requires a 64-bit installation regardless of your Ubuntu version.
Additionally, your kernel must be 3.10 at minimum. The latest 3.10 minor version or a newer maintained version are also acceptable.

docs.docker.com

docs.docker.com

Rocket.Chatを入れる

1.docker-compose.ymlを書く

# vi docker-compose.yml 

app:
  image: rocket.chat
  environment:
    - MONGO_URL=mongodb://mongodb:27017/rocketchat
    - ROOT_URL=http://$HOSTNAME:3000
  links:
    - mongodb
  ports:
    - 3000:3000

mongodb:
  image: mongo:3.0
  volumes:
    - ./mongodb:/data/db
  command: mongod --smallfiles

$HOSTNAMEには自分の環境に合わせたものを入れてくださいませ。

2.mongodb用のディレクトリを作成

Dockerコンテナは削除するとデータまで削除されてしまいます。
そこが良いとこでもあるのですが。

前手順で書いたYMLファイルをよく読んで見ると、
恒久化するためにmongodbコンテナの一部ディレクトリを外に出しています。

  volumes:
    - ./mongodb:/data/db

./mongodbがホスト側、:の右がコンテナ内のディレクト

で、今、mongodbディレクトリが無いので、作成。

# mkdir mongodb

3.起動してみよう

docker-compose up -dでも起動できる。
だけど、mongodbがコネクションを待ち受ける前にRocket.Chatが起動し、接続先がなくて起動失敗する。
コンテナの再起動してもダメ。

なので、最初にDBだけ立ち上げる

# docker-compose up -d mongodb
#  # logs確認
# docker-compose logs mongodb
--- 略
mongodb_1  | 2016-06-12T12:36:33.227+0000 I NETWORK  [initandlisten] waiting for connections on port 27017

### ↑みたいなログが出ていることを確認

# docker-compose up -d app

あ。
そう、私の場合、コンテナ同士の連携がうまくいかなかった。

原因はこいつ

# sysctl -a | grep -i brid
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

bridgeにarpテーブルやらipテーブルを適用する云々という設定だそうな。
むかつくので、無効にしてやりました。

# sysctl -w net.bridge.bridge-nf-call-arptables=0
# sysctl -w net.bridge.bridge-nf-call-iptables=0
# sysctl -w net.bridge.bridge-nf-call-ip6tables=0
# sysctl -a | grep -i brid
net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
# docker-compose stop app
# docker-compose rm app
   [Y] 
# docker-compose up -d app

4.アクセスしてみる

localhost:3000 とか。

f:id:hatman62:20160615003429p:plain

私の環境だと新規アカウント作成のリンクが消えていますけど、実際はちゃんとあります。
そこでアカウントを登録してください。
最初のユーザがAdmin権限を持つので、注意ですよ

5.LDAP連携と新規登録ユーザ拒否設定

管理 > LDAP から設定できます。
自分の設定をさらす。

検索窓の「変数 シェル」が恥ずかしい

f:id:hatman62:20160615004514p:plain

f:id:hatman62:20160615004520p:plain

f:id:hatman62:20160615004524p:plain

f:id:hatman62:20160615004528p:plain

f:id:hatman62:20160615004532p:plain

f:id:hatman62:20160615004537p:plain

f:id:hatman62:20160615004539p:plain

こんな感じでOpenLDAPと連携しています。
LDAPサーバ構築の記事と見比べてみると、ふむふむと思えるはず。。。

次に新規ユーザをブロックします

管理 > アカウント から設定できます。

f:id:hatman62:20160615005004p:plain

「新しいユーザを手動で承認する」にチェックをつけると、管理者が承認しない限りログインできません。
LDAP連携しているなら、「いいえ」で良いと思います。

f:id:hatman62:20160615005009p:plain

「登録フォームへのアクセス」を無効に設定すると、新規ユーザの登録画面が出ません。

今日はここまで。

環境構築:LDAPサーバ その3

hatman62.hatenablog.com

hatman62.hatenablog.com

前回のおさらい

前回、組織単位、GroupsとかPeopleとか設定しました。
一応前回のものを貼っておくと、こんな感じ。

# vi base.ldif 

--- 以下内容
dn: ou=People,dc=hatenablog,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=hatenablog,dc=com
objectClass: organizationalUnit
ou: Groups

今回やること

前回登録したou(部署)に対して、ユーザや部署名を設定していきます。

1. パスワードを取得

# slappasswd 
New password: 
Re-enter new password: 
{SSHA}wdPbk8MJq7bbfOkyuUBppMekBuds5xG7 #{SSHA} を含めてコピー

2. ldifファイルを書く

というわけで、書いていきます。

vi ldapuser.ldif

# Groupsに所属する部署
dn: cn=Users,ou=Groups,dc=hatenablog,dc=com
objectClass: posixGroup
cn: Users
gidNumber: 5000

# Peopleに所属する人
dn: uid=tanaka,ou=People,dc=hatenablog,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: tanaka
sn: Tanaka
givenName: Taro
cn: Taro Tanaka
uidNumber: 10000
gidNumber: 5000
userPassword: {SSHA}wdPbk8MJq7bbfOkyuUBppMekBuds5xG7
loginShell: /bin/bash
homeDirectory: /home/tanaka
mail: tarotanaka@hoge.co.jp

属性名や名前は適宜読み替えてください。

とりあえず、自分はこれで登録しました。
objectClass、ちゃんと追えていないので、いつか解析したいと思います。。。いつか。。。

3. 登録

# ldapadd -x -D cn=admin,dc=hatenablog,dc=com -W -f ldapuser.ldif 
Enter LDAP Password:  #LDAPインストール時のAdminパスワード

adding new entry "dn: uid=tanaka,ou=People,dc=hatenablog,dc=com"

これでOK!

ようやっと基盤ができてきました。

環境構築:LDAPサーバ その2

前回の続きから。

hatman62.hatenablog.com

OpenLDAPのインストール記事を読んでいると、slapd.conf というファイルを編集する記事が多いです。
が、そんなファイルはどこにもなく。。。

バージョンが変わって、ファイルの位置やらなんやら変わるのは多いことです。

というわけで、まずはバージョンを確認

# slapd -V
@(#) $OpenLDAP: slapd  (Ubuntu) (May 11 2016 16:12:05) $
    buildd@lgw01-10:/build/openldap-mF7Kfq/openldap-2.4.42+dfsg/debian/build/servers/slapd

openldap-2.4.42 ということがわかりました。

これを元に検索検索ぅ
で、記事見つかります。

takowasa note: OpenLDAP2.4での設定スキームの移行

OpenLDAP-2.4.28セットアップ。ベースDNと管理者DN | テックラボ 来夢多゛

先人たちは、slapd.confを元にして設定を作成しているらしい。
そもそも無いしなぁ、、、一から作れる気がしない。

さらに検索。
ubuntuのサポートページを発見。

OpenLDAP Server

これだ!

というわけで、まんまマニュアルに沿って、構築していきます。

1./etc/hostsの設定

dc=noadmin になってる原因がようやくわかりましたよ。。。
hostsを読んでたんですねぇ、、、そりゃ設定してなかったわ。

hatman62.hatenablog.com であれば、/etc/hostsにこう書きます

127.0.1.1 hatman62.hatenablog.com hatman62

そうすると、dc=hatenablog,dc=com とインストール時に設定されます。
ファイルが編集できたら、再起動。

2.OpenLDAPインストール

の、前にアンインストールですな。

# apt-get purge slapd ldap-utils

purgeだと設定ファイルなんかも消してくれるそうです。
removeだと消えないらしい。

# apt-get install slapd ldap-utils

管理者パスワードを設定してください。
終わったら、slapcatコマンドでdc=nodomainになっていないことを確認

People,Groupsの設定

# vi base.ldif 

--- 以下内容
dn: ou=People,dc=hatenablog,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=hatenablog,dc=com
objectClass: organizationalUnit
ou: Groups

dcのところは適宜読み替えてください。

ldapaddする

# ldapadd -x -D cn=admin,dc=hatenablog,dc=com -W -f base.ldif 
Enter LDAP Password: 
adding new entry "ou=People,dc=hatenablog,dc=com"

adding new entry "ou=Groups,dc=hatenablog,dc=com"

やっとこさできました。。。。

今日はここまで。
次はユーザを追加していきます。

グローバルIPが振り出されたので。

申請したのが深夜、それでも2日後の今日にはグローバルIPの設定通知書が届きました。
こんなに早いのってくらい早かった。

さてはて。
さっそく、前回のDDNSの続き

hatman62.hatenablog.com

今の構成について

Windows10のホストマシンにVirtualBoxを入れて、Ubuntu16.04を動かしています。
今回、グローバルIPを設定するのは、このVMの方。

あとで図を挿入したいと思います。

設定後

ホストマシン(Windows)からPingを打ってみる。

>ping XX.XX.XX.XX

XX.XX.XX.XX に ping を送信しています 32 バイトのデータ:
XX.XX.XX.XX からの応答: バイト数 =32 時間 =3ms TTL=63
XX.XX.XX.XX からの応答: バイト数 =32 時間 =1ms TTL=63
XX.XX.XX.XX からの応答: バイト数 =32 時間 =1ms TTL=63

お、通った。
でも、これって部屋にあるハブを通ってるだけなんじゃないの?(NW素人並の感想)

というわけで、tracertも打ってみる

>tracert XX.XX.XX.XX

hogeeeeeeeeeeee [XX.XX.XX.XX] へのルートをトレースしています
経由するホップ数は最大 30 です:

  1    <1 ms    <1 ms    <1 ms  XX.XX.XX.XX
  2     1 ms     1 ms     1 ms  hogeeeeeeeeeeee [XX.XX.XX.XX]

トレースを完了しました。

一応、ルータを介しているっぽい。

まだまだ疑う

myDNSでドメイン名を設定し、IPアドレスを設定。

で。Dockerでhttpdを立てて、スマホからアクセスできることを確認する。

確認のための、index.htmlを作成

# nano index.html

<h1>Hello!!!!!</h1>

Dockerコンテナを立てる

# docker run -it --rm --name my-apache-app -p 80:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd

おしまい。
Dockerのインストールは今度説明する。

この状態で、スマホからアクセス。もちろん、wifiは切って、携帯電話の回線でアクセスする。

と、できちゃう。

f:id:hatman62:20160610001938j:plain

確認したのは妻の携帯だけど、このスクショは私のsimなし携帯なので、wifiマークついてます。
悪しからず。。。。

環境構築:LDAPサーバ

LDAPとは

記事参照のこと。

www.infraexpert.com

LDAPサーバをなぜ立てる

RocketChatなど、各種サービスを立ち上げる予定。
デフォルトだと誰でもアカウントを作成できてしまうので、LDAP認証を利用したいと考えた。

LDAP連携可能なサービス

などなど。一々アカウントなんか作ってられない。

OpenLDAPインストール

  • OS: Ubuntsu 16.04 64bit
  • VirtualBox上で動かしている

  • OpenLDAPをインストール

# apt-get -y install slapd ldap-utils

任意の管理者パスワードを入力(2回) f:id:hatman62:20160608214701p:plain

  1. ユーザとグループ用のベースを登録
# nano base.ldif
dn: ou=people,dc=XXX,dc=co,dc=jp
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=XXX,dc=co,dc=jp
objectClass: organizationalUnit
ou: groups 

# ldapadd -x -D cn=admin,dc=XXX,dc=co,dc=jp -W -f base.ldif 
Enter LDAP Password:     # 管理者パスワード
ldap_bind: Invalid credentials (49)

...ん???

ldap_bind: Invalid credentials (49)

ハマった。

パスワード合ってるはずなのに、なんでじゃー。
ハマる人多いみたいですよ(当社比)

原因は、いい加減に入力した、dcの部分
任意だと思ってたねー、ちゃんとドメイン名を書かないとダメなのねー。

本当に助かりました↓
Carpe Diem LDAPの構築 その1(インストール、初期設定)

slapcatコマンドで確認すると、たしかに、nodomainに。
DNSサーバに登録すればちゃんと書き変わるんだろうか、、、、
固定IP化してからじゃないと何も動けなくなってしまった。。。。

次回はDockerでGitLabを立てたいと思います。
何も進展なくてごめんなさい。