Laravel 13 Filament Jobs Backend with Docker and MySQL

If you want to build a practical jobs backend in Laravel, a strong starting point is Laravel + Filament + MySQL with Docker for local development.

That is the setup used in this project.

The stack includes:

  • Laravel 13
  • Filament 5
  • MySQL 8
  • Docker Compose
  • cPanel-friendly deployment defaults

This article is a compact reference for how the setup was built and why certain decisions were made.

Repository:
https://github.com/ipint/JobList

Why This Stack

The goal was to build a backend that could:

  • run locally with Docker
  • use MySQL locally and in production
  • provide a fast admin panel for jobs management
  • deploy cleanly to a dedicated cPanel server
  • avoid needing Redis or Supervisor at the start

Filament was chosen because it gives Laravel a fast, maintainable admin panel. Laravel was chosen because the production target is PHP 8.3 on cPanel, so the ecosystem fits well.

Local Setup Approach

The local Docker stack is simple:

  • PHP-FPM app container
  • Nginx container
  • MySQL container

This keeps development predictable and close to production.

One practical issue came up during setup: common local ports were already in use, so the app was exposed on:

http://localhost:8088

Important Early Decision: Queue Table Naming

Laravel’s default database queue uses a table named jobs.

That would conflict with the actual jobs domain table needed for job listings.

To avoid that, the queue tables were renamed to:

  • queued_jobs
  • failed_queued_jobs

That kept the data model clean from the start.

PHP Version Compatibility

Production is expected to run on PHP 8.3.

At one stage, Composer resolved packages using local PHP 8.4, which caused dependency problems inside Docker and would also have caused issues on cPanel.

The fix was to pin Composer’s platform to PHP 8.3 so the lockfile stays aligned with the real deployment environment.

Filament Admin Setup

Filament 5 was installed as the admin layer and mounted under:

/admin

That provided:

  • login
  • dashboard
  • resource routing
  • the structure needed to manage jobs properly

Jobs Schema

A proper jobs table was created with fields such as:

  • title
  • slug
  • reference
  • company name
  • department
  • description
  • requirements
  • benefits
  • employment type
  • work mode
  • experience level
  • status
  • county
  • city
  • postcode
  • salary fields
  • application URL and email
  • sponsorship and right-to-work flags
  • publish and expiry dates
  • featured flag

This gave the project a realistic jobs domain rather than just an empty admin shell.

UK Counties Dropdown

The project requirement was to always select a county from a dropdown.

To support that, the setup added:

  • a uk_counties table
  • a UkCounty model
  • a UK counties seeder
  • a county_id foreign key on jobs

This means counties are not hardcoded inside the form. They come from the database, which makes maintenance easier later.

Filament Jobs Resource

The generated Filament stubs were replaced with a proper Jobs resource.

The admin now includes:

  • a create/edit job form
  • a searchable jobs table
  • filters for status, type, work mode, county, and featured jobs

That makes the panel usable as a real internal admin, not just a demo.

Seeded UK Jobs

To make testing easier, the setup also includes:

  • a JobFactory
  • a JobSeeder
  • 30 generated UK jobs

The jobs use random departments such as:

  • Technology
  • Sales
  • Marketing
  • Finance
  • Operations
  • Product
  • Customer Support
  • Legal

This makes the admin panel useful immediately for testing and demonstration.

cPanel Deployment Strategy

The production target is a dedicated cPanel server running PHP 8.3, without Redis or Supervisor.

Because of that, the setup uses:

  • database queue
  • database cache
  • database sessions
  • cron-based scheduling
  • cron-based queue processing if needed

That keeps the architecture realistic for the hosting environment.

Issues Encountered During Setup

A few practical problems came up:

1. Laravel could not be scaffolded directly into the repo root

The repo was not empty, so Laravel had to be created in a temporary subdirectory first.

2. Docker port conflicts

Ports 8000 and 8080 were already in use, so the final local port became 8088.

3. Composer resolved dependencies for PHP 8.4

That had to be corrected by pinning the Composer platform to PHP 8.3.

4. Filament 5 namespace differences

One form error came from using the wrong namespace for Section. In Filament 5 it needed to come from Filament\Schemas\Components.

Final Result

The finished setup gives:

  • Laravel 13 backend
  • Filament 5 admin panel
  • MySQL Docker environment
  • UK counties lookup
  • jobs management resource
  • 30 seeded jobs
  • cPanel-friendly deployment path

That is a solid base for adding more features later, such as:

  • companies
  • categories
  • applications
  • saved jobs
  • public jobs APIs
  • frontend job listing pages

Closing Note

The most important part of this setup is not that it is advanced. It is that it matches the actual environment and future needs.

That includes:

  • matching local and production database choices
  • keeping Laravel upgrades manageable
  • using Filament as an admin layer, not as the whole application
  • making location data structured from the start

If you are building a similar platform, this is a strong practical foundation to start from.

Repository:
https://github.com/ipint/JobList

Leave a Reply

Your email address will not be published. Required fields are marked *