[
  {
    "path": "README.md",
    "content": "# redash-hands-on\n\n[![GitHub stars](https://img.shields.io/github/stars/kakakakakku/redash-hands-on.svg?style=for-the-badge)](https://github.com/kakakakakku/redash-hands-on/stargazers)\n[![Redash version](https://img.shields.io/badge/redash-v25.1.0-ff7964.svg?style=for-the-badge)](https://github.com/getredash/redash)\n\n## 前提\n\nRedash ハンズオン資料は以下の環境を前提に動作確認をしています．\n\n- Docker Desktop for Mac\n\nなお，Redash のバージョンごとにハンズオン資料を用意しています．最新バージョン以外を使う場合は，以下のタグから参照できます．\n\n- [kakakakakku/redash-hands-on at v2.0.1](https://github.com/kakakakakku/redash-hands-on/tree/v2.0.1)\n- [kakakakakku/redash-hands-on at v4.0.1](https://github.com/kakakakakku/redash-hands-on/tree/v4.0.1)\n- [kakakakakku/redash-hands-on at v4.0.2](https://github.com/kakakakakku/redash-hands-on/tree/v4.0.2)\n- [kakakakakku/redash-hands-on at v5.0.1](https://github.com/kakakakakku/redash-hands-on/tree/v5.0.1)\n- [kakakakakku/redash-hands-on at v6.0.0](https://github.com/kakakakakku/redash-hands-on/tree/v6.0.0)\n- [kakakakakku/redash-hands-on at v7.0.0](https://github.com/kakakakakku/redash-hands-on/tree/v7.0.0)\n- [kakakakakku/redash-hands-on at v8.0.0](https://github.com/kakakakakku/redash-hands-on/tree/v8.0.0)\n- [kakakakakku/redash-hands-on at v10.1.0](https://github.com/kakakakakku/redash-hands-on/tree/v10.1.0)\n\n## 環境構築\n\nDocker Compose で **Redash (v25.1.0)** 環境を構築します．任意のディレクトリに `kakakakakku/redash-hands-on` リポジトリをクローンしましょう．\n\n```sh\n$ git clone https://github.com/kakakakakku/redash-hands-on.git\n$ cd redash-hands-on\n```\n\n公式の getredash/redash リポジトリに公開されている設定をベースに，テストデータを事前に投入した MySQL 8.4 コンテナを含めた `docker-compose.yml` を準備しました．\n\n以下のコマンドを実行し，Docker Compose で Redash を起動しましょう．\n\n初回はイメージをダウンロードするため，少し時間がかかる場合があります．\n\n```sh\n$ docker compose run --rm server create_db\n$ docker compose up -d\n```\n\n起動すると，以下の URL で Redash にアクセスできるようになります．\n\n- http://localhost:5001\n\n最初に Admin User と Organization Name を登録しましょう．以下にサンプルを載せておきます．入力したら「Setup」をクリックします．\n\n- Admin User\n    - Name\n        - `admin`\n    - Email Address\n        - `admin@example.com`\n    - Password\n        - `任意のパスワード`\n- General\n    - Organization Name\n        - `hands-on`\n\n![](images/setup.png)\n\nRedash にログインできました．\n\n![](images/top.png)\n\nなお，Redash 環境の構築方法は Docker Compose 以外にもあります．興味のある方は，公式ドキュメントを読んでみましょう．\n\n- [Setting up a Redash Instance | Redash](https://redash.io/help/open-source/setup/)\n\n## データソース設定\n\n次に Redash から MySQL に接続できるように「データソース」を設定します．\n\nログイン後の画面にある「1. Connect a Data Source」のリンクをクリックします．\n\n検索フォーム「Search...」に「MySQL」と入力し，1番目の「MySQL」をクリックします．「MySQL (Amazon RDS)」ではなく「MySQL」です．\n\n![](images/data_sources.png)\n\n以下の通りに設定したら「Create → Test Connection」とクリックし，接続確認をしましょう．Success と画面右下に表示されます．なお，今回はテストデータとして `world` データベースを使います．\n\n| 項目 | 値 |\n| --- | --- |\n| Name | MySQL |\n| Host | mysql |\n| Port | 3306 |\n| User | root |\n| Password | - |\n| Database Name | world |\n\n![](images/data_source.png)\n\n## 日付フォーマット設定\n\n画面左下にある Settings アイコンをクリックし，「General」タブをクリックします．\n\n日付フォーマットを以下の通りに変更します．変更後に「Save」ボタンをクリックします．\n\n- General\n    - Date Format\n        - `YYYY-MM-DD`\n\n![](images/settings.png)\n\n## クエリを作ってみよう\n\nナビバーから「Create → New Query」とクリックし，以下のクエリを入力しましょう．\n\n```sql\nSELECT * FROM country;\n```\n\n入力したら「Execute」ボタンをクリックしてクエリを実行します．すると「国の一覧」が取得できます．\n\nクエリの実行ができたら，画面左上の「New Query」という部分をクリックし，クエリタイトルを **「国の一覧」** に変更します．忘れずに画面右側にある「Save」ボタンをクリックしましょう．\n\nさらに画面右上の「Publish」ボタンをクリックします．Redash ではクエリを公開することで，他のユーザーに共有することができます．\n\n![](images/query_country.png)\n\n## クエリの「お気に入り登録」と「タグ登録」をしよう\n\nRedash ではクエリに対する「お気に入り登録」と「タグ登録」がサポートされています．\n\nまず，クエリ名の左にある星アイコンをクリックし，お気に入り登録をしてみましょう．次に，クエリ名の右にある「Add tag」ボタンをクリックし，2個のタグ **「分析チーム」** と **「マスタデータ」** を登録してみましょう．\n\nクエリが増えると探しにくくなってしまうため，積極的に「お気に入り登録」と「タグ登録」を活用しましょう．\n\n![](images/query_country_with_tags.png)\n\n## グラフを作ってみよう\n\n先ほどと同様にナビバーから「Create → New Query」とクリックし，新規クエリを作成し，以下のクエリを入力しましょう．実行すると，登録されている国の件数が「239」であることが取得できます．この件数をグラフにしてみましょう．\n\n```sql\nSELECT COUNT(*) AS COUNT FROM country;\n```\n\n「Table」 タブの横に表示されている「+ Add Visualization」ボタンをクリックし，以下の通りに設定をします．「Save」ボタンをクリックすると，件数のグラフが表示されます．最新値など，特定の値をグラフにする場合は `Counter` が便利です．\n\n- Visualization Type\n    - `Counter`\n- Visualization Name\n    - `国の件数`\n- Counter Value Column Name\n    - `COUNT`\n\n![](images/query_country_with_visualization.png)\n\nなお `Counter` には「目標値」を設定する機能もあります．今回のデータソースではデータ件数に変化がありませんが，サンプルとして，作ってみましょう．先ほどのクエリを以下の通りに変更し，実行します．\n\n```sql\nSELECT COUNT(*) AS COUNT, 500 AS kpi FROM country;\n```\n\nもう一度「+ Add Visualization」ボタンをクリックし，以下の通りに設定をします．先ほどとの違いは「Target Value Column Name」の設定を追加した点です．このようにクエリを活用することで，目標値と実績値を一緒に可視化することができます．\n\n`Counter` に「目標値」を設定した場合，値が実績を下回る場合は赤く表示され，上回る場合は緑で表示されます．\n\n- Visualization Type\n    - `Counter`\n- Visualization Name\n    - `国の件数（+ 目標値）`\n- Counter Value Column Name\n    - `COUNT`\n- Target Value Column Name\n    - `kpi`\n\nクエリタイトルを **「国の件数」** とし，忘れずに保存と公開をしておきましょう．\n\n![](images/query_country_with_kpi.png)\n\n## 円グラフと棒グラフを作ってみよう\n\nクエリの作成はもう慣れたと思います．以下のクエリを作成し，実行しましょう．\n\n国ごとに都市の件数を取得できます．中国とインドが特に多いことがわかります（あくまでサンプルデータです）．\n\n```sql\nSELECT CountryCode, COUNT(*) AS COUNT\nFROM city\nGROUP BY CountryCode\nORDER BY COUNT DESC;\n```\n\n先ほどと同様に「+ Add Visualization」ボタンをクリックし，以下の通りに設定をすると，円グラフを作ることができます．\n\n- Visualization Type\n    - `Chart`\n- Visualization Name\n    - `都市の件数`\n- General\n    - Chart Type\n        - `Pie`\n    - X Column\n        - `CountryCode`\n    - Y Columns\n        - `COUNT`\n\n![](images/query_city_pie.png)\n\n次に棒グラフも作ってみましょう．設定は以下の通りです．\n\n- Visualization Type\n    - `Chart`\n- Visualization Name\n    - `都市の件数（棒グラフ）`\n- General\n    - Chart Type\n        - `Bar`\n    - X Column\n        - `CountryCode`\n    - Y Columns\n        - `COUNT`\n\nしかし，棒グラフの場合，このままでは順序がバラバラです．「General」タブの隣にある「X Axis」タブをクリックし，軸の設定をする必要があります．\n\n- Scale\n    - `Category`\n- Sort Values\n    - `OFF`\n\nこれで棒グラフも作れました．\n\nクエリタイトルを **「都市の件数」** とし，忘れずに保存と公開をしておきましょう．\n\n![](images/query_city_bar.png)\n\n## ダッシュボードを作ってみよう\n\n次にダッシュボードを作ってみましょう．\n\nナビバーから「Create → New Dashboard」とクリックし，ダッシュボードタイトルに **「国ダッシュボード」** と入力しましょう．\n\n次にダッシュボードにグラフを配置していきます．\n\n画面右下にあるメニューから「Add Widget」をクリックします．すると「Add Widget」というモーダルが表示されるため，以下の設定を繰り返し行いましょう．「Search a query by name」でクエリ名を検索し，Visualizaを選択します．レイアウトは自由に変更することができます．\n\n- 1回目\n    - クエリ名\n        - `国の一覧`\n    - Choose Visualization\n        - `Table`\n- 2回目\n    - クエリ名\n        - `国の件数`\n    - Choose Visualization\n        - `国の件数（+ 目標値）`\n- 3回目\n    - クエリ名\n        - `都市の件数`\n    - Choose Visualization\n        - `都市の件数`\n- 4回目\n    - クエリ名\n        - `都市の件数`\n    - Choose Visualization\n        - `都市の件数（棒グラフ）`\n\nもしクエリ名が表示されない場合は，そのクエリが公開されていないことが考えられます．\n\nナビバーの「Queries」で `Unpublished` 状態になっているクエリがあったら，そのクエリを公開し，再度ダッシュボードにグラフを追加してみましょう．\n\n最後に画面右上にある「Done Editing」をクリックし，続けて「Publish」をクリックしましょう．クエリ同様にダッシュボードも他のユーザーに共有することができます．\n\n![](images/dashboard_country.png)\n\n## ダッシュボードの「お気に入り登録」と「タグ登録」をしよう\n\nRedash ではクエリだけではなく，ダッシュボードに対しても「お気に入り登録」と「タグ登録」がサポートされています．\n\nまず，ダッシュボード名の左にある星アイコンをクリックし，お気に入り登録をしてみましょう．次に，ダッシュボード名の右にある「Add tag」ボタンをクリックし，タグ **「分析チーム」** を登録してみましょう．\n\n![](images/dashboard_country_with_tags.png)\n\n## パラメータ付きクエリを作ってみよう\n\n次はクエリにパラメータを付けてみましょう．\n\nRedash では，クエリに `{{}}` を含めると，その部分がパラメータになります．以下の新規クエリを作りましょう．\n\nなお，クエリを入力した後にクエリの下にある2番目のアイコン「Format Query」をクリックすると，自動的にクエリをフォーマットすることができます．`FROM` が3行目にフォーマットされます．試してみましょう．\n\n```sql\nSELECT * FROM city\nWHERE CountryCode = '{{CountryCode}}'\nORDER BY Population DESC;\n```\n\nすると，画面左下に「CountryCode」をパラメータとして入力するテキストエリアが表示されます．\n\nここに「JPN」を入力し，「Apply Changes」をクリックすると，日本の都市を人口の多い順に取得することができます．クエリタイトルを **「都市の検索（パラメータ選択）」** にして保存しておきましょう．\n\n![](images/query_city_search.png)\n\nパラメータとして入力できる UI はテキストフィールド以外にもあります．名前の通り，例えば「Date」を選択すると，日付ピッカー（カレンダー）から日付を選択することができます．\n\n- Text\n- Number\n- Dropdown List\n- Query Based Dropdown List\n- Date\n- Date and Time\n- Date and Time (with seconds)\n- Date Range\n- Date and Time Range\n- Date and Time Range (with seconds)\n\n今回は便利な「Dropdown List」を試しましょう．\n\nパラメータの横にあるトグルをクリックし，「Type」を `Dropdown List` にします．さらに「Values」 に以下のリストを設定します．\n\n```\nJPN\nUSA\nAUS\n```\n\nすると，選択肢から選べるようになるため，入力ミスを軽減できるようになります．「AUS」を選択し，「Apply Changes」をクリックしてみましょう．\n\n![](images/query_city_search_dropdown.png)\n\n## パラメータ付きクエリ（複数値）を作ってみよう\n\nパラメータを複数選択する機能もあります．以下の新規クエリを作りましょう．\n\n```sql\nSELECT *\nFROM city\nWHERE CountryCode IN ({{CountryCode}})\nORDER BY Population DESC;\n```\n\nパラメータの横にあるトグルをクリックし，「Type」を `Dropdown List` にします．さらに「Values」 に以下のリストを設定し，今回は「Allow multiple values」をチェックし，「Quotation」で「Single Quotation Mark」を選択します．\n\n```\nJPN\nUSA\nAUS\n```\n\n![](images/query_city_search_dropdown_multi_setting.png)\n\nすると，選択肢からパラメータを複数選べるようになります．今回は「JPN」と「AUS」を選択し，「Apply Changes」をクリックしてみましょう．\n\n![](images/query_city_search_dropdown_multi.png)\n\nクエリタイトルを **「都市の検索（パラメータ複数選択）」** にして保存しておきましょう．\n\n## フィルタ機能を使ってみよう\n\nRedash では，クエリのカラム名を `カラム名::filter` もしくは `カラム名::multi-filter` という命名規則にすると，クエリ結果をフィルタできるようになります．さっそく試してみましょう．\n\n以下の新規クエリを作成し，実行すると，クエリ結果を「CountryCode」で自由にフィルタできるようになります．これが「フィルタ機能」です．\n\n```sql\nSELECT *, CountryCode AS 'CountryCode::filter'\nFROM city\nORDER BY Population DESC;\n```\n\n次に「マルチフィルタ機能」を試しましょう．クエリを以下のように変更すると，今度は複数の「CountryCode」でフィルタできるようになります．なお，今回も「Format Query」を実行しておきましょう．\n\n```sql\nSELECT *, CountryCode AS 'CountryCode::multi-filter'\nFROM city\nORDER BY Population DESC;\n```\n\nフィルタ機能は非常に便利です．詳しくは公式ドキュメントを読んでみましょう．\n\n- [Query Filters | Redash](https://redash.io/help/user-guide/querying/query-filters)\n\nクエリタイトルを **「都市のフィルタ」** にして保存しておきましょう．\n\n![](images/query_city_filter.png)\n\n## クエリスニペットを活用しよう\n\nRedash では，よく使うクエリ（もしくはクエリの一部）をクエリスニペットとして登録する機能があります．\n\n画面左下にある Settings アイコンをクリックし，「Query Snippets」タブをクリックします．\n\n次に「New Query Snippet」ボタンをクリックすると登録画面が表示されます．以下の設定をしたら「Create」ボタンを押しましょう．\n\n- Trigger\n    - `_country_code`\n- Description\n    - `国コード検索`\n- Snippet\n    - `WHERE CountryCode = '{{CountryCode}}'`\n\n新規クエリを作成し，以下のクエリを入力しましょう．クエリスニペットに登録した「Trigger」に部分一致すると候補として表示されるため `_` と入力するとクエリスニペットを呼び出すことができます．\n\n```sql\nSELECT * FROM city _\n```\n\nクエリスニペットにプレースホルダを設定することもできます．\n\n以下のように `${1:table}` と設定すると，テーブル名のプレースホルダになります．是非試してみましょう．今回はクエリスニペットの動作確認が目的ですので，クエリは保存しなくて大丈夫です．\n\n- Trigger\n    - `_record_count`\n- Description\n    - `レコード件数`\n- Snippet\n    - `SELECT COUNT(*) FROM ${1:table};`\n\n![](images/query_snippets.png)\n\n## クエリ結果に色を付けよう\n\nRedash では，クエリ結果に HTML を埋め込むことができます．さっそく以下の新規クエリを作成してみましょう．\n\n```sql\nSELECT Code,\n       Name,\n       Population,\n       CASE\n           WHEN Population > 1000000000 THEN '<div class=\"bg-success p-30 text-center\">AAA</div>'\n           WHEN Population > 213000000 THEN '<div class=\"bg-warning p-20 text-center\">BBB</div>'\n           ELSE '<div class=\"bg-danger p-10 text-center\">CCC</div>'\n       END AS Color\nFROM country\nORDER BY Population DESC;\n```\n\n「Population」の値によって「緑黄赤」と色を変えています．さらに縦サイズも変えています．このように活用すると，よりクエリ結果を便利に使うことができます．\n\nクエリタイトルを **「国の一覧（色付き）」** にして保存しておきましょう．他にも利用可能なマークアップがあり，公式ドキュメントに載っています．\n\n- [Conditional Formatting & General Text Formatting - Tips, Tricks & Query Examples - Redash Discourse](https://discuss.redash.io/t/conditional-formatting-general-text-formatting/1706)\n\n![](images/query_country_with_color.png)\n\n## リンク集を作ろう\n\nダッシュボードに複数のグラフを配置する場合，関連する URL などを載せておくと便利な場合があります．\n\nダッシュボードにフリーテキストを入力する方法もありますが，Redash では，クエリ結果に HTML を埋め込むことができるため，簡単にリンクを作成することができます．\n\n以下の新規クエリを作成し，クエリタイトルを **「リンク集」** にして保存しておきましょう．\n\n```sql\nSELECT '<a href=\"https://www.google.co.jp/\" target=\"_blank\">Google</a>' AS name\nUNION\nSELECT '<a href=\"https://www.yahoo.co.jp/\" target=\"_blank\">Yahoo!</a>'\nUNION\nSELECT '<a href=\"https://www.bing.com/\" target=\"_blank\">Bing</a>'\nUNION\nSELECT '<a href=\"https://kakakakakku.hatenablog.com/\" target=\"_blank\">kakakakakku blog</a>';\n```\n\n![](images/query_urls.png)\n\n## クエリを選択実行しよう\n\nRedash には，クエリを選択実行する機能があります．\n\n分析クエリを書くときにサブクエリや JOIN を活用する場面も多いと思います．サブクエリなどの部分クエリを選択して実行できると便利です．\n\n以下の新規クエリを作成し，サブクエリを選択し，「Execute Selected」ボタンをクリックして実行してみましょう．\n\n```sql\nSELECT *\nFROM country\nWHERE Code =\n    (SELECT Code\n     FROM country\n     WHERE Name = 'Japan')\n```\n\n![](images/query_selected.png)\n\n## クエリ結果をダウンロードしよう\n\nRedash では，クエリ結果をダウンロードすることができます．現状サポートされているデータ形式は CSV と TSV と Excel です．\n\nナビバーの「Queries」をクリックし，既に作ったクエリ **「国の一覧」** を開きましょう．\n\n> [!TIP]\n> \"Query has no result\" と表示されている場合は「Refresh Now」ボタンをクリックします．\n\n画面下にある「縦三点リーダー」ボタン（Edit Visualization ボタンの2つ左にある）を押すと，以下のメニューが表示されます．クエリ結果をダウンロードしてみましょう．\n\n- Download as CSV File\n- Download as TSV File\n- Download as Excel File\n\n![](images/query_download.png)\n\n## クエリのフォーク機能を体験しよう\n\n今回はハンズオンとして Redash を1人で使っていますが，一般的にはチームで使うことが多いと思います．\n\nチームで使っていると **「メンバーが作ったクエリを少しカスタマイズしたい」** と感じる場面があります．そのために Redash には「フォーク機能」があります．\n\n既に作ったクエリ **「国の一覧」** を開き，画面右上にある「縦三点リーダー」ボタンから「Fork」ボタンをクリックしましょう．すると，自動的に新規クエリが作成されます．クエリタイトルを **「Copy of (#1) 国の一覧」** から **「国の一覧（カスタマイズ）」** に変更しましょう．\n\nクエリを自由に変更できるため，以下のクエリを入力し，実行しましょう．表示するカラムを「国コード」と「名前」と「人口」にカスタマイズできました．なお，今回も「Format Query」を実行しておきましょう．\n\n```sql\nSELECT Code, Name, Population FROM country;\n```\n\n![](images/query_fork.png)\n\n## アラートを設定しよう\n\nRedash の機能は可視化だけではありません．特定の値が閾値を超えた場合にアラートを通知する機能があります．通知先は以下から選ぶことができます．\n\n- Email\n- Slack\n- Webhook\n- Discord\n- Mattermost\n- ChatWork\n- PagerDuty\n- Google Hangouts Chat\n- Microsoft Teams Webhook\n- Asana\n- Webex\n- Datadog\n\nSlack に Webhook 経由でアラートを通知してみましょう．今回は，自由に使える Slack アカウントがある前提で進めます．\n\nまず，Slack で Incoming WebHooks を作成します．そのままでも使えますが，Slack App の Basic Information で「App name」に `Redash Alerts`，「App icon」に Redash のロゴ画像などを設定しておくと便利です．生成された「Webhook URL」の値は次に使います．\n\n> [!TIP]\n> Incoming WebHooks の設定方法は [Sending messages using incoming webhooks | Slack](https://api.slack.com/messaging/webhooks) に載っています。\n\n画面左下にある Settings アイコンをクリックし，「Alert Destinations」タブにある「New Alert Destination」ボタンをクリックしましょう．次に「Slack」をクリックし，登録画面で以下を設定します．\n\n- Name\n    - `Slack`\n- Slack Webhook URL\n    - `Webhook URL`\n\n![](images/alert_destinations.png)\n\nアラートを設定する前に，もう少し準備をしておく必要があります．\n\n既に作成をした「国の件数」クエリを開き「Edit Source」をクリックします。\n\n> [!TIP]\n> \"Query has no result\" と表示されている場合は「Refresh Now」ボタンをクリックします．\n\nさらに画面左下にある「Refresh Schedule」を有効にする必要があります．「Never」をクリックしてから，今回は `1 minute` にしましょう．\n\n今回の例では，国の件数に変化はありませんが，定期的にクエリの実行をする機能です．アラートの設定をするクエリには「Refresh Schedule」の設定が必要です．\n\n![](images/refresh_schedule.png)\n\n最後はアラートの設定です．ナビバーから「Create → New Alert」をクリックし，「New Alert」の画面を開きます．\n\n登録画面で以下を設定します．\n\n- Query\n    - `国の件数`\n- Trigger when\n    - `[first] COUNT > 200`\n- When triggered, send notification\n    - `Each time alert is evaluated`\n- Template\n    - `Use default template`\n- 名前（画面1番上）\n    - `国の件数が200件を超えた場合`\n\n「Create Alert」をクリックすると，右側に「Destinations」のメニューが表示されるため，「Slack」を「Add」します．\n\n![](images/alerts.png)\n\nすると，Slack にアラートが通知されます．確認ができたら「Destinations」の「Slack」を消しておきましょう．\n\n![](images/slack_alerts.png)\n\n## Redash ユーザーを追加／無効化しよう\n\n次に，Redash 管理者として Redash ユーザーを追加／無効化する運用手順を試してみましょう．\n\n画面左下にある Settings アイコンをクリックし，「Users」タブをクリックします．次に「New User」ボタンをクリックします．\n\n以下の通りに，Redash ユーザーを2人登録します．登録が終わったら「Pending Invitations」をクリックし，ユーザーを確認しましょう．招待中の状態になっています．\n\n- Create a New User（1回目）\n    - Name\n        - `RedashUser1`\n    - Email\n        - `redashuser1@example.com`\n- Create a New User（2回目）\n    - Name\n        - `RedashUser2`\n    - Email\n        - `redashuser2@example.com`\n\n![](images/users.png)\n\nメンバーの退職など，Redash ユーザーを削除する場合はどうしたら良いのでしょう？\n\nRedash にはユーザーを削除する機能はありませんが，ユーザーを無効化する手順があります．今回は招待中のユーザーを無効化します．\n\n「Pending Invitations」で「RedashUser2」をクリックし，「Disable User」ボタンを押してみましょう．ユーザーを無効化できました．無効化を解除する場合は「Enable User」ボタンをクリックします．\n\n![](images/disabled_users.png)\n\n以上でハンズオンは終わりです！Redash を停止しておきましょう！お疲れさまでした！\n\n```sh\n$ docker compose down\n```\n\nHappy querying :)\n\n## Stargazers\n\n[![Stargazers over time](https://starchart.cc/kakakakakku/redash-hands-on.svg?variant=adaptive)](https://starchart.cc/kakakakakku/redash-hands-on)\n"
  },
  {
    "path": "compose.yaml",
    "content": "x-redash-service: &redash-service\n  image: redash/redash:25.1.0\n  env_file:\n    - redash.env\nx-redash-environment: &redash-environment\n  REDASH_HOST: http://localhost:5001\n  REDASH_LOG_LEVEL: \"INFO\"\n  REDASH_REDIS_URL: \"redis://redis:6379/0\"\n  REDASH_DATABASE_URL: \"postgresql://postgres@postgres/postgres\"\n  REDASH_RATELIMIT_ENABLED: \"false\"\n  REDASH_MAIL_DEFAULT_SENDER: \"redash@example.com\"\n  REDASH_MAIL_SERVER: \"email\"\n  REDASH_MAIL_PORT: 1025\n  REDASH_ENFORCE_CSRF: \"true\"\n  REDASH_GUNICORN_TIMEOUT: 60\nservices:\n  server:\n    <<: *redash-service\n    command: dev_server\n    depends_on:\n      - postgres\n      - redis\n    ports:\n      - \"5001:5000\"\n      - \"5678:5678\"\n    environment:\n      <<: *redash-environment\n      PYTHONUNBUFFERED: 0\n  scheduler:\n    <<: *redash-service\n    command: dev_scheduler\n    depends_on:\n      - server\n    environment:\n      <<: *redash-environment\n  worker:\n    <<: *redash-service\n    command: dev_worker\n    depends_on:\n      - server\n    environment:\n      <<: *redash-environment\n      PYTHONUNBUFFERED: 0\n  redis:\n    image: redis:7-alpine\n    restart: unless-stopped\n  postgres:\n    image: pgautoupgrade/pgautoupgrade:latest\n    ports:\n      - \"15432:5432\"\n    command: \"postgres -c fsync=off -c full_page_writes=off -c synchronous_commit=OFF\"\n    restart: unless-stopped\n    environment:\n      POSTGRES_HOST_AUTH_METHOD: \"trust\"\n  email:\n    image: maildev/maildev\n    ports:\n      - \"1080:1080\"\n      - \"1025:1025\"\n    restart: unless-stopped\n  mysql:\n    image: kakakakakku/mysql-world-database:8.4\n    environment:\n      MYSQL_ALLOW_EMPTY_PASSWORD: \"yes\"\n      TZ: Japan\n"
  },
  {
    "path": "redash.env",
    "content": "REDASH_COOKIE_SECRET=redash-hands-on\n"
  }
]