Laravel, MySQL, Azure, SSL Connection is required - laravel

I'm trying to deploy a laravel 5.8 application to Azure, but I'm getting the following error;
"SSL connection is required. Please specify SSL options and retry."
In the config folder there wasn't a database.php file, so I created one using the database.php in the Laravel Git Repository. I downloaded the BaltimoreCyberTrustRoo.crt.pem file from MS and placed this inside the root of my application inside a folder called ssl. I've then modified the database.php file to this;
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'sslmode' => env('DB_SSLMODE', 'prefer'),
'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
PDO::MYSQL_ATTR_SSL_KEY => base_path('ssl/BaltimoreCyberTrustRoot.crt.pem'),
] : []
],
However, even with this change, I'm still seeing the same error.
I've attached a screenshot of the folder structure incase it is useful.

I managed to resolve this by changing the mysql options value to;
'options' => [
PDO::MYSQL_ATTR_SSL_KEY => base_path('ssl/BaltimoreCyberTrustRoot.crt.pem'),
]
instead of
'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
PDO::MYSQL_ATTR_SSL_KEY => base_path('ssl/BaltimoreCyberTrustRoot.crt.pem'),
] : []

Mine is a non production(just learning) scenario, so I disabled ssl.
If it is enabled, I am getting this error.

Related

Laravel Hyn/Tenancy Database [tenant] not configured

I followed the tutorial in this web and with homestead, got results right.
But, with XAMPP on Windows, when I try to login as a tenant, "Database [tenant] not configured" error occurs.
URL:
https://www.seismicpixels.com/creating-a-laravel-saas-framework-part-1/
https://www.seismicpixels.com/creating-a-laravel-saas-framework-part-2/
(At part-2, step 4, the error occurs and I cannot login as the tenant)
Environment:
XAMPP for Windows 7.3.9
PHP 7.3.9
Apache/2.4.41 (Win64)
mysql Ver 15.1 Distrib 10.4.11-MariaDB, for Win64 (AMD64)
Laravel Framework 5.8.37
hyn/multi-tenant 5.4.5
I am very new to Laravel and if Im missing any information to ask help, please kindly let me know.
Thank you in advance.
added on 26th
I added 'tenant' in database.php then I get the following error now:
SQLSTATE[HY000] [1045] Access denied for user ''#'localhost' (using password: NO) (SQL: select * from users where email = billy#example.com limit 1)
it seems hyn/tenancy cannot get the user database name (uuid) and it's password.
is this hyn/malti-tenant bug?
my database.php------------
'connections' => [
'system' => [
'driver' => 'mysql',
'host' => env('TENANCY_HOST', '127.0.0.1'),
'port' => env('TENANCY_PORT', '3306'),
'database' => env('TENANCY_DATABASE', 'tenancy'),
'username' => env('TENANCY_USERNAME', 'tenancy'),
'password' => env('TENANCY_PASSWORD', 'tenancy'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'tenant' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => '',
'username' => '',
/*'database' => '3d118cf757154f6d9be5cb1935078588',
'username' => 'root',*/
'password' => '',
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
my .env---------------------------
DB_CONNECTION=system
TENANCY_HOST=127.0.0.1
TENANCY_PORT=3306
TENANCY_DATABASE=tenancy
TENANCY_USERNAME=tenancy
TENANCY_PASSWORD=tenancy
At the end, using stancl/tenancy solved it all.
Strongly recommend using stancl now.
https://github.com/stancl/tenancy

Laravel Hyn\Multi-Tenant Database [tenant] not configured

I am working on a multi-tenant laravel application, and have run into an issue with the hyn\multi-tenant package. The documentation for hyn\multi-tenant states that the tenant database connection will be handled by the package, and that as long as the system connection is available and the user has privileges to add and modify databases, the package will handle all tenant database connections.
Upon trying to create a tenant in my application I get the error: Database [tenant] is not configured.
I have seen many answers to this issue on SO, however they all refer to the Customer model, or localhost configurations. Hyn removed the Customer model, and the issue I am having is also happening on my DigitalOcean server published through Laravel Forge.
I would be grateful to anyone that might be able to provide some assistance.
My .env (local)
APP_NAME="Multi-Tenant"
APP_ENV=local
APP_KEY=base64:j1aLzU7m5LWK1keo/FjgbtpwTpVZ1NBj29zuXIByHek=
APP_DEBUG=true
APP_URL_BASE=localhost:8888/lms/public
APP_URL=http://${APP_URL_BASE}
LOG_CHANNEL=stack
DB_CONNECTION=system
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=lmssystem
DB_USERNAME=lmssystem
DB_PASSWORD=lmssystem
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
LIMIT_UUID_LENGTH32=true
My database.php
return [
'default' => env('DB_CONNECTION', 'system'),
'connections' => [
'system' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '8889'),
'database' => env('DB_DATABASE', 'lmssystem'),
'username' => env('DB_USERNAME', 'lmssystem'),
'password' => env('DB_PASSWORD', 'lmssystem'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => 'InnoDB',
],
],
'migrations' => 'migrations',
'redis' => [
'client' => 'predis',
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],
'cache' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 1),
],
],
];
This issue turned out to be a logic error in my application not a database configuration issue. I was forced to deviate from Ashok's article on Medium [https://medium.com/#ashokgelal/a-full-featured-multi-tenant-app-with-laravel-part-1-4049a3cc229d][1] since the Hyn\Multi-Tenant package no longer supports the customer model.
After developing my own client model, and extending the existing Website and Hostname models to interact with the client model, I had to re-write the tenant:create command. In this, I created websites and hostnames directly from their extended models, rather than via the repositories as per the Hyn documentation (copied below)
Tenancy is heavily driven by events. For event listeners to properly work, you have to use the repositories to create new websites and hostnames.
use Hyn\Tenancy\Models\Website;
use Hyn\Tenancy\Contracts\Repositories\WebsiteRepository;
$website = new Website;
app(WebsiteRepository::class)->create($website);
dd($website->uuid);
$hostname = new Hostname;
$hostname->fqdn = 'luceos.demo.app';
app(HostnameRepository::class)->attach($hostname, $website);
Creating via the repositories resolved the:
Database [tenant] not configured
Error.
this code may be solve your problem
config/database.php :
'connections' => [
'system' => [
'driver' => env('DB_DRIVER', 'mysql'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', '123'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'tenant' => [
'driver' => env('DB_DRIVER', 'mysql'),
'host' => '',
'port' => env('DB_PORT', '3306'),
'database' => '',
'username' => '',
'password' => '',
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
],
create a "tenant" connection on the config/database.php file
'tenant' => [
'driver' => 'mysql',
'host' => env('TENANCY_HOST', '127.0.0.1'),
'port' => env('TENANCY_PORT', '3306'),
'database' => env('TENANCY_DATABASE', 'tenancy'),
'username' => env('TENANCY_USERNAME', 'tenancy'),
'password' => env('TENANCY_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
];
if it related to Livewire problem,
Open the config/livewire.php file and change this:
'middleware_group' => ['web'],
to this:
'middleware_group' => [
'web',
'universal',
InitializeTenancyByDomain::class, // or whatever tenancy middleware you use
],

How to build a custom connection outside of database.php in Laravel 5.4

I am building a system that uses multiple databases. I currently have a custom config file which I am using that has some controls in it. This file is not put through version control.
I would like these databases to be independant of git. I am looking to build a custom connection without using config/database.php
I could of course remove config/database.php from git but I want to keep it neat and make use of my custom config file.
Here is my clientconfig.php to be found in /config folder
<?php
$clientDB = '';
if(isset($_SERVER['SERVER_NAME'])) {
$apiDomain = $_SERVER['SERVER_NAME'];
if ( $apiDomain == 'www.example.com' ) {
$clientDB = 'clientdb_1';
}
}
return [
'client_db' => $clientDB
];
I would like to add my connections in that file too that are found in database.php
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'example'),
'username' => env('DB_USERNAME', 'example'),
'password' => env('DB_PASSWORD', 'example'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
'clientdb_1' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => ('clientdb_1'),
'username' => env('DB_USERNAME', 'example'),
'password' => env('DB_PASSWORD', 'example'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
Is there a clean way this can be done?
EDIT: I have consired the .env file but it is too messy considering I may have different amount of databases etc. I will still be adding them to database.php which is what I am trying to avoid.
I was able to add my own new connection in that file by using config().
if ( $apiDomain == 'www.example.com' ) {
$appUrl = $apiDomain;
$clientDB = 'clientdb_1';
config(['database.connections.clientdb_1' => array(
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => $clientDB,
'username' => 'example',
'password' => 'example',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
)]);
}
NB: This did not work unless my custom config file was loaded after database.php. Because it was in alphabetical order I had to rename my file to z_clientconfig.php

Do i need to change database configuration in database.php file in laravel when upload to server?

Do i need to change database configuration in database.php file in laravel when upload to server?
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
Don't change anything in database.php config file. What you need to do is to change DB credentials in .env file on server side.
So, you'll have different .env files on a local machine and server, but the same database.php config file.
https://laravel.com/docs/5.3/configuration#environment-configuration
Update your database.php
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'yourdatabasename'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'password'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],

Alter base PDO configuration in Laravel

My shared web host have some problems with query prepares and I want to enable PDO's emulated prepares, there's no option for this in the config\database.php.
Is there any way I can do that in Laravel?
You can add an "options" array to add options to your Database Connection within config/database.php:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
// Additional options here
'options' => [PDO::ATTR_EMULATE_PREPARES => true, PDO::MYSQL_ATTR_COMPRESS => true,]
],
You will see I've also switched on MYSQL_ATTR_COMPRESS for my connection.
You can find more information on some of the options they have built in here:
https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Connectors/Connector.php

Resources