環境構築: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
がドメイン名で設定しているヤツね。
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.
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
とか。
私の環境だと新規アカウント作成のリンクが消えていますけど、実際はちゃんとあります。
そこでアカウントを登録してください。
最初のユーザがAdmin権限を持つので、注意ですよ
5.LDAP連携と新規登録ユーザ拒否設定
管理 > LDAP から設定できます。
自分の設定をさらす。
検索窓の「変数 シェル」が恥ずかしい
こんな感じでOpenLDAPと連携しています。
LDAPサーバ構築の記事と見比べてみると、ふむふむと思えるはず。。。
次に新規ユーザをブロックします
管理 > アカウント から設定できます。
「新しいユーザを手動で承認する」にチェックをつけると、管理者が承認しない限りログインできません。
LDAP連携しているなら、「いいえ」で良いと思います。
「登録フォームへのアクセス」を無効に設定すると、新規ユーザの登録画面が出ません。
今日はここまで。
環境構築:LDAPサーバ その3
前回のおさらい
前回、組織単位、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
前回の続きから。
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のサポートページを発見。
これだ!
というわけで、まんまマニュアルに沿って、構築していきます。
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の続き
今の構成について
Windows10のホストマシンにVirtualBoxを入れて、Ubuntu16.04を動かしています。
今回、グローバルIPを設定するのは、このVMの方。
あとで図を挿入したいと思います。
設定後
>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] トレースを完了しました。
一応、ルータを介しているっぽい。
まだまだ疑う
で。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は切って、携帯電話の回線でアクセスする。
と、できちゃう。
確認したのは妻の携帯だけど、このスクショは私のsimなし携帯なので、wifiマークついてます。
悪しからず。。。。
環境構築:LDAPサーバ
LDAPとは
記事参照のこと。
LDAPサーバをなぜ立てる
RocketChatなど、各種サービスを立ち上げる予定。
デフォルトだと誰でもアカウントを作成できてしまうので、LDAP認証を利用したいと考えた。
LDAP連携可能なサービス
などなど。一々アカウントなんか作ってられない。
OpenLDAPインストール
- OS: Ubuntsu 16.04 64bit
VirtualBox上で動かしている
OpenLDAPをインストール
# apt-get -y install slapd ldap-utils
任意の管理者パスワードを入力(2回)
- ユーザとグループ用のベースを登録
# 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を立てたいと思います。
何も進展なくてごめんなさい。