0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ubuntuファイルサーバーでアップロードを監視してDiscordに通知する仕組みを作ってみた

Posted at

はじめに

自宅に学習用途で構築中のUbuntuファイルサーバーの共有ディレクトリにファイルが追加された際、リアルタイムでその情報をDiscordに通知する仕組みを作成した際の手順メモです。

目的は自身の備忘録としてですが、「シェルスクリプトやファイル監視の自動化を学びたい方」にとっても再現しやすい内容になっていると思います。

環境・前提

項目 内容
OS Ubuntu 24.04.2 LTS
実行環境 自宅内の物理サーバー(Ubuntuファイルサーバー)
通知先 Discord Webhook
共有ディレクトリ /srv/share
前提知識 LPIC Level1 相当(基本的なCLI操作、シェル理解してたら誰でも)

やりたいこと(ゴール)

  • Sambaで共有している/srv/shareに誰かがファイルをアップしたら…
  • そのファイル名とアップロードしたユーザー名をDiscordに通知したい!
  • さらに、再起動後も自動で監視が始まるようにしたい!

手順1:inotify-toolsのインストール

sudo apt update
sudo apt install inotify-tools curl

手順2:Discord Webhookの作成

  • Discordサーバーを作成(自分用でOK)
  • 通知用のテキストチャンネルを作成(名前は適当で!私は#upload-watchにしました)
  • チャンネル設定 → [連携サービス] → [Webhookを作成]
  • Webhook URLをコピー
    スクリーンショット 2025-08-05 152940.png

手順3:監視スクリプトの作成

sudo vim /usr/local/bin/watch_uploads_discord.sh

sudo vim /usr/local/bin/watch_uploads_discord.shの中身:

#!/bin/bash

# 監視対象のディレクトリ(Sambaで共有されているディレクトリを想定)
WATCH_DIR="/srv/share"

# ログファイルの出力先(ファイル追加の記録を保存)
LOG_FILE="/var/log/filewatch_discord.log"

# DiscordのWebhook URL(事前にDiscord側で作成しておく)
WEBHOOK_URL="https://discord.com/api/webhooks/xxxxxxxx"  # 自分のWebhook URLに置き換える

# inotifywaitで対象ディレクトリを監視
# -m:常に監視し続ける(monitorモード)
# -e create:新しいファイルが作成されたイベントだけを監視
# --format "%w%f":フルパス形式で出力(%w=ディレクトリ, %f=ファイル名)
inotifywait -m -e create --format "%w%f" "$WATCH_DIR" | while read NEWFILE
do
    # 現在時刻を取得(ログに記録するため)
    NOW=$(date "+%Y-%m-%d %H:%M:%S")

    # フルパスからファイル名だけを抽出
    FILENAME=$(basename "$NEWFILE")

    # ファイルの所有ユーザー名を取得(アップロード者として表示)
    FILEOWNER=$(stat -c %U "$NEWFILE")

    # ログファイルに記録(タイムスタンプ・ファイル名・ユーザー)
    echo "[$NOW] $FILENAME was created by $FILEOWNER" >> "$LOG_FILE"

    # DiscordへWebhook通知を送信
    # -s:進捗を表示しない
    # -H:HTTPヘッダでContent-Type指定(JSON)
    # -d:POSTするJSONデータ(改行は \\n で表現)
    curl -s -H "Content-Type: application/json" \
         -X POST \
         -d "{
             \"content\": \"📥 新しいファイルがアップロードされました!\\n🗂️ ファイル名: \`$FILENAME\`\\n👤 アップロードユーザー: \`$FILEOWNER\`\"
         }" \
         "$WEBHOOK_URL"
done

実行ファイルに権限が付与されているかも一応:

sudo chmod +x /usr/local/bin/watch_uploads_discord.sh

手順4:systemdサービスファイルの作成

毎回起動後に実行しているのが面倒なので、systemdに登録しました:

sudo vim /etc/systemd/system/watch_uploads.service

中身:

[Unit]
Description=Watch /srv/share for new files and send Discord notification
After=network.target

[Service]
ExecStart=/usr/local/bin/watch_uploads_discord.sh
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target

手順5:systemd再読み込みとサービス起動

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl start watch_uploads.service
sudo systemctl enable watch_uploads.service

動作テスト

実際に共有ディレクトリ(/srv/share)にファイルを作成して保存してみる:

touch /srv/share/test_notify.txt #作成するファイル名はなんでもいいです!

→ Discordに通知が届けばOK!
スクリーンショット 2025-08-05 154355.png

今後の応用アイデア

  • 拡張子で通知対象を制限したい(.pdf, .jpg とか)
  • ファイルサイズなども通知に追加

やってみて

inotifywait は軽量かつ即時性が高く、監視用途に最適だった。Discord Webhookは導入が簡単で、通知テストもすぐできるのが良いですね。
またbasename, stat など基本的なシェルコマンドの実用例として良い勉強になりました。
systemd化により再起動耐性もついたため、業務用途のファイル監視にも応用できればしていきたいです!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?