xây dựng docker

This commit is contained in:
Victor Phan
2026-01-14 14:51:03 +07:00
parent a990a01ee5
commit 610c88debc
25 changed files with 1033 additions and 15 deletions

28
.dockerignore Normal file
View File

@@ -0,0 +1,28 @@
node_modules/
npm-debug.log
yarn-error.log
vendor/
.git
.gitignore
.gitattributes
.env
.env.*
!.env.docker
.DS_Store
Thumbs.db
*.log
storage/logs/*
storage/framework/cache/*
storage/framework/sessions/*
storage/framework/views/*
bootstrap/cache/*
.phpunit.result.cache
coverage/
*.sql
*.csv
*.backup
.idea/
.vscode/
*.swp
*.swo
*~

23
.env
View File

@@ -1,30 +1,32 @@
APP_NAME=Laravel APP_NAME=LuckyWheel
APP_ENV=local APP_ENV=local
APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU= APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU=
APP_DEBUG=true APP_DEBUG=true
APP_URL=http://localhost APP_URL=http://localhost:8080
LOG_CHANNEL=stack LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug LOG_LEVEL=debug
# Database Configuration for Docker
DB_CONNECTION=mysql DB_CONNECTION=mysql
DB_HOST=127.0.0.1 DB_HOST=db
DB_PORT=3306 DB_PORT=3306
DB_DATABASE=luckywheel DB_DATABASE=luckywheel
DB_USERNAME=laravel DB_USERNAME=laravel
DB_PASSWORD=laravel123 DB_PASSWORD=laravel123
BROADCAST_DRIVER=log BROADCAST_DRIVER=log
CACHE_DRIVER=file CACHE_DRIVER=redis
FILESYSTEM_DISK=local FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync QUEUE_CONNECTION=sync
SESSION_DRIVER=file SESSION_DRIVER=redis
SESSION_LIFETIME=120 SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1 MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1 # Redis Configuration for Docker
REDIS_HOST=redis
REDIS_PASSWORD=null REDIS_PASSWORD=null
REDIS_PORT=6379 REDIS_PORT=6379
@@ -48,7 +50,7 @@ PUSHER_APP_KEY=
PUSHER_APP_SECRET= PUSHER_APP_SECRET=
PUSHER_HOST= PUSHER_HOST=
PUSHER_PORT=443 PUSHER_PORT=443
PUSHER_SCHEME=https PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1 PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
@@ -56,10 +58,3 @@ VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}" VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=1909415
PUSHER_APP_KEY=242f238ba1f5a0a20de3
PUSHER_APP_SECRET=5afc35e0dddb385d586f
PUSHER_APP_CLUSTER=ap1

View File

@@ -0,0 +1,65 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=luckywheel
DB_USERNAME=laravel
DB_PASSWORD=laravel123
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=1909415
PUSHER_APP_KEY=242f238ba1f5a0a20de3
PUSHER_APP_SECRET=5afc35e0dddb385d586f
PUSHER_APP_CLUSTER=ap1

View File

@@ -0,0 +1,60 @@
APP_NAME=LuckyWheel
APP_ENV=local
APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU=
APP_DEBUG=true
APP_URL=http://localhost:8080
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
# Database Configuration for Docker
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=luckywheel
DB_USERNAME=laravel
DB_PASSWORD=laravel123
BROADCAST_DRIVER=log
CACHE_DRIVER=redis
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=redis
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
# Redis Configuration for Docker
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

60
.env.docker Normal file
View File

@@ -0,0 +1,60 @@
APP_NAME=LuckyWheel
APP_ENV=local
APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU=
APP_DEBUG=true
APP_URL=http://localhost:8080
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
# Database Configuration for Docker
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=luckywheel
DB_USERNAME=laravel
DB_PASSWORD=laravel123
BROADCAST_DRIVER=log
CACHE_DRIVER=redis
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=redis
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
# Redis Configuration for Docker
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

310
DOCKER_README.md Normal file
View File

@@ -0,0 +1,310 @@
# 🐳 HƯỚNG DẪN SỬ DỤNG DOCKER CHO DỰ ÁN LUCKY WHEEL
## 📋 Yêu Cầu Hệ Thống
- Docker version 20.10 trở lên
- Docker Compose version 2.0 trở lên
- Ít nhất 4GB RAM
- 10GB dung lượng ổ cứng trống
## 🚀 Cài Đặt Docker (Nếu chưa có)
### Ubuntu/Debian:
```bash
# Cài đặt Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Thêm user vào group docker
sudo usermod -aG docker $USER
# Docker Compose V2 đã được tích hợp sẵn trong Docker
# Kiểm tra: docker compose version
# Logout và login lại để áp dụng thay đổi
```
## 🎯 Khởi Động Dự Án
### Cách 1: Sử dụng script tự động (Khuyến nghị)
```bash
./docker-setup.sh
```
Script này sẽ tự động:
- ✅ Tạo file .env từ .env.docker
- ✅ Build Docker images
- ✅ Khởi động containers
- ✅ Chạy migrations
- ✅ Seed dữ liệu
- ✅ Cấu hình storage link
- ✅ Optimize ứng dụng
### Cách 2: Thủ công
```bash
# 1. Sao chép file .env
cp .env.docker .env
# 2. Build và khởi động containers
docker compose up -d --build
# 3. Chờ MySQL khởi động (30 giây)
sleep 30
# 4. Chạy migrations
docker compose exec app php artisan migrate --force
# 5. Seed dữ liệu
docker compose exec app php artisan db:seed --class=DanhSachGiaiThuongSeeder --force
# 6. Tạo symbolic link
docker compose exec app php artisan storage:link
# 7. Clear và cache
docker compose exec app php artisan config:cache
docker compose exec app php artisan route:cache
docker compose exec app php artisan view:cache
```
## 🌐 Truy Cập Ứng Dụng
| Dịch vụ | URL | Thông tin đăng nhập |
|---------|-----|---------------------|
| **Laravel App** | http://localhost:8080 | - |
| **PHPMyAdmin** | http://localhost:8081 | User: `laravel`<br>Pass: `laravel123` |
| **MySQL** | localhost:3307 | Database: `luckywheel`<br>User: `laravel`<br>Pass: `laravel123`<br>Root Pass: `root123` |
| **Redis** | localhost:6380 | - |
## 📦 Cấu Trúc Docker
```
LuckyWheel/
├── docker-compose.yml # Cấu hình Docker Compose
├── Dockerfile # Dockerfile cho PHP/Laravel
├── .dockerignore # Loại trừ files khi build
├── .env.docker # Environment cho Docker
├── docker-setup.sh # Script khởi động tự động
├── docker-stop.sh # Script dừng containers
└── docker/
├── nginx/
│ └── default.conf # Cấu hình Nginx
├── supervisor/
│ └── supervisord.conf # Cấu hình Supervisor
└── mysql/
└── my.cnf # Cấu hình MySQL
```
## 🔧 Các Lệnh Docker Hữu Ích
### Quản lý Containers
```bash
# Xem trạng thái containers
docker compose ps
# Xem logs của tất cả services
docker compose logs -f
# Xem logs của một service cụ thể
docker compose logs -f app
docker compose logs -f db
# Dừng containers (giữ nguyên dữ liệu)
docker compose down
# Dừng containers và XÓA dữ liệu
docker compose down -v
# Khởi động lại containers
docker compose restart
# Khởi động lại một service cụ thể
docker compose restart app
```
### Thao tác với Container App
```bash
# Truy cập vào container app
docker compose exec app bash
# Chạy Artisan commands
docker compose exec app php artisan migrate
docker compose exec app php artisan db:seed
docker compose exec app php artisan tinker
docker compose exec app php artisan config:clear
docker compose exec app php artisan cache:clear
# Cài đặt Composer packages
docker compose exec app composer install
docker compose exec app composer require package-name
# Chạy tests
docker compose exec app php artisan test
```
### Thao tác với Database
```bash
# Truy cập MySQL CLI
docker compose exec db mysql -u laravel -plaravel123 luckywheel
# Backup database
docker compose exec db mysqldump -u laravel -plaravel123 luckywheel > backup_$(date +%Y%m%d_%H%M%S).sql
# Restore database
docker compose exec -T db mysql -u laravel -plaravel123 luckywheel < backup.sql
# Reset database
docker compose exec app php artisan migrate:fresh --seed
```
### Quản lý Images
```bash
# Xem danh sách images
docker images
# Rebuild image (không dùng cache)
docker compose build --no-cache
# Xóa images không sử dụng
docker image prune -a
```
## 🔍 Xử Lý Sự Cố
### Lỗi: Port đã được sử dụng
```bash
# Kiểm tra process đang sử dụng port
sudo lsof -i :8080
sudo lsof -i :3307
# Hoặc thay đổi port trong docker-compose.yml
# Ví dụ: "8080:80" -> "8081:80"
```
### Lỗi: Permission denied
```bash
# Cấp quyền cho thư mục storage và bootstrap
docker compose exec app chown -R www-data:www-data /var/www/storage
docker compose exec app chown -R www-data:www-data /var/www/bootstrap/cache
docker compose exec app chmod -R 775 /var/www/storage
docker compose exec app chmod -R 775 /var/www/bootstrap/cache
```
### Lỗi: Cannot connect to MySQL
```bash
# Kiểm tra MySQL đã khởi động chưa
docker compose ps
# Xem logs MySQL
docker compose logs db
# Restart MySQL container
docker compose restart db
# Chờ 30 giây sau khi khởi động MySQL
```
### Lỗi: Composer dependencies
```bash
# Xóa vendor và cài lại
docker compose exec app rm -rf vendor
docker compose exec app composer install --optimize-autoloader
```
### Reset hoàn toàn dự án
```bash
# Dừng và xóa tất cả (bao gồm volumes)
docker compose down -v
# Xóa images
docker rmi luckywheel_app
# Chạy lại setup
./docker-setup.sh
```
## 📊 Giám sát Resources
```bash
# Xem tài nguyên đang sử dụng
docker stats
# Xem dung lượng đang sử dụng
docker system df
# Dọn dẹp tài nguyên không sử dụng
docker system prune -a
```
## 🔐 Bảo Mật
### Trong môi trường Production:
1. Thay đổi tất cả passwords trong `.env.docker`
2. Đặt `APP_DEBUG=false`
3. Đặt `APP_ENV=production`
4. Tắt PHPMyAdmin (comment trong docker-compose.yml)
5. Sử dụng HTTPS
6. Giới hạn exposed ports
### File .env.docker cho Production:
```env
APP_ENV=production
APP_DEBUG=false
DB_PASSWORD=<password_mạnh>
MYSQL_ROOT_PASSWORD=<password_mạnh>
```
## 🚀 Deploy lên Server
### 1. Clone repository
```bash
git clone <repository-url>
cd LuckyWheel
```
### 2. Chạy setup
```bash
./docker-setup.sh
```
### 3. Cấu hình reverse proxy (Nginx)
```nginx
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
## 📝 Ghi Chú
- Tất cả dữ liệu database được lưu trong Docker volume `dbdata`
- Redis data được lưu trong volume `redisdata`
- Source code được mount từ host vào container, thay đổi sẽ reflect ngay lập tức
- Logs được lưu trong `/var/log/supervisor/` bên trong container
## 💡 Tips & Tricks
1. **Development nhanh**: Code changes tự động reflect, không cần rebuild
2. **Database GUI**: Sử dụng PHPMyAdmin tại http://localhost:8081
3. **Redis GUI**: Có thể cài thêm Redis Commander nếu cần
4. **Xem real-time logs**: `docker compose logs -f app`
5. **Quick restart**: `docker compose restart app` thay vì down/up
## 🆘 Hỗ Trợ
Nếu gặp vấn đề, kiểm tra:
1. Docker và Docker Compose đã được cài đúng phiên bản
2. Ports 8080, 8081, 3307, 6380 chưa được sử dụng
3. Có đủ dung lượng ổ cứng và RAM
4. Logs của containers: `docker compose logs`
---
**Chúc bạn deploy thành công! 🎉**

60
Dockerfile Normal file
View File

@@ -0,0 +1,60 @@
FROM php:8.1-fpm
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
libicu-dev \
zip \
unzip \
nginx \
supervisor
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd intl
# Install Redis extension
RUN pecl install redis && docker-php-ext-enable redis
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www
# Copy existing application directory contents
COPY . /var/www
# Install dependencies
RUN composer install --optimize-autoloader --no-dev
# Create required directories and set permissions
RUN mkdir -p /var/www/storage/framework/sessions \
/var/www/storage/framework/views \
/var/www/storage/framework/cache \
/var/www/storage/framework/testing \
/var/www/storage/logs \
/var/www/storage/app/public \
/var/www/bootstrap/cache
# Set ownership and permissions
RUN chown -R www-data:www-data /var/www
RUN chmod -R 775 /var/www/storage /var/www/bootstrap/cache
# Copy nginx configuration
COPY docker/nginx/default.conf /etc/nginx/sites-available/default
# Copy supervisor configuration
COPY docker/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Expose port 80
EXPOSE 80
# Start supervisor
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

163
HUONG_DAN_DOCKER.md Normal file
View File

@@ -0,0 +1,163 @@
# 🎡 HƯỚNG DẪN SỬ DỤNG DOCKER - DỰ ÁN LUCKY WHEEL
## 🚀 Khởi động dự án lần đầu
```bash
./docker-setup.sh
```
## 🌐 Truy cập ứng dụng
| Dịch vụ | URL | Thông tin đăng nhập |
|---------|-----|---------------------|
| **Ứng dụng Web** | http://localhost:8080 | - |
| **PHPMyAdmin** | http://localhost:8081 | User: `laravel`<br>Password: `laravel123` |
| **MySQL** | localhost:3307 | Database: `luckywheel`<br>User: `laravel`<br>Password: `laravel123` |
| **Redis** | localhost:6380 | - |
## 📝 Các lệnh thường dùng
### Quản lý containers
```bash
# Xem trạng thái containers
docker compose ps
# Xem logs
docker compose logs -f
# Dừng containers
docker compose down
# Khởi động lại
docker compose restart
# Dừng và xóa hoàn toàn (bao gồm dữ liệu)
docker compose down -v
```
### Làm việc với ứng dụng
```bash
# Vào container app
docker compose exec app bash
# Chạy lệnh artisan
docker compose exec app php artisan migrate
docker compose exec app php artisan db:seed
docker compose exec app php artisan tinker
# Clear cache
docker compose exec app php artisan cache:clear
docker compose exec app php artisan config:clear
docker compose exec app php artisan view:clear
# Cài package mới
docker compose exec app composer require package-name
```
### Làm việc với database
```bash
# Truy cập MySQL CLI
docker compose exec db mysql -u laravel -plaravel123 luckywheel
# Backup database
docker compose exec db mysqldump -u laravel -plaravel123 luckywheel > backup.sql
# Import database
docker compose exec -T db mysql -u laravel -plaravel123 luckywheel < backup.sql
# Reset database
docker compose exec app php artisan migrate:fresh --seed
```
## 🔧 Sửa lỗi thường gặp
### Lỗi quyền truy cập (Permission denied)
```bash
docker compose exec app chmod -R 777 /var/www/storage /var/www/bootstrap/cache
```
### Lỗi không kết nối được MySQL
```bash
# Restart MySQL
docker compose restart db
# Xem logs MySQL
docker compose logs db
```
### Port bị chiếm
Mở file `docker-compose.yml` và thay đổi port:
- `"8080:80"``"8081:80"` (cho app)
- `"3307:3306"``"3308:3306"` (cho MySQL)
### Rebuild lại toàn bộ
```bash
docker compose down -v
docker compose build --no-cache
docker compose up -d
```
## 📂 Cấu trúc Docker
```
LuckyWheel/
├── Dockerfile # Build image PHP/Laravel
├── docker-compose.yml # Cấu hình services
├── .env.docker # Environment cho Docker
├── docker-setup.sh # Script khởi động tự động
├── docker-stop.sh # Script dừng containers
└── docker/
├── nginx/
│ └── default.conf # Cấu hình Nginx
├── supervisor/
│ └── supervisord.conf # Cấu hình Supervisor
└── mysql/
└── my.cnf # Cấu hình MySQL
```
## 💾 Import/Export dữ liệu
### Import file SQL có sẵn
```bash
docker compose exec -T db mysql -u laravel -plaravel123 luckywheel < your-file.sql
```
### Backup toàn bộ database
```bash
docker compose exec db mysqldump -u laravel -plaravel123 luckywheel > backup_$(date +%Y%m%d_%H%M%S).sql
```
## 🎯 Workflow phát triển
1. **Sửa code**: Chỉnh sửa file PHP/Blade trực tiếp, thay đổi tự động reflect
2. **Chạy migration**: `docker compose exec app php artisan migrate`
3. **Test**: Truy cập http://localhost:8080 để xem kết quả
4. **Xem logs**: `docker compose logs -f app`
5. **Debug**: `docker compose exec app php artisan tinker`
## 🛑 Dừng dự án
```bash
# Dừng containers (giữ nguyên dữ liệu)
./docker-stop.sh
# Hoặc
docker compose down
# Dừng và XÓA toàn bộ dữ liệu
docker compose down -v
```
## Thông tin thêm
- Source code được mount từ host → thay đổi code không cần rebuild
- Database được lưu trong Docker volume `dbdata`
- Redis data được lưu trong volume `redisdata`
- Logs nằm trong `/var/log/supervisor/` bên trong container
## 🆘 Cần trợ giúp?
Xem file [DOCKER_README.md](DOCKER_README.md) để có hướng dẫn chi tiết hơn.
---
**Chúc bạn code vui vẻ! 🎉**

0
bootstrap/cache/.gitignore vendored Normal file → Executable file
View File

90
docker-compose.yml Normal file
View File

@@ -0,0 +1,90 @@
services:
# PHP & Nginx Application
app:
build:
context: .
dockerfile: Dockerfile
container_name: luckywheel_app
restart: unless-stopped
working_dir: /var/www
volumes:
- ./:/var/www
- ./docker/nginx/default.conf:/etc/nginx/sites-available/default
- ./docker/supervisor/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
ports:
- "8080:80"
networks:
- luckywheel
depends_on:
- db
- redis
environment:
- APP_ENV=local
- APP_DEBUG=true
- DB_HOST=db
- DB_PORT=3306
- DB_DATABASE=luckywheel
- DB_USERNAME=laravel
- DB_PASSWORD=laravel123
- REDIS_HOST=redis
- REDIS_PORT=6379
# MySQL Database
db:
image: mysql:8.0
container_name: luckywheel_db
restart: unless-stopped
environment:
MYSQL_DATABASE: luckywheel
MYSQL_USER: laravel
MYSQL_PASSWORD: laravel123
MYSQL_ROOT_PASSWORD: root123
MYSQL_ALLOW_EMPTY_PASSWORD: 0
volumes:
- dbdata:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- "3307:3306"
networks:
- luckywheel
command: --default-authentication-plugin=mysql_native_password
# Redis
redis:
image: redis:7-alpine
container_name: luckywheel_redis
restart: unless-stopped
ports:
- "6380:6379"
networks:
- luckywheel
volumes:
- redisdata:/data
# PHPMyAdmin (Optional - for database management)
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: luckywheel_phpmyadmin
restart: unless-stopped
ports:
- "8081:80"
environment:
PMA_HOST: db
PMA_PORT: 3306
PMA_USER: laravel
PMA_PASSWORD: laravel123
UPLOAD_LIMIT: 100M
networks:
- luckywheel
depends_on:
- db
networks:
luckywheel:
driver: bridge
volumes:
dbdata:
driver: local
redisdata:
driver: local

99
docker-setup.sh Executable file
View File

@@ -0,0 +1,99 @@
#!/bin/bash
# Script khởi động Docker cho dự án Lucky Wheel
echo "🎡 Lucky Wheel - Docker Setup Script"
echo "===================================="
# Kiểm tra Docker và Docker Compose
if ! command -v docker &> /dev/null; then
echo "❌ Docker chưa được cài đặt. Vui lòng cài đặt Docker trước."
exit 1
fi
if ! command -v docker compose &> /dev/null; then
echo "❌ Docker Compose chưa được cài đặt. Vui lòng cài đặt Docker Compose trước."
exit 1
fi
echo "✅ Docker và Docker Compose đã được cài đặt"
# Sao chép file .env.docker thành .env
echo ""
echo "📋 Cấu hình file .env..."
if [ -f .env ]; then
echo "⚠️ File .env đã tồn tại. Tạo backup..."
cp .env .env.backup.$(date +%Y%m%d_%H%M%S)
fi
cp .env.docker .env
echo "✅ Đã sao chép .env.docker thành .env"
# Dừng và xóa các container cũ (nếu có)
echo ""
echo "🛑 Dừng và xóa các container cũ..."
docker compose down -v
# Build và khởi động containers
echo ""
echo "🔨 Building Docker images..."
docker compose build --no-cache
echo ""
echo "🚀 Khởi động containers..."
docker compose up -d
# Chờ MySQL khởi động hoàn toàn
echo ""
echo "⏳ Chờ MySQL khởi động (30 giây)..."
sleep 30
# Chạy migrations và seeders
echo ""
echo "📊 Chạy database migrations..."
docker compose exec app php artisan migrate --force
echo ""
echo "🌱 Chạy database seeders..."
docker compose exec app php artisan db:seed --class=DanhSachGiaiThuongSeeder --force || true
# Tạo symbolic link cho storage
echo ""
echo "🔗 Tạo symbolic link cho storage..."
docker compose exec app php artisan storage:link
# Clear cache
echo ""
echo "🧹 Clear cache..."
docker compose exec app php artisan config:clear
docker compose exec app php artisan cache:clear
docker compose exec app php artisan view:clear
docker compose exec app php artisan route:clear
# Optimize
echo ""
echo "⚡ Optimize application..."
docker compose exec app php artisan config:cache
docker compose exec app php artisan route:cache
docker compose exec app php artisan view:cache
echo ""
echo "✅ Hoàn tất!"
echo ""
echo "📌 Thông tin dịch vụ:"
echo " - Ứng dụng Laravel: http://localhost:8080"
echo " - PHPMyAdmin: http://localhost:8081"
echo " - MySQL: localhost:3307"
echo " - Redis: localhost:6380"
echo ""
echo "📝 Thông tin đăng nhập MySQL:"
echo " - Database: luckywheel"
echo " - Username: laravel"
echo " - Password: laravel123"
echo " - Root Password: root123"
echo ""
echo "🔧 Các lệnh hữu ích:"
echo " - Xem logs: docker compose logs -f"
echo " - Xem logs app: docker compose logs -f app"
echo " - Vào container app: docker compose exec app bash"
echo " - Dừng services: docker compose down"
echo " - Khởi động lại: docker compose restart"
echo ""

11
docker-stop.sh Executable file
View File

@@ -0,0 +1,11 @@
#!/bin/bash
# Script dừng Docker cho dự án Lucky Wheel
echo "🛑 Dừng Lucky Wheel Docker Containers..."
docker compose down
echo "✅ Đã dừng tất cả containers"
echo ""
echo "💡 Để khởi động lại, chạy: ./docker-setup.sh"
echo "💡 Để xóa tất cả dữ liệu (bao gồm database), chạy: docker compose down -v"

13
docker/mysql/my.cnf Normal file
View File

@@ -0,0 +1,13 @@
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-authentication-plugin=mysql_native_password
max_allowed_packet=100M
innodb_buffer_pool_size=256M
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

45
docker/nginx/default.conf Normal file
View File

@@ -0,0 +1,45 @@
server {
listen 80;
server_name localhost;
root /var/www/public;
index index.php index.html index.htm;
charset utf-8;
# Increase upload size
client_max_body_size 100M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}
location ~ /\.(?!well-known).* {
deny all;
}
# Disable access to hidden files
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# Security headers
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
}

View File

@@ -0,0 +1,19 @@
[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
[program:php-fpm]
command=/usr/local/sbin/php-fpm -F
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/php-fpm.log
stderr_logfile=/var/log/supervisor/php-fpm-error.log
[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/nginx.log
stderr_logfile=/var/log/supervisor/nginx-error.log

View File

@@ -1 +1 @@
/home/x79/LuckyWheel/storage/app/public /var/www/storage/app/public

0
storage/app/.gitignore vendored Normal file → Executable file
View File

0
storage/app/public/.gitignore vendored Normal file → Executable file
View File

0
storage/framework/.gitignore vendored Normal file → Executable file
View File

0
storage/framework/cache/.gitignore vendored Normal file → Executable file
View File

0
storage/framework/cache/data/.gitignore vendored Normal file → Executable file
View File

0
storage/framework/sessions/.gitignore vendored Normal file → Executable file
View File

0
storage/framework/testing/.gitignore vendored Normal file → Executable file
View File

0
storage/framework/views/.gitignore vendored Normal file → Executable file
View File

0
storage/logs/.gitignore vendored Normal file → Executable file
View File