dishplanner/shell.nix

225 lines
7.3 KiB
Nix
Raw Normal View History

2025-12-27 17:30:07 +01:00
{ pkgs ? import <nixpkgs> {} }:
let
# Playwright's bundled Chromium is a prebuilt glibc binary. NixOS has no
# /usr/lib, so nix-ld (enabled system-wide) resolves its interpreter and
# NIX_LD_LIBRARY_PATH supplies the libraries below.
chromiumLibs = with pkgs; [
glib nss nspr atk at-spi2-atk at-spi2-core cups dbus expat
xorg.libxcb libxkbcommon alsa-lib libgbm mesa
xorg.libX11 xorg.libXext xorg.libXcomposite xorg.libXdamage
xorg.libXfixes xorg.libXrandr cairo pango systemd libdrm
];
in
2025-12-27 17:30:07 +01:00
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
2025-12-27 17:30:07 +01:00
# Utilities
git
curl
gnumake
];
shellHook = ''
2025-12-27 21:18:09 +01:00
# 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
export NIX_LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath chromiumLibs}:$NIX_LD_LIBRARY_PATH"
# Compose file location
COMPOSE_FILE="$PWD/docker/dev/docker-compose.yml"
# ===================
# ALIASES
# ===================
alias pc='podman-compose -f $COMPOSE_FILE'
2025-12-27 17:30:07 +01:00
# Define helper functions
dev-rebuild() {
2025-12-27 17:30:07 +01:00
echo "🔨 Rebuilding development environment..."
PODMAN_USERNS=keep-id podman-compose -f $COMPOSE_FILE down -v
PODMAN_USERNS=keep-id podman-compose -f $COMPOSE_FILE build --no-cache app
PODMAN_USERNS=keep-id podman-compose -f $COMPOSE_FILE up -d
echo " Rebuild complete! Check logs with: dev-logs"
2025-12-27 17:30:07 +01:00
}
dev-rebuild-quick() {
2025-12-27 17:30:07 +01:00
echo " Quick rebuild (keeping volumes)..."
PODMAN_USERNS=keep-id podman-compose -f $COMPOSE_FILE down
PODMAN_USERNS=keep-id podman-compose -f $COMPOSE_FILE build app
PODMAN_USERNS=keep-id podman-compose -f $COMPOSE_FILE up -d
2025-12-27 17:30:07 +01:00
echo " Quick rebuild complete!"
}
dev-up() {
echo "🚀 Starting development environment..."
PODMAN_USERNS=keep-id podman-compose -f $COMPOSE_FILE up -d
echo " Dev environment started!"
}
dev-down() {
echo "🛑 Stopping development environment..."
podman-compose -f $COMPOSE_FILE down
echo " Dev environment stopped!"
}
dev-restart() {
echo "🔄 Restarting development environment..."
podman-compose -f $COMPOSE_FILE restart
echo " Dev environment restarted!"
}
dev-logs() {
podman-compose -f $COMPOSE_FILE logs -f "$@"
2025-12-27 17:30:07 +01:00
}
2026-08-17 01:56:01 +02:00
dev-logs-db() {
podman-compose -f $COMPOSE_FILE logs -f db "$@"
2026-08-17 01:56:01 +02:00
}
dev-shell() {
podman-compose -f $COMPOSE_FILE exec app sh
2025-12-27 17:30:07 +01:00
}
dev-artisan() {
podman-compose -f $COMPOSE_FILE exec app php artisan "$@"
2025-12-27 17:30:07 +01:00
}
2026-08-17 01:56:01 +02:00
dev-test() {
podman-compose -f $COMPOSE_FILE exec -T app env $(grep -vE '^\s*(#|$)' .env.testing) php -d memory_limit=512M vendor/bin/phpunit "$@"
2026-08-17 01:56:01 +02:00
}
pest-browser() {
# Run Pest browser tests (Playwright) on the host. Pass --headed for a
# visible browser or --debug to pause on failure. Requires `npm run build`.
vendor/bin/pest tests/Browser "$@"
}
2026-08-17 01:56:01 +02:00
2025-12-27 21:18:09 +01:00
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="forge.lvl0.xyz"
local NAMESPACE="lvl0"
local IMAGE_NAME="dishplanner"
echo "🔨 Building production image..."
2026-01-09 01:09:48 +01:00
podman build --format docker -f Dockerfile -t ''${REGISTRY}/''${NAMESPACE}/''${IMAGE_NAME}:''${TAG} .
echo " Build complete: ''${REGISTRY}/''${NAMESPACE}/''${IMAGE_NAME}:''${TAG}"
echo "Run 'prod-push' to push to Forgejo"
}
prod-push() {
local TAG="''${1:-latest}"
local REGISTRY="forge.lvl0.xyz"
local NAMESPACE="lvl0"
local IMAGE_NAME="dishplanner"
echo "📤 Pushing to Forgejo 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-nc() {
local TAG="''${1:-latest}"
local REGISTRY="forge.lvl0.xyz"
local NAMESPACE="lvl0"
local IMAGE_NAME="dishplanner"
echo "🔨 Building production image (no cache)..."
2026-01-09 01:09:48 +01:00
podman build --format docker --no-cache -f Dockerfile -t ''${REGISTRY}/''${NAMESPACE}/''${IMAGE_NAME}:''${TAG} .
echo " Build complete: ''${REGISTRY}/''${NAMESPACE}/''${IMAGE_NAME}:''${TAG}"
echo "Run 'prod-push' to push to Forgejo"
}
prod-build-push() {
local TAG="''${1:-latest}"
prod-build "$TAG" && prod-push "$TAG"
}
prod-login() {
echo "📝 Logging into Forgejo registry..."
podman login forge.lvl0.xyz
}
2025-12-27 17:30:07 +01:00
echo "🚀 Dish Planner 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)"
2026-08-17 01:56:01 +02:00
echo " dev-logs-db - Tail database logs"
echo " dev-shell - Enter app container"
echo " dev-artisan - Run artisan commands"
2026-08-17 01:56:01 +02:00
echo " dev-test [path] - Run PHPUnit suite (CI invocation)"
echo " pest-browser [--headed] - Run Pest browser tests (Playwright)"
2025-12-27 21:18:09 +01:00
echo " dev-fix-permissions - Fix Docker-created file permissions"
2025-12-27 17:30:07 +01:00
echo ""
echo "Production commands:"
echo " prod-login - Login to Forgejo registry"
echo " prod-build [tag] - Build production image (default: latest)"
echo " prod-push [tag] - Push image to Forgejo"
echo " prod-build-push - Build and push in one command"
2025-12-27 17:30:07 +01:00
echo ""
# Auto-start prompt
if [ -f "$COMPOSE_FILE" ]; then
2025-12-27 17:30:07 +01:00
read -p "Start development containers? (y/N) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "Starting containers..."
podman-compose -f $COMPOSE_FILE up -d
2025-12-27 17:30:07 +01:00
# Wait a moment for containers to start
sleep 3
echo ""
echo " Services should be available at:"
echo " App: http://localhost:8000"
echo " Vite: http://localhost:5173"
echo " Mailhog: http://localhost:8025"
echo " MariaDB: localhost:3306"
echo ""
echo "Run 'pc logs -f app' to follow logs"
2025-12-27 17:30:07 +01:00
fi
fi
'';
}