TKK_E32231503/backend/RAILWAY_MYSQL_SETUP.md

318 lines
6.3 KiB
Markdown

# 🚂 Railway MySQL Setup Guide
## 📋 Environment Variables di Railway
Railway menyediakan environment variables dengan format yang berbeda tergantung cara setup MySQL.
### Format 1: Railway MySQL Plugin (Recommended)
Jika Anda menggunakan Railway MySQL Plugin, Railway otomatis menyediakan:
```bash
MYSQLHOST=containers-us-west-xxx.railway.app
MYSQLPORT=6543
MYSQLUSER=root
MYSQLPASSWORD=xxxxxxxxxxxxx
MYSQLDATABASE=railway
```
**Backend sudah support format ini!** Tidak perlu setting manual.
---
### Format 2: DATABASE_URL
Beberapa Railway service menyediakan `DATABASE_URL`:
```bash
DATABASE_URL=mysql://root:password@host:port/database
```
**Backend sudah support format ini!** Tidak perlu setting manual.
---
### Format 3: MYSQL_URL
Alternative format:
```bash
MYSQL_URL=mysql://root:password@host:port/database
```
**Backend sudah support format ini!** Tidak perlu setting manual.
---
### Format 4: Custom Variables (Local Development)
Untuk development lokal, gunakan:
```bash
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=pengering_ikan
```
**Backend sudah support format ini!**
---
## 🚀 Setup Railway MySQL
### Opsi 1: Menggunakan Railway MySQL Plugin (Recommended)
1. **Buka Railway Dashboard**
- Go to your project
- Click "New" → "Database" → "Add MySQL"
2. **Railway akan otomatis:**
- Create MySQL database
- Set environment variables:
- `MYSQLHOST`
- `MYSQLPORT`
- `MYSQLUSER`
- `MYSQLPASSWORD`
- `MYSQLDATABASE`
3. **Link ke Service Anda:**
- Railway otomatis link database ke service
- Environment variables tersedia di service
4. **Deploy:**
- Push code ke GitHub
- Railway auto-deploy
- Backend otomatis connect ke MySQL
**DONE!** Backend akan otomatis detect dan gunakan variables ini.
---
### Opsi 2: Menggunakan External MySQL (Aiven, PlanetScale, dll)
1. **Dapatkan Connection String:**
```
mysql://user:password@host:port/database
```
2. **Set di Railway:**
- Go to your service
- Click "Variables"
- Add variable:
- Name: `DATABASE_URL`
- Value: `mysql://user:password@host:port/database`
3. **Deploy:**
- Railway auto-redeploy
- Backend otomatis connect
**DONE!**
---
## 🔍 Cek Connection di Railway
### 1. Lihat Logs
Di Railway Dashboard:
- Go to your service
- Click "Deployments"
- Click latest deployment
- View logs
Cari log:
```
📦 Using MYSQLHOST for connection
🔧 Database Config: { host: '...', port: 3306, ... }
✅ Database connected successfully
✅ Database tables initialized
```
### 2. Test via API
Setelah deploy, test endpoint:
```bash
# Test connection
curl https://your-app.railway.app/api/database/test
# Response jika berhasil:
{
"success": true,
"message": "Database connection successful"
}
```
### 3. Initialize Tables
Jika belum ada tabel, initialize:
```bash
curl -X POST https://your-app.railway.app/api/database/init
# Response:
{
"success": true,
"message": "Database tables initialized successfully"
}
```
---
## 🛠️ Troubleshooting
### Error: "Database connection failed"
**Cek 1: Environment Variables**
```bash
# Di Railway Dashboard → Variables, pastikan ada salah satu:
# - MYSQLHOST, MYSQLPORT, MYSQLUSER, MYSQLPASSWORD, MYSQLDATABASE
# - DATABASE_URL
# - MYSQL_URL
```
**Cek 2: MySQL Service Running**
```bash
# Di Railway Dashboard, pastikan MySQL service status = "Active"
```
**Cek 3: Network Access**
```bash
# Pastikan Railway service bisa akses MySQL
# Jika pakai external MySQL, cek firewall/whitelist
```
---
### Error: "Access denied for user"
**Solusi:**
1. Cek username dan password benar
2. Cek user punya permission ke database
3. Jika pakai Railway MySQL Plugin, coba restart service
---
### Error: "Unknown database"
**Solusi:**
1. Database belum dibuat
2. Jika pakai Railway MySQL Plugin, database otomatis dibuat dengan nama `railway`
3. Jika pakai external MySQL, buat database manual:
```sql
CREATE DATABASE pengering_ikan;
```
---
### Error: "Too many connections"
**Solusi:**
1. Backend sudah pakai connection pool (max 10 connections)
2. Jika masih error, cek MySQL max_connections setting
3. Atau upgrade Railway plan untuk lebih banyak connections
---
## 📊 Database Schema
Backend otomatis create 3 tables:
### 1. `sensor_data`
```sql
CREATE TABLE sensor_data (
id INT AUTO_INCREMENT PRIMARY KEY,
suhu FLOAT NOT NULL,
berat FLOAT NOT NULL,
target FLOAT NOT NULL,
relay1 BOOLEAN DEFAULT FALSE,
relay2 BOOLEAN DEFAULT FALSE,
relay3 BOOLEAN DEFAULT FALSE,
relay4 BOOLEAN DEFAULT FALSE,
status VARCHAR(50) DEFAULT 'DISCONNECTED',
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_timestamp (timestamp)
);
```
### 2. `status_history`
```sql
CREATE TABLE status_history (
id INT AUTO_INCREMENT PRIMARY KEY,
message TEXT NOT NULL,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_timestamp (timestamp)
);
```
### 3. `control_commands`
```sql
CREATE TABLE control_commands (
id INT AUTO_INCREMENT PRIMARY KEY,
command VARCHAR(50) NOT NULL,
source VARCHAR(50) DEFAULT 'API',
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_timestamp (timestamp)
);
```
---
## 🎯 Best Practices
### 1. Gunakan Railway MySQL Plugin
- ✅ Otomatis setup
- ✅ Otomatis backup
- ✅ Otomatis scaling
- ✅ Gratis untuk development
### 2. Set Connection Pool
Backend sudah set:
```javascript
connectionLimit: 10 // Max 10 concurrent connections
```
### 3. Regular Cleanup
Backend punya endpoint untuk clear old data:
```bash
curl -X DELETE https://your-app.railway.app/api/history/clear
```
### 4. Monitor Logs
Cek Railway logs secara berkala untuk detect issues early.
---
## 📝 Checklist Setup
- [ ] Railway MySQL Plugin installed
- [ ] Environment variables tersedia
- [ ] Backend deployed
- [ ] Test `/api/database/test` berhasil
- [ ] Initialize tables via `/api/database/init`
- [ ] Test insert data via ESP32
- [ ] Test query data via `/api/data/latest`
---
## 🆘 Need Help?
1. **Cek Railway Logs** untuk error messages
2. **Cek Environment Variables** di Railway Dashboard
3. **Test Connection** via `/api/database/test`
4. **Check MySQL Status** di Railway Dashboard
---
## 🎉 Done!
Setelah setup berhasil:
- ✅ Backend otomatis connect ke MySQL
- ✅ Tables otomatis dibuat
- ✅ Data dari ESP32 otomatis tersimpan
- ✅ Flutter app bisa query data via API
Selamat! 🚀