redashでのアクセス制御について

※redashの権限指定に誤りがあったので修正(2018/01/18)※ f:id:yassan0627:20171202153537p:plain Redash Advent Calendar 2017 の 22日目の記事です!

redashを使って可視化したら今度は、色々な人に公開したくなりますよね?

ただ、会社によっては、「あのデータを全員に見せるのは如何なものか?」勢が少なからずいるはず。
まぁ、なんでもかんでもデータを見せることで事業リスクなったり、インサイダーな重要事実を知っている扱いの人を不用意に増やすのもまた問題でもあります。

そういう訳で、必要な人に適度にデータを公開する為に、redashを使った取り組み事例のご紹介。

検証環境

  • ホスト:Ubuntu 16.04 LTS
  • redashは、Dockerイメージを使って構築(v3.0.0+b3134)

TLDR

  • グループにパーミッション設定をつければ良いが、GUIでは指定不可。 CLIでは出来るようだが、今回はテーブル直接変更した。
  • redashだけでは、クエリ単位のパーミッション設定は出来ない。 なので、ロール違いの同じデータベースなデータソースを複数用意して、ロールに応じて参照権限有/無でうまいこと切り分ける(かなり力技)。

はじめに

redash単体で可能なアクセス制御は以下の通り、ソース見るとパーミッション設定値がそのままなので、イメージが湧くと思います。

cf. redash/groups.py · getredash/redash

@option('--permissions', default=None,
        help="Comma separated list of permissions ('create_dashboard',"
        " 'create_query', 'edit_dashboard', 'edit_query', "
        "'view_query', 'view_source', 'execute_query', 'list_users',"
        " 'schedule_query', 'list_dashboards', 'list_alerts',"
        " 'list_data_sources') (leave blank for default).")

見難いので、整理するとこんな感じ

create_dashboard
create_query
edit_dashboard
edit_query
execute_query
list_alerts
list_dashboards
list_data_sources
list_users
schedule_query
view_query
view_source

また、コードにもあるとおり、パーミッションはグループに付与するようです。
ここでは、CLI経由でグループ作成時に指定するようです。GUIでは指定出来ないので、CLIを使う事になりますが、イマイチわからないので、テーブルを直接書き換えちゃいます

前提条件

ユーザ 所属グループ パーミッション
member1 member_group すべての操作可能
manager1 manager_group ダッシュボードの選択と閲覧しか出来ない

cf. ダッシュボードの用意には、id:kakku22 さんの kakakakakku/redash-hands-on: Redash study materials for beginners 📊 を活用させていただきました。
cf. testデータソース用のテーブルデータは、 Mockaroo を使ったダミーテーブルを作成しました

ユーザ及びグループの作成

まず、グループの作成、管理者ユーザでredashにログインし、グループを2つ作成し、ユーザを各々所属させます。

f:id:yassan0627:20171217184557p:plain
f:id:yassan0627:20171217184602p:plain

グループのパーミッションの変更

次に、redashのデータベースに入って、groupsテーブルを以下のようにいじります

f:id:yassan0627:20171217184220p:plain

グループ パーミッション
'member_group' '{"view_query","execute_query","list_dashboards"}'
'manager_group' '{"create_dashboard","create_query","edit_dashboard","edit_query","view_query","view_source","execute_query","list_users","schedule_query","list_dashboards","list_alerts","list_data_sources"}'

※更新すると即時反映されます

変更結果

manager1の表示

デフォルトと特に変わりません
f:id:yassan0627:20171217185352p:plain
f:id:yassan0627:20171217185355p:plainf:id:yassan0627:20171217185359p:plain f:id:yassan0627:20171217185406p:plain

member1の表示

一方、memberの方は、クエリやアラートなどの表示が消えて選択できなくなっています。
f:id:yassan0627:20171217185806p:plain

また、ダッシュボードの作成も出来ません。
f:id:yassan0627:20171217185809p:plain

ダッシュボードも右端にあるはずの編集ボタンが消え、各クエリへのリンクもなくなっていることがわかります。
f:id:yassan0627:20171217190313p:plain

データソースを分ける

データベース test を作成して、ロール ope_1、ope_2を作成して、以下のように権限設定します。

テーブル名 ope_1 ope_2
users 参照可能 参照不可
play_list 参照可能 参照可能

下記のようにデータソースを作成

ope_2が参照出来ない ope_2で参照
f:id:yassan0627:20171217202048p:plain f:id:yassan0627:20171217202059p:plain

各グループに作成したデータソースを割り当て

グループ 設定
manager f:id:yassan0627:20171217203255p:plain
member f:id:yassan0627:20171217202402p:plain

クエリを下記のように作成

f:id:yassan0627:20171217202609p:plainf:id:yassan0627:20171217202614p:plain

上記2つのクエリをならべたダッシュボードを作成して、ユーザによって表示を確認

グループ 表示
manager f:id:yassan0627:20171217203337p:plain
member f:id:yassan0627:20171217203343p:plain

まとめ

以上が現状までに考えた対策です。
ただ、これ非常にややこしい(特にデータソースで分ける辺り)。しかも、柔軟性に乏しいので、その場しのぎでしか無いです。

この方が楽だとか、あればぜひ教えてください!

明日は、 @katsuhisa__ さんです。お楽しみに。

今年のビールを振り返る

f:id:yassan0627:20171216175109p:plain Beer Advent Calendar 2017 Adventar の18日目の記事です。

ビール好きですか?

ワタシ、ビールチョットスキデス。

上の絵は今年飲んだビールの一部をタイル状にしてみました。

そして、日本の井戸水 日本酒も大好きです。 日本酒 Advent Calendar 2017 でも記事書いてるのでそちらもよろしく。

ビール美味しいですね。ビール。

中でもクラフトビールに分けられるビールが大好きです。
ピルスナーも暑い日にキンキンに冷やして、太陽の下で飲むのは最高ですね。

ただ、ピルスナーだけじゃなく、スタウトやポーター、ペール・エールIPAとその他のジャンルが特に大好きですね。 中でも一番好きな「ポーター、スタウト」と「IPA」の2つに分けてご紹介。

ポーターやスタウト系

いわゆる黒ビールってやつですね。
最近では、国内大手ビールメーカーからも出てますが、どれもピルスナーの枠から超えない感がどうしてもあって、好みでは無いです。

コスパが最高なのは、ヤッホー・ブルーイング東京ブラックも捨てがたいですが、やっぱり Lion Stout ですね。
f:id:yassan0627:20171216175159p:plain
ほのかに丁度よい甘さが好きです。 KALDIとかにも置いてたりするので、見かけたら一度飲んでみては。

一番美味しかったのは、伊勢角屋麦酒 スタウト です。
f:id:yassan0627:20171216175900p:plain
コーヒーみたいなロースト感と甘みがほんと美味しかった。

あぁ、MINOH BEER スタウト も捨てがたいなぁ。これも最高に美味しいです。

IPA

独特の強い苦味がたまらん。 IPAは特に好きで大体IPAばかり飲んでます。

コスパ高くて調達しやすい インドの青鬼 はローソンで買えるのでほんとありがたい。

一番美味しかったのは、 志賀高原IPA Fresh Hop です。期間限定の志賀高原IPAの自家栽培ホップ生ホップ版で、香りが良く苦味も最高でホント美味しかった。来年も飲みたいなぁ。
f:id:yassan0627:20171216181331p:plain

他にも箕面ビールのおさるIPAとか、W-IPAもかなり美味しいです。

まとめ

最近はヤッホー・ブルーイングの製品がコンビニで買えるので、遅くなっても飲めるようになったのはホントありがたいですね。 去年もやってましたが、夏限定の僕ビール、君ビール。続よりみち も美味しいです。通常版も美味しいですが、特によりみちは美味しい。 後、ちょっと前に出た 僕ビール、君ビール。ミッドナイト星人(ホッピーアンバー) も美味しいです。
f:id:yassan0627:20171216181813p:plainf:id:yassan0627:20171216182253p:plain

始めの頃は、外国のクラフトビールを飲んでましたが、高いのでホイホイ買えない。。。Rogue の DEAD GUY ALE とか好きなんだけど、高い、、、
それなら国内のクラフトビールメーカーでも十分に美味しいので、最近では国内メーカばかり飲んでます。

来年も美味しいビールが出ないか楽しみですね。

明日は、 @masuP9 さんです。渋谷のよく行くビールのお店だそうです。すごく楽しみですね。

今年飲んで美味しかった日本酒を挙げていく

f:id:yassan0627:20171216191916p:plain

日本酒 Advent Calendar 2017 の17日目の記事です。

上の画像は、今年飲んだ日本酒の一部です。 ビールも美味しいのだけど、やっぱり日本酒が一番美味しい。

居酒屋で飲むとどうしても高くなるので、家飲みが多くなりますね。

では、その中でも特に美味しかったケシカランニホンシュを挙げて行きます。

大典白菊 直汲み純米吟醸生酒 岡山朝日米五五

f:id:yassan0627:20171216204407j:plain

岡山 備中の地酒 白菊酒造 のお酒。

シャリにも使っている食用米 朝日米を使った日本酒。 五五とは、55%まで磨いているらしい。
すごくバランスの良いお酒。旨みと香りが最高! 生酒特有のシュワッと感もあって美味い。

Shirakiku Beilliant 純米吟醸無濾過生原酒

f:id:yassan0627:20171216192225p:plain

銀シャリって銘柄のお酒も作ってる京都府京丹後市 白杉酒造株式会社 のお酒。

こちらも丹後産コシヒカリを使ったお酒。 酸味と香りのバランスが良いです。白ワインみたいな感じ。それを意識してワインボトルになってます。

不動 おりがらみ 出羽燦々

f:id:yassan0627:20170312224104j:plain

千葉県の仁勇と不動で有名な 鍋店株式会社 のお酒。

シュワッと感と程よい甘味と最後のキレがたまらん!
女性なら多分好きそう。

笑四季 純米大吟醸 真夜中のバカンス

f:id:yassan0627:20171216202217p:plain

ラベルがおしゃれな 笑四季酒造 夏酒っぽくアッサリめだけどちゃんとキレもあるし美味い!生だったらヤバイ。

純米大吟醸 無濾過生原酒

f:id:yassan0627:20171216202958p:plain
山形県の東光がメインブランド 小嶋総本店のお酒。

旨さとキレが抜群。香りは控えめだけど、旨味と甘さのバランスがとても良い。

まんさくの花 超限定純米大吟醸一度火入れ原酒

f:id:yassan0627:20171216192240p:plain

秋田の地酒 まんさくの花 で有名な 日の丸醸造株式会社 のお酒。
ラベルだけだと、「超限定」とか「大吟醸」とか形容詞的な表現が真ん中にどかーんとあるお酒はだいたい失敗なんだけど、これは別。

春と秋、1年に2回、発売される超限定商品。 今年一番のお酒。むっちゃ好み。ケシカラン。

以上、今年の日本酒を振り返るでした。

新米データエンジニアがPGConf.ASIA に初参加してきた

PostgreSQL Advent Calendar 2017 の過ぎてしまった14日目の記事です。

データ分析や集計処理で使っている(&使えそうな?)クエリについて紹介しようとしていたのですが、色々アレヤコレヤがあって、察してくれという事で、路線変更。

うちの部署ではデータ分析基盤を新規改装中で、ようやくRDMBSをちゃんと使い始め(まぁもろもろ大変でした)、データ分析向きでお安く始められるけど、素敵なPostgreSQLを使っています(他にもperl、embulk、kuroko2とか色々ありますがこれはまた別の機会に)。
なので、データエンジニアとしては、身銭切ってでも(色々あって会社からサポート取れなかった)行きたいって事で参加してきました。

f:id:yassan0627:20171212062306p:plain

PGConf.ASIA 2017 は、アジア最大のPostgreSQLコミュニティイベントで、12月4日〜12月6日の期間で実施されました。 私が参加したのは、Day1とDay2の2日間です。

各セッションの説明や一部スライドは以下から確認出来ます。

また、当日のツイートまとめは以下

PGCONF.Asia 2017 ツイートまとめ - Togetter

気になった話題としては、以下がありました。

  • PostgreSQL 10の説明やそれ以降、どのように変わっていくか
  • ロジカルレプリケーション、パラレルクエリ、パーティショニング、シャーディング、HAなどの紹介や制限事項
  • SQLクエリの最適化、ウィンドウ関数などのPostgreSQLでのSQLの話
  • PostgreSQLの活用事例紹介
  • SCRAM認証やDB自身の暗号化といったセキュリティ面

まぁ、全方位って感じですね。

データ分析屋さんとしては、パラレルクエリやロジカルレプリケーション、SCRAM認証やDBの暗号化などは使ってみたいところではあるけど、機能面や周辺のミドルウェアやライブラリの対応などがまだ整っていないので本番で使うには色々悩みどころです。
今後の予定からすると、Pg12辺りにはなんとかなりそう(?)

印象としては、バージョン重ねるたびに、Hadoopに近寄っている感がすごくするのは私だけかなぁ。

では、改めて、本題。聴いた講演の中から印象に残ったいくつかを紹介。

PostgreSQL universal database

スライド

Oleg Bartunov さんによる、「PostgreSQLを使うのがいかに良い選択肢なのか」って事が良く分かるお話でした。

歴史を振り返りながら、PostgreSQLの魅力がふんだんに紹介されていました。

スライドpp13(Case 2: NoSQL Postgres)で、NoSQLとしての対応について述べらてていたのですが、2018には SQL:2016 - wikipedia に対応し、 2019頃?には、それを拡張して、Custom typeのサポートや、インデックスの改善?、JSONの更新、削除にも対応するらしい。

詳しいSQL:2016については、 What's New in SQL:2016 を見ると良いかと。 データ分析をする際に、Rawデータを扱う際にスキーマレスにしたいって事が多々あるので、この辺りの対応はとてもうれしい。

ただ、JSON便利なのだけど、データサイズが大きくなるので、PostgreSQLの仕様上、TOASTが発生してパフォーマンスが落ちる問題がある。 TOASTについては、 TOASTメカニズム - KaiGaiの俺メモ がとても参考になります。

また、ご自身の関わるお仕事(宇宙しゅごい話)も熱かった。内容も濃いのだけど、扱っているDBサイズがトータル100TBって、、そこまで行けるんですね。

PostgreSQL Strengthen Our Country

Julyanto Sutandang さんによる、インドネシアでのPostgreSQLの利用について。 「某赤い商用RDBMSなどの外国製のプロプライエタリな製品を使わずにPostgreSQLを使う事で、国レベルで輸入額を減らす。」
なるほどって思いました。また、見ている視野が違う。やり手なんだろうなぁって感じの人でした。
また、様々な金融系の利用事例を見ているとインドネシア国内の大手銀行でも当たり前に使っているようです。

Postgresパーティーをバリでどう?ってバリ島押しが面白かった。一度、行ったことがありますが、ご飯も美味しいし、景色も良いし、バリ良いよバリ。

QAで、Oracle RACPostgreSQLで置き換えに関して、HAに関する質問だったのだけど、RACとしての機能をどう補完したのかってところには触れられず。。

What’s new in PostgreSQL 10

スライド

Magnus HaganderさんによるPosgreSQL10の話。

互換性のなくなる話がちらほら。移管の際には参考になりそう。 クライアント認証をよりセキュアにするSCRAM認証をサポートしたとの事。この辺は、クライアントアプリやドライバやライブラリとかがサポートしているかしっかり確認してから使わないと事故りそうだ。

モニアリング面では、pg_stat_activityの可視性が向上したのと、モニタリング用のロールの追加ってのは運用していてありがたい。

良く分からなかったのは、XML tableのサポート。どこにメリットがあるのかイマイチわからない。

バックアップやレプリケーションに関して、 postgresql.confpg_hba.conf のデフォルト値が以下のように変わることでローカルでレプリケーションをすぐに使えるようになっているとの事。

postgresql.conf defaults:
- wal_level = replica
- max_wal_senders = 10
- max_replication_slots = 10

pg_hba.conf defaults:
- Replication connections by default

スライドpp42(Don't forget)で、WALリサイクリングとかVACUUMに気をつけようぜ!ってあるけど、その割には、デフォルトの値が割とアグレッシブなのが気になりました。モニタリング必須ですね。

ロジカルレプリケーションについても触れられていたが、利用するにはユースケース選びそうな雰囲気。

アイルランド最大の薬局サプライヤーチェーンの BI プラットホームに使われたPostgres. 私達の経験と失敗

スライド

Andy Fefelovさんによる事例紹介。

まったく知らない製品があって、国によって違うんだなぁと。

SpagoBI

SpagoBI は、OSSのBIだそうです。ただ、 新しいバージョンから、 Knowage って言う、 OSSのBIスイートの一部として取り込まれたみたい。CEとEEがあるのでお試しは出来そう。
パット見はキレイだけど、BI製品はどれもライセンス高いのでこれを使ってみるのもありかもしれないですね。

ここでは、BIとしてのUIはこちらを使っているようです。

Pentaho / Mondrian / Saiku

Pentaho もBIスイートの一つですが、もともとは、Pentaho Corporationというアメリカの会社だったのですが、Hitachi Data Systems Corporationと統合して、 Hitachi Vantara の製品となっているようです。

CE版はありますが、もはやオープン感は薄い感じ(勝手な印象)。

この辺りが参考になりました。 オープンソースBIのPentaho(ペンタホ)ブログ: アーカイブ qiita.com

どうやらETL周りはここが担当しているようです。

Cubes(databrewery)

github.com

アドホックに分析する際に、いろんな切り口で分析し易いようにするためのOLAPの為のフレームワークのようです。

以下のスライドがとても分かり易いです。

www.slideshare.net

他のスライドも参考になりました。
www.slideshare.net

Cubesを使って、RDBのデータをstar schemaとして集約したモデリングを行い、HTTPで多次元的にスライスするってのは、シンプルで良いですね。 ただ、開発止まってるっぽいのが残念。他のデファクトがあるのかなぁ。

スライドから推測した全体像としては、
Postgresをraw dataを置く「stage」、標準化した「nds」、cubeやスナップショット、ビューとして集約した「ddm」の3層に分けたデータストアとし、

  1. Cyclone_client(自前?)でCSVを取得、Kachok(かちょく)でWebスクレイピング、Skytoolsで既存のプロダクトからPL/pgsqlでデータ抜くなどした raw dataをstageに配置
  2. Pentaho(PDI)でETL処理して、標準化して、ndsに配置
  3. Cubes使ってモデリングし、必要ならスナップショット、ビューを作成して、ddmに配置 して、データを用意
  4. CubesとAPI経由でデータを取得しリッチなグラフを用意(D3、DC、croosfilter)したり、ACLする自前のRails+ReactのAPIを用意
  5. 4をI/Fとして、SpagoBIをビューアとしてユーザに見せている

と言った感じかなぁ。

各ツールを使ったこと無いので実際のところどうなのか自信ない。。。
Cubes面白いなぁ。

PostgreSQL 10 を導入!大規模データ分析事例からみる DWH としての PostgreSQL 活用のポイント

スライド

石井 愛弓さんによる、PostgreSQL10でパラレルクエリをつかったDWHとしてPostgreSQLを扱う際の抑えどころの紹介。
現状でパラレルクエリを使う際にとても参考になる話でした。実際に使ってみたいと考えていたところだったので、この検証結果は本当にありがたい。

その他

その他にも、

  • Dmitry Dolgovさんの「PostgreSQL での NoSQL 成功事例( スライド )」はJSONPostgreSQLで使う際の参考になった
  • Michael Paquierさんの「SCRAM authentication( スライド )」は、SCRAM認証って何か知ることが出来たし
  • Bruce Momjianさんの「Postgres Window Magic( スライド )」は、Windows関数についてとても参考になった
  • Ashutosh Bapatさん、Amit Langoteさんの「Declarative Partitioning Has Arrived( スライド1 スライド2 )」は、パーティショニングを検討する上でとても参考になった
  • Ilya Kosmodemianskyさんの「PostgreSQL クエリ最適化テクニック ステップ・バイ・ステップ( スライド )」や 高塚 遥さんの「SQL パフォーマンスチューニング技法 2017( スライド )」は、SQL最適化に対してとても参考になった
  • 篠田 典良さんの「Logical Replication Internals( スライド )」や澤田 雅彦さんの「PostgreSQL Replication 2.0( スライド )」は、今後のレプリケーションを考える上でとても参考になった。また、澤田さんのデモの手際の良さがすごい。手慣れてる感ある。

つまり、みんな良かった。 他にも被ってて聴けなかった講演もありましたが、どの講演もすごく良いものでした。

感想

控えめに言っても、学びの多い、最高の2日間でした。

今のPostgreSQLの話やPostgreSQLの活用事例、DBチューニングやSQL話など様々あって、とても参考になる時間でした。
また、通訳のあるセッションについては、英語のスピーカーに対して、日本語で質問して&回答もらえる(通訳してくれる)のでとても有難かった(事前にアナウンスしてくれるとすごく良かった)。

あと、PostgreSQLのステッカーを期待してたけど無かったのが残念。。。欲しいなぁf:id:yassan0627:20171216170953p:plain

会場は、 秋葉原コンベンションホール で、立地もよくお昼ご飯にも困らなかった(選ぶのに困るくらい)。

今回は、

てな感じで、 そーだい(@soudai1025) さんからぐいぐい誘われたのだけど、アウトプットせねば詰むっとなって集中して聴けたし、結果、良いきっかけになったので良かった。ありがとう。そーだいさん。

おまけ

Day1の後に、個人的に飲みに行った帰りに、 鈴木酒販神田店 って良さげな酒屋さんがありました。
日本酒やクラフトビールが程良く揃ってて、角打ちもあるので近くの人は行ってみると良いかも。

プロジェクト管理 on Redmine on Dockerで運用含めて考えてみる~環境構築編~

f:id:yassan0627:20171202151039p:plain

Redmine Advent Calendar 2017 の 11日目です!

redmine.tokyo という、Redmine勉強会でコアスタッフをしている やっさん🍶(@yassan168) です。

今回は、RedmineをDocker使って環境を構築し、運用面まで考えてみます。 、、、のつもりでしたが、ボリュームがでかいので次回12/25に運用編は分けます。
(´-`).。oO(2段階認証のGmailアカウントからのメール送信を解決するのに時間がかかった上に成果が無いという悲惨な話。。)

前提条件

  • 実行環境は、Ubuntu 16.04 LTS(私のノートがUbuntuなので)
  • RDBは、PostgreSQLがすでに用意してある
  • パブリックIPは、192.168.11.6
  • サイトドメインredmine.yassan.local とするため、hostsに設定追加
192.168.11.6 redmine.yassan.local
  • 実行ユーザは、 redmine を新規に作成(PW指定無し。 sudo su - redmine で切り替え)
  • SELinuxはdisable

要件

  • Redmineの構築コストが低い
  • プラグインや添付ファイル、テーマはコンテナに含めない
  • Redmineプラグインが自由に追加可能
  • 添付ファイル、テーマなどのバックアップが可能
  • URLに「/redmine」を入れること
  • HTTPSである事

Dockerfileはどうするのか?

Dockerでredmineを動かすにも、一からDockerfileを書いてもいいのですが、車輪の再発明の匂いがするのでDocker Hubで検索すると480リポジトリもありました。 f:id:yassan0627:20171203112104p:plain

Docker公式の library/redmine - Docker Hub もありますが、こちらは割とプレーンな状態で、一から運用面などを考慮する必要があります。独自にどうこうしたい人はこちらを使って、docker-compose使ってイイ感じしたら良いかと思います。

今回は、 その中でも sameersbn/redmine を使います。

Redmine.tokyo の事前アンケート でも利用している人が多い bitnami のイメージ bitnami/redmine - Docker Hub もあります。

こちらは、コンポーネントをALL bitnamiなので、bitnamiユーザならこちらでも良いのかも。

また、今回使用するDockerイメージの作者 sameersbn (Sameer Naik) さんは、bitnamiの中の人ですね。

dockerの用意

その辺はお手本が山程あると思いますのでおぐぐりください。 私は諸般の事情で Hosts in Rancher にある Install Scriptで docker-ce 17.06をインストール後、うっかりアップグレードしないようVer.固定してます。

また、rootじゃなくてもdockerを実行出来るようにしています cf. Post-installation steps for Linux

$ curl https://releases.rancher.com/install-docker/17.06.sh | sh
$ apt-mark hold docker-ce
$ sudo groupadd docker
$ sudo usermod -aG docker redmine

docker-composeの用意

Install Docker Compose | Docker Documentation を参考にしてインストールください。

Ver.確認

$ docker --version
Docker version 17.06.2-ce, build cec0b72
$ docker-compose --version
docker-compose version 1.17.0, build ac53b73

添付ファイルやバックアップ、証明書の置き場の作成

docker起動時に参照するディレクトリを作成

$ sudo mkdir /srv/docker/redmine/redmine
$ cd /srv/docker/redmine/redmine
$ sudo mkdir backups files plugins themes tmp certs
$ sudo chown -R redmine:redmine /srv/docker/

(新規向け)redmine用のデータベースとユーザを作成

sameersbn/redmine 自体は、MySQLでもいけるけど、RedminePostgreSQL推奨なので、PostgreSQLを使います。

cf. Defect #19344: MySQL 5.6: IssueNestedSetConcurrencyTest#test_concurrency : always fails - Redmine
cf. Feature #17460: MySQL 5.7 support - Redmine

$ sudo -u postgres createuser -P redmine
※パスワードは pass0000
$ sudo -u postgres createdb -E UTF-8 -l ja_JP.UTF-8 -O redmine -T template0 redmine_dev

接続確認

$ psql -h 192.168.11.6 -U redmine redmine_dev -W
Password for user redmine: 
psql (10.1)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

redmine_dev=> \q

SSLの用意

お手軽にオレオレ証明で作成。

$ sudo su - redmine
redmine$ mkdir ~/ssl
redmine$ cd ~/ssl
redmine$ openssl genrsa -out redmine.key 2048
redmine$ openssl req -new -key redmine.key -out redmine.csr
  :
Common Name (e.g. server FQDN or YOUR name) []:redmine.yassan.local
  :
redmine$ openssl x509 -req -days 3650 -in redmine.csr -signkey redmine.key -out redmine.crt
redmine$ openssl dhparam -out dhparam.pem 2048

docker側で利用できるよう作成したファイルを証明書置き場へコピー

redmine$ cd /srv/docker/redmine/redmine/certs
redmine$ cp ~/ssl/redmine.key .
redmine$ cp ~/ssl/redmine.crt .
redmine$ cp ~/ssl/dhparam.pem .
redmine$ chmod 400 redmine.key

redmine on dockerの環境構築

sameersbn/docker-redmine: Docker Image for Redmine に必要なことはすべて書いてあります。

redmineのVer.は、 sameersbn/redminetag にあるものを指定します。 今回は、 3.4.2を使います。

また、リバプロには、 sameersbn/docker-nginxをつかい、1ユーザだけなのに、無駄に、memcachedとして、 sameersbn/docker-memcached を使います。

また、DBユーザとかパスワードなど、あまり公開したくないファイルは、 docker-compose.yml と同じ階層に、 .env を作成してそこに環境変数として書き込んで、yml側で指定します。
cf. Compose ファイル・リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

redmine$ mkdir docker
redmine$ cd docker
redmine$ vim .env
redmine$ vim docker-compose.yml

編集したファイルは以下

SMTP_USER=アカウント@gmail.com
SMTP_PASS=パスワード
DB_HOST=192.168.11.6
DB_PORT=5432
DB_USER=redmine
DB_PASS=pass0000
DB_NAME=redmine_dev
※以下は必要な人だけ
HTTP_PROXY=http://IPアドレス:ポート
HTTPS_PROXY=http://IPアドレス:ポート
NO_PROXY=127.0.0.1,localhost,自分のパブリックIP,通信が必要なローカルホスト(Gitサーバとかあれば)
version: '2'                                                                         
 
services:
  redmine:
    image: 'sameersbn/redmine:3.4.2'
    depends_on:
    - memcached
    environment:
    - TZ=Asia/Tokyo

     ※必要な人は追加
    - HTTP_PROXY: ${HTTP_PROXY}
    - HTTPS_PROXY: ${HTTPS_PROXY}
    - NO_PROXY: ${NO_PROXY}
 
    - DB_ADAPTER=postgresql
    - DB_ENCODING=utf8  
    - DB_HOST=${DB_HOST}
    - DB_PORT=${DB_PORT}
    - DB_USER=${DB_USER}
    - DB_PASS=${DB_PASS}
    - DB_NAME=${DB_NAME}
 
    - REDMINE_PORT=10445
    - REDMINE_HTTPS=true
    - REDMINE_RELATIVE_URL_ROOT=/redmine
    - REDMINE_SECRET_TOKEN=${REDMINE_SECRET_TOKEN}
 
    - REDMINE_SUDO_MODE_ENABLED=false
    - REDMINE_SUDO_MODE_TIMEOUT=15
    
    - REDMINE_CONCURRENT_UPLOADS=2
    
    - REDMINE_BACKUP_SCHEDULE=weekly
    - REDMINE_BACKUP_EXPIRY=
    - REDMINE_BACKUP_TIME=04:00
    
    - SMTP_USER=${SMTP_USER}
    - SMTP_PASS=${SMTP_PASS}

    - MEMCACHE_HOST=memcached
    - MEMCACHE_PORT=11211
    ports:
    - "10083:80"
    - "10445:443"
    volumes:
    - /srv/docker/redmine/redmine:/home/redmine/data
    
  memcached:
    image: 'sameersbn/memcached:latest'
    ports:
    - '11211:11211'
    restart: always    

注意: Gmailアカウントを指定する場合、2段階認証済みのアカウントの場合、なぜかうまく行きません。
https://myaccount.google.com/security から「アプリパスワード」選んで生成したものを使ってみたけど、使い方が悪いのかメールが飛びません。。。知ってる人いたら教えてください。

起動

redmine$ docker-compose up

https://redmine.yassan.local:10445/redmine でブラウザで開くと起動が確認出来ます。 f:id:yassan0627:20171204002501p:plain admin/adminでは入れます。

プラグインのインストール

ローカル内にプラグイン用のディレクトリ作成

$ sudo su - redmine
redmine$ mkdir -p /srv/docker/redmine/redmine/plugins

あとは、そこにいつものようにプラグインを配置するだけ。 例として、みんな大好き Redmine Drafts Plugin を例に挙げて見ましょう。

redmine$ cd /srv/docker/redmine/redmine/plugins
redmine$ git clone https://github.com/jbbarth/redmine_drafts.git
redmine$ git ls-remote --tag
From https://github.com/jbbarth/redmine_drafts.git
ff78367305399c26477a2522d080e2ca39e5bb5b    refs/tags/v0.1.0
338032656bd94d3bca57b9f7715860ebc3ed92f6    refs/tags/v0.1.0^{}
f40a06d2d891e6f165f6bfdffcbcfded7b7d5420    refs/tags/v0.1.1
30aaaf6dd1b30d97f3e9ac2717629ea9b719e78c    refs/tags/v0.2.0   ※最新はこれ
redmine$ git checkout v0.2.0

また、Dockerイメージ作者がいくつか自動で配置するようにしているようです。参考になると思います。
cf. Redmine Plugins Installation

後は、起動して完了。

テーマのインストール

プラグインと同様です。

ローカル内にテーマ用のディレクトリ作成

$ sudo su - redmine
redmine$ mkdir -p /srv/docker/redmine/redmine/themes

後は、作成したディレクトリ以下に、プラグインの時と同様にテーマを配置して、 docker-compose up し直すだけです。

まとめ

以上が、環境構築編でした。 次回は、バックアップや本体、プラグイン、テーマのアップデートや、プラグイン、テーマのアンインストールなど、日常で遭遇しそうな話メインで書いていきます。

明日は、 forenoonM さんです。お楽しみに。


FAQ

昨日動いてた(違う場所で動かした)ら、動かなくなった

パブリックIPが変わってませんか?ご確認を。

redmineの内部が見たい場合

以下のコマンドから名前を検索

redmine$ docker-compose ps
       Name                     Command               State                       Ports                    
-----------------------------------------------------------------------------------------------------------
docker_memcached_1   /sbin/entrypoint.sh /usr/b ...   Up      0.0.0.0:11211->11211/tcp, 11211/udp          
docker_redmine_1     /sbin/entrypoint.sh app:start    Up      0.0.0.0:10445->443/tcp, 0.0.0.0:10083->80/tcp

docker_redmine_1 と分かったので、以下のコマンドで内部に入ります。

redmine$ docker exec -it docker_redmine_1 bash
root@9e96d3bbbbcc:/home/redmine/redmine# ls
CONTRIBUTING.md  Gemfile  Gemfile.lock  README.rdoc  Rakefile  app  appveyor.yml  bin  config  config.ru  db  doc  extra  files  lib  log  plugins  public  script  test  tmp  vendor

あとは、いつも通りです。

初回起動で500エラーの場合

DB作成失敗している可能性があります(私は試行錯誤しながらやってて、DB作成失敗してました)。 redmine内部に入って以下を実行して作成しました(最初と最後のコマンドはおまけ)。

root@9e96d3bbbbcc:/home/redmine/redmine#bundle exec rake generate_secret_token
root@9e96d3bbbbcc:/home/redmine/redmine#RAILS_ENV=production bundle exec rake db:migrate
root@9e96d3bbbbcc:/home/redmine/redmine#RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data

cf. Redmine 3.4をCentOS 7.3にインストールする手順 | Redmine.JP Blog の「Redmineの初期設定と初期データ登録」

やっさん的美味しい酒に出会える酒屋

f:id:yassan0627:20171202141813j:plain

日本酒 Advent Calendar 2017 の4日目の記事です。

カレンダーに余裕があるので、せっかくなので他にも何か書いてみるって事で、 わたしが考える「美味しいお酒に出会える酒屋」について書きたいと思います。

冷蔵庫がちゃんとしている

日本酒と言うかお酒は温度管理大事。

生酒などは特に低温じゃないと販売も出来ません。 なので、扉付きの冷蔵庫など、とにかく、冷やす設備が揃っているところは美味しい酒に出会える可能性が高いです。

また、生酒はあまり日本酒飲まない人にも飲みやすいものが多く、試しに日本酒飲みたいって人は生酒がある冷蔵庫がしっかりしたお店を選ぶと良いです。

試飲出来る

酒屋さんには、お店の人向けに売り込み用のサンプルは販売元からもらえるらしいです。そのサンプルをちょっとだけ試飲出来たりするお店があります。

また、お店によっては、オススメだけ幾つか試飲出来たりします。

そんなお店なら自分にあったお酒が選べますね。

お店の人が実際に飲んで感想が言える

これは完全に経験ですが、一番大事にしてます。

自分の好みを伝えて、オススメを聞いた際に、「私は飲んでないけど、お客さんが良く買っていくのは...」みたいに言ってくるお店は大体ハズレが多いです。

逆に「こないだ飲んだんですが、これは○○~~」と味の感想を言える店員が多い酒屋は美味しいお酒に出会える可能性が高いです。

まとめ

まとめます。

冷蔵庫がちゃんとしてて、そこにお酒が並んでて、店員がお酒の感想がしっかり言える酒屋

そこに行けば、美味しいお酒に出会えます。

では。

DigDagでAPI使って取得したリストでfor_eachを回す

www.digdag.io

DigDag のfor_eachオペレータで配列使う際に四苦八苦したのでメモ。

今日取得して指定の場所に配置してあるファイルを1ファイルずつ加工したかったので、DigDag使ってやってみることにしたものの。。

  • 今日取得したファイルのリストってどう作るのか?
  • 1ファイルずつ処理するにはどうするのか?

さっぱりわからなかったので色々調べてみた。

DigDagには、 Python API が用意されている(Perl API欲しいなぁ。。)ので、今日更新したファイルをリスト化して配列に格納し、 for_eachオペレータ 使って作成した配列で回すことにした。

んで、 digdag init mydag で作ったサンプルワークフローをベースにして作った実際のサンプルコードはこちら。 但し、for_eachのループでechoしてるだけなので異様にループが遅いのはなんでだろ。。。まだ課題がありそうです。

ファイルツリー

mydag.dig
tasks/__init__.py
続きを読む