Fly.ioにMySQLをデプロイする手順

## **1. はじめに**  
この記事では、Fly.ioを使って**MySQLをデプロイする手順**を解説します。  
Fly.ioではDockerfileの作成が不要で、公式イメージをそのまま利用できるため、**最短ステップでMySQLをデプロイ**できます。  

### **この記事のゴール**  
1. Fly.ioにMySQLをデプロイする。  
2. ローカルからFly.io上のMySQLに接続できるようにする。  

### **想定読者**
MySQL8.4をfly.ioにデプロイしたい方


## **2. 前提条件**  
2.1. **Fly.io CLIのインストール**  
```bash
brew install flyctl
```

2.2. **Fly.ioアカウントの作成とログイン**  
```bash
flyctl auth login
```


## **3. MySQLのデプロイ手順**  

### **3.1. アプリケーションの作成**  
```bash
mkdir my-mysql # ルート直下にしました
cd my-mysql
fly launch --no-deploy --image mysql:8.4
```

#### **設定変更 (ポート3306への変更)**  
コマンド実行後、以下のプロンプトが表示されます：  
```
Do you want to tweak these settings before proceeding? (y/N)
```

ここでは、**`y`** を選択してください。  

その後、ブラウザでFly.ioの管理画面が自動的に開きます。  
- **Port設定を3306に変更**  
  1. 「Port」フィールドを **`3306`** に変更します。  
  2. 設定を保存し、管理画面を閉じます。  

---


### **3.2. ボリュームの作成**

Fly.ioでは、データを永続化するために**ボリュームを作成**します。  

```bash
fly volumes create mysqldata --size 10
```

- **mysqldata**: ボリューム名  
- **サイズ10GB**を指定（必要に応じて変更可能）  

#### **実行時のプロンプト例:**

```
Warning! Every volume is pinned to a specific physical host. You should create two or more volumes per application to avoid downtime. Learn more at https://fly.io/docs/volumes/overview/
? Do you still want to use the volumes feature? Yes
? Select region:  [Use arrows to move, type to filter]
? Select region: Tokyo, Japan (nrt)
```

ここでは、以下の手順で進めます：  
1. 「Do you still want to use the volumes feature?」と聞かれるので、**Yes**を選択。  
2. 次にリージョンを選択する画面が表示されるので、矢印キーで**Tokyo, Japan (nrt)** を選択。  
---

### **3.3. 環境変数とシークレットの設定**  
MySQLのユーザー名やパスワードはFly.ioのシークレットとして安全に保存します。  

```bash
fly secrets set MYSQL_PASSWORD="あなたのパスワード" MYSQL_ROOT_PASSWORD="あなたのルートパスワード"
```





### **3.4. 設定ファイルの編集 (fly.toml)**  
以下は例です：

```toml
app = 'my-mysql'
primary_region = 'nrt'

[build]
  image = 'mysql:8.4'

[[vm]]
  cpu_kind = 'shared'
  cpus = 1
  memory_mb = 2048

[processes]
  app = """--datadir /data/mysql \
    --mysql-native-password=ON"""

[mounts]
  source = "mysqldata"
  destination = "/data"

[env]
  MYSQL_DATABASE = "my_database"
  MYSQL_USER = "my_user"
```

---

### **3.5. 環境変数とデータベースの初期化について**  

この`fly.toml`の`env`セクションに記載された項目は、**デプロイ時に自動でデータベース内に作成されます。**  

#### **具体例:**  
- `MYSQL_DATABASE`: Fly.ioがデプロイ時に`my_database`というデータベースを自動で作成します。  
- `MYSQL_USER`: Fly.ioが`my_user`というユーザーを作成します。  

これらは、Fly.ioが提供するMySQL公式イメージの初期化機能によって設定されます。  
また、以下のシークレットとして指定されたパスワードがユーザーに割り当てられます。  

```bash
fly secrets set MYSQL_PASSWORD="あなたのパスワード" MYSQL_ROOT_PASSWORD="あなたのルートパスワード"
```

---

**ポイント:**
- データベースやユーザーはFly.ioの公式MySQLイメージに組み込まれている機能で自動的に作成されます。  
- 環境変数の設定だけで基本的なデータベース環境が構築されるため、手動でSQLを実行する必要はありません。  

## **4. デプロイの実行**  
準備が整ったら、以下のコマンドでデプロイを実行します。  

```bash
fly deploy
```

---

## **5. 接続確認**  

### **5.1. プロキシ設定**  
Fly.ioのMySQLにローカルから接続するためのプロキシを起動します。  
```bash
fly proxy 3306 -a my-mysql
```

### **5.2. ローカルから接続**  
プロキシ経由で接続します：  
```bash
mysql -h 127.0.0.1 -P 3306 -u my_user -p my_database
```

- パスワード入力後、接続されれば成功です

## **6. データベース管理**  

### **6.1. テーブル作成**  
```sql
CREATE TABLE test_table (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL
);
```

### **6.2. データ確認**  
```sql
INSERT INTO test_table (name) VALUES ('test_name');
SELECT * FROM test_table;
```

---

## **7. トラブルシューティング**  

### **7.1. 接続できない場合**  
Fly.ioのログを確認します：  
```bash
fly logs
```


## **8. まとめ**  
- Fly.ioではDockerfile不要でMySQLを簡単にデプロイできる。  
- 永続化設定や接続情報の管理もFly.ioのシークレット管理で安全に実施可能。  
- 本番環境やアプリケーションとの接続設定も同じ手順で対応できる。  


## **9. 補足情報**  
- **Fly.io公式ドキュメント:** [Fly.io MySQLの公式ガイド](https://fly.io/docs/app-guides/mysql-on-fly/#main-content-start)