さくらサーバー – Laravel~デプロイ

概要

ローカルで開発したLaravelのプロジェクトを、さくらのレンタルサーバーにデプロイした時の記録。

  • ローカルで
    • CentOS7~Laravel~MySQLで開発
    • 必要に応じてデータベースのダンプファイルも含める
    • GitHubのリポジトリーに登録
  • さくらサーバーにssh接続
    • 秘密鍵と公開鍵をさくらサーバーにコピー
    • GitHubのリポジトリーをclone
    • 必要に応じてデータベースのダンプファイルから復帰
    • Laravelのpublicディレクトリーのシンボリックリンクを公開ディレクトリーに作成

躓いたのは以下の点

  • ssh鍵ファイルのパーミッション設定
  • login/registerのパス設定

Laravelを直接さくらサーバー上でインストールする手順はこちら

ローカルでの開発

プロジェクトの開発

通常の方法によって、ローカル環境でLaravelプロジェクトを開発。このとき、さくらのサーバー上で利用可能なPHP/Laravel/MySQLのバージョンを確認しておく。

データベースのダンプ

開発中にデータベースの実データを扱っている場合は、データベースの内容をダンプファイルに出力しておく

今回はリポジトリーのディレクトリーにダンプファイルを保存して、GitHub経由で共有した。

GitHubへのpush

ローカルの開発結果をコミットしてGitHubへpush。以下の手順によった。

  1. git add -f .venderディレクトリーなども含めてステージング
  2. git commit -mでコミット
  3. git pushでGitHubのリポジトリーに反映

ローカルでの状況は以下のとおり。

  • プロジェクトの配置→.../laravel/PROJECT/
  • ローカルサーバー→PROJECT/下でサーバーを起動
  • ローカルでのアクセス→localhost:3000/
  • GitHubのリポジトリー→laravelディレクトリー以下

さくらサーバーでのデプロイ

ssh接続の準備

GitHubとSSHでやり取りする準備。

  •  秘密鍵(id_rsa)と公開鍵(id_rsa.pub)をさくらサーバーにアップロード
    • アップロード先は~/.ssh/ディレクトリー
    • .ssh/ディレクトリは既に存在していて、パーミッションは700
  • アップロードした2つの鍵ファイルのパーミッションを600に変更する必要がある

ssh鍵でのエラー

当初、鍵ファイルのパーミッションが他者から読み取り可能のままになっていて接続できなかった。

2つの鍵のパーミッションを600に変更して解決。

プロジェクトの配置計画

さくらサーバーでの配置計画は以下のようにした。

  • プロジェクト本体は公開領域以外に置く
  • 公開領域にプロジェクトのpublicディレクトリーのシンボリックリンクを置く
  • シンボリックリンクの名前をプロジェクト名にする

これによって、”サイト名/プロジェクト名“というURLをアプリケーションのメインページとすることができる。

プロジェクトのダウンロード

GitHubのリポジトリーをさくらサーバーのユーザーホームディレクトリー下でclone。

故人開発であり、git pull/pushにするとサーバー側での.envの編集などの本質でない操作などが反映されてしまうので、ローカル側で編集したプロジェクトをさくらサーバー上でcloneするのがよいと考えた。

.envファイルの編集

さくら側のMySQLに接続するため、.envファイルの以下を変更。

  • MYSQL_HOSTはさくらのMySQLホスト名
    • mysql**.ユーザー名.sakura.ne.jpなど
  • DB_NAMEはさくら上でのDB名
    • ユーザー名_任意のDB名など
  • USER/PASSはMySQLに接続するためのユーザー名とパスワード

publicディレクトリーのシンボリックリンク

非公開に置いたプロジェクトのうち、公開対象のpublicディレクトリーのシンボリックリンクを公開領域(~/www)に作成する。リンク名はプロジェクト名と同じにした。

ログイン・サインアップできない

Laravelでの症状

当初プロジェクトをさくらサーバーに配置したとき、以下のような状況になった。

  • 非認証時のメインページや説明ページなどは表示・遷移できる
  • ログインやサインアップのフォームページも表示される
  • ログインページで入力後にボタンを押すと、WordPressのログイン画面に遷移してしまう
  • サインアップページで入力後にボタンを押すとWordPressの「ページが見つかりませんでした」表示

元々ドメイン直下ではWordPressが実行されるようになっていて、サブディレクトリーでLaravelを動かそうとしてこのような状況になった。

URL指定による同じ状況の再現

LoginController/RegisterControllerredirectToを変えたり、ルーティングファイルやindex.phpを触ったりしてみたが、状況は変わらず。その中で、以下のことに気づく。

  • URLで直接http://DOMAIN.com/loginを指定すると、WordPressのログイン画面に遷移する
  • URLで直接http://DOMAIN.com/registerを指定すると、WordPressの「ページが見つかりませんでした」表示

原因特定

Laravelではいずれもボタンを押した後に上と同じ状況になることに気づき、login.blade.phpregister.blade.phpを見てみると、POSTを発しているform要素のaction"/login""/register"を直に書いていた。

これらをルート名で"{{ route('login') }}""{{  route('register') }}"に変更したところ、正常にログインとサインアップができるようになった。これらのルート名は、Auth::routes()で設定自動的に設定されるので、artisanで確認。

考えてみれば至極当然の挙動で、ローカルと本番で配置形態が変わる場合に備えて徹底的にroute()を使うのがよさそう。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です