6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ssh(sftp)サーバーをLaravelのストレージとして利用する

Last updated at Posted at 2019-07-13

はじめに

Laravelのファイルストレージで外部のサーバーのファイルを取り扱いたい場面に遭遇して解決方法が見つかったのでメモとして残します。

ファイルストレージは標準ではローカル ディスクとAmazon S3、Rackspace、ftp用のアダプタが組み込まれています。調べてみるとFlysystemというライブラリの機能で実現されていて、アダプタを追加すれば様々なデバイスをストレージとして利用できる仕組みになっています。

Laravelには入っていませんがFlysystemには標準でsftpのアダプタが用意されています。これを利用すると任意のsshサーバーをsftp経由でLaravelのストレージとして利用可能です。

手順

  1. composer で sftp アダプタのモジュールをインストール

    composer require league/flysystem-sftp
    
  2. サービスプロバイダでアダプタを追加する。

    <?php
    
    namespace App\Providers;
    
    use Storage;
    use League\Flysystem\Filesystem;
    use League\Flysystem\Sftp\SftpAdapter;
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        ...
        public function boot()
        {
            /**
              * flysystem に sftp 用のアダプタを追加する
              * @see https://flysystem.thephpleague.com/docs/adapter/sftp/
              * @see https://readouble.com/laravel/5.5/ja/filesystem.html#custom-filesystems
              */
            Storage::extend('sftp', function ($app, $config) {
                return new Filesystem(new SftpAdapter($config));
            });
        }
    }
    

    サービスプロバイダの詳細は readouble のドキュメントを参照してください。ちなみに AppServiceProvider最初から存在し自由に記述していいサービスプロバイダとなっています。

  3. config/filesystems.php にディスクを追加する。

    <?php
    
    return [
        ...
         /**
          * sftp アダプタで ssh サーバーを disk として登録する
          *
          * @see https://flysystem.thephpleague.com/docs/adapter/sftp/
          */
        'rpx' => [
            'driver' => 'sftp',
            'host' => '192.168.10.11',
            'port' => 22,
            'username' => 'vagrant',
            // 'password' => 'vagrant',
            'privateKey' => '/home/vagrant/.ssh/id_rsa',
            'root' => 'rpx',
            'timeout' => 10,
        ],
    ];
    

    接続先サーバーには対応する公開鍵を登録する。

  4. ストレージで利用する

    Storage::disk('rpx')->put('./a/test.txt', "hello rpx\n");
    
6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?