LoginSignup
15
8

More than 3 years have passed since last update.

Docker 環境に Sftp コンテナを構築して Laravel と連携する

Last updated at Posted at 2019-12-09

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

できました。

詳しい構築方法は過去記事を参考ください。

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"

差分のコード

参考

15
8
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
15
8