208 lines
7.5 KiB
Makefile
Executable file
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!"
|