Skip to main content

Installation

Step-by-step install on a bare-metal server or VM. Prefer containers? Use Docker production instead.

Requirements

  • PHP 8.2+ (with the extensions listed in Requirements)
  • Node.js 20+
  • PostgreSQL 14+ or MySQL 8+
  • Redis 6+
  • Composer 2.x

Install

1. Clone the repository

2. Install PHP and Node dependencies

php artisan key:generate writes APP_KEY into .env. Without it the app will not boot.

3. Configure the environment

Edit .env before migrating. Minimum for a working self-hosted instance:
Also configure mail (invites / password reset) and optional social OAuth / AI keys — see Configuration.
Prefer a one-liner for deps? composer setup runs install + key:generate + migrate + npm build, but it migrates before you edit .env. Safer path for a real server: follow the steps above (configure .env, then migrate yourself).

4. Run migrations

Passport needs an RSA key pair on disk to sign and verify API / MCP tokens:
Run once. Do not regenerate later unless you intend to invalidate every existing API token. If you keep FILESYSTEM_DISK=public, also create the public media symlink:
Skip storage:link when using object storage (s3, r2, spaces) — those disks serve from the bucket URL.

6. Seed Passport client and admin user

Self-hosted installs close /register. Bootstrap the database once:
Passport is two independent pieces:
  1. Keys (passport:keys) — files on disk
  2. Personal Access Client (db:seed) — row in oauth_clients
API keys in Settings need both. MCP OAuth uses the same Passport keys (not API-key Bearer headers).
Admin credentials — change the password immediately on first login: Further accounts come from workspace invites (Settings → Members).
Only on a brand-new empty database you may use php artisan migrate:fresh --seed && php artisan db:seed --class=UserSeeder. migrate:fresh drops every table.

7. Build the frontend

8. Run the app

Local / smoke test (one terminal):
This starts php artisan serve, a queue listener, log tail, and Vite. Open http://localhost:8000 and sign in with the admin user. Production — do not use composer dev. You need long-running processes: Full Supervisor configs, Nginx (including Reverb /app/ + /apps/), SSL, and caches: Production setup.

End-to-end checklist

Verify

  1. Sign in at APP_URL with the admin credentials
  2. Create an API key under workspace Settings → API Keys (fails with 500 if Passport keys or client are missing)
  3. Connect an MCP client via OAuth (Settings → MCP), or call the REST API with the key above
  4. Upload a media file (404s if you use public disk without storage:link)
  5. Schedule a test post and confirm Horizon processes it

Next steps