Redash の開発環境を作った時の手順を書いてみます。
作業はざっくり次の流れです。
- ソースコードの取得
- 必要なパッケージのインストール
- Docker Compose の修正とコンテナの起動
- 起動時の設定
- 初期データベース登録
- Webサーバの起動
- Workerの起動
- webpack の開発用サーバの起動
はじめに
Redash の開発環境を構築する方法は大きく分けて次の3つになると思います。
- AMI または Google Compute Engine のイメージから構築
- Docker イメージから構築
- プロビジョニングスクリプトから構築
当初 AMI でインスタンスを作成して構築しようとしていたのですが、無料枠で使える t2.micro
インスタンスだと非力すぎて断念しました。この時の手順は別記事にしています。
また、ドキュメントによるとプロビジョニングスクリプトは Ubuntu でのみしかテストされていないのと、他の環境を壊してしまう事が怖かったため、最終的に Docker を選択しました。
Docker Compose として Redash 本体と、それ以外の関連サービスである Redis, Postgres, nginx にイメージが分かれていたので Redash 本体は clone したソースを使い、それ以外はこれらのイメージから作成したコンテナを使うことにしました。
ソースコードの取得
適当な作業用ディレクトリでプロジェクトを clone します。
% git clone git@github.com:getredash/redash.git
必要なパッケージのインストール
まず、pip で Python パッケージのインストールを行います。注意点として Python は2.7系を使ってインストールします。
% sudo pip install -r requirements.txt -r requirements_dev.txt -r requirements_all_ds.txt
sudo
を付けているのはインストールするパッケージによって、root 権限が必要なディレクトリにアクセスするためです。
次に Node.js パッケージのインストールを行います。ここでも注意点として、npm は package-lock.json
をサポートしたv5以上を使った方が安全です。
古いバージョン使っていたので、参照しているパッケージに問題があった場合に気づくのに時間がかかります。自分は Issue まで立ててました。
% npm install
初回ビルドを行います。
% npm run build
Docker Compose の修正とコンテナの起動
docker-compose.yml
でも良いのですが、docker-compose.production.yml
を編集しました。
version: '2'
services:
redis:
image: redis:3.0-alpine
restart: always
ports:
- "6370:6379"
postgres:
image: postgres:9.5.6-alpine
restart: always
ports:
- "6543:5432"
server
, worker
, nginx
サービスを削除しています。
server
, worker
サービスが Redash 本体で、これらは docker イメージではなくソースを利用し、nginx は経由しないためです。
また、別の環境ですでに5432番ポートを使っていたので、Postgres を6543番ポートに割り当てました。
イメージの取得とコンテナの作成、起動を行います。
% docker-compose -f docker-compose.production.yml up -d
起動時の設定
環境変数で起動時の設定をプロジェクトディレクトリ直下の .env
ファイルに指定します。
export PYTHONUNBUFFERED=0
export REDASH_LOG_LEVEL="DEBUG"
export REDASH_DATABASE_URL="postgresql://postgres:postgres@localhost:6543/postgres"
export REDASH_COOKIE_SECRET=veryverysecret
export REDASH_WEB_WORKERS=4
export REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.python
export REDASH_REDIS_URL="redis://localhost:6370/0"
export WORKERS_COUNT=2
Postgres, Redis のポートを変更したのでここで指定します。
初期データベース登録
初期データベースを作成します。
% bin/run ./manage.py database create_tables
Webサーバの起動
Webサーバを起動します。
% bin/run ./manage.py runserver --debugger --reload --host 0.0.0.0
--reload
オプションによって、コードを編集して保存したタイミングで Web サーバのリロードが行われます。
--host 0.0.0.0
オプションによって、別のマシンからアクセスできるようになります。
Workerの起動
Webサーバと同様に Worker も Docker ではなく clone したソースコードを利用するため、起動します。
% bin/run celery worker --app=redash.worker --beat -Qqueries,celery,scheduled_queries~~
webpack の開発用サーバの起動
webpack の開発用サーバを起動します。
% npm run start
この後、localhost:8080 にブラウザからアクセスするとログインページが表示されるはずです。
これで開発環境の構築はひとまず完了になります。実際のデータソースは
などを参考に追加します。
開発するゾ
- Fix error when adding widget to dashboard by kyoshidajp · Pull Request #2025 · getredash/redash
- Set auto focus in first input items by kyoshidajp · Pull Request #2028 · getredash/redash
- Add copy clipboard link by kyoshidajp · Pull Request #2049 · getredash/redash
- Fix error when exporting list data as Excel file by kyoshidajp · Pull Request #2060 · getredash/redash
- Fix error when adding widget to dashboard by kyoshidajp · Pull Request #2025 · getredash/redash
- Copy parameters value when forking a query by kyoshidajp · Pull Request #2068 · getredash/redash
ログインページが表示されない場合
以下の内容を確認して対応します。
-
docker ps
でworker
,redis
,postgres
のコンテナが起動しているか - Webサーバ起動
bin/run ./manage.py runserver --debugger --reload
のログにエラーが出ていないか - webpack の開発用サーバ起動
npm run start
のログにエラーが出ていないか
webpack
で node-sass
のビルドエラーが出る場合
npm run build
もしくは npm run start
時に次のようなエラーが出る事があります。
[0] ./node_modules/css-loader?{"minimize":false}!./node_modules/sass-loader/lib/loader.js!./client/app/assets/css/main.scss 1.46 kB {0} [built] [failed] [1 error]
ERROR in ./node_modules/css-loader?{"minimize":false}!./node_modules/sass-loader/lib/loader.js!./client/app/assets/css/main.scss
Module build failed: Error: Missing binding /Users/katsuhiko.yoshida/work/redash/node_modules/node-sass/vendor/darwin-x64-57/binding.node
Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js 8.x
Found bindings for the following environments:
- OS X 64-bit with Node.js 6.x
- OS X 64-bit with Node.js 7.x
This usually happens because your environment has changed since running `npm install`.
Run `npm rebuild node-sass --force` to build the binding for your current environment.
at module.exports (/Users/katsuhiko.yoshida/work/redash/node_modules/node-sass/lib/binding.js:15:13)
at Object.<anonymous> (/Users/katsuhiko.yoshida/work/redash/node_modules/node-sass/lib/index.js:14:35)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/katsuhiko.yoshida/work/redash/node_modules/sass-loader/lib/loader.js:3:14)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Module.require (module.js:568:17)
この場合、node-sass
を再構築すると解消されました。
% npm rebuild node-sass