docker-laravel-stack/Makefile
2025-10-31 11:29:14 -04:00

208 lines
7.5 KiB
Makefile
Executable file

# ==============================================
# 💻 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!"