Virtualbox/Vagrant で Ubuntu22.04 + Laravel 9.x 環境構築

Date:

Share post:

少し前にLaravel 9.xを「Laravel Sail」(Dockerベースの開発環境構築ツール)を使用して動かしてみたことがありましたが、諸般の事情により、やはりVirtualbox/Vagrant環境でも動作させたくなりました。

調べてみるとLaravel 9.xの動作環境として必要なPHP8を標準的にインストール可能なUbuntu22.04(Jammy Jellyfish)のVagrant boxが既に提供されているようなので、改めてこれらを使用してLaravel 9.xの動作環境を構築してみたいと思います。

なお、基本的な流れは以前書いた「UbuntuにLaravel環境構築」と同様なので、ここでは特筆すべき点にのみ触れていきます。

Ubuntu22.04環境構築

Ubuntu22.04のVagrant box名は「ubuntu/jammy64」なので、適当なフォルダ配下で以下のように実行します。

vagrant init ubuntu/jammy64 

Vagrantfileの内容は以下のようにしました。

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/jammy64"

  config.vm.network "private_network", ip: "192.168.56.30"

  config.vm.provider "virtualbox" do |vb|
    vb.name = "workspace_ubuntu_jammy"
    vb.memory = "2048"
  end
end

ポイントはprivate_networkに指定したIPアドレスが「192.168.56.30」になっている点です。
以前は「192.168.33.x」のようなアドレスをよく使っていたのですが。

話が前後してしまいますが、そもそも「ubuntu/jammy64」をインストールし、起動しようとしたところ、以下のようなエラーが発生しました。

==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...

本件に関してはネットで調べると公開鍵と秘密鍵の不一致であるとか、「/home/vagrant/.ssh」や「/home/vagrant/.ssh/authorized_keys」のパーミッションが不適切であるなどの情報が見つかったのですが、いずれの対処方法でも解決せず、結局Virtualboxとvagrantを最新のバージョンにアップグレードすることでなんとか解決できました。

ただ、上記結果として従来愛用していた「192.168.33.x」のようなprivate_networkを指定すると、

The IP address configured for the host-only network is not within the
allowed ranges. Please update the address used to be within the allowed
ranges and run the command again.

  Address: 192.168.33.30
  Ranges: 192.168.56.0/21

なるエラーが出るようになりました。

どうも最近のバージョンではprivate_networkには「192.168.56.0/21」の範囲のIPアドレスしか指定できなくなったようです。
なぜこのような変更が行われたかは謎ですが、とりあえずは上記指示に従って問題ないアドレスを選択した結果が先のVagrantfileであったと言うことです。

上記のように若干の問題(対処には相応に時間を要しましたが…)を解決することで、Ubuntu22.04のboxが起動できるようになりました。

Virtualmin環境構築

次にVirtualmin環境を構築します。

いつも通り以下の操作でインストール用のシェルファイルを取得します。

curl -O http://software.virtualmin.com/gpl/scripts/install.sh

しかし、このファイルでは実はUbuntu22.04へのVirtualminのインストールはできません。

同ファイルの中身を見てみると、先頭の方に以下のような記述があります。

#!/bin/sh
# shellcheck disable=SC2059 disable=SC2181 disable=SC2154
# virtualmin-install.sh
# Copyright 2005-2019 Virtualmin, Inc.
# Simple script to grab the virtualmin-release and virtualmin-base packages.
# The packages do most of the hard work, so this script can be small-ish and
# lazy-ish.

# WARNING: Anything not listed in the currently supported systems list is not
# going to work, despite the fact that you might see code that detects your
# OS and acts on it.  If it isn't in the list, the code is not complete and
# will not work.  More importantly, the repos that this script uses do not
# exist, if the OS isn't listed.  Don't even bother trying it.
#
# A manual install might work for you though.
# See here: https://www.virtualmin.com/documentation/installation/manual/

# License and version
SERIAL=GPL
KEY=GPL
VER=6.2.2
vm_version=6

# Currently supported systems:
supported="    CentOS/RHEL Linux 7, and 8 on x86_64
    Debian 9, and 10 on i386 and amd64
    Ubuntu 16.04 LTS, 18.04 LTS, and 20.04 LTS on i386 and amd64"

Ubuntuに関しては20.04までしか対応していないようです。

この点もネットで色々調べてみるとベータ版であればインストール可能なようです。
と言うことで、ベータ版用のインストールシェルを取得してきて実行します。

curl -O https://software.virtualmin.com/gpl/scripts/vm7-beta-install.sh
sh vm7-beta-install.sh

以降の操作は従来のUbuntu20.04での内容と同等です。

Laravel環境構築

新規に9.x環境を構築するだけであれば特に問題はありません。
従来と同様に普通にLaravelをインストールすれば自動的に最新の9.xがインストールされます。

composer create-project laravel/laravel <インストール先>

ただ、旧バージョンで動作していたプロダクトを9.x環境で動作できるようにしようと思うと少々面倒です。
この辺はネットに多くの情報があるので細かくは触れませんが、以前のLTSである6.xからの移行である場合、以下のような流れになります。

6.x → 7.x

一部ファイルの修正のみ。
比較的簡単に移行できます。

7.x → 8.x

factoryがクラス形式で書かれるようになりました。
従来のfactoryを使用できるようにするパッケージもあるようですが、クラス形式の方が使い勝手が良さそうなので、頑張って書き換えるのが吉かと。
factoryファイル本体のみならず、呼び出し方も変更が必要なので、seederやテストケースなどの大量のファイルで修正が必要に。

8.x → 9.x

ここも基本的には一部ファイルの修正のみです。
ただし、ストレージとしてS3を使用していた場合は要注意です。
8.xまではパッケージとして「league/flysystem-aws-s3-v3」を使用すると共に、パフォーマンス向上のために「league/flysystem-cached-adapter」なるパッケージをインストールするような記述があります(あくまで「追加インストールすることもできます」と言う玉虫色な表現ですが…)。

しかし、9.xでは上記「league/flysystem-cached-adapter」に関する記述がなくなります。
「league/flysystem-aws-s3-v3」のバージョンが以前の「^1.0」から「^3.0」に変更されていますので、その辺も関係するかと思いますが、いずれにしても「league/flysystem-cached-adapter」が存在すると「composer update」がエラーになります。
とりあえずは当該パッケージを削除して「composer update」が成功するようになりましたが、その影響に関しては未確認です。

所感

とりあえずVirtualbox/Vagrant上のUbuntu22.04+Laravel9.xでプロダクトを開発できるようになりました。
従来プロダクト(6.xで作成)に関しても前述のような移行作業を経て、phpunitによるテストが全て正常な結果が得られるようになっています(一応カバレッジ100%)。
ただし前述したように問題のあったS3(ストレージ)関連の動作はローカルな開発環境では通常の内蔵ディスクにアクセスするようにしてあるので、実際にS3を絡めて動作させた際に問題が発生する可能性はあります。

この辺、早期にS3を使用できるステージング環境をUbuntu22.04+Laravel9.x化して確認したいのですが、実サーバの環境構築を何度も行うのは面倒なので、以降はUbuntu22.04対応のVirtualminがリリースされるのを待って実施したいと思っています。

Related articles

ローカルSMTPメールサーバ(Mailpit)をE...

ローカル環境でのメール送受信テストにつ...

EC-CUBE 4系のプラグイン開発について その...

今回は、ちょっとハマったプラグインのイ...

EC-CUBE 4系のプラグイン開発について その...

前回のブログの最後でちょっと書いたので...

EC-CUBE 4系のプラグイン開発について その...

前回、プラグインを一旦有効化させて管理...