RaspberryPi上で排他制御付きのFTPサーバを動かす(ProFTPD)

1 min read読了の目安(約1600字

TL;DR

ProFTPDを使え

  • インストール
sudo apt-get install proftpd-basic
  • 設定
sudo vi /etc/proftpd/proftpd.conf
HiddenStores on

やりたいこと

  • IoT機器からラズパイへのデータ連携にftpを使いたい。
  • 転送途中にデータを読んだり、書いたり、移動したり、消したりできると困るので、何らかの形で排他制御をいれたい。

そもそも「FTPでアプリ間通信を実装するな」という話

「ftp 排他制御」でググると上位にくる記事です。

https://anopara.net/2013/12/16/ftpでアプリ間通信を実装するな馬鹿/
実際その通りだと思います。API作ってhttpで通信したほうがよいですし、IoT機器だったらMQTTで実装すればいいです。
とはいっても、なんだかんだでFTPが昔からあるし、世の中の知見も多いので、手軽に作りたい時の選択肢として出てくるのが現実です。複数の開発会社が関わってくるときとかは特に。

Vsftpdの排他制御

  • ラズパイで使われるftpサーバーではVsftpdが最もメジャーだと思います
  • Vsftpdには lock_upload_files というオプションがあり、これをONにすると排他制御してくれそうに見えます
  • しかし、実際にはftpで転送中にラズパイ側のアプリケーションからファイルをオープンできますし、なんなら移動も削除もできますので、求めている要件を満たしているかと言われるとNoです

よくやるFTPの排他制御処理

FTPの排他制御として、よく使われる方法として下記の方法があります。

  1. ファイルを別名でftpで転送
  2. 転送後にRenameで正しい名前に変更
  3. ラズパイ側のアプリでは正しい名前のファイルのみをアクセスする

この方法は、完璧な排他制御ではないですが、落とし所として実用できる方法だと思います。
しかし、普通にやるとサーバー側だけでは実現出来ず、クライアント側に「別名で転送した後にRename」という処理が必要になります。自社で全部やってるなら良いですが、、、という感じです。

そこでProFTPDを使う

ようやく本題です。
ProFTPDなら前章で書いた処理をサーバー側で自動でやってくれる機能があります!!

http://www.proftpd.org

ProFTPDのインストール

apt-getでインストールできます。

apt-get update
sudo apt-get install proftpd-basic

排他制御の設定

proftpdの設定ファイルは /etc/proftpd/proftpd.conf です。
このファイルを開いて HiddenStores on という行を追加すれば、OKです。

sudo vi /etc/proftpd/proftpd.conf
# 送信中はファイル別名にRenameする[.in.{filename}.]
HiddenStores on

詳細はマニュアルを読みましょう。

http://proftpd.org/docs/directives/linked/by-name.html

以上で、最低限の排他制御付きのftpサーバーをラズパイ上に構築できました。