web上でファイルマネージャを用いてファイルをクラウド管理する Filestash + docker compose

# 導入
様々なOSで仕事や学校のためにファイルをセキュアに保存、共有したいが、SFTPをドライブとして使うには標準対応しているOSが少なすぎる。また、Googleドライブなどのクラウドストレージサービスは速度が遅いことがあるため、実用上不満が多い。
# 解決方法
[Filestash](https://www.filestash.app/)と呼ばれるOSSをdockerにインストールして使う。Filestashは、FTP、SFTP、WebDAV、S3、SMB、Git、Dropbox、Google Driveなど、多様なストレージプロトコルに対応したオープンソースのWEB上で操作できるファイルマネージャーである。
# 環境
今回はwindowsを使っているが、通常のx86 osや変わりなく動作が可能だろう。ARM系で動作させる場合はdocker-composeに工夫が必要である。今回の作業はすべて[VSCode](https://code.visualstudio.com/)で行うが特別な拡張機能などは使用しないため普通のテキストエディタでも作業可能だ。その際文字コードはUTF-8を推奨する。

|  | version |
|:-:|:-:|
|  OS |  windows10 |
|  Docker Desktop | 4.40.0 (187762) |

# 仕組み
dockerを用いてfilestashのコンテナとsftpサーバーのatmoz/sftpコンテナを作成する
filestashコンテナは8334番ポートで動作させる。
atmoz/sftpコンテナは2222番ポートで動作させる。


![1000006977.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/dda8cdf3-06ca-4828-a382-451a90112f87.png)


今回はFilestashの使用例としてhttpを使用するが、実際に使うとなったらtailscaleやSSLで暗号化して通信することを推奨する。
tailscale+sftp+filestash on sftp Serverの筆者が実際に使っている構成はまたいつか書き込みたいと思っている。

# Dockerコンテナを起動
dockerを使うにあたってdocker-composeというものを使う。dockerコンテナは本来作るたびにイメージやストレージの細かい設定が必要だが、それを自動で行うものである。docker-composeを使うためにはdocker-compose.yamlと呼ばれるファイルに記述する。
dockerでは2つのコンテナを立てるがまとめてdocker-compose.yamlに記述する。

1. まず作業用にデスクトップ等自分の好きな場所にfilestashフォルダを作るその中にdocker-compose.yamlというファイルを作成する。
2. docker-compose.yamlに以下の内容を書き込む
```yaml:docker-compose.yaml
version: '3.8'

services:
  sftp:
    image: atmoz/sftp
    ports:
      - "2222:22"
    volumes:
      - ./data/alice:/home/userA/upload
      - ./data/bob:/home/userB/upload
    command: |
      userA:abcd:1001
      userB:1234:1002
    networks:
      - filenet

  filestash:
    image: machines/filestash
    container_name: filestash
    ports:
      - "8334:8334"
    volumes:
      - ./app:/app/data/state
    networks:
      - filenet
    depends_on:
      - sftp

networks:
  filenet:
    driver: bridge
```
**ユーザー名とパスワードの設定**
```
    volumes:
      - ./data/alice:/home/userA/upload
      - ./data/bob:/home/userB/upload
    command: |
      userA:abcd:1001
      userB:1234:1002
```
の部分のuserA,userBをユーザー名に置き換えてください。
またabcd,1234をパスワードに置き換えてください。

**ファイルの場所について**
```
volumes:
      - ./data/alice:/home/userA/upload
      - ./data/bob:/home/userB/upload

volumes:
      - ./app:/app/data/state
```
の部分でfilestashの設定ファイルとアップロードされたデータなどを./appと./dataで共有している

# 起動！
docker-compose.yamlがあるディレクトリでターミナルを開いて
```
docker compose up -d
```
を実行すると起動します。
しばらくしたあとに処理が終わってフォルダが以下のように増えていることを確認してください。
![2025-04-11_22h17_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/7bf220d6-1773-4961-b6e4-6a35345f71d5.png)
増えていれば正常に起動ができています。

# 接続確認
起動が完了したら[localhost:8334](http://localhost:8334/)にアクセスしてください

最初に管理者用パスワードを設定します
![2025-04-12_16h11_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/2a7525ec-43f1-41bb-8534-90dd37f353dd.png)
ここはお好みで
![2025-04-12_16h12_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/6e88ce89-db17-40c5-a648-45c16b7bfdaf.png)
Backendを押す
![2025-04-12_16h12_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/8a5805c8-94c9-4eeb-bcf3-6ba5ceef4ffe.png)
今回はSFTP以外使わないので❌を押す
![2025-04-12_16h12_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/e77238b1-5c0f-40e8-a2ba-a7881a846cd9.png)

認証方法にはPASSTHROUGHを使う
![2025-04-12_16h12_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/7151d489-ae00-4b15-ab20-454e30a01fbc.png)

username_and_passwordを選択
![2025-04-12_16h13_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/8d41d8a7-f261-4e3c-8c2d-f95804be2070.png)

画像と同じように設定する
![2025-04-12_16h14_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/070ef9a6-1b83-4641-a930-2a73adb7ea73.png)

これで設定完了
もう一度[localhost:8334](http://localhost:8334/)にアクセスすると今度は管理ページではなくSFTPログインページに飛ぶ
docker-compose内で設定したユーザー名とパスワードでログインする

![2025-04-12_16h15_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/73f007d3-b878-46ea-aa5c-2c0e03cd5236.png)

これで完了となる
ドラッグ&ドロップなどでアップロードもできる
![2025-04-12_16h15_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058165/ab195179-691e-446f-b538-2ac88fc10a66.png)


# 停止方法
停止するには起動したときと同じディレクトリで
```
docker compose down
```
を実行するだけ
設定ファイルやアップロードされたファイルは消えないのでそこを初期化したい場合はfilestashフォルダのappとdataを消す。