EC-CUBEをAmazon Linux 2023にインストールする

# 概要

AWS上に構築することはあまりないかもしれませんが、EC-CUBEをAmazon Linux 2023にインストールしたので、ここに個人的な手順や設定を示しておきます。

## バージョン情報等

- Amazon Linux 2023 AMI
- PostgreSQL 15.5
- Apache/2.4.58 (Amazon Linux)
- EC-CUBE 4.2.3

その他設定

- 検証や開発向け
- `/var/www/html/ec-cube/`以下にインストール
- PostgreSQLはローカルからはパスワード認証で接続
  - ユーザ名: `postgres`
  - パスワード: `postgres`
  - データベース名: `eccube`

## 　手順

### インスタンスの作成

AWSコンソールにログインし、EC2インスタンスを作成します。下記に主な設定を記載します。

- インスタンスタイプ: t2.micro等
- キーペア: 適当に設定する
- ネットワーク設定: 適切に設定する
  - sshで接続できるよう、インバウンドの80番ポートを開けておく（AWS SSM経由での接続なら不要）
- ストレージ: 20 GiB程度あれば十分か。gp3で作成

### ロケールの変更

サーバにssh接続後、下記設定を行っていきます。

```bash
sudo timedatectl set-timezone Asia/Tokyo
```

### ホスト名の設定

```bash
sudo hostnamectl set-hostname your_host_name
```

### swapの設定

仮想メモリの設定で、8GBぐらいにしておきます。

```bash
swapfile_size=8GB
swapfile_path=/swapfile

sudo fallocate -l "$swapfile_size" "$swapfile_path"
sudo chmod 600 "$swapfile_path"
sudo mkswap "$swapfile_path"
sudo swapon "$swapfile_path"
ls -lh "$swapfile_path"
swapon --show
sudo cp /etc/fstab /root/fstab.default
echo "$swapfile_path none swap sw 0 0" | sudo tee -a /etc/fstab
```

### 基本アプリのインストール

cronなど、あとあと必要になると思われるアプリをインストールしておきます。

```bash
sudo yum -y update
sudo dnf install -y cronie patch
```

### Apacheのインストール・設定

```bash
sudo yum -y install httpd
sudo systemctl enable httpd.service
```

### screenの設定

仮想コンソールの設定をしておきます。

```bash
cat <<EOS >"$HOME/.screenrc"
Encoding
defutf8 on
defencoding utf8
encoding utf8 utf8

defbce on
term xterm-256color

# Prefix Key
escape ^Gg

# set scrollback
# メモリ量と相談
# defscrollback 1000000

# Delete sartt up screen
startup_message off

# Enable Auto detach
autodetach on

hardstatus alwayslastline "%{= rw} %H %{= wk}%-Lw%{= bw}%n%f* %t%{= wk}%+Lw %{= wk}%=%{= gk} LoadAVG [%l] %y/%m/%d %c "
termcapinfo xterm* ti@:te@
altscreen on
EOS
```

### PostgreSQLのインストール・設定

今回はデータベースとしてpostgresを使用します

```bash
sudo dnf install -y postgresql15-server
sudo postgresql-setup initdb
# WARNING: using obsoleted argument syntax, try --help
# WARNING: arguments transformed to: postgresql-setup --initdb --unit postgresql
#  * Initializing database in '/var/lib/pgsql/data'
#  * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
sudo systemctl enable postgresql

# 設定
# ローカルからはパスワードでログインできるようにする
cat << EOS | sudo patch -p1 -f /var/lib/pgsql/data/pg_hba.conf
--- /home/ec2-user/pg_hba_default.conf  2024-02-21 11:04:02.779795012 +0900
+++ /var/lib/pgsql/data/pg_hba.conf     2024-02-21 11:04:41.488692691 +0900
@@ -85 +85 @@
-local   all             all                                     peer
+local   all             all                                     trust
@@ -87 +87 @@
-host    all             all             127.0.0.1/32            ident
+host    all             all             127.0.0.1/32            password
@@ -92 +92 @@
-local   replication     all                                     peer
+local   replication     all                                     trust
EOS
sudo systemctl restart postgresql

# ec-cube用のデータベース、ユーザを予め作っておきます
psql -U postgres -c "ALTER USER postgres with password 'postgres'";
psql -U postgres -c "CREATE DATABASE eccube" ;
```

### phpのインストール

```bash
sudo yum install -y php
sudo systemctl restart httpd
```

### EC-CUBEのインストール

```bash
cd "$HOME"
curl -OL https://downloads.ec-cube.net/src/eccube-4.2.3.zip
unzip eccube-4.2.3.zip
sudo mv ec-cube/ /var/www/html/

# Change file/directory owner
cd /var/www/html/
sudo chown -R apache:apache *
```

EC-CUBE起動に必要なphp拡張機能をインストールします

```bash
sudo yum install -y \
  php8.2-pgsql \
  php8.2-gd \
  php8.2-zip \
  php8.2-intl

  # php8.2-pdo
  # php8.2-opcache
# Package php8.2-pdo-8.2.15-1.amzn2023.0.1.x86_64 is already installed.
# Package php8.2-opcache-8.2.15-1.amzn2023.0.1.x86_64 is already installed.
```

### EC-CUBEのインストールウィザードへアクセス

<http://YOUR_SERVER_IP/ec-cube/index.php/install/step1> にアクセスしインストールウィザードを開始します。
参考: [EC-CUBEのインストール方法 | ECサイト構築・リニューアルは「ECオープンプラットフォームEC-CUBE」](https://www.ec-cube.net/installation/)

## バックアップ

データベースのダンプと、ドキュメントルート以下の必要なファイルをtarに固めます。
（あまり検証していない・・・）

```bash
now="$(date +%Y-%m-%d_%H-%M-%S)"
database_dump_dir="$HOME/backup/eccube/"
eccube_backup_export_dir="$HOME/backup/eccube/"

# データベースのダンプを出力
mkdir -p "$database_dump_dir"
cd "$database_dump_dir"
pg_dump -U postgres -d eccube | gzip -c >"$now.sql.gz"

# ドキュメントルートでバックアップが必要なファイルを固める
mkdir -p "$eccube_backup_export_dir"
cd "$eccube_dir"
tar zcf "$eccube_backup_export_dir/$now.tar.gz" --exclude 'var/cache/*' --exclude 'var/sessions/*' ./

# "$HOME/backup/eccube/"以下に下記ファイルフォーマットで出力される
# YYYY-mm-dd_HH-MM-SS.sql.gz
# YYYY-mm-dd_HH-MM-SS.tar.gz
```

## リストア

```bash
postgres_dump="$HOME/backup/eccube/YYYY-mm-dd_HH-MM-SS.sql.gz"
html_backup="$HOME/backup/eccube/YYYY-mm-dd_HH-MM-SS.tar.gz"
html_target="/var/www/html/ec-cube"

psql -U postgres -c "DROP DATABASE IF EXISTS eccube;" -c "CREATE DATABASE eccube;"
gunzip -c "$postgres_dump" | psql -U postgres -w -d eccube

cd "$html_target"
sudo rm -rf app/ html/

cd "$(dirname "$html_backup")"
tar xf "$html_backup"
sudo mv app/ html/ .env "$html_target"

cd "$html_target"
sudo chown -R apache:apache ./*
```

次にアクセスしログインできることを確認 <http://localhost/ec-cube/index.php/管理画面ログインID/login>
（管理画面ログインIDは、EC-CUBEのインストールウィザードにて設定した値）

### 設定修正

サーバのIPが変更されている場合、設定を書き換えないと、下記のエラーが表示される。

```txt
アクセスできません。
Untrusted Host "xxxxx.example.com".
```

この場合、`.env`ファイルの`TRUSTED_HOSTS`項目値を適切に修正する
現状のサーバのIPアドレスを指定（HTTP時）

```bash
vim /var/www/html/ec-cube/.env
```

サーバIPが123.456.789.012の場合

```ini:.env
TRUSTED_HOSTS=^123\.456\.789\.012$
```

## メモ

### 空き容量

セットアップ完了直後の、ストレージ使用量を記載します。

```bash
# "空き容量"
df
# Filesystem     1K-blocks    Used Available Use% Mounted on
# /dev/xvda1      20893676 2465896  18427780  12% /

# "空き容量 -h"
df -h
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/xvda1       20G  2.4G   18G  12% /
```