Laravel2 Advent Calendar 2019 - Qiita の 9日目 の記事です。
サンプルリポジトリ
前準備
まずはLaravelの環境を用意します。
$ git clone git@github.com:ucan-lab/docker-laravel.git laravel6-sftp
$ cd laravel6-sftp
$ make create-project
できました。
詳しい構築方法は過去記事を参考ください。
- 【忙しい人向け】カップ麺より早く作るDockerでLaravel開発環境構築
- Laravelの開発環境をDockerを使って構築する
- 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン
Sftpコンテナを作成する
ベースコンテナは atmoz/sftp 使用します。
対向先のディレクトリを作成する
$ mkdir sftp-store
$ echo "hello" > sftp-store/world.txt
認証用の公開鍵、秘密鍵を作成する
$ mkdir .ssh
$ ssh-keygen -t rsa -b 4096 -N "" -f .ssh/ssh_host_rsa_key
Git管理対象外設定をする
.gitignore
/.ssh
/sftp-store
鍵ファイルやSftp内のデータはGit管理したくないため。
docker-compose.yml
services:
app:
volumes:
- ./.ssh/ssh_host_rsa_key:/root/.ssh/ssh_host_rsa_key
sftp-server:
image: atmoz/sftp
volumes:
- ./sftp-store:/home/foo/share
- ./.ssh/ssh_host_rsa_key.pub:/home/foo/.ssh/keys/ssh_host_rsa_key.pub
command: foo::1001
docker-compose.yml
の差分を抜き出してます。
sftp-server
に公開鍵を配置して、共有ディレクトリ(/home/foo/share
)にローカルディレクリ(./sftp-store
) をマウントします。
Sftp コンテナを構築
$ docker-compose down
$ docker-compose up -d --build
Laravel で Sftp 設定を行う
$ docker-compose exec app ash
app
コンテナ内で実行します。
Sftpライブラリ導入
$ composer require league/flysystem-sftp
SftpServiceProvider を作成する
$ php artisan make:provider SftpServiceProvider
app/Providers/SftpServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use League\Flysystem\Sftp\SftpAdapter;
class SftpServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
Storage::extend('sftp', function ($app, $config) {
return new Filesystem(new SftpAdapter($config));
});
}
}
Filesystem に sftp 用のアダプタを追加します。
作成した SftpServiceProvider を登録する
config/app.php
'providers' => [
// ...
App\Providers\SftpServiceProvider::class,
],
Sftp ディスク設定を追加する
config/filesystems.php
'disks' => [
'sftp-disk' => [
'driver' => 'sftp',
'host' => 'sftp-server',
'port' => 22,
'username' => 'foo',
'privateKey' => '/root/.ssh/ssh_host_rsa_key',
'root' => 'share',
'timeout' => 10,
'directoryPerm' => 0755,
],
],
お試し
$ php artisan tinker
>>> Storage::disk('sftp-disk')->get('world.txt');
=> "hello\n"