diff --git a/Dockerfile b/Dockerfile index b325d82..2abcea3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -63,7 +63,8 @@ RUN mkdir -p /var/www/html/storage/logs \ && mkdir -p /var/www/html/bootstrap/cache \ && chown -R www-data:www-data /var/www/html \ && chmod -R 775 /var/www/html/storage \ - && chmod -R 775 /var/www/html/bootstrap/cache + && chmod -R 775 /var/www/html/bootstrap/cache \ + && chmod -R 755 /var/www/html/public # Create nginx config COPY ./docker/nginx.conf /etc/nginx/sites-available/default diff --git a/Dockerfile.dev b/Dockerfile.dev index 859a967..96bd8e1 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -71,7 +71,8 @@ RUN mkdir -p /var/www/html/storage/logs \ && mkdir -p /var/www/html/bootstrap/cache \ && chown -R www-data:www-data /var/www/html \ && chmod -R 775 /var/www/html/storage \ - && chmod -R 775 /var/www/html/bootstrap/cache + && chmod -R 775 /var/www/html/bootstrap/cache \ + && chmod -R 755 /var/www/html/public # Create nginx config for development COPY ./docker/nginx.dev.conf /etc/nginx/sites-available/default diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 3bf2bc0..08a9533 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -9,6 +9,7 @@ services: volumes: - ./storage:/var/www/html/storage - ./bootstrap/cache:/var/www/html/bootstrap/cache + - ./docker/php.ini:/usr/local/etc/php/conf.d/local.ini ports: - "80:80" environment: @@ -22,26 +23,28 @@ services: db: image: mysql:8.0 + platform: linux/amd64 container_name: ckb-mysql-prod restart: unless-stopped environment: - MYSQL_DATABASE: ckb_production - MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} - MYSQL_PASSWORD: ${DB_PASSWORD} - MYSQL_USER: ${DB_USERNAME} + MYSQL_DATABASE: ${DB_DATABASE:-ckb_production} + MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-rootpassword} + MYSQL_PASSWORD: ${DB_PASSWORD:-password} + MYSQL_USER: ${DB_USERNAME:-laravel} volumes: - mysql_data:/var/lib/mysql - - ./docker/mysql.cnf:/etc/mysql/conf.d/mysql.cnf + - ./docker/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro ports: - "3306:3306" networks: - ckb-network + command: --default-authentication-plugin=mysql_native_password redis: image: redis:7-alpine container_name: ckb-redis-prod restart: unless-stopped - command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD} + command: redis-server --appendonly yes ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD} volumes: - redis_data:/data ports: @@ -71,4 +74,4 @@ volumes: networks: ckb-network: - driver: bridge \ No newline at end of file + driver: bridge diff --git a/docker-compose.yml b/docker-compose.yml index 67b3355..695ed8c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,87 +1,94 @@ services: - app: - build: - context: . - dockerfile: Dockerfile.dev - container_name: ckb-app-dev - restart: unless-stopped - working_dir: /var/www/html - volumes: - - ./:/var/www/html - - ./docker/php.ini:/usr/local/etc/php/conf.d/local.ini - - storage_logs:/var/www/html/storage/logs - - storage_cache:/var/www/html/storage/framework - ports: - - "8000:80" - - "3000:3000" - environment: - - APP_ENV=local - - APP_DEBUG=true - depends_on: - - db - - redis - networks: - - ckb-network + app: + build: + context: . + dockerfile: Dockerfile.dev + container_name: ckb-app-dev + restart: unless-stopped + working_dir: /var/www/html + volumes: + - ./:/var/www/html + - ./docker/php.ini:/usr/local/etc/php/conf.d/local.ini + - ./docker/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini + - storage_logs:/var/www/html/storage/logs + - storage_cache:/var/www/html/storage/framework + ports: + - "8000:80" + - "3000:3000" + environment: + - APP_ENV=local + - APP_DEBUG=true + depends_on: + - db + - redis + networks: + - ckb-network - db: - image: mysql:8.0 - container_name: ckb-mysql - restart: unless-stopped - environment: - MYSQL_DATABASE: ckb_db - MYSQL_ROOT_PASSWORD: root - MYSQL_PASSWORD: password - MYSQL_USER: laravel - volumes: - - mysql_data:/var/lib/mysql - - ./ckb.sql:/docker-entrypoint-initdb.d/01-init.sql:ro - ports: - - "3306:3306" - networks: - - ckb-network + db: + image: mariadb:10.6 + platform: linux/amd64 + container_name: ckb-mysql-dev + restart: unless-stopped + environment: + MYSQL_DATABASE: ckb_db + MYSQL_ROOT_PASSWORD: root + MYSQL_PASSWORD: password + MYSQL_USER: laravel + volumes: + - mysql_data:/var/lib/mysql + - ./ckb.sql:/docker-entrypoint-initdb.d/01-init.sql:ro + - ./docker/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro + ports: + - "3306:3306" + networks: + - ckb-network - redis: - image: redis:7-alpine - container_name: ckb-redis - restart: unless-stopped - ports: - - "6379:6379" - networks: - - ckb-network + redis: + image: redis:7-alpine + container_name: ckb-redis-dev + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - ckb-network - phpmyadmin: - image: phpmyadmin/phpmyadmin - container_name: ckb-phpmyadmin - restart: unless-stopped - environment: - PMA_HOST: db - PMA_PORT: 3306 - MYSQL_ROOT_PASSWORD: root - ports: - - "8080:80" - depends_on: - - db - networks: - - ckb-network + phpmyadmin: + image: phpmyadmin/phpmyadmin + container_name: ckb-phpmyadmin + restart: unless-stopped + environment: + PMA_HOST: db + PMA_PORT: 3306 + MYSQL_ROOT_PASSWORD: root + ports: + - "8080:80" + depends_on: + - db + networks: + - ckb-network - mailhog: - image: mailhog/mailhog - container_name: ckb-mailhog - restart: unless-stopped - ports: - - "1025:1025" - - "8025:8025" - networks: - - ckb-network + mailhog: + image: mailhog/mailhog + container_name: ckb-mailhog + restart: unless-stopped + ports: + - "1025:1025" + - "8025:8025" + networks: + - ckb-network volumes: - mysql_data: - driver: local - storage_logs: - driver: local - storage_cache: - driver: local + mysql_data: + driver: local + redis_data: + driver: local + storage_logs: + driver: local + storage_cache: + driver: local networks: - ckb-network: - driver: bridge \ No newline at end of file + ckb-network: + driver: bridge diff --git a/docker-quick-setup.sh b/docker-quick-setup.sh index 7f22096..929f71a 100755 --- a/docker-quick-setup.sh +++ b/docker-quick-setup.sh @@ -107,6 +107,9 @@ start_containers() { print_status "Waiting for MySQL to be ready..." sleep 20 + # Wait a bit more for MySQL to be fully ready + sleep 10 + # Check if database was imported automatically if docker-compose exec -T db mysql -u root -proot -e "USE ckb_db; SHOW TABLES;" > /dev/null 2>&1; then table_count=$(docker-compose exec -T db mysql -u root -proot -e "USE ckb_db; SHOW TABLES;" 2>/dev/null | wc -l) @@ -118,7 +121,7 @@ start_containers() { fi else print_warning "Database not accessible. Running manual import..." - sleep 10 + sleep 15 ./docker-import-db.sh dev fi diff --git a/docker/env.example b/docker/env.example index d45d7f7..a3efcd4 100644 --- a/docker/env.example +++ b/docker/env.example @@ -12,34 +12,32 @@ DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=ckb_db -DB_USERNAME=laravel -DB_PASSWORD=password -DB_ROOT_PASSWORD=root +DB_USERNAME=root +DB_PASSWORD=root # Redis Configuration for Docker REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 -# Cache Configuration +BROADCAST_DRIVER=log CACHE_DRIVER=redis -QUEUE_CONNECTION=redis +FILESYSTEM_DRIVER=local +QUEUE_CONNECTION=sync SESSION_DRIVER=redis +SESSION_LIFETIME=120 -# Mail Configuration (using MailHog for development) +# Mail Configuration for Docker (MailHog) MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS=noreply@ckb.local +MAIL_FROM_ADDRESS=test@ckb.local MAIL_FROM_NAME="${APP_NAME}" -# Broadcasting -BROADCAST_DRIVER=log - -# AWS (if needed) +# AWS (if needed for production) AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 @@ -50,7 +48,13 @@ 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 -MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" -MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" \ No newline at end of file +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}" \ No newline at end of file diff --git a/docker/mysql.cnf b/docker/mysql.cnf index 5f88428..406af3a 100644 --- a/docker/mysql.cnf +++ b/docker/mysql.cnf @@ -4,27 +4,27 @@ default-authentication-plugin = mysql_native_password character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci -# Connection settings -max_connections = 200 -connect_timeout = 60 -wait_timeout = 600 -interactive_timeout = 600 - -# Buffer settings +# Performance settings innodb_buffer_pool_size = 256M innodb_log_file_size = 64M -innodb_log_buffer_size = 16M innodb_flush_log_at_trx_commit = 1 +innodb_flush_method = O_DIRECT -# Query cache -query_cache_type = 1 -query_cache_size = 32M -query_cache_limit = 2M +# Connection settings +max_connections = 200 +max_allowed_packet = 16M # Logging +general_log = 0 slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 # Security -local_infile = 0 \ No newline at end of file +sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO + +[mysql] +default-character-set = utf8mb4 + +[client] +default-character-set = utf8mb4 \ No newline at end of file diff --git a/docker/php.ini b/docker/php.ini index aa6d400..2092a28 100644 --- a/docker/php.ini +++ b/docker/php.ini @@ -1,21 +1,16 @@ -; PHP Configuration for CKB Laravel App +; PHP Configuration for Laravel -; Maximum execution time -max_execution_time = 300 - -; Maximum input time -max_input_time = 300 - -; Memory limit +; General settings memory_limit = 512M - -; Upload settings -upload_max_filesize = 100M +max_execution_time = 300 +max_input_time = 300 post_max_size = 100M +upload_max_filesize = 100M max_file_uploads = 20 -; Error reporting +; Error reporting (will be overridden by environment) display_errors = Off +display_startup_errors = Off log_errors = On error_log = /var/log/php_errors.log @@ -23,14 +18,37 @@ error_log = /var/log/php_errors.log date.timezone = Asia/Jakarta ; Session settings +session.save_handler = files +session.save_path = /var/www/html/storage/framework/sessions session.gc_maxlifetime = 1440 session.cookie_lifetime = 0 +session.cookie_secure = Off +session.cookie_httponly = On -; OPcache settings +; OPcache settings (for production performance) opcache.enable = 1 +opcache.enable_cli = 0 opcache.memory_consumption = 128 opcache.interned_strings_buffer = 8 opcache.max_accelerated_files = 4000 opcache.revalidate_freq = 2 opcache.fast_shutdown = 1 -opcache.enable_cli = 1 \ No newline at end of file + +; Security settings +expose_php = Off +allow_url_fopen = On +allow_url_include = Off + +; File uploads +file_uploads = On +upload_tmp_dir = /tmp + +; MySQL settings +mysqli.default_port = 3306 +mysqli.default_socket = +mysqli.default_host = +mysqli.default_user = +mysqli.default_pw = + +; Redis extension +extension = redis.so \ No newline at end of file