2026.10.22
薬の飲み忘れをDiscordの通知で減らす!毎晩決まった時刻に届く自分専用の仕組みの作り方

- 寝る前の薬を、気づいたら飲まずに寝てしまっている
- スマホのアラームは止めた瞬間に忘れて、結局飲んでいない
- 毎日よく開くDiscordに、決まった時刻にお知らせが届けばいいのに
寝る前の薬の時間は、毎晩決まった時刻にDiscordへ通知を送る、自分専用の小さな仕組みで知らせてもらえます。
使うのは、Discordのウェブフックと、決まった時刻に動くプログラムだけです。Botのアカウントは要らず、この記事のファイルを写して動かせます。
通知が届くのは、ふだんから開いているDiscordのチャンネルです。アラームのように止めたら消える音ではなく、あとから見返せるメッセージとして残ります。
この記事では、ウェブフックの作り方、通知を送るスクリプト、時刻どおりに動かす設定、24時間動かす場所の選び方をまとめました。
設定が終われば、毎晩同じ時刻に、薬を飲む時間を知らせるメッセージが届くようになります。
決まった時刻にDiscordへ通知を送る仕組み
この仕組みは、3つの部品でできています。
| 部品 | 役割 |
|---|---|
| ウェブフック | 決まったチャンネルにメッセージを投稿するためのURL |
| 送信スクリプト | ウェブフックURLへ、通知の文章を送る |
| 時刻の管理 | 毎晩決まった時刻に、送信スクリプトを動かす |
ウェブフックは、Discordのサーバー設定から作れる投稿用のURLです。会話に返事をするBotとは違い、メッセージを送るだけなので、Botのアカウントやトークンは要りません。

僕は毎晩22時30分に、寝る前の薬の時間を知らせるメッセージがDiscordに届くようにしています。
通知は飲み忘れを知らせる補助
この仕組みは、止まっても自分には知らせません。マシンの停止やウェブフックの削除、Discordの通知のオフで届かない日があるので、大事な薬はスマホのアラームなどと併用してください。
通知の文章には、薬の名前や病名を書かないでください。チャンネルを見られる人に伝わります。飲み忘れたときの対応は、医師か薬剤師に確かめておきます。
始める前に用意するもの
用意するのは、通知を受け取るDiscordのサーバーと、24時間動かしておけるLinuxのマシンです。
| 用意するもの | 内容 |
|---|---|
| Discordのサーバー | 自分だけのサーバーでよい。サーバーの管理権限が要る |
| Linuxのマシン | 24時間つけておけるPCか、借りたVPS(インターネット上で借りるサーバー) |
| Docker | プログラムを決まった環境で動かすソフト。Linuxのマシンに入れる |
自分のPCで動かすと、PCを閉じた夜は通知が届きません。寝る前の通知はPCを閉じている時間帯に重なりやすいので、24時間動いているマシンに置きます。
VPSにSSHでつなぐ
VPSを使うときは、自分のPCのターミナルから、SSHという仕組みでVPSにログインして操作します。ユーザー名とIPアドレスは、VPSの管理画面に出ています。
ssh [ユーザー名]@[VPSのIPアドレス]Dockerを入れる
Ubuntuなら、Dockerの公式のUbuntuへのインストール手順どおりに入れます。入れ終わったら、次のコマンドでDocker Composeの版が表示されることを確かめます。
docker compose version手順1:ウェブフックを作ってURLをコピーする
通知を受け取りたいDiscordのサーバーで、ウェブフックを作ります。
- 「サーバー設定」を開き、「連携サービス」を選ぶ
- 「ウェブフックを作成」を押す
- 通知を送るチャンネルを選び、見分けやすい名前に変える
- 「ウェブフックURLをコピー」を押す
コピーしたURLは、次の手順で使います。作り方は、Discordのウェブフックのご紹介にも書かれています。
ウェブフックURLは人に見せない
URLを知っている人はだれでも、そのチャンネルにメッセージを投稿できます。SNSやGitHubに貼ってしまったら、そのウェブフックを削除して作り直してください。
手順2:ウェブフックURLを設定ファイルに書く
ウェブフックURLは、スクリプトの中に直接書かず、別のファイルに分けて置きます。スクリプトを人に見せたり、GitHubに上げたりしても、URLが漏れません。
Linuxのマシンで、設定を置くフォルダを作り、ファイルを開きます。
mkdir -p ~/.config && nano ~/.config/medicine-reminder.curl開いたファイルに次の1行を書きます。引用符の中身を、手順1でコピーしたウェブフックURLそのものに置き換えてください。
url = "ここにコピーしたウェブフックURLを貼る"nanoは、CtrlとOを押してからEnterで保存し、CtrlとXで閉じます。保存したら、自分以外は読めないように権限を変えます。
chmod 600 ~/.config/medicine-reminder.curl最後に、次のコマンドでファイルの場所を表示させます。表示された場所は、手順4で使うので控えておきます。
ls -l ~/.config/medicine-reminder.curl行の先頭が-rw-------で始まっていれば、ファイルとして正しく作れています。
手順3:通知を送るスクリプトを作る
作業用のフォルダを作り、その中に通知を送るスクリプトを置きます。
mkdir -p ~/medicine-reminder && cd ~/medicine-reminder && nano send-reminder次の内容を書いて保存します。descriptionの中の文章が、Discordに届くメッセージです。
#!/bin/shset -eu
CONFIG_FILE="${REMINDER_CONFIG_FILE:-/config/medicine-reminder.curl}"
exec /usr/bin/curl --config "$CONFIG_FILE" \ --silent --show-error --fail \ --connect-timeout 10 --max-time 30 \ --output /dev/null \ --header 'Content-Type: application/json' \ --data '{"embeds":[{"description":"夜10時半です。寝る前のお薬を飲む時間です。"}],"allowed_mentions":{"parse":[]}}'allowed_mentionsの設定は、メッセージの文章に@everyoneなどが入っても、だれにもメンションを飛ばさないためのものです。
REMINDER_CONFIG_FILEの後ろの/config/medicine-reminder.curlは、compose.ymlを使わずにスクリプトを動かしたときの既定の場所です。
手順4:決まった時刻に動かす設定を作る
時刻どおりにスクリプトを動かすのは、Dockerの中で動くcronです。マシンの時刻の設定に左右されないよう、コンテナの中で日本時間に固定します。
同じフォルダにentrypoint.shを作ります。
#!/bin/shset -eu
if [ ! -f "$REMINDER_CONFIG_FILE" ] || [ ! -r "$REMINDER_CONFIG_FILE" ]; then echo "設定ファイルが読めません: $REMINDER_CONFIG_FILE" >&2 exit 1fi
printf '%s /usr/local/bin/send-reminder\n' "$CRON_SCHEDULE" > /etc/crontabs/rootecho "schedule='$CRON_SCHEDULE' TZ=$TZ"
exec crond -f -d 8 -L /dev/stdout続けて、Dockerfileを作ります。
FROM alpine:3.22
ENV TZ=Asia/Tokyo
RUN apk add --no-cache curl ca-certificates tzdata \ && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \ && echo "Asia/Tokyo" > /etc/timezone
COPY send-reminder /usr/local/bin/send-reminderCOPY entrypoint.sh /usr/local/bin/entrypoint.shRUN chmod 0755 /usr/local/bin/send-reminder /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]最後に、compose.ymlを作ります。volumesの左側の/home/ubuntu/.config/medicine-reminder.curlは、手順2のls -lで表示された場所に書き換えてください。
services: medicine-reminder: build: . container_name: medicine-reminder restart: unless-stopped environment: TZ: Asia/Tokyo CRON_SCHEDULE: "30 22 * * *" REMINDER_CONFIG_FILE: /config/medicine-reminder.curl volumes: - /home/ubuntu/.config/medicine-reminder.curl:/config/medicine-reminder.curl:roCRON_SCHEDULEの30 22 * * *は、毎日22時30分という意味です。左から分、時、日、月、曜日の順で、21時にしたいなら0 21 * * *にします。
手順5:起動してテストの通知を送る
compose.ymlのあるフォルダで、コンテナを作って起動します。
docker compose up -d --build起動したら、時刻を待たずにテストの通知を1回送ります。
docker compose exec medicine-reminder send-reminderDiscordのチャンネルにメッセージが届けば成功です。あとは、毎晩決まった時刻に同じメッセージが届きます。
時刻や文章をあとから変えたときは、もう一度docker compose up -d --buildを実行して反映させます。
テストの通知も本番と同じチャンネルに届きます。家族と共有しているチャンネルなら、先にひと言伝えておきます。
通知が来ないときの確認
テストは届くのに決まった時刻に届かないときは、時刻の設定を疑います。テストも届かないときは、ウェブフックURLか設定ファイルの読み込みを疑います。
| 症状 | 確かめること |
|---|---|
| コンテナがすぐ止まる | docker compose logsに、設定ファイルが読めないと出ていないか |
| テストも届かない | テストのコマンドを実行したときに出るエラーの文面と、設定ファイルのURL |
| テストは届くが、時刻に届かない | docker compose logsのschedule=の値とTZ=Asia/Tokyoの表示 |
| 以前は届いたのに急に届かない | ウェブフックが削除されていないか |
docker compose logsの最初には、schedule='30 22 * * *' TZ=Asia/Tokyoのように、設定した時刻とタイムゾーンが出ます。ここが思った値になっていれば、時刻の設定は合っています。
24時間動かす場所を選ぶ
この仕組みは、動かしているマシンが止まると通知も止まります。毎晩届けたいなら、電源を切らないマシンに置く必要があります。
| 置き場所 | 向いている人 | 気をつけること |
|---|---|---|
| 自宅のPC | 24時間つけておけるPCがある | 停電や再起動のあとに動いているかの確認が要る |
| VPS | 自宅のPCを閉じて寝たい | 毎月の料金がかかる |
24時間つけているLinuxのPCが家にあるなら、VPSを借りなくてもこの記事の手順で動かせます。
VPSを借りるときの条件は、Ubuntuを選べてroot権限があることです。通知のためだけに借りるより、ほかのBotも同じVPSに載せる予定があるときのほうが、料金に見合いやすくなります。
よくある質問
Q朝と夜の2回、通知を送れますか?
送れます。「CRON_SCHEDULE」を「0 8,22 * * *」のようにすると、8時と22時に同じ文章が届きます。文章を時刻に合わせて変えたいときは、文章に時刻を書かずに使います。
Q飲んだかどうかを記録できますか?
この記事の仕組みは通知を送るだけで、飲んだかどうかは記録しません。記録まで残したいときは、ボタンや返信を受け取れるBotを作る必要があります。
まとめ:毎晩の通知はウェブフックと時刻の設定で作れる
寝る前の薬の通知は、次の順で作れます。
- Discordでウェブフックを作り、URLを設定ファイルに分けて置く
- 通知を送るスクリプトと、時刻どおりに動かす
cronをDockerで動かす - テストの通知が届くことを確かめてから、毎晩の時刻を待つ
- 自分のPCを閉じても届くように、24時間動くマシンに置く
一度動けば、毎晩同じ時刻にメッセージが届きます。止まったことに気づけるよう、ときどきチャンネルを見返してください。
食事の記録もDiscordで続けたいなら、食事の写真を送るだけでAIが記録するBotが同じサーバーで使えます。
