GAミント至上主義

Web Monomaniacal Developer.

ElasticsearchをローカルDocker開発環境で動かす

シニアジョブの人材管理システムでは、全文検索エンジンとしてElasticsearchを使っています。

Elasticsearchは業務で直接触るのは初めての初心者です。
昔はElasticSearchと思っていたり、Elasticって付いてるからAWSのサービスかーとか思ってた。

基本的に開発環境はDocker化したんですが、Elasticsearchは開発でもAWSに用意した1つを共用したままとなっていました。
1人のときはいいですが複数となると不整合が出て支障が出始めたのでローカル化しました。

バージョンとイメージ

AWSAmazon Elasticsearch Service ダッシュボードで、現在使っているバージョンを確認したところ6.7となっていました。
近いうちに7へのバージョンアップは必要ですが一旦それに合わせる形で近い6.8.6を使用しました(メジャーバージョン同じなら動くやろ)。

https://hub.docker.com/_/elasticsearch?tab=tags

Laravelとの連携

Laravel Scoutというのを使ってます。使用するindex名はそのままscout。
Algoliaもそのまま使えるんだなぁ。

readouble.com

docker-compose.yml

公式イメージで特に問題なさそうなのでDockerfileはなし。
docker-compose.ymlへの追加とデータ保持用にディレクトリだけ作っておきます。

version: '3'

services:
  app:
    container_name: app
    build:
      context: ./
      dockerfile: ./Dockerfiles/app/Dockerfile
    environment:
      - TZ=Asia/Tokyo
    depends_on:
      - elasticsearch

 # 省略

  elasticsearch:
    container_name: elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:6.8.6
    volumes:
      - ./Dockerfiles/elasticsearch/data:/usr/share/elasticsearch/data
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"

index の設定をjsonで書き出す

mappingとsettingsの設定が必要な場合は、jsonで出力しておきます。
今回すでにあるのを使ったのでやってないけど、たぶん普通にindex名にGETして返ってきたのから不要なの(uuidとかversionとか)を消して使えばいいと思う(てきとー)。

curl -XGET "https://elasticsearch-host/scout?pretty"  > create_index.json

jsonを利用してindex作成

docker-compose upで起動したら、上記で出力したjsonを元にindexを作成します。

curl -XPUT "http://localhost:9200/scout?pretty" -H "Content-type: application/json" -d @./path/to/create_index.json

反映コマンドでDB→Elasticsearchにインポート

インポートはartisan scout:importを使ってもできますが、特殊な処理がいるので独自に実装してるのでこんな感じ。

docker-compose exec app php artisan reflect:elasticsearch

最初mappingとsettingsはあとでいいだろーと先にインポートをやってしまいましたが、後からは変更できないので、DELETEして再度やり直しが必要になりました。

現在開発用のDBデータも数十GBあり、初回読み込みには2時間ぐらいかかり、MacBook Proのファンが全開でした。

所感

Dockerで起動後は実質2コマンドであっけなく動いてしまいました。よくできてる。
とりあえずシングルノードだけど、これならKubernetes で分散させるのも簡単そう。

Elasticsearch実践ガイド (impress top gear)

Elasticsearch実践ガイド (impress top gear)

シニアジョブに入社して1ヶ月でやったこととこれから

ちょうど一ヶ月なのでメモも兼ねて。

1週間はこっちに書いた。あとTwitterで随時。
uyamazak.hatenablog.com

システムの現状

50歳以上、シニア専門の人材会社です。派遣も紹介もやってます。
全体で20人程度、開発者は2人とデザイナー1人で、人材のマッチング、管理を行う自社システムを開発保守しています。
社長の学生起業から手探りではじめて現在の事業をはじめ、それに伴って3年以上成長してきたシステムです。
効率よく人材を検索、マッチングするために、よくここまで作ったという機能がたくさんあり、事業に貢献してきたオリジナルのシステムです。

しかし、最初に作った人はすでにおらず、コードを読んでいても「これ何してんの?」と思ういわゆるレガシーコードもたくさん溜まってきてます。解読実質不可能なjQueryの処理とか。
またDB設計も柔軟性に全振りしたような感じなので、このままではスケールアップもメンテナンスも難しいという課題があります。

フレームワークはLaravel、インフラはAWS、EC2とRDS、ElasticSearchとRedisという一般的な感じですが、これは別のサービスだろっていうのも一つのLaravelに入っており、そこにも課題があります。

やったこと

とりあえずやった感あるのは下記2つ。

開発環境Docker化

入社当時、Vagrant + Ansibleの環境がありました。
でも2016年からDockerとKubernetesを触っているため、個人的にはどちらも今後必要もないと感じていることから、インストールも勉強もしなくない。
将来的には本番もコンテナ化したいし、デザイナーの人はエラーで使えてないのでEC2にいちいちアップしてるし、何より今どきDockerだろということで、もう一人の開発者と社長にも同意してもらってDocker化しました。

動作も早くなったらしいし、何より設定ファイル数も50以上から10以下ぐらいになり必要なパッケージ、ミドルウェア、OSの設定を把握しやすくなりました。しかもDockerfileとdocker-compose.ymlはメンテしやすいのでいいですね。

使ってるうちに、ビルドが遅いとかディスク使いすぎるとかあったんですが、都度潰していって今はそこそこ快適に使えてます。

本音をいえば、Mac OSで動くDockerコンテナはハイパーバイザー(Hyperkitだっけ?)で動く偽物なので、本物のLinuxで開発するのがストレスないなぁとは思いますが、社内は営業も含めてみんなMacなので揃えるメリットの方が大きいとも感じます。

PageSpeed Insightsの点数を1点から70点前後(調子がいいとき)に

SEOとか表示速度はまだまだ課題もありますが、 特にPageSpeed Insights (モバイル)の点数が1点(調子が悪いときは0点)という初めて見る面白い状況でした。

その結果を見て何もしていないわけではなく、数ヶ月前から短期で派遣の人に専門でいろいろSEOや速度改善をやってもらっていたようですが、1点どまり。その人もほとんど私と入れ替わりで契約が終了していなくなってしまいました。

これはおかしいと思って、Chrome開発者ツールでいろいろ見たところ、Google Fontsが読み込まれるまで文字が表示されなかったり、そもそもページ全体の転送量のほとんどがGoogle Fontsでした。
最初は同じGoogleのだしそこまで影響しないだろうと、読み込み方法を変えたり、やりましたが無駄でした。

この記事も見つけ、社長にも確認したところフォントにこだわりもないので、デザイナーの方に撤去してもらい、見た目を整えてもらったところ大げさにいって70点前後になりました。
tm23forest.com

検索順位への影響はまだこれからという感じ。

あとは営業さんの方で必要になった機能とかを作ったりしながら、既存の設計やビジネス要件を体に叩き込んでいっています。

すごいところ

1人3役による圧倒的決断スピード

社長がもちろん最終決定者ですが、システムのユーザーである営業、テレアポもやり、プロマネ的な優先順位決めやざっくり進捗管理もやっているので、だいたいのものは瞬殺してもらえます。はやい。

技術的な問題でも2人の開発者と社長の3人しかいないので、はやい。
人が増えたらこうは行かないけど、なるべく維持していきたいところ。

嫌になるような会議がない

会議と言えるものは朝社長が席にきて「今日なにする?」的な話をする朝会的なもののみ。某前職と違う。
あとは困ったら直接話したり、Slackで会話したり。
ほとんど一日中集中できるので、19時ぐらいには脳の疲労感がすごいことになってます。
つい体も動かさず固くなってしまうので金曜夜のサウナは欠かせない。

歓迎会がまさかのアレ

お酒飲めないと言ったら飯ウマなところへ連れて行ってくれました。
居酒屋で唐揚げとかは一品料理では食べたことあるけどコースは初めてでした。

f:id:uyamazak:20200217221729j:plain
f:id:uyamazak:20200217221719j:plain
f:id:uyamazak:20200217221724j:plain

今後の採用とか

エンジニア職は募集したいところだけど、今のシステムで開発してもらうのはいろいろ辛いと思うので、新バージョンが形になってきてから本気出したい。
Vue.js、できればFirebase & FirestoreにTypeScript、あと検索はKubernetesに載せたElasticSearchとかいろいろ妄想中。
少人数で何でもやりたいフルスタックに興味のある人は、お話聞くのでTwitterとかで連絡ください。

MySQLの公式DockerイメージでMySQLクライアントから日本語が入力できない

ローカル開発環境にDockerの公式イメージを使っているが、mysqlのコマンドから日本語を入力したり、コピペしても消えてしまって困った。

https://hub.docker.com/_/mysql

文字コードはUTF−8。

日本語の表示は文字化けするけど

set names utf8;

で表示できる。毎回打つのはちょっと面倒だ。

docker-compose.ymlはこんな感じ。いろいろ省略してる

version: '3'

services:
  mysql:
    container_name: mysql
    image: mysql:5.7
    ports:
      - "3306:3306"


入るときはこんな感じ

$ docker-compose exec mysql mysql -u root -p

もちろんアプリケーション側では日本語は問題なく使えている。
主に手作業INSERTするときに困った。


検索するといろいろインストールしたり、localeとか設定する方法が出てくるのが面倒。
面倒なのでローカル(Mac)にmysqlクライアントをインストールした。

普通にHomebrewでいれる。サーバーはいらない。
https://qiita.com/takepan/items/e01dfd968faffbe2ebb2

$ brew install mysql-client

あとはこんな感じで入る。

$ mysql -h 127.0.0.1 -P 3306 -u root -p*******
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.29 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> あああ 

無事エンターしても消えずに入力できた。
もちろん本番環境では手作業INERTをはじめとして、こんなのおすすめできない。

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

Docker実践ガイド 第2版 impress top gearシリーズ

Docker実践ガイド 第2版 impress top gearシリーズ