# ============================================== # ๐Ÿ’ป Laravel Docker Development & Production # ============================================== # Load .env variables ifneq (,$(wildcard .env)) include .env export $(shell sed 's/=.*//' .env) else $(error ".env file not found. Please create it first.") endif # ------------------------------- # ๐Ÿ’พ APP PATHS # ------------------------------- PROJECT_NAME ?= $(PROJECT_NAME) HOST_APP_PATH=./$(APP_HOST_DIR) CONTAINER_APP_PATH=/var/www/app # Check for a short override 'PDIR' (Project Directory) and use it. # If PDIR is provided via command line (make setup PDIR=...), it takes precedence and sets APP_HOST_DIR. ifdef PDIR APP_HOST_DIR := $(PDIR) endif # UID/GID HOST_UID ?= $(UID) HOST_GID ?= $(GID) # ------------------------------- # ๐Ÿงฉ MAIN SETUP WORKFLOW # ------------------------------- setup: fix-acl up init-laravel @echo "โœ… Full Laravel Docker setup completed! Visit https://localhost" # ------------------------------- # ๐Ÿงฑ ACL PERMISSIONS FIX # ------------------------------- fix-acl: @echo "๐Ÿ”ง Setting ACL permissions for host user..." @if [ ! -d "$(HOST_APP_PATH)" ]; then mkdir -p "$(HOST_APP_PATH)"; fi @sudo setfacl -R -m u:$$(id -u):rwx "$(HOST_APP_PATH)" || true @sudo setfacl -R -d -m u:$$(id -u):rwx "$(HOST_APP_PATH)" || true # ------------------------------- # ๐Ÿš€ CONTAINER MANAGEMENT # ------------------------------- up: @echo "๐Ÿš€ Starting Docker containers..." @docker compose up -d --build down: @docker compose down restart: @docker compose down && docker compose up -d logs: @docker compose logs -f status: @docker compose ps # ------------------------------- # ๐Ÿงฑ LARAVEL INITIALIZATION # ------------------------------- init-laravel: @echo "๐Ÿš€ Initializing Laravel..." @if [ ! -f "$(HOST_APP_PATH)/composer.json" ]; then \ echo "Creating new Laravel project in container..."; \ docker compose exec -T --user 0 php bash -c "composer create-project laravel/laravel laravel-temp --prefer-dist --no-interaction"; \ docker compose exec -T --user 0 php bash -c "mv laravel-temp/* $(CONTAINER_APP_PATH)"; \ docker compose exec -T --user 0 php bash -c "mv laravel-temp/.* $(CONTAINER_APP_PATH) || true"; \ docker compose exec -T --user 0 php bash -c "rm -rf laravel-temp"; \ $(MAKE) fix-perms; \ else \ echo "Laravel project already exists, skipping creation."; \ fi @echo "Installing Composer dependencies..." @docker compose exec -T --user 0 php bash -c "cd $(CONTAINER_APP_PATH) && composer install --no-interaction --prefer-dist --ignore-platform-reqs" @$(MAKE) fix-perms @echo "โœ… Laravel initialization completed." # ------------------------------- # ๐Ÿง USER & PERMISSIONS # ------------------------------- fix-perms: @echo "๐Ÿ”ง Fixing permissions for host user..." @if [ ! -d "$(HOST_APP_PATH)" ]; then mkdir -p "$(HOST_APP_PATH)"; fi # <--- ADDED LINE: Ensure directory exists @sudo chown -R $(HOST_UID):$(HOST_GID) "$(HOST_APP_PATH)" # ------------------------------- # ๐Ÿงฐ LARAVEL UTILITIES # ------------------------------- artisan: @read -p "๐Ÿ”ง Enter artisan command: " CMD; \ docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan $$CMD"; \ $(MAKE) fix-perms composer: @read -p "๐Ÿ“ฆ Enter composer command: " CMD; \ docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && composer $$CMD"; \ $(MAKE) fix-perms migrate: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan migrate"; \ $(MAKE) fix-perms seed: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan db:seed"; \ $(MAKE) fix-perms cache-clear: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan cache:clear"; \ $(MAKE) fix-perms optimize: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan optimize"; \ $(MAKE) fix-perms horizon: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan horizon"; \ $(MAKE) fix-perms telescope: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan telescope:publish"; \ $(MAKE) fix-perms queue: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan queue:work"; \ $(MAKE) fix-perms # ------------------------------- # ๐Ÿงฑ DATABASE MANAGEMENT # ------------------------------- db-shell: @docker compose exec mariadb mysql -u$$(grep MYSQL_USER .env | cut -d= -f2) \ -p$$(grep MYSQL_PASSWORD .env | cut -d= -f2) \ $$(grep MYSQL_DATABASE .env | cut -d= -f2) db-backup: @./scripts/backup-db.sh db-restore: @if [ -f ./scripts/restore-db.sh ]; then \ ./scripts/restore-db.sh; \ else \ echo "๐Ÿ“‚ Enter backup file path (inside ./backups):"; \ read FILE; \ cat backups/$$FILE | docker compose exec -i mariadb mysql -u$$(grep MYSQL_USER .env | cut -d= -f2) \ -p$$(grep MYSQL_PASSWORD .env | cut -d= -f2) \ $$(grep MYSQL_DATABASE .env | cut -d= -f2); \ echo 'โœ… Database restored.'; \ fi # ------------------------------- # ๐Ÿงฐ UTILITIES # ------------------------------- switch-ssl: @read -p "๐Ÿ”„ Switch SSL mode (selfsigned/real): " MODE; \ sed -i "s/^SSL_MODE=.*/SSL_MODE=$$MODE/" .env; \ ./scripts/generate-ssl.sh; \ make restart; \ echo "โœ… SSL mode switched to $$MODE." # ------------------------------- # ๐Ÿงช TESTING & DEBUGGING # ------------------------------- tinker: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan tinker" test: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash -c "cd $(CONTAINER_APP_PATH) && php artisan test" bash: @docker compose exec --user $(HOST_UID):$(HOST_GID) php bash # ------------------------------- # ๐Ÿงฉ HELP # ------------------------------- help: @echo "" @echo "๐Ÿงฐ Laravel Docker Makefile Commands" @echo "----------------------------------" @echo "make setup โ†’ Full environment setup (build, ACL fix, Laravel install)" @echo "make fix-acl โ†’ Fix ACL permissions for host user" @echo "make up โ†’ Start containers" @echo "make down โ†’ Stop containers" @echo "make restart โ†’ Restart all containers" @echo "make artisan โ†’ Run artisan command interactively (auto-fix permissions)" @echo "make composer โ†’ Run composer command interactively (auto-fix permissions)" @echo "make migrate โ†’ Run database migrations (auto-fix permissions)" @echo "make seed โ†’ Seed database (auto-fix permissions)" @echo "make cache-clear โ†’ Clear Laravel cache (auto-fix permissions)" @echo "make optimize โ†’ Optimize Laravel app (auto-fix permissions)" @echo "make horizon โ†’ Run Laravel Horizon (auto-fix permissions)" @echo "make telescope โ†’ Publish Telescope assets (auto-fix permissions)" @echo "make queue โ†’ Start Laravel queue worker (auto-fix permissions)" @echo "make db-backup โ†’ Dump database backup" @echo "make db-restore โ†’ Restore database backup" @echo "make fix-perms โ†’ Fix file permissions using host UID/GID" @echo "make logs โ†’ Tail container logs" @echo "make switch-ssl โ†’ Toggle SSL type (selfsigned/real)" @echo "make tinker โ†’ Open Laravel tinker shell" @echo "make bash โ†’ Enter PHP container shell" @echo "make help โ†’ Show this help menu" @echo "" @echo "โœจ Tip: Run 'make setup' first to build your full Laravel environment!"