前回の記事では InfluxDB と Grafana の概要を整理しました。 今回は実際に WSL 上の Ubuntu で Docker を使って InfluxDB + Grafana をローカルに立ち上げて、 Line Protocol でデータを書き込み → Grafana でグラフ表示 するところまで一気にやります。
- InfluxDBとGrafanaの概要
- ローカルサーバーを立ち上げる(WSL上のUbuntuでDockerを使って動かす)(この記事)
- パブリックサーバーを立ち上げる(VPS上のAlmaLinuxでDockerを使って動かす)
前提チェック
Docker Desktop を起動した状態で、Docker と Docker Compose が使えることを確認します。
$ docker --version
Docker version 27.3.1, build ce12230
$ docker compose version
Docker Compose version v2.30.3-desktop.1
OK です。
docker-compose.yml を作る
作業ディレクトリを作ってそこに docker-compose.yml を配置します。
$ cd ~/dev
$ mkdir keys-server
$ cd keys-server
services:
influxdb:
image: influxdb:2
container_name: keys-influxdb
ports:
- "8086:8086"
volumes:
- influxdb-data:/var/lib/influxdb2
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: keys-grafana
ports:
- "3100:3000"
volumes:
- grafana-data:/var/lib/grafana
restart: unless-stopped
volumes:
influxdb-data: {}
grafana-data: {}
ポイント:
- InfluxDB は
8086(デフォルト)をそのまま公開 - Grafana はデフォルトの
3000ではなく3100にマッピング(他で 3000 を使ってるため) - データは named volume にしているのでコンテナを消してもデータは残る
起動します。
$ docker compose up -d
ちゃんと 2 コンテナとも起動しているか確認。
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
keys-grafana grafana/grafana:latest "/run.sh" grafana 8 seconds ago Up 7 seconds 3000/tcp, 0.0.0.0:3100->3100/tcp
keys-influxdb influxdb:2 "/entrypoint.sh infl…" influxdb 8 seconds ago Up 7 seconds 0.0.0.0:8086->8086/tcp
OK です。両方 Up になっています。
InfluxDB の初期セットアップ
ブラウザで http://localhost:8086 にアクセスすると InfluxDB の初期セットアップ画面が出ます。
[Get Started] をクリックして、初期ユーザーを作成します。
| 項目 | 値 |
|---|---|
| Username | (任意のユーザー名) |
| Password | (任意のパスワード) |
| Initial Organization Name | keys |
| Initial Bucket Name | keys |
[Continue] をクリック。
You are ready to go! Make sure to copy your operator API token now. This token enables superuser privileges like creating users, orgs, etc. You won’t be able to see it again!
ここで表示される Operator API Token は後で InfluxDB への書き込みや Grafana の接続に使うので、必ず控えておきます。
curl で書き込みテスト
InfluxDB にデータが書き込めるかどうか、まず curl で確かめます。 InfluxDB の書き込みエンドポイントは以下のとおり。
POST /api/v2/write?org=<ORG>&bucket=<BUCKET>&precision=ns
テスト用のシェルスクリプトを書きます。
ORG="keys"
BUCKET="keys"
TOKEN="<ここに控えておいた API Token を貼る>"
HOST="DESKTOP-TEST"
COUNT=12345
TS_NS=$(python3 - <<'PY'
import time
print(int(time.time() * 1_000_000_000))
PY
)
LINE="keystrokes,host=${HOST} daily_count=${COUNT} ${TS_NS}"
curl -i \
-X POST "http://localhost:8086/api/v2/write?org=${ORG}&bucket=${BUCKET}&precision=ns" \
-H "Authorization: Token ${TOKEN}" \
-H "Content-Type: text/plain; charset=utf-8" \
--data-binary "${LINE}"
やっていることの解説:
keystrokesが measurement(テーブル名のようなもの)host=DESKTOP-TESTが tag(インデックス付きラベル)daily_count=12345が field(実際の値)- 末尾のナノ秒タイムスタンプは Python でその場で生成している
これが 前回の記事で説明した Line Protocol のフォーマットです。
実行してみます。
$ sh -x test.sh
+ ORG=keys
+ BUCKET=keys
+ TOKEN=****
+ HOST=DESKTOP-TEST
+ COUNT=12345
+ python3 -
+ TS_NS=1772262845522068992
+ LINE=keystrokes,host=DESKTOP-TEST daily_count=12345 1772262845522068992
+ curl -i -X POST 'http://localhost:8086/api/v2/write?org=keys&bucket=keys&precision=ns' ...
HTTP/1.1 204 No Content
X-Influxdb-Build: OSS
X-Influxdb-Version: v2.8.0
Date: Sat, 28 Feb 2026 07:14:05 GMT
HTTP/1.1 204 No Content が返ってくれば書き込み成功です。
204 は「正常に受け取ったけどレスポンスボディはないよ」の意味なので、InfluxDB の Write API ではこれが正解。もしトークンが間違っていれば 401 Unauthorized、バケット名が間違っていれば 404 Not Found が返ります。
InfluxDB UI でデータを確認する
書き込めたら、InfluxDB の UI でちゃんとデータが入っていることを確認します。
- http://localhost:8086 にアクセス
- 左メニューの Data Explorer を開く
- View Raw Data をオンにする
以下のようにデータが確認できるはずです。
| 項目 | 値 |
|---|---|
| measurement | keystrokes |
| field | daily_count |
| value | 12345 |
| host | DESKTOP-TEST |
| time | 2026-02-28T07:14:10.000Z |
データが見えたら InfluxDB 側は完了です。

Grafana のセットアップ
初回ログイン
ブラウザで http://localhost:3100 にアクセスすると Grafana のログイン画面が出ます。
| 項目 | 値 |
|---|---|
| Email or username | admin |
| Password | admin |
ログインすると、パスワード変更を求められるので新しいパスワードを設定します。
データソースの追加
Grafana が InfluxDB のデータを見に行けるように、データソースを設定します。
- Connections > Data sources を開く
- [Add data source] をクリック
- InfluxDB を選択
設定は以下のとおり。
| 項目 | 値 |
|---|---|
| Name | influxdb |
| Query language | Flux |
| URL | http://keys-influxdb:8086 |
| Organization | keys |
| Token | (InfluxDB の初期セットアップで控えた API Token) |
| Default Bucket | keys |
URL が localhost ではなく keys-influxdb になっていることに注意。
Grafana コンテナから InfluxDB コンテナに通信するので、Docker Compose のサービス名(= コンテナ名)で指定します。
Auth 系のオプション(Basic auth, TLS Client Auth など)はすべて Off のままで OK。
[Save & test] をクリックして datasource is working. 3 buckets found と表示されれば接続成功です。
ダッシュボードを作る
いよいよ Grafana でグラフを表示します。
- Dashboards を開く
- [Create dashboard] → [Add visualization] をクリック
- Data source に influxdb を選択
パネル①:累積値の折れ線グラフ
まずは打鍵数の累積値をそのまま折れ線で表示します。
from(bucket: "keys")
|> range(start: -24h)
|> filter(fn: (r) => r._measurement == "keystrokes")
|> filter(fn: (r) => r._field == "daily_count")
直近 24 時間の daily_count の値がそのまま折れ線で出ます。
パネル②:10分あたりの打鍵数(差分)
累積値だと「いつ集中的に打鍵していたか」がわかりにくいので、difference() で差分を取ります。
from(bucket: "keys")
|> range(start: -24h)
|> filter(fn: (r) => r._measurement == "keystrokes")
|> filter(fn: (r) => r._field == "daily_count")
|> difference()
これで各データポイント間の差分(= その区間で増えた打鍵数)が折れ線で表示されます。
パネル③:今日の最新累積値(Stat パネル)
Panel type を Stat に変更して、今日の累積打鍵数をでっかい数字で表示します。
from(bucket: "keys")
|> range(start: today())
|> filter(fn: (r) => r._measurement == "keystrokes")
|> filter(fn: (r) => r._field == "daily_count")
|> last()
today() で今日の 0:00 からのデータに絞り、last() で最新の値だけを取得します。
ダッシュボードの保存
[Refresh] でグラフが表示されることを確認したら、ダッシュボードを保存します。
| 項目 | 値 |
|---|---|
| Title | Keys Metrics |
| Folder | Dashboards |
[Save] で完了。

まとめ
ここまでの手順で、ローカル環境に以下の構成ができました。
WSL (Ubuntu)
├── Docker
│ ├── keys-influxdb (InfluxDB 2.x) :8086
│ └── keys-grafana (Grafana) :3100
│
└── curl / test.sh ──→ Line Protocol で書き込み
docker compose up -dで InfluxDB + Grafana が起動する- curl で Line Protocol を POST すると InfluxDB に書き込める
- Grafana から Flux クエリでデータを可視化できる
まずは Apache なしで localhost:8086 に直で投げる構成で動かしています。
次回はこれを VPS 上の AlmaLinux に移して、パブリックに公開するサーバーとして構築していきます。