add docker for local and production
This commit is contained in:
399
DOCKER-README.md
Normal file
399
DOCKER-README.md
Normal file
@@ -0,0 +1,399 @@
|
||||
# Docker Setup untuk CKB Laravel Application
|
||||
|
||||
Dokumentasi ini menjelaskan cara menjalankan aplikasi CKB menggunakan Docker untuk environment local development dan staging/production.
|
||||
|
||||
## Struktur File Docker
|
||||
|
||||
```
|
||||
├── Dockerfile # Production/Staging Docker image
|
||||
├── Dockerfile.dev # Development Docker image
|
||||
├── docker-compose.yml # Local development setup
|
||||
├── docker-compose.prod.yml # Production/Staging setup
|
||||
├── .dockerignore # Files to exclude from build
|
||||
└── docker/
|
||||
├── env.example # Environment variables template
|
||||
├── nginx.conf # Production Nginx config
|
||||
├── nginx.dev.conf # Development Nginx config
|
||||
├── supervisord.conf # Production supervisor config
|
||||
├── supervisord.dev.conf # Development supervisor config
|
||||
├── xdebug.ini # Xdebug configuration
|
||||
├── php.ini # PHP configuration
|
||||
└── mysql.cnf # MySQL configuration
|
||||
```
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker Engine 20.10+
|
||||
- Docker Compose 2.0+
|
||||
- Git
|
||||
|
||||
## Setup untuk Local Development
|
||||
|
||||
### 1. Quick Setup (Recommended)
|
||||
|
||||
Untuk setup cepat dengan auto-import database:
|
||||
|
||||
```bash
|
||||
# Clone repository
|
||||
git clone <your-repo-url>
|
||||
cd CKB
|
||||
|
||||
# Pastikan file ckb.sql ada di root project
|
||||
ls ckb.sql
|
||||
|
||||
# Jalankan quick setup
|
||||
./docker-quick-setup.sh dev
|
||||
```
|
||||
|
||||
Script ini akan otomatis:
|
||||
- Setup environment file
|
||||
- Start semua containers
|
||||
- Import database dari ckb.sql
|
||||
- Generate application key
|
||||
- Setup Laravel application
|
||||
|
||||
### 2. Manual Setup
|
||||
|
||||
Jika Anda ingin setup manual:
|
||||
|
||||
```bash
|
||||
# Copy environment file
|
||||
cp docker/env.example .env
|
||||
|
||||
# Start containers
|
||||
docker-compose up -d --build
|
||||
|
||||
# Import database
|
||||
./docker-import-db.sh dev
|
||||
|
||||
# Generate Laravel application key
|
||||
docker-compose exec app php artisan key:generate
|
||||
```
|
||||
|
||||
### 2. Menjalankan Development Environment
|
||||
|
||||
```bash
|
||||
# Build dan jalankan containers
|
||||
docker-compose up -d --build
|
||||
|
||||
# Atau tanpa rebuild
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### 3. Akses Aplikasi
|
||||
|
||||
- **Web Application**: http://localhost:8000
|
||||
- **Database (phpMyAdmin)**: http://localhost:8080
|
||||
- **Mail Testing (MailHog)**: http://localhost:8025
|
||||
- **MySQL Direct**: localhost:3306
|
||||
- **Redis**: localhost:6379
|
||||
|
||||
### 4. Menjalankan Laravel Commands
|
||||
|
||||
```bash
|
||||
# Masuk ke container aplikasi
|
||||
docker-compose exec app bash
|
||||
|
||||
# Atau jalankan command langsung
|
||||
docker-compose exec app php artisan migrate
|
||||
docker-compose exec app php artisan db:seed
|
||||
docker-compose exec app php artisan cache:clear
|
||||
```
|
||||
|
||||
### 5. Development dengan Hot Reload
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
docker-compose exec app npm install
|
||||
|
||||
# Jalankan webpack dev server
|
||||
docker-compose exec app npm run hot
|
||||
```
|
||||
|
||||
## Setup untuk Staging/Production
|
||||
|
||||
### 1. Persiapan Environment
|
||||
|
||||
```bash
|
||||
# Copy dan edit environment file production
|
||||
cp docker/env.example .env.production
|
||||
|
||||
# Edit file .env.production sesuai kebutuhan production
|
||||
vim .env.production
|
||||
```
|
||||
|
||||
Contoh konfigurasi production:
|
||||
|
||||
```env
|
||||
APP_ENV=production
|
||||
APP_DEBUG=false
|
||||
APP_URL=https://your-domain.com
|
||||
|
||||
DB_HOST=db
|
||||
DB_DATABASE=ckb_production
|
||||
DB_USERNAME=your_db_user
|
||||
DB_PASSWORD=your_secure_password
|
||||
DB_ROOT_PASSWORD=your_root_password
|
||||
|
||||
REDIS_PASSWORD=your_redis_password
|
||||
```
|
||||
|
||||
### 2. Menjalankan Production Environment
|
||||
|
||||
```bash
|
||||
# Build dan jalankan dengan konfigurasi production
|
||||
docker-compose -f docker-compose.prod.yml up -d --build
|
||||
|
||||
# Atau menggunakan environment file spesifik
|
||||
docker-compose -f docker-compose.prod.yml --env-file .env.production up -d --build
|
||||
```
|
||||
|
||||
### 3. Database Migration dan Seeding
|
||||
|
||||
```bash
|
||||
# Jalankan migrations
|
||||
docker-compose -f docker-compose.prod.yml exec app php artisan migrate --force
|
||||
|
||||
# Jalankan seeders (jika diperlukan)
|
||||
docker-compose -f docker-compose.prod.yml exec app php artisan db:seed --force
|
||||
|
||||
# Optimize aplikasi untuk production
|
||||
docker-compose -f docker-compose.prod.yml exec app php artisan config:cache
|
||||
docker-compose -f docker-compose.prod.yml exec app php artisan route:cache
|
||||
docker-compose -f docker-compose.prod.yml exec app php artisan view:cache
|
||||
```
|
||||
|
||||
## Monitoring dan Debugging
|
||||
|
||||
### 1. Melihat Logs
|
||||
|
||||
```bash
|
||||
# Semua services
|
||||
docker-compose logs -f
|
||||
|
||||
# Service specific
|
||||
docker-compose logs -f app
|
||||
docker-compose logs -f db
|
||||
docker-compose logs -f redis
|
||||
|
||||
# Production
|
||||
docker-compose -f docker-compose.prod.yml logs -f
|
||||
```
|
||||
|
||||
### 2. Debugging dengan Xdebug (Development)
|
||||
|
||||
Xdebug sudah dikonfigurasi untuk development environment:
|
||||
- Port: 9003
|
||||
- IDE Key: PHPSTORM
|
||||
- Host: host.docker.internal
|
||||
|
||||
### 3. Monitoring Resources
|
||||
|
||||
```bash
|
||||
# Lihat resource usage
|
||||
docker stats
|
||||
|
||||
# Lihat containers yang berjalan
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
## Database Management
|
||||
|
||||
### 1. Import Database dari Backup
|
||||
|
||||
Untuk mengimport database dari file backup ckb.sql:
|
||||
|
||||
```bash
|
||||
# Import ke development environment
|
||||
./docker-import-db.sh dev
|
||||
|
||||
# Import ke production environment
|
||||
./docker-import-db.sh prod
|
||||
|
||||
# Import file SQL khusus
|
||||
./docker-import-db.sh dev my-backup.sql
|
||||
```
|
||||
|
||||
Script import akan otomatis:
|
||||
- Backup database yang sudah ada (safety)
|
||||
- Drop dan recreate database
|
||||
- Import data dari file SQL
|
||||
- Jalankan migrations jika diperlukan
|
||||
- Clear cache Laravel
|
||||
|
||||
### 2. Backup Database
|
||||
|
||||
```bash
|
||||
# Backup database development
|
||||
docker-compose exec db mysqldump -u root -proot ckb_db > backup_$(date +%Y%m%d).sql
|
||||
|
||||
# Backup database production
|
||||
docker-compose -f docker-compose.prod.yml exec db mysqldump -u root -p ckb_production > backup_prod_$(date +%Y%m%d).sql
|
||||
```
|
||||
|
||||
### 3. Manual Restore Database
|
||||
|
||||
```bash
|
||||
# Restore database development
|
||||
docker-compose exec -T db mysql -u root -proot ckb_db < backup.sql
|
||||
|
||||
# Restore database production
|
||||
docker-compose -f docker-compose.prod.yml exec -T db mysql -u root -p ckb_production < backup.sql
|
||||
```
|
||||
|
||||
### 4. Auto Import saat Pertama Kali Setup
|
||||
|
||||
File `ckb.sql` di root project akan otomatis diimport saat pertama kali menjalankan containers baru. Ini terjadi karena MySQL menggunakan `/docker-entrypoint-initdb.d/` untuk auto-import.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### 1. Docker Build Issues
|
||||
|
||||
Jika mengalami error saat build (seperti PHP extension compilation errors):
|
||||
|
||||
```bash
|
||||
# Clean rebuild dengan script otomatis
|
||||
./docker-rebuild.sh dev
|
||||
|
||||
# Atau manual cleanup dan rebuild
|
||||
docker-compose down
|
||||
docker system prune -a -f
|
||||
docker-compose build --no-cache --pull
|
||||
```
|
||||
|
||||
**Common Build Errors:**
|
||||
- **curl extension error**: Fixed dengan menambah `libcurl4-openssl-dev` dan `pkg-config`
|
||||
- **gd extension error**: Pastikan `libfreetype6-dev` dan `libjpeg62-turbo-dev` terinstall
|
||||
- **Out of space**: Jalankan `docker system prune -a -f` untuk cleanup
|
||||
|
||||
### 2. Permission Issues
|
||||
|
||||
**Laravel Storage Permission Errors** (seperti "laravel.log could not be opened"):
|
||||
|
||||
```bash
|
||||
# Quick fix dengan script otomatis
|
||||
./docker-fix-permissions.sh dev
|
||||
|
||||
# Atau manual fix
|
||||
docker-compose exec app chown -R www-data:www-data /var/www/html/storage
|
||||
docker-compose exec app chmod -R 775 /var/www/html/storage
|
||||
docker-compose exec app mkdir -p /var/www/html/storage/logs
|
||||
```
|
||||
|
||||
**Host Permission Issues:**
|
||||
|
||||
```bash
|
||||
# Fix permission di host system
|
||||
sudo chown -R $(id -u):$(id -g) storage/
|
||||
sudo chown -R $(id -u):$(id -g) bootstrap/cache/
|
||||
chmod -R 775 storage/
|
||||
chmod -R 775 bootstrap/cache/
|
||||
```
|
||||
|
||||
### 3. Reset Containers
|
||||
|
||||
```bash
|
||||
# Stop dan remove containers
|
||||
docker-compose down
|
||||
|
||||
# Remove volumes (HATI-HATI: akan menghapus data database)
|
||||
docker-compose down -v
|
||||
|
||||
# Rebuild dari awal
|
||||
docker-compose up -d --build --force-recreate
|
||||
```
|
||||
|
||||
### 4. Cache Issues
|
||||
|
||||
```bash
|
||||
# Clear semua cache Laravel
|
||||
docker-compose exec app php artisan optimize:clear
|
||||
|
||||
# Clear Docker build cache
|
||||
docker system prune -f
|
||||
|
||||
# Clean rebuild everything
|
||||
./docker-rebuild.sh dev
|
||||
```
|
||||
|
||||
### 5. Database Import Issues
|
||||
|
||||
```bash
|
||||
# Jika auto-import gagal
|
||||
./docker-import-db.sh dev
|
||||
|
||||
# Jika database corrupt
|
||||
docker-compose down -v
|
||||
docker-compose up -d
|
||||
./docker-import-db.sh dev
|
||||
```
|
||||
|
||||
### 6. Redis Connection Issues
|
||||
|
||||
Jika mengalami error "Class Redis not found":
|
||||
|
||||
```bash
|
||||
# Test Redis functionality
|
||||
./docker-test-redis.sh dev
|
||||
|
||||
# Rebuild containers dengan Redis extension
|
||||
./docker-rebuild.sh dev
|
||||
|
||||
# Manual fix: Clear cache dan config
|
||||
docker-compose exec app php artisan config:clear
|
||||
docker-compose exec app php artisan cache:clear
|
||||
```
|
||||
|
||||
**Common Redis Errors:**
|
||||
- **Class Redis not found**: Fixed dengan install `pecl install redis`
|
||||
- **Connection refused**: Pastikan Redis container berjalan
|
||||
- **Config not loaded**: Jalankan `php artisan config:clear`
|
||||
|
||||
## Security Notes untuk Production
|
||||
|
||||
1. **Environment Variables**: Jangan commit file `.env` ke repository
|
||||
2. **Database Passwords**: Gunakan password yang kuat
|
||||
3. **SSL/TLS**: Setup SSL certificate untuk HTTPS
|
||||
4. **Firewall**: Konfigurasi firewall untuk membatasi akses port
|
||||
5. **Updates**: Regular update Docker images dan dependencies
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### 1. Production Optimizations
|
||||
|
||||
```bash
|
||||
# Laravel optimizations
|
||||
docker-compose exec app php artisan config:cache
|
||||
docker-compose exec app php artisan route:cache
|
||||
docker-compose exec app php artisan view:cache
|
||||
docker-compose exec app composer install --optimize-autoloader --no-dev
|
||||
```
|
||||
|
||||
### 2. Docker Optimizations
|
||||
|
||||
- Gunakan multi-stage builds untuk image yang lebih kecil
|
||||
- Leverage Docker layer caching
|
||||
- Optimize .dockerignore untuk build speed
|
||||
|
||||
## Backup Strategy
|
||||
|
||||
### 1. Automated Backups
|
||||
|
||||
Buat script backup otomatis:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# backup.sh
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
docker-compose exec db mysqldump -u root -p${DB_ROOT_PASSWORD} ckb_production > "backup_${DATE}.sql"
|
||||
tar -czf "backup_${DATE}.tar.gz" backup_${DATE}.sql storage/
|
||||
```
|
||||
|
||||
### 2. Volume Backups
|
||||
|
||||
```bash
|
||||
# Backup Docker volumes
|
||||
docker run --rm -v ckb_mysql_data:/data -v $(pwd):/backup alpine tar czf /backup/mysql_backup.tar.gz /data
|
||||
```
|
||||
|
||||
Untuk pertanyaan lebih lanjut atau issues, silakan buat issue di repository ini.
|
||||
Reference in New Issue
Block a user