page:migrate:digitalocean droplet app:laravel
Migrate DigitalOcean Droplet app: Laravel
Move Laravel compute from DigitalOcean Droplet app to Ample, one component at a time. Destination verified on Ample: the app built, started and answered on its public HTTPS URL with encrypted configuration delivered.
Summary
- Source procedure: Collect the process environment from the droplet (systemd unit, PM2 or supervisor config) into an env file kept out of the repository.
- Not migrated automatically: Cron jobs, local upload directories and firewall rules are not migrated; move uploads to a bucket and data to a managed database.
- Cutover: Add the custom domain with
ample domain add, update DNS from the droplet IP, keep the droplet until verified, then power it off. - Rollback: Keep the source untouched until you confirm; nothing at the source is changed or deleted by this guide.
Workflow Steps
Inventory the source
List what DigitalOcean Droplet app provides beyond the component you are moving. Out of scope here: Cron jobs, local upload directories and firewall rules are not migrated; move uploads to a bucket and data to a managed database.Source step 1
Collect the process environment from the droplet (systemd unit, PM2 or supervisor config) into an env file kept out of the repository.Source step 2
Replace the droplet's process manager and reverse proxy with the repository's start command; Ample provides HTTPS and supervision.Source step 3
Inventory what else runs on the droplet: databases, cron, local uploads.Deploy on Ample in parallel
composer install --no-dev from composer.lock, then FrankenPHP serving public/ (php-server with the index.php fallback) reading PORT on the php-8.5 template. Pass the exported variables with--env; keep the source running.
Command:ample deploy . --name --public --env-file .env.productionValidate before cutover
Run the app's own checks and, for data, compare counts and checksums; the example checks are the pattern self-tests (/p/configuration-secrets, /p/relational-records).Cut over
Add the custom domain withample domain add, update DNS from the droplet IP, keep the droplet until verified, then power it off.Rollback
Point DNS or configuration back to the source. The source was never modified; deletion is a separate, user-executed step after validation.
Examples
Laravel pattern fixture (destination)
- Description: Verified destination basis: Laravel compute.
- Source Ref: tests/deploy-canaries/laravel-patterns
Success Checks
Destination app responds on its public URL
Kind:http_get
Path:/
Expect:ample canary laravel patternsConfiguration-secrets check from the destination example
Kind:http_get
Path:/p/configuration-secrets
Expect:see the pattern fixture checksRelational-records check from the destination example
Kind:http_get
Path:/p/relational-records
Expect:see the pattern fixture checksData or object counts and checksums match the source
Kind: manual
Expect:operator comparison before cutover
Limitations
- Documentation only: nothing is executed automatically and no execution binding is offered.
- The source-side procedure is documented from DigitalOcean Droplet app's standard tooling and was not executed in this catalog's evidence; the destination side was verified with the pattern fixture.
- No full source-product parity is claimed: Cron jobs, local upload directories and firewall rules are not migrated; move uploads to a bucket and data to a managed database.
Cost Estimate
- Currency: USD
- Monthly Amount: 10.0
- Components:
- Name: app server
- Size: s-1vcpu-1gb
- Quantity: 1.0
- Monthly Amount: 5.0
- Name: managed PostgreSQL database
- Size: s-1vcpu-1gb
- Quantity: 1.0
- Monthly Amount: 5.0
- Name: app server
- Note: Destination always-on monthly price of the tested sizes; apps auto-pause when idle.
Evidence Summary
- Kind: canary_run
Summary: Destination side verified: the Laravel pattern fixture deployed on Ample and its checks passed (the app built, started and answered on its public HTTPS URL with encrypted configuration delivered).
Observed At: 2026-09-20T20:36:21Z