I have an app built on app.mydomain.com (Server 1) and a support ticketing system at support.mydomain.com (server 2). How can I establish a connection between both databases in my laravel app? Both are using Laravel Forge and Digital Ocean.
I read this post on SO which looked great but I am getting a "connection timed out error". I believe it has to do with Forge needing the SSH key file (id_rsa.pub) when connecting to a database? Source here
I tried adding this to database.php:
//Server/Site 1
'mysql' => array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'support',
'username' => 'user',
'password' => 'mysecretpassword',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
//Server/Site 2
'mysql2' => array(
'driver' => 'mysql',
'host' => '123.456.789.101',
'port' => '3306',
'database' => 'app',
'username' => 'forge',
'password' => 'mysecretpassword',
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
),
And then adding this to my model:
protected $connection = 'mysql2';
When you provision your server with Forge, MySQL configuration restricts external connections for security reasons. Only application at the same server can access your database.
New answer
Since you're using forge it's even easier than I suggested before. If you provisioned both your servers with forge, go to
forge -> networking -> server network
and selectcan connect to
checkbox and hit update.Afterwards you need to update
DB_HOST=
of mysql2 connection with private network IP obtained from digitalocean.Old answer - manual setup
Now, there are couple of things to be done in order to allow external connections in secure way:
/etc/mysql/my.cnf
and udpatebind-address
with your server IPSince you are using digital ocean, if your servers are in the same datacenter you should be able to use private network ip address of your droplet. This is more secure solution, any connection between servers will not leave datacenter infrastructure. Remember to restart mysql.
Go to
Forge -> Networking -> New Firewall Rule
and add a new rule for port 3306 and IP address of your site1, again a private IP if possible.Connect with ssh to site1 open mysql console and add new user
For more info refer to this tutorial, it solves similar issue to yours https://www.digitalocean.com/community/tutorials/how-to-set-up-a-remote-database-to-optimize-site-performance-with-mysql
Hope this helps!