salahhusa9/laravel-updater
Laravel Updater lets you update your Laravel project with a single command or click. Supports Laravel 11, 12, and 13, with an Artisan command and web interface for running updates, so deployments and version upgrades stay quick and painless.
What the package is. salahhusa9/laravel-updater is an in-place self-updater for Laravel applications: a single Artisan command (and, per the README, an optional "one click" web trigger) that shells out to git and composer and then runs post-update steps such as migrations and cache clears. It exposes before/after "pipelines" so teams can hook custom steps into the update sequence. MIT licensed, Laravel 11/12/13 support, ~216 stars, 0 Packagist dependents.
Architecture fit. Fit is narrow but real. The package assumes it owns a mutable git working copy on the host it runs on: a checked-out repo, a writable application directory, and git/composer binaries on the PHP process's PATH. That describes single-server VMs, bare-metal, and simple shared hosting — it does not describe immutable container deploys (Docker/K8s), read-only or ephemeral filesystems, or symlink-swap release models (Laravel Forge/Envoyer zero-downtime, Deployer, Vapor). In those environments the package is architecturally incompatible, not merely inconvenient, because the whole release directory is replaced rather than mutated. As a TPM I would only sponsor this for the "we have a pet server and no CI/CD" segment.
Integration feasibility. Low technical effort: composer require, publish config, register the command, gate the trigger. The extensibility surface (before/after pipelines, merged with existing pipelines as of v1.2.4) is the most valuable part — it lets us bolt on php artisan optimize:clear, queue:restart, Horizon terminate, and an OPcache reset without forking. The real work is not integration, it is containment: deciding who can invoke it, from where, and what happens on a partial failure. That is process work a TPM owns, not code work.
Technical risk.
composer install plus migrations is a remote-code-execution surface by design. It must sit behind authentication, an IP allowlist, and ideally be disabled entirely outside a maintenance window. The README does not advertise hardening guidance as a first-class concern — I would treat the default posture as unsafe for internet-facing production until proven otherwise..env, or hotfix is edited in place will silently lose that change on the next update. This is a data-loss footgun and must be documented in our runbook.git pull but before composer install leaves the app in a broken, half-updated state. Rollback is manual and human-driven.salahhusa9.com/laravel-updater), not in the repo. The in-repo README is a badge collage. External docs can drift and can disappear; there is no offline reference.Key questions for the maintainer / our own spike.
composer install --no-dev --optimize-autoloader? migrate --force?)?artisan down?.env, storage/, and user uploads treated — preserved, ignored, or at risk from the checkout?Stack fit. Target only Laravel 11–13 applications deployed as a persistent, writable checkout on a single host or a small fixed set of hosts. Confirm PHP version against v2.0.0's composer.json before planning anything. Explicitly out of scope: containerized workloads, autoscaled fleets, read-only filesystems, and any environment using symlink-based releases. If our estate is mostly containers, this evaluation ends here and I recommend against adoption regardless of the package's quality.
Migration path. Three-step, reversible:
artisan down, an authenticated and IP-restricted route, or — preferably — CLI-only execution by an operator on a runbook. Feature-flagged so it can be disabled in one config change.Compatibility. Verify the package's illuminate/contracts constraint against our locked Laravel minor. Because majors have been used for framework-support bumps, do not assume ^1.x and ^2.x are interchangeable; pin and test. Check that our project's composer.lock survives the package's composer install invocation — if the package runs a bare composer install on a stale lock, dependency drift is possible. Where we already have a CI/CD pipeline (GitHub Actions, GitLab CI, Forge), this package is redundant: a proper pipeline gives us the same outcome with build-time validation, artifact promotion, and atomic swap. I would position the package as an interim stopgap for properties with no pipeline, with a documented exit path to one.
Sequencing. Containment before enablement: auth/IP gating and an operator runbook must land before the first production invocation. Pipelines and observability land in the same PR as the install, not later. Backups (DB + current release tarball) are a hard prerequisite, not a follow-up ticket.
Maintenance. Low code churn, but low churn is not the same as low burden: dependency bumps arrive as framework-matrix jumps and loose-major releases, so someone must read composer.json diffs each time Laravel ships. Budget a small recurring owner. Have a fork-and-own contingency — at 0 dependents and one maintainer, the realistic failure mode is abandonment, and the fork path must be pre-agreed rather than improvised.
Support. Community-only, no SLA, no vendor. External docs mean our internal runbook must be self-sufficient. First-line support is whoever holds the runbook; escalation is the platform team.
Scaling. This is not a horizontally scalable operation and should not be treated as a deploy mechanism for a fleet. On multiple nodes, per-instance invocation creates version skew — node A on the new commit, node B on the old — which produces schema/code mismatches that are painful to diagnose. The only safe pattern is a coordinated, serialized update across all nodes inside a maintenance window, or a load-balancer drain. Effort scales linearly with node count; at more than a handful of nodes, switch to a real deploy pipeline.
Failure modes to plan for.
| Failure | Impact | Mitigation |
|---|---|---|
git checkout discards local modifications |
Silent loss of hotfixes/config edits | Enforce "no in-place edits" policy; config in env/vault only |
| Composer failure post-pull | App code new, deps old → fatal errors | Pre-pull DB+release snapshot; pin lockfile; smoke test immediately post-run |
| Migration fails mid-run | Partially migrated schema, no auto-rollback | Backup before update; write down-migrations for every change; rehearse |
| Overlapping invocations | Corrupt checkout, double migrations | External lock; CLI-only execution |
| Binary/PATH permissions | Update aborts or half-completes | Pre-flight check in before-pipeline |
| Queues/Horizon on stale code | Jobs execute old classes against new schema | queue:restart in after-pipeline, mandatory |
| Node skew in multi-host | Intermittent, hard-to-reproduce errors | Maintenance window + serialized rollout |
Ramp-up. A mid-level Laravel developer can invoke the command in minutes; the cognitive load is entirely in operational trust, not in the API. Expect ~1 week of engineering for spike + staging hardening, plus a runbook and a rehearsed rollback drill before production use. The training cost is low; the risk-acceptance cost is the real line item, and it needs a named owner signing off.
Recommendation. Adopt conditionally and narrowly: single-server Laravel 11–13 apps with no existing CI/CD, CLI-only invocation, hard auth gating if the web route is ever enabled, mandatory snapshots, and a pipeline hook set for cache/queue/OPcache. Reject for containerized, autoscaled, or symlink-release environments, where the package's core assumption is wrong. Given 0 dependents and the destructive git behaviour, I would not make this an organizational standard — I would treat it as a tactical tool with a documented exit path to a proper deployment pipeline.
How can I help you explore Laravel packages today?