318 lines
6.3 KiB
Markdown
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! 🚀
|