220 lines
No EOL
6.9 KiB
Nix
220 lines
No EOL
6.9 KiB
Nix
{ pkgs ? import <nixpkgs> {} }:
|
||
|
||
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
|
||
'';
|
||
} |