I have a Laravel installation and have set up three environments with their own corresponding config directories:
I use php artisan migrate:make create_users_table
etc as described here to create database migrations.
In my local environment I use Vagrant and a simple MySQL server setup, and on staging & production I use AWS RDS.
To configure database access for the staging environment I have a app/config/staging/database.php
file with settings like this:
...
"mysql" => array(
"driver" => "mysql",
"host" => $_SERVER["RDS_HOSTNAME"],
"database" => $_SERVER["RDS_DB_NAME"],
"username" => $_SERVER["RDS_USERNAME"],
"password" => $_SERVER["RDS_PASSWORD"],
"charset" => "utf8",
"collaction" => "utf8_unicode_ci",
"prefix" => "",
),
...
I use git to deploy the app with git aws.push
as described here.
The question is: How do I run the migration on my staging (and later production) EBS server when deploying?
I solved it by creating a new directory in the root of my project named .ebextensions
. In that directory I created a script file my-scripts.config
:
.ebextensions/
my-scripts.config
app/
artisan
bootstrap
...
The file my-scripts.config
gets executed when EBS deploys, is a YAML file and looks like this:
container_commands:
01-migration:
command: "php /var/app/ondeck/artisan --env=staging migrate"
leader_only: true
Add the directory and file to git, commit, and run git aws.push
and it will migrate.
Explanations on how stuff in .ebextensions
works can be found here.
The path /var/app/ondeck
is where your application lives when your script runs, it will afterwards be copied into /var/app/current
.
The artisan option --env=staging
is useful for telling artisan what environment it should run in, so that it can find the correct database settings from app/config/staging/database.php
If you need a quick and dirty way to log why the migrate command fails you might want to try out something like "php /var/app/ondeck/artisan --env=staging migrate > /tmp/artisan-migrate.log"
so that you can log into your ec2 instance and check the log.