Setup lengkap untuk menjalankan multiple Laravel applications dalam satu container FrankenPHP dengan domain yang berbeda.
- β Multi-Domain Support - Satu container untuk multiple Laravel apps
- β FrankenPHP - Performance tinggi dengan worker mode
- β Auto SSL - Let's Encrypt untuk production, self-signed untuk development
- β Database Isolation - Setiap app punya database terpisah
- β Redis Caching - Shared Redis untuk semua aplikasi
- β Queue Workers - Supervisor untuk background jobs
- β Development Tools - phpMyAdmin, Vite dev server
- β Easy Deployment - Script otomatis untuk VPS
laravel-multi-domain/
βββ apps/ # Laravel applications
β βββ tokoonline/ # E-commerce app
β βββ blog/ # Blog app
β βββ portfolio/ # Portfolio app
βββ docker/ # Docker configurations
β βββ php/
β β βββ Dockerfile
β β βββ Caddyfile # Multi-domain configuration
β βββ node/
β βββ supervisor/
βββ scripts/ # Deployment scripts
β βββ setup-local.sh # Local development setup
β βββ deploy-to-vps.sh # VPS deployment
β βββ init-databases.sql # Database initialization
βββ docs/ # Documentation
βββ docker-compose.yml # Multi-domain services
-
Clone repository
git clone <repository-url> cd laravel-multi-domain
-
Run setup script
chmod +x scripts/setup-local.sh ./scripts/setup-local.sh
-
Access applications
- Toko Online: https://tokoonline.local
- Blog: https://blog.local
- Portfolio: https://portfolio.local
- phpMyAdmin: http://localhost:8001
-
Prepare VPS
- Ubuntu 20.04+ atau Debian 11+
- Minimal 2GB RAM, 20GB storage
- Domain sudah pointing ke VPS IP
-
Run deployment script
chmod +x scripts/deploy-to-vps.sh ./scripts/deploy-to-vps.sh
-
Follow prompts
- Masukkan VPS IP address
- Konfirmasi domain names
- Script akan otomatis setup semuanya
- Docker & Docker Compose
- Git
- SSH access ke VPS (untuk production)
-
Setup hosts file
# Windows: C:\Windows\System32\drivers\etc\hosts # Linux/Mac: /etc/hosts 127.0.0.1 tokoonline.local 127.0.0.1 blog.local 127.0.0.1 portfolio.local
-
Create Laravel applications
mkdir -p apps cd apps # Create each Laravel app composer create-project laravel/laravel tokoonline composer create-project laravel/laravel blog composer create-project laravel/laravel portfolio
-
Configure environment files
# For each app, copy .env.example to .env and update: # - APP_NAME # - APP_URL # - DB_DATABASE, DB_USERNAME, DB_PASSWORD # - DB_HOST=mysql # - REDIS_HOST=redis
-
Start services
docker-compose up -d --build
-
Setup Laravel in containers
# For each app docker-compose exec frankenphp bash cd /var/www/tokoonline composer install php artisan key:generate php artisan migrate
-
Prepare VPS
# Update system apt update && apt upgrade -y # Install Docker curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh # Install Docker Compose curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
-
Copy project files
scp -r . root@your-vps-ip:/var/www/docker-setup/
-
Update Caddyfile
# Replace .local domains with actual domains # Update email for SSL certificates
-
Deploy
ssh root@your-vps-ip cd /var/www/docker-setup docker-compose up -d --build
Edit docker/php/Caddyfile
untuk mengatur domain:
# Development
tokoonline.local {
tls internal
# ... config
}
# Production
tokoonline.com {
# SSL otomatis dari Let's Encrypt
# ... config
}
Setiap aplikasi memiliki database terpisah:
tokoonline_db
βtokoonline_user
blog_db
βblog_user
portfolio_db
βportfolio_user
Development:
APP_ENV=local
APP_DEBUG=true
DB_HOST=mysql
REDIS_HOST=redis
Production:
APP_ENV=production
APP_DEBUG=false
DB_HOST=mysql
REDIS_HOST=redis
# Start services
docker-compose up -d
# Stop services
docker-compose down
# View logs
docker-compose logs -f frankenphp
# Access container
docker-compose exec frankenphp bash
# Restart services
docker-compose restart
# Run artisan commands
docker-compose exec frankenphp php artisan migrate
# Install packages
docker-compose exec frankenphp composer install
# Clear cache
docker-compose exec frankenphp php artisan cache:clear
# Queue workers (handled by supervisor)
docker-compose logs supervisor
# Access MySQL
docker-compose exec mysql mysql -u root -p
# Backup database
docker-compose exec mysql mysqldump -u root -p tokoonline_db > backup.sql
# Restore database
docker-compose exec -T mysql mysql -u root -p tokoonline_db < backup.sql
php_server {
worker index.php 4 # Adjust based on CPU cores
}
# Production optimizations
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
# Composer optimization
composer install --no-dev --optimize-autoloader
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
- Development: Self-signed certificates
- Production: Let's Encrypt automatic
header {
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-XSS-Protection "1; mode=block"
Strict-Transport-Security "max-age=31536000"
}
# UFW configuration
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
# Check container status
docker-compose ps
# Check resource usage
docker stats
# Check logs
docker-compose logs -f --tail=100
- FrankenPHP:
docker-compose logs frankenphp
- MySQL:
docker-compose logs mysql
- Redis:
docker-compose logs redis
- Supervisor:
docker-compose logs supervisor
-
Port conflicts
# Check what's using port 80/443 netstat -tulpn | grep :80
-
Permission issues
# Fix Laravel permissions chmod -R 755 apps/ chmod -R 775 apps/*/storage apps/*/bootstrap/cache
-
SSL certificate issues
# Check Caddy logs docker-compose logs frankenphp | grep -i ssl
-
Database connection issues
# Test database connection docker-compose exec frankenphp php artisan tinker DB::connection()->getPdo();
# Enable debug logging
# In Caddyfile, change log level to DEBUG
log {
level DEBUG
}
- Fork repository
- Create feature branch
- Make changes
- Test thoroughly
- Submit pull request
MIT License - see LICENSE file for details.
- Issues: Create GitHub issue
- Documentation: Check docs/ folder
- Community: Join discussions
Happy coding! π
Dibuat dengan β€οΈ untuk komunitas Laravel Indonesia