Google Compute Engine(GCE)にLaravel10をデプロイする

いつもEC２を使っているエンジニアなのですが、GCPを最近使う機会が増え、今回はLaravelをGCEにデプロイすることとなりました。

色々と忘れてしまうので備忘録として残しておきたいと思います。


## Compute Engineを作成する

コンソールからCompute Engineを作成しましょう。ここは特に細かく話さないのでスルーしようかと思います。

作成後はgcloudコマンドでSSH接続します。

```zsh
gcloud compute ssh --project [プロジェクト名] --zone [ゾーン名] [インスタンス名]
```

## 時刻を日本時間に変更する。

```zsh
timedatectl set-timezone Asia/Tokyo
date
```

## PHPのインストール

Laravel10はPHP8.1以上が必要なのですが、ローカルでの開発ではphp8.2のDockerイメージを使っていたので、今回はPHP8.2をインストールしていきたいと思います。

```zsh
# アップデート
sudo apt update
sudo apt -y upgrade

# PHPパッケージのaptリポジトリをDebianサーバに追加する
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
sudo apt update

# インストール
sudo apt-get install php8.2 php-pear
sudo apt-get install libapache2-mod-php8.2 php8.2-xml php8.2-gd php8.2-opcache php8.2-mbstring php8.2-curl zip unzip php8.2-zip php8.2-mysql

# バージョン確認
php -v
```

## composerの導入

[公式サイト](https://getcomposer.org/download/)の指示通り導入する。

```zsh
# ハッシュ値が変わるので詳細コマンドは公式サイトを確認ください
# 今回は2.5.7を導入
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

# /binに移動
sudo mv composer.phar /bin/composer
composer --version

```

## Gitの導入

```zsh
sudo apt-get -y install git
git --version
```

## Apacheの導入

```zsh
sudo apt-get -y install apache2
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo systemctl restart apache2
```

この状態でインスタンスの外部IPアドレスを叩いてApacheのデフォルトページが表示されるか確認しましょう。この時HTTPSではなくHTTP接続して確認してください。

ちなみにコンソールのVMインスタンスの一覧から外部IPのリンクを押すとHTTPSアクセスして「このサイトにアクセスできません」と表示されてしまう罠があるので気をつけましょう。

HTTPアクセスしても表示できない場合、VMインスタンスのVPCのファイアーウォール設定で0.0.0.0/0からの80番ポートを許可するルールがない可能性があるので、アクセスできない場合は確認してみてください。


## Laravelの導入

```zsh
# var/www/html内の所持者を変更
sudo chown -R ユーザー名 /var/www/html

# Gitからクローンする
cd /var/www/html
git clone https://github.com/ユーザー名/リポジトリ名.git

# 権限周り
sudo chgrp -R www-data /var/www/html/プロジェクト名
sudo chmod -R 775 /var/www/html/プロジェクト名/storage

# .envの作成
vi .env

# その他色々
php artisan key:generate
composer install
php artisan migrate

```

## Apacheのドキュメントルート設定

```zsh
cd /etc/apache2/sites-available
sudo vi 任意の名前.conf
```

新しく作成したconfファイルの中身は下記

```:任意の名前.conf
<VirtualHost *:80>
    ServerName 使用するサーバー名(なければプロジェクト名).com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/プロジェクト名/public

    <Directory /var/www/html/プロジェクト名>
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

適用

```zsh
sudo a2dissite 000-default.conf
sudo a2ensite 任意の名前.conf
sudo a2enmod rewrite
sudo service apache2 restart
```

外部IPアドレスに接続して表示されれば完了です！！


## 追加の設定その① SSL化

Let's EncryptでSSL化します。

```
sudo apt install certbot python3-certbot-apache
sudo certbot --apache

```

## 参考記事

https://pandadannikki.blogspot.com/2021/01/gcpserver007.html

https://qiita.com/ac2393921/items/0a9016fcf47ee7a41a2c

https://qiita.com/cress_cc/items/f8d8128743faa598bb92