One Laravel codebase with multiple databases and hostnames

What we want to achieve:

  • Using one Laravel codebase that serves multiple hostnames and databases
  • Each codebase should have a separate storage and bootstrap/cache directory
  • And of course each codebase should have its own environment file

These are the steps needed to accomplish this.

Symlink to codebase

Each hostname should have be a symlink to the original codebase. For example our codebase is in /var/www/codebase and if we have a new hostname we should create a symlink to this codebase, for example a symlink /var/www/host1 pointing to /var/www/codebase.

Now we can point to this symlink in the webserver config.

Loading environment file and set storage path

To load a specific environment file and use a specific storage path, add the following code to the bootstrap/app.php file just below the first lines where the $app is created:

// This line is already present:

$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)

// Add this:

$envFile = '.env.host1';
// Note that loadEnvironmentFrom excepts a path relative to the base path

$storagePath = base_path('storage.host1');
// Note that useStoragePath expects an absolute path

The bootstrap cache directory

The bootstrap/cache directory is used to store cached config, routes and some other resources. These cached files are created after you do for example: php artisan config:cache. This command will create a bootstrap/cache/config.php file with all config settings for performance reasons. At the same time this will invalidate ALL calls to env() except those in the files in the config directory.

Each and every hostname MUST have its own bootstrap/cache directory. Otherwise the bootstrap/cache/config.php file will only have the settings of the last call to php artisan config:cache!

To use different bootstrap/cache directories for each hostname, add the below variables to the .env file of this hostname.


Tag: , | Category: