{ pkgs ? import {} }: pkgs.mkShell { buildInputs = with pkgs; [ # PHP and tools php83 php83Packages.composer # Node.js and npm nodejs_20 # Container tools podman podman-compose # Database client (optional, for direct DB access) mariadb-client # Utilities git curl gnumake ]; shellHook = '' # Export user/group IDs for Docker permission matching export USER_ID=$(id -u) export GROUP_ID=$(id -g) # Use keep-id for proper permission mapping in rootless podman export PODMAN_USERNS=keep-id # Define helper functions dev-rebuild() { echo "🔨 Rebuilding development environment..." PODMAN_USERNS=keep-id podman-compose down -v PODMAN_USERNS=keep-id podman-compose build --no-cache app PODMAN_USERNS=keep-id podman-compose up -d echo "📦 Installing dependencies..." # Wait for containers to be ready echo " Waiting for containers to be ready..." sleep 5 # Wait for database to be healthy echo " Waiting for database to be ready..." for i in {1..30}; do if podman-compose exec db mariadb -u root -proot -e "SELECT 1" > /dev/null 2>&1; then echo " Database is ready!" break fi if [ $i -eq 30 ]; then echo " ⚠️ Database not ready after 30 seconds" fi sleep 1 done # Install composer dependencies echo " Installing composer packages..." podman-compose exec app composer install --no-interaction || echo "⚠️ Composer install failed" # Install npm dependencies echo " Installing npm packages..." podman-compose exec app npm install || echo "⚠️ NPM install failed" # Run migrations echo " Running database migrations..." sleep 2 # Extra wait to ensure DB is fully ready podman-compose exec app php artisan migrate --force || echo "⚠️ Migrations failed" # Restart app container to ensure Vite picks up all changes echo " Restarting app container..." podman-compose restart app echo "✅ Rebuild complete! Check logs with: dev-logs" echo "" echo "📍 Services available at:" echo " App: http://localhost:8100" echo " Vite: http://localhost:5174" echo " Mailhog: http://localhost:8026" echo " MariaDB: localhost:3307" } dev-rebuild-quick() { echo "⚡ Quick rebuild (keeping volumes)..." PODMAN_USERNS=keep-id podman-compose down PODMAN_USERNS=keep-id podman-compose build app PODMAN_USERNS=keep-id podman-compose up -d echo "✅ Quick rebuild complete!" } dev-up() { echo "🚀 Starting development environment..." PODMAN_USERNS=keep-id podman-compose up -d echo "✅ Dev environment started!" echo "" echo "📍 Services available at:" echo " App: http://localhost:8100" echo " Vite: http://localhost:5174" echo " Mailhog: http://localhost:8026" echo " MariaDB: localhost:3307" } dev-down() { echo "🛑 Stopping development environment..." podman-compose down echo "✅ Dev environment stopped!" } dev-restart() { echo "🔄 Restarting development environment..." podman-compose restart echo "✅ Dev environment restarted!" } dev-logs() { podman-compose logs -f "$@" } dev-shell() { podman-compose exec app sh } dev-artisan() { podman-compose exec app php artisan "$@" } dev-fix-permissions() { echo "🔧 Fixing file permissions..." echo "This will require sudo to fix Docker-created files" sudo chown -R $(id -u):$(id -g) storage/ bootstrap/cache/ vendor/ node_modules/ 2>/dev/null || true echo "✅ Permissions fixed!" } prod-build() { local TAG="''${1:-latest}" local REGISTRY="codeberg.org" local NAMESPACE="lvl0" local IMAGE_NAME="buckets" echo "🔨 Building production image..." podman build -f Dockerfile -t ''${REGISTRY}/''${NAMESPACE}/''${IMAGE_NAME}:''${TAG} . echo "✅ Build complete: ''${REGISTRY}/''${NAMESPACE}/''${IMAGE_NAME}:''${TAG}" echo "Run 'prod-push' to push to Codeberg" } prod-push() { local TAG="''${1:-latest}" local REGISTRY="codeberg.org" local NAMESPACE="lvl0" local IMAGE_NAME="buckets" echo "📤 Pushing to Codeberg registry..." if podman push ''${REGISTRY}/''${NAMESPACE}/''${IMAGE_NAME}:''${TAG}; then echo "✅ Image pushed to ''${REGISTRY}/''${NAMESPACE}/''${IMAGE_NAME}:''${TAG}" else echo "❌ Failed to push image. Did you run 'prod-build' first?" echo " Also make sure you're logged in with 'prod-login'" return 1 fi } prod-build-push() { local TAG="''${1:-latest}" prod-build "$TAG" && prod-push "$TAG" } prod-login() { echo "📝 Logging into Codeberg registry..." podman login codeberg.org } echo "🚀 Buckets Development Environment" echo "=======================================" echo "PHP: $(php --version | head -n1)" echo "Node: $(node --version)" echo "Podman: $(podman --version)" echo "Podman-compose: $(podman-compose --version 2>/dev/null || echo 'checking...')" echo "" echo "Development commands:" echo " dev-up - Start development environment" echo " dev-down - Stop development environment" echo " dev-restart - Restart containers" echo " dev-rebuild - Full rebuild (removes volumes)" echo " dev-rebuild-quick - Quick rebuild (keeps volumes)" echo " dev-logs [svc] - Follow logs (default: all)" echo " dev-shell - Enter app container" echo " dev-artisan - Run artisan commands" echo " dev-fix-permissions - Fix Docker-created file permissions" echo "" echo "Production commands:" echo " prod-login - Login to Codeberg registry" echo " prod-build [tag] - Build production image (default: latest)" echo " prod-push [tag] - Push image to Codeberg" echo " prod-build-push - Build and push in one command" echo "" # Auto-start prompt if [ -f "docker-compose.yml" ]; then read -p "Start development containers? (y/N) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then echo "Starting containers..." podman-compose up -d # Wait a moment for containers to start sleep 3 echo "" echo "✅ Services should be available at:" echo " App: http://localhost:8100" echo " Vite: http://localhost:5174" echo " Mailhog: http://localhost:8026" echo " MariaDB: localhost:3307" echo "" echo "Run 'podman-compose logs -f app' to follow logs" fi fi ''; }