buckets/shell.nix

220 lines
No EOL
6.9 KiB
Nix
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ 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
'';
}