Dashboard Solusi AI Peternakan Ayam
Dashboard monitoring dan manajemen peternakan ayam berbasis web dengan integrasi IoT, AI, dan database PostgreSQL untuk penyimpanan data siklus produksi.
📋 Daftar Isi
- Fitur Utama
- Teknologi
- Deployment
- Persyaratan Sistem
- Instalasi
- Cara Menjalankan
- Struktur Proyek
- API Documentation
- Database Schema
- Troubleshooting
🚀 Fitur Utama
Frontend
- Dashboard Utama: Monitoring real-time KPI, alert, dan kondisi kandang
- Linimasa Siklus: Manajemen siklus produksi dengan timeline visual
- Hitung Ayam:
- Dashboard perhitungan populasi
- Manajemen Data: CRUD data mortalitas dengan penyimpanan database
- Monitoring Berat: Tracking berat ayam dengan distribusi dan statistik
- Standar Performa: Perbandingan dengan standar Cobb
- Penjadwalan Pakan: Rekomendasi jadwal pemberian pakan
- Feed Wastage: Monitoring pemborosan pakan
- AI Insight: Analisis otomatis per topik (hitung ayam, berat, FCR, EEF, panel IoT, karung pakan) memakai LLM lokal + RAG buku standar CP 707. Tiap kartu punya toggle Harian/Mingguan, grafik pendukung, dan ekspor PDF berlabel lokasi & periode
- Behavior Analysis: Analisis perilaku ayam dengan AI
- Network Monitoring: Status koneksi IoT devices
- ERP Integration: Sinkronisasi dengan sistem ERP
Backend (PostgreSQL Database)
- Database: PostgreSQL untuk penyimpanan data siklus dan mortalitas
- RESTful API: Endpoint untuk CRUD operations
- Migrasi otomatis: Skema dan migrasi dijalankan sendiri saat backend start
- Data TIDAK terisi otomatis: tabel dibuat kosong. Isi dengan
backup.sql(lihat SETUP.md) — tanpa itu dashboard terbuka tanpa data sama sekali - Persistent Storage: Semua perubahan data tersimpan permanen
🛠 Teknologi
Frontend
- React 18 dengan TypeScript
- Vite - Build tool & dev server
- Recharts - Data visualization
- Tailwind CSS - Styling
- Context API - State management
Backend
- Node.js dengan Express
- PostgreSQL (pg) - Database
- CORS - Cross-origin support
AI
- Ollama - LLM lokal (default
qwen2.5:7b, ~5 GB) - Python + FastAPI - layanan RAG di folder
AI Insight/ - ChromaDB - penyimpanan vektor buku standar CP 707
Deployment
- Docker - Containerization
- Docker Compose - Orkestrasi 6 service:
database,backend,frontend,rag,llm(Ollama), danllm-model-downloader - Nginx - Reverse proxy & static file serving
- PostgreSQL - Database container
🐳 Deployment
Docker Deployment (Recommended for Production)
Deploy dengan Docker Compose:
docker compose up -d --build
Di mode Docker penuh, frontend disajikan Nginx di port 5002, backend di 15001, dan RAG di 5005 — berbeda dari mode pengembangan native. Jangan menjalankan kedua mode bersamaan; keduanya berebut port yang sama.
Keuntungan Docker:
- ✅ Easy deployment dan scaling
- ✅ Isolated environment
- ✅ Consistent across different servers
- ✅ Automatic restarts
- ✅ Built-in health checks
📚 Complete Docker Guide: DOCKER.md
Setup dari nol sampai jalan: SETUP.md
Catatan teknis & pekerjaan yang masih terbuka: CATATAN-LANJUTAN.md
Manual Deployment
Untuk development atau testing lokal, lihat Instalasi dan Cara Menjalankan di bawah.
📦 Persyaratan Sistem
Untuk Docker Deployment
- Docker: v20.10+
- Docker Compose: v2.0+
- RAM: minimum 8GB (model LLM berjalan di CPU)
- Disk: 15GB free space — model
qwen2.5:7bsaja ~5GB - Port: 5002 (frontend), 15001 (backend), 15432 (Postgres), 11434 (Ollama), 5005 (RAG)
Untuk Manual Installation
- Node.js: v18.0.0 atau lebih tinggi
- npm: v9.0.0 atau lebih tinggi
- Python: v3.10+ — untuk layanan RAG
- Docker: tetap dibutuhkan untuk PostgreSQL dan Ollama
- Port yang tersedia:
- Frontend: 3000, mundur ke 3001/3002/… bila terpakai
- Backend: 5001
- RAG: 5002
- PostgreSQL: 15432 (bukan 5432 — dipetakan begitu agar tidak bentrok)
- Ollama: 11434
💿 Instalasi
Panduan lengkap dan berurutan ada di SETUP.md. Bagian di bawah ini hanya memasang dependensi JavaScript. Aplikasi belum bisa jalan hanya dengan ini — masih perlu file
.env, container PostgreSQL dan Ollama, model LLM, dependensi Python untuk RAG, serta pengisian database daribackup.sql.
1. Clone Repository
git clone <repository-url>
cd dashboard-solusi-ai-peternakan-ayam
2. Install Dependencies Frontend
npm install
3. Install Dependencies Backend
cd backend
npm install
cd ..
▶️ Cara Menjalankan
Menjalankan backend dan frontend saja tidak cukup — AI Insight butuh layanan RAG (port 5002) dan Ollama (port 11434) ikut hidup. Cara termudah:
docker compose up -d database llm # PostgreSQL + Ollama bash start_all.sh # RAG + backend + frontend sekaligus
start_all.shmenampilkan alamat frontend yang benar-benar dipakai di akhir keluarannya. Bukalah alamat itu, jangan diasumsikan.
Opsi 1: Menjalankan Secara Manual (Recommended untuk Development)
Terminal 1 - Backend Server
cd backend
npm run dev
Backend akan berjalan di: http://localhost:5001
Output yang diharapkan:
========================================
🚀 Server running on http://localhost:5001
========================================
API Endpoints:
GET /health
GET /api/cycles
GET /api/cycles/active
...
Terminal 2 - Frontend Server
npm run dev
Frontend akan berjalan di: http://localhost:3000 — atau 3001, 3002, dan seterusnya
kalau port itu sedang dipakai proses lain. Backend menerima port localhost mana pun
saat NODE_ENV=development, jadi berapa pun portnya aplikasi tetap jalan.
Output yang diharapkan:
VITE v6.4.1 ready in 155 ms
➜ Local: http://localhost:3001/
Opsi 2: Menjalankan dengan satu perintah
Buka dua terminal secara terpisah:
Terminal 1:
cd backend && npm run dev
Terminal 2:
npm run dev
Atau gunakan terminal multiplexer seperti tmux atau screen.
📁 Struktur Proyek
dashboard-solusi-ai-peternakan-ayam/
├── backend/ # Backend Node.js + PostgreSQL
│ ├── database/
│ │ ├── db.js # PostgreSQL connection & pool setup
│ │ ├── schema.sql # Database schema
│ │ ├── seed-postgres.js # Data seeding script
│ │ └── migrations/ # Database migrations
│ ├── models/
│ │ ├── Cycle.js # Cycle data model
│ │ └── Mortality.js # Mortality data model
│ ├── routes/
│ │ ├── cycles.js # Cycle endpoints
│ │ └── mortality.js # Mortality endpoints
│ ├── server.js # Express server
│ ├── package.json
│ └── .env # Environment variables
├── components/ # React components
│ ├── counting/
│ │ └── DataManagementPage.tsx # Mortality data management
│ ├── CycleTimeline.tsx # Cycle timeline component
│ └── ...
├── context/ # React context & stores
│ ├── AppContext.tsx
│ └── stores/
│ └── useStaticDataStore.ts # Store with DB integration
├── services/
│ └── apiService.ts # API client with DB methods
├── scripts/ # Database & deployment scripts
│ ├── backup-postgres.sh # Backup database
│ ├── restore-postgres-local.sh # Restore from backup
│ └── fetch-prod-db.sh # Fetch production data
├── mockData/ # Mock data for demo mode
├── types/ # TypeScript type definitions
├── public/ # Static assets
├── AI Insight/ # Layanan RAG (Python) + ChromaDB + dokumen CP 707
├── SETUP.md # Panduan setup dari nol
├── start_all.sh # Menyalakan RAG + backend + frontend
├── backup.sql # Data awal — WAJIB di-restore, tidak otomatis
├── docker-compose.yml # Orkestrasi 6 service
├── package.json
└── README.md
📡 API Documentation
Base URL: http://localhost:5001/api
Health Check
GET /health
Response:
{
"status": "ok",
"timestamp": "2025-12-22T03:02:20.793Z"
}
Cycles Endpoints
Get All Cycles
GET /api/cycles
Response:
{
"success": true,
"data": [
{
"id": "CYCLE-JBW-2025-12-10",
"totalDays": 42,
"currentDay": 7,
"startDate": "2025-12-10",
"endDate": "2026-01-20",
"chickInWeight": null,
"docInCount": 20000,
"status": "Active",
"createdAt": "2025-12-22 02:59:17",
"updatedAt": "2025-12-22 02:59:17"
}
]
}
Get Active Cycle
GET /api/cycles/active
Get Cycle by ID
GET /api/cycles/:id
Update Cycle
PUT /api/cycles/:id
Content-Type: application/json
{
"totalDays": 42,
"currentDay": 7,
"startDate": "2025-12-10",
"endDate": "2026-01-20",
"chickInWeight": 42,
"docInCount": 20000,
"status": "Active"
}
Delete Cycle
DELETE /api/cycles/:id
Mortality Endpoints
Get All Mortality Records for Cycle
GET /api/mortality/:cycleId
Response:
{
"success": true,
"data": [
{
"id": 1,
"cycleId": "CYCLE-JBW-2025-12-10",
"day": 0,
"mortalityCount": 25,
"isEdited": true,
"createdAt": "2025-12-22 03:00:00",
"updatedAt": "2025-12-22 03:00:00"
}
]
}
Get Mortality Record for Specific Day
GET /api/mortality/:cycleId/:day
Update/Create Mortality Record
PUT /api/mortality/:cycleId/:day
Content-Type: application/json
{
"mortalityCount": 30
}
Delete Mortality Record (Reset to Default)
DELETE /api/mortality/:cycleId/:day
🗄️ Database Schema
Table: cycles
Menyimpan informasi siklus produksi.
| Column | Type | Description |
|---|---|---|
| id | TEXT | Primary key, format: CYCLE-JBW-YYYY-MM-DD |
| total_days | INTEGER | Total hari dalam siklus (biasanya 42) |
| current_day | INTEGER | Hari saat ini dalam siklus |
| start_date | TEXT | Tanggal mulai (ISO format: YYYY-MM-DD) |
| end_date | TEXT | Tanggal akhir (ISO format: YYYY-MM-DD) |
| chick_in_weight | INTEGER | Berat DOC in (gram) |
| doc_in_count | INTEGER | Jumlah DOC in (ekor) |
| status | TEXT | Status: 'Active', 'Completed', 'Upcoming' |
| created_at | TEXT | Timestamp pembuatan |
| updated_at | TEXT | Timestamp update terakhir |
Table: mortality_records
Menyimpan data mortalitas harian.
| Column | Type | Description |
|---|---|---|
| id | INTEGER | Primary key (auto increment) |
| cycle_id | TEXT | Foreign key ke cycles.id |
| day | INTEGER | Hari ke berapa dalam siklus |
| mortality_count | INTEGER | Jumlah mortalitas hari ini |
| is_edited | BOOLEAN | Flag apakah data sudah diedit manual |
| created_at | TEXT | Timestamp pembuatan |
| updated_at | TEXT | Timestamp update terakhir |
Constraints:
- UNIQUE(cycle_id, day) - Satu cycle hanya bisa punya satu record per hari
- FOREIGN KEY cascade delete - Jika cycle dihapus, mortality records ikut terhapus
Indexes
idx_mortality_cycle_id- Index pada cycle_id untuk query cepatidx_mortality_day- Index pada dayidx_cycles_status- Index pada status untuk filter cycle aktifidx_cycles_start_date- Index pada start_date untuk sorting
🔧 Troubleshooting
Port 5001 sudah terpakai
Jika port 5001 sudah digunakan oleh aplikasi lain (contoh: AirPlay on macOS):
- Edit file
backend/.env:
PORT=5002 # Ganti ke port lain yang tersedia
- Update URL di
services/apiService.ts:
const DB_API_BASE_URL = 'http://localhost:5002/api';
- Restart backend server
Port 3001 sudah terpakai
Vite akan otomatis mencari port lain yang tersedia. Perhatikan output di terminal untuk melihat port yang digunakan.
Database tidak terbuat
Jika database tidak terbuat otomatis:
cd backend
node database/seed-postgres.js
CORS Error
Jika frontend tidak bisa mengakses backend, pastikan:
- Backend server sudah berjalan
- Port di
backend/server.jssesuai dengan konfigurasi CORS:
origin: ['http://localhost:3001', 'http://localhost:5173'];
Frontend tidak load data dari database
- Buka browser console (F12)
- Cek apakah ada error dari API calls
- Pastikan backend server berjalan:
curl http://localhost:5001/health - Cek network tab untuk melihat request/response
Error "Failed to load cycles from database"
- Pastikan backend server sudah berjalan
- Test backend endpoint:
curl http://localhost:5001/api/cycles - Cek backend logs untuk melihat error detail
Reset Database ke Data Awal
For Local PostgreSQL Development:
# Stop backend if running, then:
./scripts/restore-postgres-local.sh --reset
# Or manually run seed:
cd backend
node database/seed-postgres.js
For Docker:
# Reset database by removing volume and restarting:
docker-compose down -v
docker-compose up -d
📝 Fitur Database
Auto-Seeding
Database akan otomatis terisi dengan 4 siklus produksi saat pertama kali server backend dijalankan:
- CYCLE-JBW-2025-05-20 - Completed (20 Mei - 30 Juni 2025)
- CYCLE-JBW-2025-07-11 - Completed (11 Juli - 21 Agustus 2025)
- CYCLE-JBW-2025-10-22 - Completed (22 Oktober - 2 Desember 2025)
- CYCLE-JBW-2025-12-10 - Active (10 Desember 2025 - 20 Januari 2026) ✓
Data Persistence
Semua perubahan data akan tersimpan permanen di PostgreSQL database:
- ✅ Perubahan tanggal siklus di Linimasa
- ✅ Update DOC In dan Berat DOC di pengaturan siklus
- ✅ Edit data mortalitas di halaman Manajemen Data
- ✅ Reset data mortalitas ke nilai default
Backup Database
Production/Docker:
./scripts/backup-postgres.sh
Backups are saved in ./backups/ as dashboard_db-YYYYMMDD-HHMMSS.sql.gz
Fetch from production server:
REMOTE_USER=your-user \
REMOTE_HOST=your-host \
REMOTE_PROJECT_DIR=/path/to/project \
./scripts/fetch-prod-db.sh
🔐 Environment Variables
Backend (.env)
File: backend/.env
PORT=5001
NODE_ENV=development
# PostgreSQL Configuration
DB_HOST=localhost
DB_PORT=5432
DB_USER=dashboard_user
DB_PASSWORD=your_password
DB_NAME=dashboard_db
DB_SSL=false
Frontend (.env.local) - Optional
File: .env.local (create if needed)
VITE_API_URL=http://localhost:5001/api
🎯 Testing
Test Backend API
# Health check
curl http://localhost:5001/health
# Get all cycles
curl http://localhost:5001/api/cycles
# Get active cycle
curl http://localhost:5001/api/cycles/active
# Get mortality records
curl http://localhost:5001/api/mortality/CYCLE-JBW-2025-12-10
Test Frontend
- Buka http://localhost:3001 di browser
- Navigasi ke "Linimasa Siklus Produksi"
- Klik "Edit" pada siklus aktif
- Ubah tanggal atau DOC count
- Save dan refresh - data harus tetap tersimpan
- Navigasi ke "Hitung Ayam" > "Manajemen Data"
- Edit nilai mortalitas
- Save dan refresh - data harus tetap tersimpan
📚 Cara Menggunakan Aplikasi
1. Mengelola Siklus Produksi
Linimasa Siklus:
- Lihat semua siklus produksi (completed, active, upcoming)
- Edit tanggal mulai dan akhir
- Set DOC In count dan berat DOC
- Data tersimpan otomatis ke database
2. Manajemen Data Mortalitas
Hitung Ayam > Manajemen Data:
- Lihat data mortalitas per hari
- Edit nilai mortalitas dengan klik "Edit"
- Reset ke nilai default dengan klik tombol reset
- Lihat statistik: populasi awal, populasi saat ini, total mortalitas, tingkat mortalitas
- Filter data: cari per hari atau tampilkan hanya data yang diedit
- Data tersimpan permanen di database
3. Monitoring Standar Performa
Standar Performa > Cobb Standard:
- Kapasitas kandang otomatis sync dengan DOC In count dari linimasa
- Lihat grafik perbandingan berat aktual vs standar Cobb
- Analisis FCR (Feed Conversion Ratio)
🚦 Status Proyek
- ✅ Frontend Dashboard
- ✅ Backend API dengan PostgreSQL
- ✅ Database Schema & Models
- ✅ CRUD Cycles
- ✅ CRUD Mortality Records
- ✅ Frontend-Backend Integration
- ✅ Data Persistence
- ✅ AI Insight per topik dengan LLM lokal + RAG CP 707
- ✅ Ekspor PDF berlabel lokasi, kandang, dan periode
- ✅ Docker Deployment (6 service)
- ✅ Database Backup & Restore Scripts
- ⏳ User Authentication (coming soon)
- ⏳ Real-time WebSocket (coming soon)
- ⏳ Data Export (CSV/Excel) (coming soon)
🤝 Kontribusi
Untuk berkontribusi pada proyek ini:
- Fork repository
- Buat branch feature (
git checkout -b feature/AmazingFeature) - Commit perubahan (
git commit -m 'Add some AmazingFeature') - Push ke branch (
git push origin feature/AmazingFeature) - Buat Pull Request
📄 License
Proyek ini menggunakan lisensi MIT.
👥 Tim Pengembang
- Development Team - PT Cipta Pola Solusi Prima
- Dashboard & AI Integration - 2025
📞 Kontak
Untuk pertanyaan atau dukungan, silakan hubungi:
- Email: support@cpsp.id
- Website: https://dashboard.cpsp.id
Dibuat dengan ❤️ untuk kemajuan peternakan ayam Indonesia