Netdataで簡単サーバー監視！Docker+Nginx構成ガイド


## Netdata とは？

![netdata01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622558/852e235e-2c14-46dc-a872-45be8d12e1a3.png)

[Netdata](https://www.netdata.cloud/) は、システムのパフォーマンスや状態をリアルタイムで監視できるツールです。主な特徴は以下の通りです。

- システムメトリクスを詳細かつリアルタイムで可視化
- CPU、メモリ、ディスク I/O、ネットワークなど幅広く監視
- 軽量で動作が速い
- 柔軟なアラートや通知機能
- プラグインで機能拡張が簡単
- ダッシュボードのカスタマイズが可能

Netdata はオープンソースで、個人・商用問わず無料で使えます。多くの Linux ディストリビューションに対応しており、Docker を使えば簡単にセットアップできます。

## 今回の構築ゴール

この記事では、以下の環境を構築します。

- Docker Compose で簡単にデプロイ
- サーバー起動時に自動で起動
- メールでアラート通知
- Nginx でリバースプロキシ
- HTTPS と Basic 認証でアクセス制限

### 前提条件

このガイドでは、以下がインストール済みであることを前提とします。

- Ubuntu 24.04 LTS
- Docker と Docker Compose
- Nginx

まだインストールしていない場合は、先に準備してください。

## Netdata セットアップ手順

### 1. ディレクトリの作成

まず、設定ファイル用のディレクトリを作ります。

```bash
sudo mkdir -p /opt/netdata/netdata-config/health
sudo mkdir -p /opt/netdata/netdata-config/msmtp
sudo chown -R $(id -un):$(id -gn) /opt/netdata
cd /opt/netdata
```

### 2. 設定ファイルの作成

#### データ保存期間の設定

Netdata は通常、データをメモリに保存しますが、長期間保存したい場合は dbengine モードが便利です。以下の設定で最大 30 日分のデータを保存できます。

```properties:netdata-config/netdata.conf
[global]
    run as user = netdata
    memory mode = dbengine
    history = 900              # 直近15分（1秒ごとに900件）
    dbengine disk space = 512  # MB単位。必要に応じて調整
```

さらに、保存するデータの粒度を時間ごとに変える設定も追加します。

```properties:netdata-config/dbengine.conf
[dbengine]
    retention = 15m:1s, 2d:1m, 30d:5m
```

この設定で、最新 15 分は 1 秒ごと、2 日間は 1 分ごと、30 日間は 5 分ごとにデータを保存します。ストレージ容量に合わせて調整してください。

#### メール通知の設定

アラート発生時にメール通知を受け取る設定です。ここでは Gmail を例にします。

```properties:netdata-config/health/health_alarm_notify.conf
SEND_EMAIL="YES"
EMAIL_USE_SMTP="YES"
DEFAULT_RECIPIENT_EMAIL="your-email@gmail.com"
```

SMTP の設定も必要です。

```properties:netdata-config/msmtp/msmtprc
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        /var/log/msmtp.log

account        default
host           smtp.gmail.com
port           587
from           your-email@gmail.com
user           your-email@gmail.com
password       your-app-password
```

:::note alert
**注意**: Gmail を使う場合は通常のパスワードではなく[アプリパスワード](https://myaccount.google.com/apppasswords)を使ってください。`your-app-password`の部分を自分のアプリパスワードに置き換えてください。
:::

セキュリティのため、設定ファイルのパーミッションも変更しておきます。

```bash
chmod 600 netdata-config/msmtp/msmtprc
```

### 3. Docker Compose の設定

以下の内容で Docker Compose ファイルを作成します。

```yaml:compose.yml
services:
  netdata:
    image: netdata/netdata
    container_name: netdata
    ports:
      - 127.0.0.1:19999:19999  # ローカルのみアクセス可
    cap_add:
      - SYS_PTRACE
    security_opt:
      - apparmor:unconfined
    volumes:
      - netdataconfig:/etc/netdata
      - netdatalib:/var/lib/netdata
      - netdatacache:/var/cache/netdata
      - ./netdata-config/netdata.conf:/etc/netdata/netdata.conf:ro
      - ./netdata-config/dbengine.conf:/etc/netdata/dbengine.conf:ro
      - ./netdata-config/health/health_alarm_notify.conf:/etc/netdata/health_alarm_notify.conf:ro
      - ./netdata-config/msmtp/msmtprc:/etc/msmtprc:ro
      - /etc/passwd:/host/etc/passwd:ro
      - /etc/group:/host/etc/group:ro
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /etc/os-release:/host/etc/os-release:ro
    restart: unless-stopped  # サーバー再起動時も自動起動

volumes:
  netdataconfig:
  netdatalib:
  netdatacache:
```

この設定では、ポート`19999`はローカル（127.0.0.1）からのみアクセス可能です。外部から直接アクセスできないようにし、Nginx のプロキシ経由でのみアクセスできるようにしています。

### 4. Netdata の起動とテスト

設定ができたら、Netdata を起動します。

```bash
docker compose up -d
```

メール通知のテストもしておきましょう。

```bash
docker exec -it netdata /usr/libexec/netdata/plugins.d/alarm-notify.sh test
```

テストメールが届けば、通知設定は完了です。

## Nginx リバースプロキシの設定

### 1. Basic 認証の設定

Netdata ダッシュボードを保護するため、Basic 認証を設定します。

```bash
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd your-username
```

`your-username`は好きなユーザー名にしてください。パスワードの入力も求められます。

複数ユーザーを追加する場合は、2 回目以降は`-c`を外して実行します。

```bash
sudo htpasswd /etc/nginx/.htpasswd another-user
```

### 2. SSL 証明書の準備

Let's Encrypt で無料の SSL 証明書を取得します。

```bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d netdata.your-domain.com
```

`netdata.your-domain.com`は実際に使うドメイン名に置き換えてください。事前に DNS でこのドメインがサーバーの IP を指すようにしておきます。

### 3. Nginx の設定ファイル作成

`/etc/nginx/sites-available/netdata_your-domain_com` に以下の内容で作成します。

```nginx
server {
  listen 443 ssl http2;
  server_name netdata.your-domain.com;  # ドメイン名に置き換え

  ssl_certificate /etc/letsencrypt/live/netdata.your-domain.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/netdata.your-domain.com/privkey.pem;

  # セキュリティ設定
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;
  ssl_ciphers HIGH:!aNULL:!MD5:!kRSA;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:10m;

  # HTTPヘッダー
  add_header X-Content-Type-Options nosniff;
  add_header X-Frame-Options SAMEORIGIN;
  add_header X-XSS-Protection "1; mode=block";

  location / {
    proxy_pass http://127.0.0.1:19999/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    # Basic認証
    auth_basic "Netdata Dashboard";
    auth_basic_user_file /etc/nginx/.htpasswd;
  }
}

# HTTP→HTTPSリダイレクト
server {
  listen 80;
  server_name netdata.your-domain.com;  # ドメイン名に置き換え
  return 301 https://$host$request_uri;
}
```

### 4. 設定の有効化と Nginx の再読み込み

設定ファイルを有効化し、Nginx を再読み込みします。

```bash
sudo ln -s /etc/nginx/sites-available/netdata_your-domain_com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

これでセットアップ完了です。以下の URL から Netdata ダッシュボードにアクセスできます。

```plaintext
https://netdata.your-domain.com
```

アクセス時に設定した Basic 認証のユーザー名とパスワードを入力してください。
右下の方にある「Skip and use the dashboard anonymously」をクリックすると、データ参照ページに遷移します。

![netdata02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622558/9957bf2e-02d5-4c33-9c7f-0a949fef2b3c.png)

## まとめ

以上で、Docker を使った Netdata のセットアップ手順を紹介しました。この構成で、

- システムメトリクスのリアルタイム監視
- 最大 30 日間のデータ保存
- 問題発生時のメール通知
- HTTPS と Basic 認証によるアクセス制限

といったサーバー監視環境が簡単に作れます。