diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..df3f249
--- /dev/null
+++ b/.dockerignore
@@ -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
+*~
diff --git a/.env b/.env
index c9fad78..15d87af 100644
--- a/.env
+++ b/.env
@@ -1,30 +1,32 @@
-APP_NAME=Laravel
+APP_NAME=LuckyWheel
APP_ENV=local
APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU=
APP_DEBUG=true
-APP_URL=http://localhost
+APP_URL=http://localhost:8080
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
+# Database Configuration for Docker
DB_CONNECTION=mysql
-DB_HOST=127.0.0.1
+DB_HOST=db
DB_PORT=3306
DB_DATABASE=luckywheel
DB_USERNAME=laravel
DB_PASSWORD=laravel123
BROADCAST_DRIVER=log
-CACHE_DRIVER=file
+CACHE_DRIVER=redis
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
-SESSION_DRIVER=file
+SESSION_DRIVER=redis
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
-REDIS_HOST=127.0.0.1
+# Redis Configuration for Docker
+REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
@@ -48,7 +50,7 @@ PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
-PUSHER_SCHEME=https
+PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
@@ -56,10 +58,3 @@ 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
diff --git a/.env.backup.20260114_125203 b/.env.backup.20260114_125203
new file mode 100644
index 0000000..c9fad78
--- /dev/null
+++ b/.env.backup.20260114_125203
@@ -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
diff --git a/.env.backup.20260114_140612 b/.env.backup.20260114_140612
new file mode 100644
index 0000000..15d87af
--- /dev/null
+++ b/.env.backup.20260114_140612
@@ -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}"
diff --git a/.env.docker b/.env.docker
new file mode 100644
index 0000000..15d87af
--- /dev/null
+++ b/.env.docker
@@ -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}"
diff --git a/DOCKER_README.md b/DOCKER_README.md
new file mode 100644
index 0000000..f707f7a
--- /dev/null
+++ b/DOCKER_README.md
@@ -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`
Pass: `laravel123` |
+| **MySQL** | localhost:3307 | Database: `luckywheel`
User: `laravel`
Pass: `laravel123`
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=
+MYSQL_ROOT_PASSWORD=
+```
+
+## 🚀 Deploy lên Server
+
+### 1. Clone repository
+```bash
+git clone
+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! 🎉**
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..ab1abc3
--- /dev/null
+++ b/Dockerfile
@@ -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"]
diff --git a/HUONG_DAN_DOCKER.md b/HUONG_DAN_DOCKER.md
new file mode 100644
index 0000000..e6f37e6
--- /dev/null
+++ b/HUONG_DAN_DOCKER.md
@@ -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`
Password: `laravel123` |
+| **MySQL** | localhost:3307 | Database: `luckywheel`
User: `laravel`
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ẻ! 🎉**
diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore
old mode 100644
new mode 100755
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..0b37d7b
--- /dev/null
+++ b/docker-compose.yml
@@ -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
diff --git a/docker-setup.sh b/docker-setup.sh
new file mode 100755
index 0000000..9e588bd
--- /dev/null
+++ b/docker-setup.sh
@@ -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 ""
diff --git a/docker-stop.sh b/docker-stop.sh
new file mode 100755
index 0000000..def96f5
--- /dev/null
+++ b/docker-stop.sh
@@ -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"
diff --git a/docker/mysql/my.cnf b/docker/mysql/my.cnf
new file mode 100644
index 0000000..8add9dd
--- /dev/null
+++ b/docker/mysql/my.cnf
@@ -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
diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf
new file mode 100644
index 0000000..21418fa
--- /dev/null
+++ b/docker/nginx/default.conf
@@ -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";
+}
diff --git a/docker/supervisor/supervisord.conf b/docker/supervisor/supervisord.conf
new file mode 100644
index 0000000..941abba
--- /dev/null
+++ b/docker/supervisor/supervisord.conf
@@ -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
diff --git a/public/storage b/public/storage
index dad100b..69db7b0 120000
--- a/public/storage
+++ b/public/storage
@@ -1 +1 @@
-/home/x79/LuckyWheel/storage/app/public
\ No newline at end of file
+/var/www/storage/app/public
\ No newline at end of file
diff --git a/storage/app/.gitignore b/storage/app/.gitignore
old mode 100644
new mode 100755
diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore
old mode 100644
new mode 100755
diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore
old mode 100644
new mode 100755
diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore
old mode 100644
new mode 100755
diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore
old mode 100644
new mode 100755
diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore
old mode 100644
new mode 100755
diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore
old mode 100644
new mode 100755
diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore
old mode 100644
new mode 100755
diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore
old mode 100644
new mode 100755