防犯カメラシステムの自作④~クラウドストレージへの動画ファイルの自動アップロード~

 本投稿は,「防犯カメラシステム with Raspberry Pi」(←開発がすべて完了したら「開発物」にページを作成する予定)に関する投稿です.Tipsでの投稿は,内容ごとに分け,下記の通り分割して投稿してゆきます.

Reolink社製カメラ「RLC-1212A」の挙動確認
Raspberry PiへのPoE HATのセットアップ
VPNを用いたリアルタイム映像視聴の環境構築
④クラウドストレージへの動画ファイルの自動アップロード(本投稿)
クラウドストレージへの動画ファイルの自動アップロード+α
ウォルボックス内環境に対する温湿度センサとファン制御の実装
⑦人物など動体検知時におけるスマホへのプッシュ通知機能の実装(予定)

 本投稿では,「防犯カメラシステム with Raspberry Pi」に向けて,防犯カメラが録画した映像を,クラウドストレージへ自動保存する方法を説明します.
 使用したRaspberry Piは,Pi 4 Model B 8GBです.OSは,rasRaspberry Pi OS(64bit)において執筆時点で最新バージョン(Debian 13 Trixieがベース.Release Date: 18 Jun 2026)を用いています.

目次

  1. 本投稿で使用するもの
  2. Raspberry PiのFTPサーバ化
  3. 防犯カメラからRaspberry Piへ動画ファイルの転送
  4. クラウドストレージへのアップロード環境の構築
    • Rcloneのインストールと設定
    • GoogleクライアントIDおよびクライアントシークレットの生成
    • Rcloneの認証
    • Google Driveへの接続確認
  5. Raspberry Piからクラウドストレージへの自動アップロード

1. 本投稿で使用するもの

 筆者が自作しようとしている防犯カメラシステム全体ではなく,本投稿で扱った機材のみを,以下にあげる.

  • 防犯カメラ:Reolink社製 RLC-1212A
  • Raspberry Pi 4 Model B 8GB(Tips②[1]より,下記がセットアップ済み)
    • Waveshare社製 PoE HAT(B)
    • Raspberry Pi 4 Model B用のヒートシンク
  • micro SDカード×2枚
    • 防犯カメラに使用 (256GB,class10,UHS-1/U3,最大読込100MB/s)
    • Raspberry Piに使用(64GB,class10,UHS-1/U3,最大読込100MB/s)
  • PoEスイッチングハブ:TPLINK社製 TL-SG1005
  • LANケーブル×2本
    • ハブ―Raspberry Pi間の接続
    • ハブ―防犯カメラ間の接続
  • Reolink社のアプリ
    • PC用クライアントソフトのバージョン:v8.21.4
  • PC(Windows,家庭LANに接続した状態)
  • Googleアカウント
    • クラウドストレージとして,Google Driveを使用するために作成が必要
  • vsftpd(v3.0.5)
  • Rclone(v1.60.1)
  • inotifywait(v4.23.9.0)

2. Raspberry PiのFTPサーバ化

 機器の物理破壊に備え,防犯カメラの録画映像をクラウドストレージへ非難する.この動画ファイル転送の流れとして,防犯カメラからRaspberry Piへ転送し,インターネットに接続されているRaspberry Piからクラウドストレージへアップロードする.

 防犯カメラのReolink社製 RLC-1212Aには,録画映像をFTPサーバへアップロードする機能がある.そこでRaspberry PiをFTPサーバ化し,Raspberry Piから防犯カメラのストレージ(microSDカード)へ動画ファイルを取得しに行くのではなく,カメラからRaspberry Pi(FTPサーバ)へ転送する方法を筆者は採用した.

 はじめに,下記コマンドでFTPサーバソフトであるvsftpdのインストールを行う.

sudo apt update
sudo apt install vsftpd

 インストール後に,下記コマンドでFTPサーバの稼働状態を確認する.

systemctl status vsftpd

# Active: active (running)となっていたら成功

 vsftpの設定を行う,vsftpd.confの編集をする.念のため,編集を行う前に既存のvsftpd.confのバックアップを取っておく.

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

 バックアップを取ったうえで,vsftpd.confの編集を行う.

sudo nano /etc/vsftpd.conf

 vsftpd.confを下記内容に書き換える.

# FTPサーバの待ち受け関連
listen=YES # IPv4の待ち受け
listen_ipv6=NO # IPv6の待ち受け制限

# FTPサーバへのログイン関連
anonymous_enable=NO # 匿名ユーザによるログイン制限
local_enable=YES # Linux上のユーザーによるログイン

# ディレクトリ/ファイル関連
write_enable=YES # FTP経由でのファイルを書き込み許可
chroot_local_user=YES # FTPユーザにとってのrootを制限する
allow_writeable_chroot=YES # ルートディレクトリへの書き込み許可
local_root=/home/<user_name>/SecurityCamera/logMovie # ファイルを書き込むディレクトリ(FTPユーザにとってのroot)

pasv_enable=YES # FTPのPassiveモード(PASV)を有効化
pasv_min_port=50000
pasv_max_port=50100

 書き込みが完了したら,下記コマンドで

sudo systemctl restart vsftpd # FTPサーバの再起動
systemctl status vsftpd # FTPサーバの稼働状態を確認

# Active: active (running)となっていたら成功

 FTPサーバの稼働を確認できたら,次に下記コマンドで,FTPサーバが待ち受けているポートを確認する.例えば,TCP/21で待ち受けている場合は,図1のように「LISTEN … 0.0.0.0:21 …」のような結果が表示される.

sudo ss -lntp | grep vsftpd
図1 FTPサーバが待ち受けているポートを確認している様子

3. 防犯カメラからRaspberry Piへ動画ファイルの転送

 前の第2章では,Raspberry PiのFTPに関する設定を行った.この第3章では,防犯カメラのFTPに関する設定を行う.Reolink社のPC用クライアントソフトの「設定>監視>FTP>FTP設定」に,FTPに関する設定項目がある(図1).
 Reolink社公式から,「Reolink製品におけるFTP設定方法」に関するドキュメントが公開されている[2]

図2 Reolink社のPC用クライアントソフトにおけるFTP設定
  • FTPサーバー:
    防犯カメラと接続している,Raspberry Piのeth0におけるIPアドレスを入力する.ここでは,Tips③[3]より192.168.20.1とする.
  • ユーザ名:
    Raspberry Piのユーザ名.Raspberry Piのユーザ名とは,例えばターミナルにおける行頭の文字「文字列A@文字列B:~ $ 」の,文字列Aの部分である.なお,文字列Bはホスト名(デバイス名)である.
  • パスワード:
    Raspberry Piのそのユーザでログインする際のパスワードである
  • リモートディレクトリ:
    Raspberry Piのvsftpd.confでも,アップロードするディレクトリを指定できたが,このPC用クライアントソフトからも指定できる.ただし,PC用クライアントソフトでディレクトリを指定する際は,その先頭に”/”を記述してはならない[2].
    • ⭕:home/<user_name>/SecurityCamera/logMovie
    • ❌:/home/<user_name>/SecurityCamera/logMovie

 録画の条件の設定は,PC用クライアントソフトの「設定>監視>FTP>スケジュール」から設定できる.
 タブで「イベント発生」と「連続(スケジュール内)」の2種類がある.筆者の目的は,常に録画し続けるのではなく,物体を検知した際のみ録画することである.そのため「イベント発生」のみ有効にし,「連続(スケジュール内)」は全て無効にした.
 対象とするイベントは,選択肢にある「任意の動き,人,車,ペット」の全てを選択した.「任意の動き」が,他3つのイベント(人,車,ペット)を意味するのか,Tips①[4]で説明した「動体」を意味するのか判断が付かなかったため,念のために全て選択した(図3).
 対象とするイベントを設定したうえで,そのイベントを録画する対象日時においては,日曜日~土曜日のすべての曜日の,0時~23時のすべての時間帯を,有効にした(図3).
 録画された動画ファイルの品質は,解像度3,840×2,160px,総ビットレート約8,192kbpsであり,1分30秒程度の尺の場合でファイルサイズは80~90MB程度である.

図3 FTPで転送する映像の録画条件

 ここまでの設定が済んだら,防犯カメラ―Raspberry Pi間のFTPによるデータ転送が可能になっているはずである.その確認として,PC用クライアントソフトの「設定>監視>FTP>FTP設定>FTPテスト」ボタンを押し,Raspberry Pi上の指定したディレクトリにテストファイルが作成されるか確認されたし.

 本投稿の本題である「防犯カメラや物理ストレージが破壊されても記録映像を守るために,クラウドストレージへ逐次アップロードする」とは話が逸れるが,防犯カメラに差したSDカードにも同様の条件で録画内容を保存するよう,「設定>監視>録画」にて同じ設定を行った.
 その理由は,今回採用したクラウドストレージ(Google Drive無償版)の容量は15GBであり,これに比べて防犯カメラに筆者が差しているmicroSDカードは256GBである.これに対し,クラウドストレージ以上に,古い記録も残せるようにするためである.

4. クラウドストレージへのアップロード環境の構築

 クラウドストレージには,無償版で15GBのストレージが使用でき,各種APIも整っている,Google Driveを用いる.そしてクラウドストレージへの自動アップロードにはRcloneを用いる.Rcloneは,Google Driveをはじめ,多種類のクラウドストレージに対応した,オープンソースのコマンドライン型プログラムである.
 この第4章では,Rcloneのインストールから始め,RcloneとGoogle Driveとの連携,手動でのコマンド実行によるアップロードの確認までを行う.

 はじめに,下記コマンドでRcloneのインストールを行う.

sudo apt update
sudo apt install rclone

 Rcloneの設定は,下記コマンドをターミナルに入力すると,設定メニューがターミナルに表示される.そしてさらに以下に示す9個の設定が,1つ1つ順々に表示される.

rclone config
  1. 新たにリモート接続するクラウドストレージの設定をするか?:
    • 選択肢:n) New remote,s)Set configuration password,q) Quit config
    • 回答:n
  2. 新たな接続先の名称(管理に用いる任意の名称):
    • 回答:筆者は”MyGoogle Drive”とした
  3. 使用するストレージのサービス:
    • 選択肢(一例):4)Amazon Drive,13)Dropbox,18)Google Drive,30)Microsoft OneDrive
    • 回答:18
図4 使用するクラウドストレージの選択肢
  1. GoogleアプリケーションのクライアントID:
    • 回答:クライアントIDの生成方法は第4.2節にて後述する
  2. Googleアプリケーションのクライアントシークレット:
    • 回答:クライアントIDの生成方法は第4.2節にて後述する
  3. Google Driveからアクセス要求が会った際のRcloneのスコープ:
    • 選択肢(一例):1)Full access all files, excluding Application Data Folder.
    • 回答:1
  4. サービスアカウントファイル:
    • 回答:空欄のままEnterキーを入力
      これはGoogle Cloudで作成したサービスアカウントの,JSON認証情報を用いる場合の設定であり,本投稿のアプローチにおいては不要
  5. 高度な設定:
    • 選択肢:y)Yes,n)No
    • 回答:n
  6. 自動設定:
    • 選択肢:y)Yes,n)No
    • 回答:n
  7. Google AOuthの認証:
    • 解凍:第4.3節にて生成されるトークンを貼り付ける
      ここで表示されている「rclone authorize “drive” “<your_command>”」を第4.3節にて用いる
  8. これを共有ドライブとして設定しますか?:
    • 選択肢:y)Yes,n)No
    • 回答:n
  9. 設定を完了して良いか?:
    • 選択肢:y)Yes,n)No
    • 回答:y
      上記の回答後、さらに “q” を入力し設定を終了する

 この第4.2節では,GoogleアプリケーションにおけるクライアントIDおよびクライアントシークレットの生成方法を説明する.手順は,Rclone公式のドキュメント[5]に記載されている.この手順に沿って説明する.

  1. この防犯カメラシステムの開発に用いるGoogleアカウントで,Google Cloud コンソール[6]にログインする
  2. 「プロジェクトの新規作成」を選ぶ
  3. 「APIとサービスを有効にする」で,Google Drive APIを有効にする
  4. 画面左側にあるパネルにて「認証情報>同意画面の構成>開始」を選び,以下の項目を入力する
    • アプリケーション名:rclone
    • ユーザサポートメール:任意のメールアドレス(筆者は,このGogleアカウントのメールアドレスにした)
    • 対象:外部
      • ここでいう ”外部” とは,OAuthアプリのユーザータイプを意味するものであり,Google Driveを一般公開するという意味ではない
    • 連絡先:このGoogleアカウントのメールアドレス
  5. 画面左側にあるパネルの「データアクセス>スコープの追加または削除」にて,以下の項目を選び,「更新」ボタンを押す.さらにその後,データアクセス画面にて「Save」ボタンを押し更新内容を保存する
    • https://www.googleapis.com/auth/drive
      • (Rcloneで)Google ドライブのすべてのファイルの参照,編集,作成,削除を可能にする
  6. 画面左側にあるパネルにて「対象>Add Users」を選び,このGoogleアカウントのメールアドレスを入力し,保存する
  7. 画面左側にあるパネルにて「概要>OAuthクライアントの作成」を選び,以下の項目を設定する.またここで,クライアントIDおよびクライアントシークレットが入手できる
    • アプリケーションの種類:デスクトップアプリ
    • 名前:任意の名前(筆者は,SecurityCameraRcloneとした)

 第4.2節で説明したGoogleクライアントIDおよびクライアントシークレットを作成し,第4.1節で説明したrclone configの設定項目を9個目まで完了すると,10個目の項目としてRcloneの認証を求められる.認証の操作には,Webブラウザが使用可能な別PCを用いて行う.筆者は Windows 11のPCを使用した.

  1. Windows PCにて,Rcloneの実行ファイルをダウンロードする[7]
  2. ダウンロードした.zipファイルを解凍し,.exeファイルを扱いやすい任意のディレクトリに移動する
    • 筆者は「Cドライブ>rcloneフォルダ」を作成し格納した
  3. Powershellを起動し,下記コマンドを入力する
cd C:\rclone # カレントディレクトリを,.exeファイルを格納したディレクトリへ移動する
./rclone.exe authorize "drive" "<your_command>" # rclone configの10個目の項目にて表示される「rclone authorize "drive" "<your_command>"」を実行する
  1. コマンドを実行したらブラウザが起動し,以下の操作を行う
    • Googleアカウントの選択
    • OAuthアプリへのアクセス許可
    • 認証完了
  2. 上記の操作を完了すると,PCのRcloneにて認証トークンが表示される.これを第4.1節の,rclone configにおける10個目の項目の解凍として入力する

 接続確認として,Raspberry Piのターミナルにて下記コマンドを入力する.

# 接続ができていれば,Google Drive上のフォルダが一覧表示される.何も格納していなければ,何も表示されないことが正常な結果である
rclone lsd MyGoogleDrive:

# ストレージの容量確認
rclone about MyGoogleDrive:

 接続確認できたら,コマンドの手動により,動画ファイルをRaspberry PiからGoogle Driveへアップロードできるか,アップロード確認を行う.

# 下記ディレクトリは一例である
rclone copy "/home/<user_name>/SecurityCamera/logMovi<yout_filename>.mp4" "MyGoogleDrive:SecurityCamera"

5. Raspberry Piからクラウドストレージへの自動アップロード

 Rcloneを用いたアップロードには,下記の2種類がある.筆者が開発する防犯カメラシステムでは,同期ではなくコピーを使用する.

  • rclone sync:Raspberry Piとクラウドストレージを同期し,同じ状態にする
  • rclone copy:Raspberry Piのファイルをクラウドストレージへコピーする

 Raspberry Piからクラウドストレージへの自動アップロードの流れは,下記の通りである.

  1. Raspberry Pi上にある新規動画ファイルの検出
  2. その動画ファイルが,防犯カメラからRaspberry Piへのファイル書き込み中(転送中)ではないかを確認
  3. Raspberry Piからクラウドストレージへ,rclone copyでアップロード
  4. アップロード途中ではないか,アップロード完了を示すマーカの確認
  5. 自動アップロードの完了

 新規動画ファイルの検出には,inotifyを用いる.下記コマンドでインストールを行う.

sudo apt update
sudo apt install inotify-tools

 新規動画ファイルの検出と,ファイルの書き込みが終了したことを確認するスクリプトを,作成する.まずは,下記コマンドでスクリプトファイルの作成と編集画面の起動を行う.スクリプトのファイル名は,例として「security-camera-monitor.sh」とした.

sudo nano /usr/local/bin/security-camera-monitor.sh

 スクリプトに以下の内容を書き込む.

#!/bin/bash

MOVIE_DIR="/home/<user_name>/SecurityCamera/logMovie" # 録画した動画ファイルがあるディレクトリ

# -m:監視を1回だけでなく継続実行
# -e close_write:「ファイル書込が行われその書き込みが終了した」というイベントを監視する
# --format '%w%f':検出時にディレクトリとファイル名の出力
exec /usr/bin/inotifywait \
    -m \
    -e close_write \
    --format '%w%f' \
    "$WATCH_DIR"

スクリプトの内容を編集し保存したら,下記コマンドでスクリプトへの実行権限の付与と,付与が正常に行われたか確認を行う.

sudo chmod +x /usr/local/bin/security-camera-monitor.sh # 実行権限の付与
ls -l /usr/local/bin/security-camera-monitor.sh # 付与されている権限の確認

# 「-rwxr-xr-x ... /usr/local/bin/security-camera-monitor.sh」となっていれば成功

 次に,このスクリプトに対するsystemdのサービスを作成し,ファイルシステムに変更(例:新たなファイルの書き込み)が生じ際に,自動的にスクリプトが実行されるようにする..serviceファイルのファイル名は,例として「security-camera-monitor.service」とした.

sudo nano /etc/systemd/system/security-camera-monitor.service

 .serviceファイルの内容は,下記の通りである.

[Unit]
Description=Security Camera FTP Upload Monitor
After=network.target vsftpd.service
Wants=vsftpd.service

[Service]
Type=simple
User=<user_name>
ExecStart=/usr/local/bin/security-camera-monitor.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

 .serviceファイルの編集と保存が完了したら,下記コマンドでsystemdへの登録を行う.

sudo systemctl daemon-reload # systemdに.serviceファイルの変更を反映させる
sudo systemctl enable --now security-camera-monitor.service # Raspberry Pi起動時の自動起動の登録と,今すぐサービス起動

 登録と今すぐのサービス起動を済ませたら,サービスの起動状態を,下記コマンドで確認する.

systemctl status security-camera-monitor.service

# Active: active (running)となっていたら成功

 下記コマンドは,作成したsecurity-camera-monitor.serviceの動作ログを,リアルタイムで監視するためのコマンドである.
 下記コマンドを実行したうえで,防犯カメラに録画させRaspberry Piへ動画ファイルをFTPで転送させる.設定が成功していた場合,その新規動画ファイルの検出と同時に,そのファイル名が出力される.

journalctl -u security-camera-monitor.service -f

 第5.1節で作成したファイル監視スクリプトsecurity-camera-monitor.shに対し,検出した新規動画ファイルのアップロードの処理を加筆する.

sudo nano /usr/local/bin/security-camera-monitor.sh
#!/bin/bash

MOVIE_DIR="/home/<user_name>/SecurityCamera/logMovie" # 録画した動画ファイルがあるディレクトリ
CLOUD_STORAGE="MyGoogleDrive:SecurityCamera" # 動画ファイルをアップロードするクラウドストレージのサービスとプロジェクト名

# リアルタイムのファイル監視
# -m:監視を1回だけでなく継続実行
# -e close_write:「ファイル書込が行われその書き込みが終了した」というイベントを監視する
# --format '%w%f':検出時にディレクトリとファイル名の出力
# 検出したファイル名(絶対パス)をパイプでWhile文に渡し,.mp4ファイルならアップロードする
/usr/bin/inotifywait \
    -m \
    -e close_write \
    --format '%w%f' \
    "$MOVIE_DIR" |
while IFS= read -r FILE
do
    if [[ "$FILE" == *.mp4 ]]; then
        echo "Detected: $FILE"
        echo "Uploading: $FILE"

        if /usr/bin/rclone copy "$FILE" "$CLOUD_STORAGE"; then
            echo "Upload completed: $FILE"
        else
            echo "Upload failed: $FILE"
        fi
    fi
done

 スクリプトの編集と保存が完了したら,下記コマンドにより,サービスを再起動し編集後の内容のスクリプトで,ファイル監視を始める.

sudo systemctl restart security-camera-monitor.service

 設定が成功していた場合,新規動画ファイルの検出と同時に,そのファイルがGoogle Driveにアップロードされる.

 第5.2節で加筆したファイル監視スクリプトsecurity-camera-monitor.shに対し,クラウドストレージにアップロード中ではないか/アップロードが完了したかを判別するためのマーカを作成し,そのマーカに応じてアップロード処理を行う処理を加筆する.

sudo cat /usr/local/bin/security-camera-monitor.sh
#!/bin/bash

MOVIE_DIR="/home/<user_name>/SecurityCamera/logMovie" # 録画した動画ファイルがあるディレクトリ
MARKER_DIR="/home/<user_name>/SecurityCamera/logMovie/uploaded" # アップロードが完了した動画ファイルのマーカを格納するディレクトリ
CLOUD_STORAGE="MyGoogleDrive:SecurityCamera" # 動画ファイルをアップロードするクラウドストレージのサービスとプロジェクト名

mkdir -p "$MARKER_DIR" # マーカを格納するディレクトリが存在していない場合は作成する

# 動画をアップロードする関数
upload_file()
{
    FILE="$1" # 引数として渡された動画ファイルの絶対パスを格納する
    FILENAME="$(basename "$FILE")" # 絶対パスからファイル名だけを抽出する
    MARKER="$MARKER_DIR/$FILENAME.uploaded"

# 対象動画ファイルに既にマーカが存在していたら,その旨を表示し,関数の処理を終了する
    if [ -f "$MARKER" ]; then
        echo "Already uploaded: $FILE"
        return 0
    else
        echo "Uploading: $FILE"
    fi

# 動画ファイルのアップロード処理
    if /usr/bin/rclone copy "$FILE" "$CLOUD_STORAGE"; then
        # アップロード(クラウドストレージへのコピー)が成功したら,マーカを作成
        touch "$MARKER"
        echo "Upload completed: $FILE"
        echo "Upload marker created: $MARKER"
    else
        echo "Upload failed: $FILE"
        return 1
    fi
}

# リアルタイムのファイル監視
# -m:監視を1回だけでなく継続実行
# -e close_write:「ファイル書込が行われその書き込みが終了した」というイベントを監視する
# --format '%w%f':検出時にディレクトリとファイル名の出力
# 検出したファイル名(絶対パス)をパイプでWhile文に渡し,.mp4ファイルならアップロードする関数を実行する
/usr/bin/inotifywait \
    -m \
    -e close_write \
    --format '%w%f' \
    "$MOVIE_DIR" |
while IFS= read -r FILE
do
    if [[ "$FILE" == *.mp4 ]]; then
        echo "Detected: $FILE"
        upload_file "$FILE"
    fi
done

 スクリプトの編集と保存が完了したら,下記コマンドにより,サービスを再起動し編集後の内容のスクリプトで,ファイル監視を始める.

sudo systemctl restart security-camera-monitor.service

 設定が成功していた場合,新規動画ファイルがGoogle Driveにアップロードされ,それが完了した際に,ディレクトリ./logMovie/uploadedに,その動画ファイルのアップロードが完了したことを表すマーカ(空のファイル)を作成される.

参考文献

  1. 防犯カメラシステムの自作②~Raspberry PiへのPoE HATのセットアップ~, word in the world, https://word-in-the-world.com/2026/08/02/securitycamera-02/, (参照2026-8-12).
  2. How to Set up FTP for Reolink Products, Reolink, https://support.reolink.com/articles/360020081034-How-to-Set-up-FTP-for-Reolink-Products/, (参照2026-8-12).
  3. 防犯カメラシステムの自作③~VPNを用いたリアルタイム映像視聴の環境構築~, word in the world, https://word-in-the-world.com/2026/08/08/securitycamera-03/, (参照2026-8-12).
  4. 防犯カメラシステムの自作①~Reolink社製防犯カメラ「RLC-1212A」の挙動確認~, word in the world, https://word-in-the-world.com/2026/07/25/securitycamera-01/, (参照2026-8-12).
  5. Google Drive – Making your own client_id, Nick Craig-Wood, https://rclone.org/drive/#making-your-own-client-id, (参照2026-8-12).
  6. Google Cloud console, Google, https://console.cloud.google.com/, (参照2026-8-12).
  7. Rclone download, Nick Craig-Wood, https://rclone.org/downloads/?utm_source=chatgpt.com, (参照2026-8-12).