はじめに
FTP サーバーと通信するようなアプリを書かなければいけなくなったけど、都合よく使える FTP サーバーが自分の管理下になかったので、どうにかモノグサして FTP サーバーを開発環境に用意しようとした結果です。
前提条件
開発マシンに入っているソフトウェアについて
- Windows 11
- Visual Studio 2022
- Docker Desktop
今回は docker-Compose を使うので、Docker が使える環境は必須です。
docker-compose さえ使えればいいはずなので、Windows 環境以外でもいけるはず。
FTP サーバーについて
Pure FTPd をコンテナ化したものを提供している方がいらっしゃったので、ありがたく拝借します。
(オマケ)クライアントアプリに組み込んだライブラリ
FluentFTP を今回は使いました。
.NET Core 8 で書いたアプリに Nuget で組み込んでサクッと FTP クライアントとして使えるので結構良かった。
作業手順
docker-compose.yml 作成
普通に Docker コマンドを叩いても立ち上げられるのですが、パスワードとかを yml ファイルで保持したかったので docker-compose.yml をサクッと書きます。
version: '3'
services:
ftpd_server:
#イメージの指定とコンテナ名指定
image: stilliard/pure-ftpd
container_name: pure-ftpd
#PASV用に30000-30009を開く必要があるらしい
ports:
- "21:21"
- "30000-30009:30000-30009"
#docker-compose.yml の下に出来る data フォルダが
#FTP サーバーのログインユーザーのホームディレクトリとしてマウントされる設定
#あとパスワードの保存先もローカルフォルダにマッピング
volumes:
- "./data:/home/${FTPUSER}/"
- "./passwd:/etc/pure-ftpd/passwd"
#ホスト名、ユーザー名、パスワード、ホームディレクトリの設定
#ユーザー名とパスワードは環境設定ファイルに持つようにする。
environment:
PUBLICHOST: "localhost"
FTP_USER_NAME: ${FTPUSER}
FTP_USER_PASS: ${FTPPASS}
FTP_USER_HOME: /home/${FTPUSER}
restart: always
環境変数の設定
docker-Compose では .env という名前のファイルに入っている値を環境変数のデフォルト値として自動で読み込む設定になっているようなのでこれを使います。→ 参考ドキュメント
.env に書いた内容は以下のような感じ
FTPUSER=ここにFTPユーザー名を指定
FTPPASS=ここにFTPパスワードを指定
FTP サーバーを立ち上げる
あとは docker-compose にお任せ。
docker-compose up
もしくはバックグラウンドで起動させたかったら -d
オプションをつけると良い感じ。
成果物
ここまでの手順を完了させると、以下の設定でアクセス可能な FTP サーバーが立ち上がります。
- ホスト名 : localhost
- ポート : 21
- ユーザー名 : .env で指定したユーザー名
- パスワード : .env で指定したパスワード
あとは煮るなり焼くなりご自由に。
注意点
今回の設定だけだと、FTP over TLS ではなく平文でやり取りされるフツーの FTP サーバーになります。
Pure FTPd の設定で FTP over TLS も設定できるっぽいのですけど、構成したらなぜかクライアントからコネクションを張れなくなり、そこのデバッグに時間を割くのがもったいなかったので、開発環境として localhost からアクセスするだけならこれでいいかなと思いつつ、FTP over TLS の採用は一旦断念しました。
Public Internet に面した環境に置く際には、そこらへん気を付けないと危なそうなので、ご注意ください。(そして、FTP over TLS うまくいった人がいたら、うまくいった手順教えてほしい…)
まとめ
docker-compose 一発で開発環境としての FTP サーバーを作れるのは割と便利かも?
なお、今回動けばいいやの最低限でモノグサしましたので、細かいデバッグ的なことはやってません。何か間違ってるとことかあったらこっそり教えていただけたら有難いです。