前回の記事では WSL 上のローカル環境に InfluxDB + Grafana を立ち上げました。 今回はこれを VPS 上の AlmaLinux 9.5 に移して、HTTPS で外部公開するサーバー として仕上げます。
- InfluxDBとGrafanaの概要
- ローカルサーバーを立ち上げる(WSL上のUbuntuでDockerを使って動かす)
- パブリックサーバーを立ち上げる(VPS上のAlmaLinuxでDockerを使って動かす)(この記事)
全体構成
Windows Keys App
↓ HTTPS
keys-api.example.com (Apache 443)
↓ Reverse Proxy
127.0.0.1:8086 (InfluxDB Docker)
↓
127.0.0.1:3000 (Grafana Docker)
↑ Reverse Proxy
keys.example.com (Apache 443)
InfluxDB は 外部公開しない。Apache だけが公開窓口。
Step 1: DNS 設定
keys-api.example.com CNAME vps.example.com
keys.example.com CNAME vps.example.com
Step 2: Docker & Docker Compose インストール(AlmaLinux)
AlmaLinux は RHEL 系なので、Docker 公式の CentOS リポジトリを使います。
# dnf update -y
# dnf install -y dnf-plugins-core
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# systemctl enable --now docker
Step 3: docker-compose.yml(ローカルとの違い)
ローカルとの最大の違い:ポートを 127.0.0.1 にバインドする。
0.0.0.0 にバインドするとファイアウォールを素通りして外部に露出してしまうため。
# mkdir -p /opt/keys-server
# cd /opt/keys-server
services:
influxdb:
image: influxdb:2
container_name: keys-influxdb
ports:
- "127.0.0.1:8086:8086" # ← ローカルは 0.0.0.0 だったがここを制限
volumes:
- influxdb-data:/var/lib/influxdb2
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: keys-grafana
ports:
- "127.0.0.1:3000:3000" # ← 同上
environment:
- GF_SERVER_ROOT_URL=https://keys.example.com
- GF_SERVER_DOMAIN=keys.example.com
volumes:
- grafana-data:/var/lib/grafana
restart: unless-stopped
volumes:
influxdb-data:
grafana-data:
起動前にユーザー・権限を整理しておきます。
# usermod -aG docker user
# chown -R user:user /opt/keys-server
# exit # rootから抜けて再ログイン
$ cd /opt/keys-server
$ docker compose up -d
$ docker compose ps
NAME IMAGE ... PORTS
keys-grafana grafana/grafana:latest ... 127.0.0.1:3000->3000/tcp
keys-influxdb influxdb:2 ... 127.0.0.1:8086->8086/tcp
Step 4: InfluxDB 初期セットアップ
InfluxDB は外部公開しないため、SSHトンネル経由でブラウザアクセスします。
# ローカルPCから
$ ssh -L 8086:localhost:8086 user@vps.example.com
ブラウザで http://localhost:8086 を開き、[Get Started] からセットアップ。
手順はローカルと同じです(Organization: keys / Bucket: keys)。
Operator API Token は必ず控えておく(後から確認不可)。
Step 5: Apache リバースプロキシ設定
VirtualHost を /etc/httpd/sites-available/ に作成します。
InfluxDB 書き込み API 用 (keys-api.example.com)
ポイントは /api/v2/write だけ をプロキシして、POST 以外は拒否すること。
<VirtualHost *:80>
ServerName keys-api.example.com
Redirect permanent / https://keys-api.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName keys-api.example.com
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
ProxyPass /api/v2/write http://127.0.0.1:8086/api/v2/write
ProxyPassReverse /api/v2/write http://127.0.0.1:8086/api/v2/write
<Location "/api/v2/write">
<LimitExcept POST>
Require all denied
</LimitExcept>
</Location>
# SSL は certbot が後から追記
</VirtualHost>
Grafana 用 (keys.example.com)
Grafana はすべてのパスをプロキシするだけです。
<VirtualHost *:80>
ServerName keys.example.com
Redirect permanent / https://keys.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName keys.example.com
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
# SSL は certbot が後から追記
</VirtualHost>
シンリンクを張って有効化します。
# ln -s /etc/httpd/sites-available/keys-api.example.com.conf /etc/httpd/sites-enabled/
# ln -s /etc/httpd/sites-available/keys.example.com.conf /etc/httpd/sites-enabled/
# httpd -t && systemctl reload httpd
Step 6: Let’s Encrypt 証明書取得
# certbot
対話形式でドメインを選択すると、certbot が VirtualHost に SSL 設定を自動追記してくれます。
Step 7: 動作確認
# GET は 403 になることを確認(POST 以外拒否の設定が効いている)
$ curl -I https://keys-api.example.com
HTTP/1.1 403 Forbidden
# POST で書き込めることを確認
$ curl -X POST "https://keys-api.example.com/api/v2/write?org=keys&bucket=keys&precision=ns" \
-H "Authorization: Token <TOKEN>" \
-H "Content-Type: text/plain" \
--data-binary "keystrokes,host=test daily_count=1 $(date +%s%N)"
# 204 No Content が返れば成功
Grafana のセットアップ
https://keys.example.com にアクセスしてログイン(初期認証情報は admin/admin)。
データソースの URL は Docker サービス名で指定します(Grafana コンテナの中から見るため)。
| 項目 | 値 |
|---|---|
| URL | http://keys-influxdb:8086 |
| Query language | Flux |
| Organization | keys |
| Token | (控えておいた API Token) |
| Default Bucket | keys |
ダッシュボードの Flux クエリはローカルで作成したものと同一です(前回の記事参照)。
Windows アプリ側の設定
書き込み先を本番エンドポイントに変えます。
[InfluxDB]
Endpoint=https://keys-api.example.com
Organization=keys
Bucket=keys
Token=<TOKEN>
まとめ
VPS (AlmaLinux 9.5)
├── Apache (:443)
│ ├── keys-api.example.com → 127.0.0.1:8086 (POST /api/v2/write のみ)
│ └── keys.example.com → 127.0.0.1:3000 (Grafana)
└── Docker
├── keys-influxdb (InfluxDB 2.x) 127.0.0.1:8086
└── keys-grafana (Grafana) 127.0.0.1:3000
ローカルとの主な違いは以下の 3 点です。
| 項目 | ローカル (WSL) | 本番 (VPS) |
|---|---|---|
| ポートバインド | 0.0.0.0 |
127.0.0.1 のみ |
| アクセス | localhost 直アクセス | Apache リバースプロキシ経由 |
| TLS | なし | Let’s Encrypt (certbot) |
セキュリティの最低ライン:
- InfluxDB は localhost バインドで直アクセス不可
- Apache で
/api/v2/writeへの POST 以外を拒否 - Grafana の admin パスワードは初回ログイン時に変更