Skip to content

Version 5.0.0

Choose a tag to compare

@andreapollastri andreapollastri released this 03 Aug 22:11

[5.0.0] — 2026-08-04

Fixed

  • First deploy fails on horizon:terminate / readlink …/current — Deployer resolves {{current_path}} with readlink before the shell || true can run, so a brand-new app (no current symlink yet) aborted at before('deploy:symlink', 'horizon:terminate'). Templates now guard with [ -L {{deploy_path}}/current ] and call artisan via {{deploy_path}}/current. Migration 5.0.0 regenerates existing deploy.php files.

Added

  • Optional Laravel Octane (FrankenPHP) — create Laravel apps that serve HTTP via Octane instead of PHP-FPM, in parallel with classic FPM apps on the same server:
    • cipi app create --octane or --octane=frankenphp (Laravel only; rejected with --custom)
    • Allocates a localhost port (8100–8999), stores octane / octane_port in apps.json
    • Nginx vhost proxies to Octane (proxy_pass) and serves static files from current/public — no per-app FPM pool
    • Supervisor program ${app}-octane alongside queue workers; Deployer template laravel-octane.php restarts/reloads on deploy
    • .env: OCTANE_SERVER=frankenphp, OCTANE_HTTPS=true
    • Requires laravel/octane + php artisan octane:install --server=frankenphp in the app repo (Octane starts after the first successful deploy)
  • cipi app convert <app> --to=octane|fpm — convert an existing Laravel app between PHP-FPM and Octane (pool/vhost/supervisor/deployer/.env; SSL re-applied when present)
  • Laravel Reverbcipi app reverb enable|disable|status: localhost port 9000–9099, Supervisor ${app}-reverb, Nginx /app WebSocket proxy, .env REVERB_*
  • Laravel Horizoncipi worker horizon enable|disable|status: mutually exclusive with queue:work workers; deploy runs horizon:terminate + cipi-worker restart
  • Scheduler CLIcipi schedule on|off|status <app> (crontab schedule:run already existed; now manageable; schedule in apps.json)
  • Node build on deploycipi app edit --node-build='npm ci && npm run build' / --no-node-build; Deployer runs .deployer/node-build.sh after vendors (fail-closed; validated command)
  • cipi app clone <src> --domain=… — staging as a new app ([--name=] [--branch=] [--with-db|--no-db]); sets cloned_from; does not copy webhook/git IDs
  • Pre-deploy DB snapshot — opt-in via predeploy_snapshot / cipi deploy --snapshot / --snapshot-required; dump under /var/log/cipi/backups/; code rollback does not auto-restore DB
  • Resource limitscipi app limits <app> (--fpm-max-children, --memory-limit, --octane-workers, --worker-procs) with hard caps
  • SSL DNS-01 (Cloudflare)cipi ssl dns set --provider=cloudflare --token= then cipi ssl install <app> --dns=cloudflare [--wildcard]; HTTP-01 remains default
  • HTTP healthcheckscipi health set|unset|check|list; cron every 5 minutes; notify health_fail after 3 consecutive failures
  • apps-public.json — also exposes reverb, reverb_port, horizon, schedule, node_build, cloned_from, predeploy_snapshot, limits, health_url, health_expect, ssl_dns_provider