Self-hosting with Docker
The Tracker ships with a Docker Compose stack: the app (PHP-FPM), nginx, MySQL 8.4, Vite for assets, and a queue worker that delivers webhooks.
Start with Docker
Section titled “Start with Docker”-
Clone the repository and create the environment file:
Terminal window git clone https://github.com/skribly/tracker.git skribly-trackercd skribly-trackercp .env.example .env -
Set a password for the administrator account before the first boot. Open
.envand fill inTRACKER_ADMIN_PASSWORD; the line above it names the administrator’s e-mail address. -
Build and start the stack:
Terminal window docker compose up -d --build -
Open
http://localhost:8100and sign in as the administrator.
On the first boot the entrypoint generates the application key, waits for the database, runs the migrations and seeds a demo workspace with three projects, their issues, comments and time entries. Later restarts keep your data: seeding only runs while the database is empty.
Services
Section titled “Services”| Service | Address | Notes |
|---|---|---|
| Tracker (nginx) | http://localhost:8100 |
Change with TRACKER_PORT |
| Vite | http://localhost:5174 |
Builds on save; VITE_DEV_SERVER=true for hot reload |
| MySQL 8.4 | Inside the Docker network only | Data in a named volume |
| Queue worker | No port | Delivers webhooks: 3 tries, then gives up |
nginx exposes a /health endpoint used by the container healthcheck. Uploaded files live in a named app-storage volume, so they survive rebuilds.
Everyday commands
Section titled “Everyday commands”docker compose logs -f app queue # follow the app and the webhook workerdocker compose exec app php artisan tracker:token you@example.com "Skribly Agent"docker compose exec app php artisan migrate # after pulling a new versiondocker compose down # stop; data stays in the volumesdocker compose down -v # stop and delete all dataWithout Docker
Section titled “Without Docker”You need PHP 8.4, Composer and Node.js 22.
cp .env.example .env # set DB_* or DB_CONNECTION=sqlitecomposer install && npm install && npm run buildphp artisan key:generatephp artisan migrate --seedphp artisan servephp artisan queue:work # in a second terminal, for webhooksRunning it for a team
Section titled “Running it for a team”- Set
APP_ENV=production,APP_DEBUG=falseandAPP_URLto the public address. - Put the Tracker behind HTTPS. Tokens travel in the
Authorizationheader. - Change the database passwords in
.envfrom the example values. - Keep the queue worker running, or webhooks are never delivered.
- Back up the database volume and the storage volume.
All settings are listed in Configuration.
Upgrading
Section titled “Upgrading”git pulldocker compose up -d --builddocker compose exec app php artisan migrate --forceEvery push to main of the Tracker repository publishes a GitHub Release with notes grouped from the commits. See the changelog.