Initial Ladill Merchant app with Gitea deploy pipeline.
Shop, menu, and booking storefronts with OIDC SSO, Pay checkout, and merchant.ladill.com deployment workflow. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
// Afia — in-app AI assistant scoped to Ladill Merchant.
|
||||
'product' => env('AFIA_PRODUCT', 'mini'),
|
||||
'enabled' => (bool) env('AFIA_ENABLED', true),
|
||||
'provider' => env('AFIA_PROVIDER', 'openai'), // openai | anthropic
|
||||
'model' => env('AFIA_MODEL', 'gpt-4o-mini'),
|
||||
'api_key' => env('AFIA_API_KEY'),
|
||||
];
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value is the name of your application, which will be used when the
|
||||
| framework needs to place the application's name in a notification or
|
||||
| other UI elements where an application name needs to be displayed.
|
||||
|
|
||||
*/
|
||||
|
||||
'name' => env('APP_NAME', 'Ladill Merchant'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Environment
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value determines the "environment" your application is currently
|
||||
| running in. This may determine how you prefer to configure various
|
||||
| services the application utilizes. Set this in your ".env" file.
|
||||
|
|
||||
*/
|
||||
|
||||
'env' => env('APP_ENV', 'production'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Debug Mode
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When your application is in debug mode, detailed error messages with
|
||||
| stack traces will be shown on every error that occurs within your
|
||||
| application. If disabled, a simple generic error page is shown.
|
||||
|
|
||||
*/
|
||||
|
||||
'debug' => (bool) env('APP_DEBUG', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application URL
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This URL is used by the console to properly generate URLs when using
|
||||
| the Artisan command line tool. You should set this to the root of
|
||||
| the application so that it's available within Artisan commands.
|
||||
|
|
||||
*/
|
||||
|
||||
'url' => env('APP_URL', 'http://localhost'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Timezone
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the default timezone for your application, which
|
||||
| will be used by the PHP date and date-time functions. The timezone
|
||||
| is set to "UTC" by default as it is suitable for most use cases.
|
||||
|
|
||||
*/
|
||||
|
||||
'timezone' => 'UTC',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Locale Configuration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The application locale determines the default locale that will be used
|
||||
| by Laravel's translation / localization methods. This option can be
|
||||
| set to any locale for which you plan to have translation strings.
|
||||
|
|
||||
*/
|
||||
|
||||
'locale' => env('APP_LOCALE', 'en'),
|
||||
|
||||
'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
|
||||
|
||||
'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Encryption Key
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This key is utilized by Laravel's encryption services and should be set
|
||||
| to a random, 32 character string to ensure that all encrypted values
|
||||
| are secure. You should do this prior to deploying the application.
|
||||
|
|
||||
*/
|
||||
|
||||
'cipher' => 'AES-256-CBC',
|
||||
|
||||
'key' => env('APP_KEY'),
|
||||
|
||||
'previous_keys' => [
|
||||
...array_filter(
|
||||
explode(',', (string) env('APP_PREVIOUS_KEYS', ''))
|
||||
),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Maintenance Mode Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These configuration options determine the driver used to determine and
|
||||
| manage Laravel's "maintenance mode" status. The "cache" driver will
|
||||
| allow maintenance mode to be controlled across multiple machines.
|
||||
|
|
||||
| Supported drivers: "file", "cache"
|
||||
|
|
||||
*/
|
||||
|
||||
'maintenance' => [
|
||||
'driver' => env('APP_MAINTENANCE_DRIVER', 'file'),
|
||||
'store' => env('APP_MAINTENANCE_STORE', 'database'),
|
||||
],
|
||||
|
||||
// Platform identity surfaces (Zoho One model). Ladill Merchant (merchant.ladill.com).
|
||||
'platform_domain' => env('PLATFORM_DOMAIN', parse_url((string) env('PLATFORM_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com'),
|
||||
'auth_domain' => env('AUTH_DOMAIN', 'auth.'.(parse_url((string) env('PLATFORM_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com')),
|
||||
'account_domain' => env('ACCOUNT_DOMAIN', 'account.'.(parse_url((string) env('PLATFORM_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com')),
|
||||
'give_domain' => env('MERCHANT_DOMAIN', parse_url((string) env('APP_URL', 'https://merchant.ladill.com'), PHP_URL_HOST) ?: 'merchant.ladill.com'),
|
||||
'servers_domain' => env('SERVERS_DOMAIN', 'servers.'.(parse_url((string) env('PLATFORM_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com')),
|
||||
'domains_domain' => env('DOMAINS_DOMAIN', 'domains.'.(parse_url((string) env('PLATFORM_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com')),
|
||||
|
||||
];
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
use App\Models\User;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Defaults
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default authentication "guard" and password
|
||||
| reset "broker" for your application. You may change these values
|
||||
| as required, but they're a perfect start for most applications.
|
||||
|
|
||||
*/
|
||||
|
||||
'defaults' => [
|
||||
'guard' => env('AUTH_GUARD', 'web'),
|
||||
'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Guards
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Next, you may define every authentication guard for your application.
|
||||
| Of course, a great default configuration has been defined for you
|
||||
| which utilizes session storage plus the Eloquent user provider.
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| Supported: "session"
|
||||
|
|
||||
*/
|
||||
|
||||
'guards' => [
|
||||
'web' => [
|
||||
'driver' => 'session',
|
||||
'provider' => 'users',
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| User Providers
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| If you have multiple user tables or models you may configure multiple
|
||||
| providers to represent the model / table. These providers may then
|
||||
| be assigned to any extra authentication guards you have defined.
|
||||
|
|
||||
| Supported: "database", "eloquent"
|
||||
|
|
||||
*/
|
||||
|
||||
'providers' => [
|
||||
'users' => [
|
||||
'driver' => 'eloquent',
|
||||
'model' => env('AUTH_MODEL', User::class),
|
||||
],
|
||||
|
||||
// 'users' => [
|
||||
// 'driver' => 'database',
|
||||
// 'table' => 'users',
|
||||
// ],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Resetting Passwords
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These configuration options specify the behavior of Laravel's password
|
||||
| reset functionality, including the table utilized for token storage
|
||||
| and the user provider that is invoked to actually retrieve users.
|
||||
|
|
||||
| The expiry time is the number of minutes that each reset token will be
|
||||
| considered valid. This security feature keeps tokens short-lived so
|
||||
| they have less time to be guessed. You may change this as needed.
|
||||
|
|
||||
| The throttle setting is the number of seconds a user must wait before
|
||||
| generating more password reset tokens. This prevents the user from
|
||||
| quickly generating a very large amount of password reset tokens.
|
||||
|
|
||||
*/
|
||||
|
||||
'passwords' => [
|
||||
'users' => [
|
||||
'provider' => 'users',
|
||||
'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
|
||||
'expire' => 60,
|
||||
'throttle' => 60,
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Confirmation Timeout
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define the number of seconds before a password confirmation
|
||||
| window expires and users are asked to re-enter their password via the
|
||||
| confirmation screen. By default, the timeout lasts for three hours.
|
||||
|
|
||||
*/
|
||||
|
||||
'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
|
||||
|
||||
];
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'api_url' => env('BILLING_API_URL', 'https://ladill.com/api/billing'),
|
||||
'api_key' => env('BILLING_API_KEY_MERCHANT'),
|
||||
'service' => 'merchant',
|
||||
'platform_settings_connection' => env('BILLING_PLATFORM_SETTINGS_CONNECTION', 'platform'),
|
||||
];
|
||||
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Cache Store
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default cache store that will be used by the
|
||||
| framework. This connection is utilized if another isn't explicitly
|
||||
| specified when running a cache operation inside the application.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('CACHE_STORE', 'database'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cache Stores
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define all of the cache "stores" for your application as
|
||||
| well as their drivers. You may even define multiple stores for the
|
||||
| same cache driver to group types of items stored in your caches.
|
||||
|
|
||||
| Supported drivers: "array", "database", "file", "memcached",
|
||||
| "redis", "dynamodb", "octane",
|
||||
| "failover", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'stores' => [
|
||||
|
||||
'array' => [
|
||||
'driver' => 'array',
|
||||
'serialize' => false,
|
||||
],
|
||||
|
||||
'database' => [
|
||||
'driver' => 'database',
|
||||
'connection' => env('DB_CACHE_CONNECTION'),
|
||||
'table' => env('DB_CACHE_TABLE', 'cache'),
|
||||
'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'),
|
||||
'lock_table' => env('DB_CACHE_LOCK_TABLE'),
|
||||
],
|
||||
|
||||
'file' => [
|
||||
'driver' => 'file',
|
||||
'path' => storage_path('framework/cache/data'),
|
||||
'lock_path' => storage_path('framework/cache/data'),
|
||||
],
|
||||
|
||||
'memcached' => [
|
||||
'driver' => 'memcached',
|
||||
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
|
||||
'sasl' => [
|
||||
env('MEMCACHED_USERNAME'),
|
||||
env('MEMCACHED_PASSWORD'),
|
||||
],
|
||||
'options' => [
|
||||
// Memcached::OPT_CONNECT_TIMEOUT => 2000,
|
||||
],
|
||||
'servers' => [
|
||||
[
|
||||
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
|
||||
'port' => env('MEMCACHED_PORT', 11211),
|
||||
'weight' => 100,
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'redis' => [
|
||||
'driver' => 'redis',
|
||||
'connection' => env('REDIS_CACHE_CONNECTION', 'cache'),
|
||||
'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'),
|
||||
],
|
||||
|
||||
'dynamodb' => [
|
||||
'driver' => 'dynamodb',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
|
||||
'endpoint' => env('DYNAMODB_ENDPOINT'),
|
||||
],
|
||||
|
||||
'octane' => [
|
||||
'driver' => 'octane',
|
||||
],
|
||||
|
||||
'failover' => [
|
||||
'driver' => 'failover',
|
||||
'stores' => [
|
||||
'database',
|
||||
'array',
|
||||
],
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cache Key Prefix
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When utilizing the APC, database, memcached, Redis, and DynamoDB cache
|
||||
| stores, there might be other applications using the same cache. For
|
||||
| that reason, you may prefix every cache key to avoid collisions.
|
||||
|
|
||||
*/
|
||||
|
||||
'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'),
|
||||
|
||||
];
|
||||
@@ -0,0 +1,204 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use Pdo\Mysql;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Database Connection Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify which of the database connections below you wish
|
||||
| to use as your default connection for database operations. This is
|
||||
| the connection which will be utilized unless another connection
|
||||
| is explicitly specified when you execute a query / statement.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('DB_CONNECTION', 'sqlite'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Database Connections
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Below are all of the database connections defined for your application.
|
||||
| An example configuration is provided for each database system which
|
||||
| is supported by Laravel. You're free to add / remove connections.
|
||||
|
|
||||
*/
|
||||
|
||||
'connections' => [
|
||||
|
||||
'sqlite' => [
|
||||
'driver' => 'sqlite',
|
||||
'url' => env('DB_URL'),
|
||||
'database' => env('DB_DATABASE', database_path('database.sqlite')),
|
||||
'prefix' => '',
|
||||
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
|
||||
'busy_timeout' => null,
|
||||
'journal_mode' => null,
|
||||
'synchronous' => null,
|
||||
'transaction_mode' => 'DEFERRED',
|
||||
],
|
||||
|
||||
'mysql' => [
|
||||
'driver' => 'mysql',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', '127.0.0.1'),
|
||||
'port' => env('DB_PORT', '3306'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'unix_socket' => env('DB_SOCKET', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8mb4'),
|
||||
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'strict' => true,
|
||||
'engine' => null,
|
||||
'options' => extension_loaded('pdo_mysql') ? array_filter([
|
||||
(PHP_VERSION_ID >= 80500 ? Mysql::ATTR_SSL_CA : PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'),
|
||||
]) : [],
|
||||
],
|
||||
|
||||
// Read-only access to platform admin settings (Paystack keys, etc.).
|
||||
'platform' => [
|
||||
'driver' => 'mysql',
|
||||
'host' => env('PLATFORM_DB_HOST', env('DB_HOST', '127.0.0.1')),
|
||||
'port' => env('PLATFORM_DB_PORT', env('DB_PORT', '3306')),
|
||||
'database' => env('PLATFORM_DB_DATABASE', 'ladilldb'),
|
||||
'username' => env('PLATFORM_DB_USERNAME', env('DB_USERNAME', 'root')),
|
||||
'password' => env('PLATFORM_DB_PASSWORD', env('DB_PASSWORD', '')),
|
||||
'unix_socket' => env('PLATFORM_DB_SOCKET', env('DB_SOCKET', '')),
|
||||
'charset' => env('DB_CHARSET', 'utf8mb4'),
|
||||
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'strict' => true,
|
||||
'engine' => null,
|
||||
'options' => extension_loaded('pdo_mysql') ? array_filter([
|
||||
(PHP_VERSION_ID >= 80500 ? Mysql::ATTR_SSL_CA : PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'),
|
||||
]) : [],
|
||||
],
|
||||
|
||||
'mariadb' => [
|
||||
'driver' => 'mariadb',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', '127.0.0.1'),
|
||||
'port' => env('DB_PORT', '3306'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'unix_socket' => env('DB_SOCKET', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8mb4'),
|
||||
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'strict' => true,
|
||||
'engine' => null,
|
||||
'options' => extension_loaded('pdo_mysql') ? array_filter([
|
||||
(PHP_VERSION_ID >= 80500 ? Mysql::ATTR_SSL_CA : PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'),
|
||||
]) : [],
|
||||
],
|
||||
|
||||
'pgsql' => [
|
||||
'driver' => 'pgsql',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', '127.0.0.1'),
|
||||
'port' => env('DB_PORT', '5432'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
'search_path' => 'public',
|
||||
'sslmode' => env('DB_SSLMODE', 'prefer'),
|
||||
],
|
||||
|
||||
'sqlsrv' => [
|
||||
'driver' => 'sqlsrv',
|
||||
'url' => env('DB_URL'),
|
||||
'host' => env('DB_HOST', 'localhost'),
|
||||
'port' => env('DB_PORT', '1433'),
|
||||
'database' => env('DB_DATABASE', 'laravel'),
|
||||
'username' => env('DB_USERNAME', 'root'),
|
||||
'password' => env('DB_PASSWORD', ''),
|
||||
'charset' => env('DB_CHARSET', 'utf8'),
|
||||
'prefix' => '',
|
||||
'prefix_indexes' => true,
|
||||
// 'encrypt' => env('DB_ENCRYPT', 'yes'),
|
||||
// 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Migration Repository Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This table keeps track of all the migrations that have already run for
|
||||
| your application. Using this information, we can determine which of
|
||||
| the migrations on disk haven't actually been run on the database.
|
||||
|
|
||||
*/
|
||||
|
||||
'migrations' => [
|
||||
'table' => 'migrations',
|
||||
'update_date_on_publish' => true,
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Redis Databases
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Redis is an open source, fast, and advanced key-value store that also
|
||||
| provides a richer body of commands than a typical key-value system
|
||||
| such as Memcached. You may define your connection settings here.
|
||||
|
|
||||
*/
|
||||
|
||||
'redis' => [
|
||||
|
||||
'client' => env('REDIS_CLIENT', 'phpredis'),
|
||||
|
||||
'options' => [
|
||||
'cluster' => env('REDIS_CLUSTER', 'redis'),
|
||||
'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'),
|
||||
'persistent' => env('REDIS_PERSISTENT', false),
|
||||
],
|
||||
|
||||
'default' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'username' => env('REDIS_USERNAME'),
|
||||
'password' => env('REDIS_PASSWORD'),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_DB', '0'),
|
||||
'max_retries' => env('REDIS_MAX_RETRIES', 3),
|
||||
'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
|
||||
'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
|
||||
'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
|
||||
],
|
||||
|
||||
'cache' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'username' => env('REDIS_USERNAME'),
|
||||
'password' => env('REDIS_PASSWORD'),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_CACHE_DB', '1'),
|
||||
'max_retries' => env('REDIS_MAX_RETRIES', 3),
|
||||
'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
|
||||
'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
|
||||
'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'api_url' => env('DOMAIN_API_URL', 'https://ladill.com/api/domains'),
|
||||
'api_key' => env('DOMAIN_API_KEY_HOSTING'),
|
||||
];
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
| Email product plans. Mailboxes are priced purely by the storage tier chosen
|
||||
| at creation (and changeable later via Upgrade). The 1 GB tier is FREE,
|
||||
| forever, for every mailbox; larger tiers are billed monthly from the one
|
||||
| Ladill wallet (§4-A). Money is in minor units (pesewas).
|
||||
*/
|
||||
'currency' => env('EMAIL_CURRENCY', 'GHS'),
|
||||
'default_quota_mb' => (int) env('EMAIL_DEFAULT_QUOTA_MB', 1024), // new mailboxes start on the free 1 GB tier
|
||||
|
||||
// Storage tiers: quota (MB) → monthly price (minor units). 1 GB is free.
|
||||
'quota_tiers' => [
|
||||
['mb' => 1024, 'price_minor' => 0], // 1 GB — Free forever
|
||||
['mb' => 5120, 'price_minor' => 1000], // 5 GB — GHS 10
|
||||
['mb' => 10240, 'price_minor' => 2000], // 10 GB — GHS 20
|
||||
['mb' => 25600, 'price_minor' => 3000], // 25 GB — GHS 30
|
||||
['mb' => 51200, 'price_minor' => 6000], // 50 GB — GHS 60
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
// Consumer config for the shared Email-Domain verification API (§4-D).
|
||||
'api_url' => env('EMAILDOMAIN_API_URL', 'https://ladill.com/api/email-domains'),
|
||||
'api_key' => env('EMAILDOMAIN_API_KEY_EMAIL'),
|
||||
];
|
||||
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Filesystem Disk
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the default filesystem disk that should be used
|
||||
| by the framework. The "local" disk, as well as a variety of cloud
|
||||
| based disks are available to your application for file storage.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('FILESYSTEM_DISK', 'local'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Filesystem Disks
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Below you may configure as many filesystem disks as necessary, and you
|
||||
| may even configure multiple disks for the same driver. Examples for
|
||||
| most supported storage drivers are configured here for reference.
|
||||
|
|
||||
| Supported drivers: "local", "ftp", "sftp", "s3"
|
||||
|
|
||||
*/
|
||||
|
||||
'disks' => [
|
||||
|
||||
'local' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/private'),
|
||||
'serve' => true,
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
'public' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/public'),
|
||||
'url' => rtrim(env('APP_URL', 'http://localhost'), '/').'/storage',
|
||||
'visibility' => 'public',
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
's3' => [
|
||||
'driver' => 's3',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'region' => env('AWS_DEFAULT_REGION'),
|
||||
'bucket' => env('AWS_BUCKET'),
|
||||
'url' => env('AWS_URL'),
|
||||
'endpoint' => env('AWS_ENDPOINT'),
|
||||
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
'qr' => [
|
||||
'driver' => 'local',
|
||||
'root' => storage_path('app/private/qr'),
|
||||
'throw' => false,
|
||||
'report' => false,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Symbolic Links
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the symbolic links that will be created when the
|
||||
| `storage:link` Artisan command is executed. The array keys should be
|
||||
| the locations of the links and the values should be their targets.
|
||||
|
|
||||
*/
|
||||
|
||||
'links' => [
|
||||
public_path('storage') => storage_path('app/public'),
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,703 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Contabo API Configuration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Credentials for the Contabo Compute Management API.
|
||||
| Used for provisioning VPS and VDS instances.
|
||||
|
|
||||
*/
|
||||
'contabo' => [
|
||||
'client_id' => env('CONTABO_CLIENT_ID'),
|
||||
'client_secret' => env('CONTABO_CLIENT_SECRET'),
|
||||
'api_user' => env('CONTABO_API_USER'),
|
||||
'api_password' => env('CONTABO_API_PASSWORD'),
|
||||
'product_catalog_endpoint' => env('CONTABO_PRODUCT_CATALOG_ENDPOINT'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Pricing Configuration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Dynamic pricing settings for VPS/Dedicated servers.
|
||||
| Base prices from Contabo are in USD, converted to GHS using exchange rate.
|
||||
|
|
||||
*/
|
||||
'pricing' => [
|
||||
'base_currency' => 'USD',
|
||||
'display_currency' => 'GHS',
|
||||
|
||||
// Fallback rate used when live API fails
|
||||
'fallback_usd_to_ghs_rate' => env('FALLBACK_USD_TO_GHS_RATE', 15.50),
|
||||
|
||||
// Profit margins (percentage on top of converted Contabo USD price)
|
||||
'margins' => [
|
||||
'vps' => env('VPS_PROFIT_MARGIN', 45),
|
||||
'dedicated' => env('DEDICATED_PROFIT_MARGIN', 30),
|
||||
],
|
||||
|
||||
'contabo_price_cache_ttl' => env('CONTABO_PRICE_CACHE_TTL', 3600),
|
||||
|
||||
'term_discounts' => [
|
||||
'quarterly' => 5,
|
||||
'semiannual' => 10,
|
||||
'yearly' => 20,
|
||||
],
|
||||
|
||||
'setup_fee_rules' => [
|
||||
// VPS 10 only — monthly and semiannual cycles carry a setup fee equal to 1× the monthly price
|
||||
[
|
||||
'product_ids' => ['V91'],
|
||||
'billing_cycles' => ['monthly', 'semiannual'],
|
||||
'monthly_price_multiplier' => 1,
|
||||
'label' => 'One-time setup fee',
|
||||
],
|
||||
// Dedicated servers — fixed EUR fee that decreases with longer commitment; waived on yearly
|
||||
[
|
||||
'product_ids' => ['amd-ryzen-12-cores', 'amd-genoa-24-cores'],
|
||||
'billing_cycles' => ['monthly', 'quarterly', 'semiannual'],
|
||||
'fixed_eur_by_cycle' => [
|
||||
'monthly' => 39.99,
|
||||
'quarterly' => 29.99,
|
||||
'semiannual' => 19.99,
|
||||
],
|
||||
'label' => 'One-time setup fee',
|
||||
],
|
||||
],
|
||||
|
||||
// Fallback Contabo base prices in USD. Live API/feed prices are preferred.
|
||||
// Keep these values as a fail-safe for API downtime.
|
||||
'contabo_base_prices' => [
|
||||
'V91' => ['monthly' => 4.99, 'name' => 'Cloud VPS 10 NVMe', 'cpu' => 3, 'ram_gb' => 8, 'disk_gb' => 75],
|
||||
'V94' => ['monthly' => 7.00, 'name' => 'Cloud VPS 20 NVMe', 'cpu' => 6, 'ram_gb' => 12, 'disk_gb' => 100],
|
||||
'V97' => ['monthly' => 14.00, 'name' => 'Cloud VPS 30 NVMe', 'cpu' => 8, 'ram_gb' => 24, 'disk_gb' => 200],
|
||||
'V100' => ['monthly' => 25.00, 'name' => 'Cloud VPS 40 NVMe', 'cpu' => 12, 'ram_gb' => 48, 'disk_gb' => 250],
|
||||
'amd-ryzen-12-cores' => ['monthly' => 104.64, 'name' => 'AMD Ryzen 12 Cores', 'cpu' => 12, 'ram_gb' => 64, 'disk_gb' => 1000],
|
||||
'amd-genoa-24-cores' => ['monthly' => 184.21, 'name' => 'AMD Genoa 24 Cores', 'cpu' => 24, 'ram_gb' => 128, 'disk_gb' => 2000],
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Server Order Options
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Surcharges shown here are Contabo-side monthly USD add-on costs before
|
||||
| the Ladill exchange-rate conversion and product margin are applied.
|
||||
| Update these values whenever Contabo changes its commercial pricing.
|
||||
|
|
||||
*/
|
||||
'server_order' => [
|
||||
'regions' => [
|
||||
'EU' => ['label' => 'Europe (Germany)', 'monthly_usd' => 0.00, 'automated' => true],
|
||||
'US-central' => ['label' => 'US Central', 'monthly_usd' => 0.00, 'automated' => true],
|
||||
'US-east' => ['label' => 'US East', 'monthly_usd' => 0.00, 'automated' => true],
|
||||
'US-west' => ['label' => 'US West', 'monthly_usd' => 0.00, 'automated' => true],
|
||||
'UK' => ['label' => 'United Kingdom', 'monthly_usd' => 0.00, 'automated' => true],
|
||||
'SIN' => ['label' => 'Singapore', 'monthly_usd' => 0.00, 'automated' => true],
|
||||
'AUS' => ['label' => 'Australia', 'monthly_usd' => 0.00, 'automated' => true],
|
||||
'JPN' => ['label' => 'Japan', 'monthly_usd' => 0.00, 'automated' => true],
|
||||
],
|
||||
'image_pricing_rules' => [
|
||||
[
|
||||
'key' => 'windows',
|
||||
'label' => 'Windows Server',
|
||||
'monthly_usd' => 9.30,
|
||||
'match' => ['windows'],
|
||||
'os_family' => 'windows',
|
||||
'default_user' => 'administrator',
|
||||
'requires_custom_image_addon' => false,
|
||||
'automated' => true,
|
||||
],
|
||||
[
|
||||
'key' => 'ubuntu',
|
||||
'label' => 'Ubuntu',
|
||||
'monthly_usd' => 0.00,
|
||||
'match' => ['ubuntu'],
|
||||
'os_family' => 'linux',
|
||||
'default_user' => 'root',
|
||||
'requires_custom_image_addon' => false,
|
||||
'automated' => true,
|
||||
],
|
||||
[
|
||||
'key' => 'rhel',
|
||||
'label' => 'RHEL Variants',
|
||||
'monthly_usd' => 0.00,
|
||||
'match' => ['alma', 'rocky', 'rhel', 'centos'],
|
||||
'os_family' => 'linux',
|
||||
'default_user' => 'root',
|
||||
'requires_custom_image_addon' => false,
|
||||
'automated' => true,
|
||||
],
|
||||
[
|
||||
'key' => 'custom',
|
||||
'label' => 'Custom Images',
|
||||
'monthly_usd' => 0.00,
|
||||
'custom_image' => true,
|
||||
'os_family' => 'linux',
|
||||
'default_user' => 'root',
|
||||
'requires_custom_image_addon' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
[
|
||||
'key' => 'linux',
|
||||
'label' => 'Linux',
|
||||
'monthly_usd' => 0.00,
|
||||
'match' => ['debian', 'fedora', 'linux', 'bsd'],
|
||||
'os_family' => 'linux',
|
||||
'default_user' => 'root',
|
||||
'requires_custom_image_addon' => false,
|
||||
'automated' => true,
|
||||
],
|
||||
],
|
||||
'fallback_images' => [
|
||||
[
|
||||
'value' => 'afecbb85-e2fc-46f0-9684-b46b1faf00bb',
|
||||
'label' => 'Ubuntu 22.04',
|
||||
'description' => 'Fallback Ubuntu image',
|
||||
'os_family' => 'linux',
|
||||
'monthly_usd' => 0.00,
|
||||
'default_user' => 'root',
|
||||
'requires_custom_image_addon' => false,
|
||||
'automated' => true,
|
||||
],
|
||||
],
|
||||
'managed_stack_supported_images' => [
|
||||
[
|
||||
'value' => 'afecbb85-e2fc-46f0-9684-b46b1faf00bb',
|
||||
'label' => 'Ubuntu 22.04 LTS',
|
||||
'match' => ['ubuntu 22.04'],
|
||||
'os_family' => 'linux',
|
||||
],
|
||||
[
|
||||
'label' => 'Ubuntu 24.04 LTS',
|
||||
'match' => ['ubuntu 24.04'],
|
||||
'os_family' => 'linux',
|
||||
],
|
||||
[
|
||||
'label' => 'Debian 12',
|
||||
'match' => ['debian 12', 'bookworm'],
|
||||
'os_family' => 'linux',
|
||||
],
|
||||
[
|
||||
'label' => 'AlmaLinux',
|
||||
'match' => ['almalinux', 'alma linux', 'alma'],
|
||||
'os_family' => 'linux',
|
||||
],
|
||||
[
|
||||
'label' => 'Rocky Linux',
|
||||
'match' => ['rocky linux', 'rocky'],
|
||||
'os_family' => 'linux',
|
||||
],
|
||||
[
|
||||
'label' => 'Fedora',
|
||||
'match' => ['fedora'],
|
||||
'os_family' => 'linux',
|
||||
],
|
||||
[
|
||||
'label' => 'openSUSE Leap',
|
||||
'match' => ['opensuse leap', 'open suse leap', 'opensuse', 'leap'],
|
||||
'os_family' => 'linux',
|
||||
],
|
||||
[
|
||||
'label' => 'CentOS',
|
||||
'match' => ['centos'],
|
||||
'os_family' => 'linux',
|
||||
],
|
||||
],
|
||||
'licenses' => [
|
||||
'none' => [
|
||||
'label' => 'Remote Login Only',
|
||||
'description' => 'No hosting panel or commercial control-panel license.',
|
||||
'monthly_usd' => 0.00,
|
||||
'license' => null,
|
||||
'panel' => null,
|
||||
'automated' => true,
|
||||
],
|
||||
'ladill_panel' => [
|
||||
'label' => 'Ladill Server Manager',
|
||||
'description' => 'Manage power, status, and server details from the Ladill server manager.',
|
||||
'monthly_usd' => 0.00,
|
||||
'license' => null,
|
||||
'panel' => 'ladill',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'requires_managed_stack_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'plesk_host' => [
|
||||
'label' => 'Plesk + Linux',
|
||||
'description' => 'Plesk host edition on Linux.',
|
||||
'monthly_usd' => 15.00,
|
||||
'license' => 'PleskHost',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'plesk_windows' => [
|
||||
'label' => 'Plesk + Windows',
|
||||
'description' => 'Plesk on Windows Server.',
|
||||
'monthly_usd' => 22.70,
|
||||
'license' => 'PleskHost',
|
||||
'compatible_os_families' => ['windows'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_5' => [
|
||||
'label' => 'cPanel 5',
|
||||
'description' => 'cPanel license for up to 5 accounts.',
|
||||
'monthly_usd' => 35.99,
|
||||
'license' => 'cPanel5',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_30' => [
|
||||
'label' => 'cPanel 30',
|
||||
'description' => 'cPanel license for up to 30 accounts.',
|
||||
'monthly_usd' => 53.99,
|
||||
'license' => 'cPanel30',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_50' => [
|
||||
'label' => 'cPanel 50',
|
||||
'description' => 'cPanel license for up to 50 accounts.',
|
||||
'monthly_usd' => 53.99 + (0.49 * 20),
|
||||
'license' => 'cPanel50',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_100' => [
|
||||
'label' => 'cPanel 100',
|
||||
'description' => 'cPanel license for up to 100 accounts.',
|
||||
'monthly_usd' => 69.99,
|
||||
'license' => 'cPanel100',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_150' => [
|
||||
'label' => 'cPanel 150',
|
||||
'description' => 'cPanel license for up to 150 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 50),
|
||||
'license' => 'cPanel150',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_200' => [
|
||||
'label' => 'cPanel 200',
|
||||
'description' => 'cPanel license for up to 200 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 100),
|
||||
'license' => 'cPanel200',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_250' => [
|
||||
'label' => 'cPanel 250',
|
||||
'description' => 'cPanel license for up to 250 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 150),
|
||||
'license' => 'cPanel250',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_300' => [
|
||||
'label' => 'cPanel 300',
|
||||
'description' => 'cPanel license for up to 300 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 200),
|
||||
'license' => 'cPanel300',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_350' => [
|
||||
'label' => 'cPanel 350',
|
||||
'description' => 'cPanel license for up to 350 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 250),
|
||||
'license' => 'cPanel350',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_400' => [
|
||||
'label' => 'cPanel 400',
|
||||
'description' => 'cPanel license for up to 400 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 300),
|
||||
'license' => 'cPanel400',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_450' => [
|
||||
'label' => 'cPanel 450',
|
||||
'description' => 'cPanel license for up to 450 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 350),
|
||||
'license' => 'cPanel450',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_500' => [
|
||||
'label' => 'cPanel 500',
|
||||
'description' => 'cPanel license for up to 500 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 400),
|
||||
'license' => 'cPanel500',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_550' => [
|
||||
'label' => 'cPanel 550',
|
||||
'description' => 'cPanel license for up to 550 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 450),
|
||||
'license' => 'cPanel550',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_600' => [
|
||||
'label' => 'cPanel 600',
|
||||
'description' => 'cPanel license for up to 600 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 500),
|
||||
'license' => 'cPanel600',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_650' => [
|
||||
'label' => 'cPanel 650',
|
||||
'description' => 'cPanel license for up to 650 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 550),
|
||||
'license' => 'cPanel650',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_700' => [
|
||||
'label' => 'cPanel 700',
|
||||
'description' => 'cPanel license for up to 700 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 600),
|
||||
'license' => 'cPanel700',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_750' => [
|
||||
'label' => 'cPanel 750',
|
||||
'description' => 'cPanel license for up to 750 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 650),
|
||||
'license' => 'cPanel750',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_800' => [
|
||||
'label' => 'cPanel 800',
|
||||
'description' => 'cPanel license for up to 800 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 700),
|
||||
'license' => 'cPanel800',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_850' => [
|
||||
'label' => 'cPanel 850',
|
||||
'description' => 'cPanel license for up to 850 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 750),
|
||||
'license' => 'cPanel850',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_900' => [
|
||||
'label' => 'cPanel 900',
|
||||
'description' => 'cPanel license for up to 900 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 800),
|
||||
'license' => 'cPanel900',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_950' => [
|
||||
'label' => 'cPanel 950',
|
||||
'description' => 'cPanel license for up to 950 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 850),
|
||||
'license' => 'cPanel950',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'cpanel_1000' => [
|
||||
'label' => 'cPanel 1000',
|
||||
'description' => 'cPanel license for up to 1000 accounts.',
|
||||
'monthly_usd' => 69.99 + (0.49 * 900),
|
||||
'license' => 'cPanel1000',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
],
|
||||
'applications' => [
|
||||
'none' => [
|
||||
'label' => 'No Preinstalled App',
|
||||
'description' => 'Provision the server without an extra preinstalled application.',
|
||||
'monthly_usd' => 0.00,
|
||||
'automated' => true,
|
||||
],
|
||||
'webmin' => [
|
||||
'label' => 'Webmin',
|
||||
'description' => 'Free Webmin server panel installed automatically on Linux.',
|
||||
'monthly_usd' => 0.00,
|
||||
'cloud_init_preset' => 'webmin',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'webmin_lamp' => [
|
||||
'label' => 'Webmin + LAMP',
|
||||
'description' => 'Free Webmin plus Apache, MariaDB, and PHP on Linux.',
|
||||
'monthly_usd' => 0.00,
|
||||
'cloud_init_preset' => 'webmin_lamp',
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'ipfs_node' => [
|
||||
'label' => 'IPFS Node',
|
||||
'description' => 'Contabo application profile for IPFS nodes.',
|
||||
'monthly_usd' => 0.00,
|
||||
'application_id' => env('CONTABO_APP_ID_IPFS_NODE'),
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'flux_node' => [
|
||||
'label' => 'Flux Node',
|
||||
'description' => 'Contabo application profile for Flux nodes.',
|
||||
'monthly_usd' => 0.00,
|
||||
'application_id' => env('CONTABO_APP_ID_FLUX_NODE'),
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'horizon_node' => [
|
||||
'label' => 'Horizen Node',
|
||||
'description' => 'Contabo application profile for Horizen nodes.',
|
||||
'monthly_usd' => 0.00,
|
||||
'application_id' => env('CONTABO_APP_ID_HORIZON_NODE'),
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'ethereum_node' => [
|
||||
'label' => 'Ethereum Node',
|
||||
'description' => 'Contabo application profile for Ethereum 2.0 nodes.',
|
||||
'monthly_usd' => 0.00,
|
||||
'application_id' => null,
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
'bitcoin_node' => [
|
||||
'label' => 'Bitcoin Full Node',
|
||||
'description' => 'Contabo application profile for Bitcoin full nodes.',
|
||||
'monthly_usd' => 0.00,
|
||||
'application_id' => null,
|
||||
'compatible_os_families' => ['linux'],
|
||||
'requires_image' => true,
|
||||
'automated' => true,
|
||||
],
|
||||
],
|
||||
'additional_ip' => [
|
||||
'none' => [
|
||||
'label' => '1 IP Address',
|
||||
'description' => 'Default primary IP only.',
|
||||
'monthly_usd' => 0.00,
|
||||
'add_on' => null,
|
||||
'automated' => true,
|
||||
],
|
||||
'one_extra' => [
|
||||
'label' => '1 Additional IP',
|
||||
'description' => 'Adds one extra IPv4 address.',
|
||||
'monthly_usd' => 4.50,
|
||||
'add_on' => 'additionalIps',
|
||||
'automated' => true,
|
||||
],
|
||||
],
|
||||
'private_networking' => [
|
||||
'disabled' => [
|
||||
'label' => 'No Private Networking',
|
||||
'description' => 'Do not enable the private networking add-on.',
|
||||
'monthly_usd' => 0.00,
|
||||
'add_on' => null,
|
||||
'automated' => true,
|
||||
],
|
||||
'enabled' => [
|
||||
'label' => 'Private Networking Enabled',
|
||||
'description' => 'Purchases the private networking add-on.',
|
||||
'monthly_usd' => 2.99,
|
||||
'add_on' => 'privateNetworking',
|
||||
'automated' => true,
|
||||
],
|
||||
],
|
||||
'storage_types' => [
|
||||
'included' => [
|
||||
'label' => 'Included Storage',
|
||||
'description' => 'Use the plan default storage.',
|
||||
'monthly_usd' => 0.00,
|
||||
'add_on' => null,
|
||||
'automated' => true,
|
||||
],
|
||||
'ssd_300' => [
|
||||
'label' => '300 GB SSD',
|
||||
'description' => 'Higher SSD storage tier.',
|
||||
'monthly_usd' => 1.95,
|
||||
'add_on' => 'extraStorage',
|
||||
'automated' => false,
|
||||
],
|
||||
'nvme_150' => [
|
||||
'label' => '150 GB NVMe',
|
||||
'description' => 'Higher NVMe storage tier.',
|
||||
'monthly_usd' => 2.30,
|
||||
'add_on' => 'extraStorage',
|
||||
'automated' => false,
|
||||
],
|
||||
],
|
||||
'object_storage' => [
|
||||
'none' => [
|
||||
'label' => 'No Object Storage',
|
||||
'description' => 'Do not order object storage with this server.',
|
||||
'monthly_usd' => 0.00,
|
||||
'automated' => false,
|
||||
],
|
||||
'eu_250' => [
|
||||
'label' => '250 GB Object Storage (EU)',
|
||||
'description' => 'S3-compatible object storage in the European Union.',
|
||||
'monthly_usd' => 2.99,
|
||||
'automated' => false,
|
||||
],
|
||||
'eu_500' => [
|
||||
'label' => '500 GB Object Storage (EU)',
|
||||
'description' => 'S3-compatible object storage in the European Union.',
|
||||
'monthly_usd' => 5.98,
|
||||
'automated' => false,
|
||||
],
|
||||
'eu_750' => [
|
||||
'label' => '750 GB Object Storage (EU)',
|
||||
'description' => 'S3-compatible object storage in the European Union.',
|
||||
'monthly_usd' => 8.97,
|
||||
'automated' => false,
|
||||
],
|
||||
'eu_1024' => [
|
||||
'label' => '1 TB Object Storage (EU)',
|
||||
'description' => 'S3-compatible object storage in the European Union.',
|
||||
'monthly_usd' => 11.96,
|
||||
'automated' => false,
|
||||
],
|
||||
],
|
||||
'linux_default_users' => [
|
||||
'root' => ['label' => 'root'],
|
||||
'admin' => ['label' => 'admin'],
|
||||
],
|
||||
'windows_default_users' => [
|
||||
'admin' => ['label' => 'admin'],
|
||||
'administrator' => ['label' => 'administrator'],
|
||||
],
|
||||
],
|
||||
|
||||
'server_agent' => [
|
||||
'release_version' => env('SERVER_AGENT_RELEASE_VERSION', '0.2.0'),
|
||||
'signed_release_ttl_minutes' => (int) env('SERVER_AGENT_SIGNED_RELEASE_TTL_MINUTES', 10080),
|
||||
'heartbeat_interval_seconds' => 15,
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Shared Hosting Configuration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Settings for the shared hosting nodes.
|
||||
|
|
||||
*/
|
||||
'shared' => [
|
||||
'default_php_version' => '8.2',
|
||||
'available_php_versions' => ['8.0', '8.1', '8.2', '8.3'],
|
||||
'default_document_root' => 'public_html',
|
||||
'max_upload_size_mb' => 64,
|
||||
'max_execution_time' => 300,
|
||||
'memory_limit_mb' => 256,
|
||||
'phpmyadmin_url' => env('HOSTING_PHPMYADMIN_URL', ''),
|
||||
'phpmyadmin_sso_secret' => env('HOSTING_PHPMYADMIN_SSO_SECRET', ''),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| VPS Configuration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Default settings for VPS instances.
|
||||
|
|
||||
*/
|
||||
'vps' => [
|
||||
'default_region' => 'EU',
|
||||
'default_image' => 'afecbb85-e2fc-46f0-9684-b46b1faf00bb', // Ubuntu 22.04
|
||||
'available_regions' => ['EU', 'US-central', 'US-east', 'US-west', 'SIN', 'UK', 'AUS', 'JPN'],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Installer Configuration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Settings for the one-click app installer.
|
||||
|
|
||||
*/
|
||||
'apps' => [
|
||||
'enabled' => ['wordpress', 'joomla', 'drupal', 'opencart'],
|
||||
'magento_enabled' => false, // Requires higher resource plans
|
||||
'wordpress' => [
|
||||
'default_version' => '6.4',
|
||||
'wp_cli_path' => '/usr/local/bin/wp',
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Provisioning Settings
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| General provisioning configuration.
|
||||
|
|
||||
*/
|
||||
'provisioning' => [
|
||||
'max_retries' => 3,
|
||||
'retry_delay_minutes' => 5,
|
||||
'timeout_minutes' => 30,
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Legacy ResellerClub Integration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Keep RC integration active for existing customers.
|
||||
|
|
||||
*/
|
||||
'legacy' => [
|
||||
// Keep RC data/API available for customers with existing ResellerClub services.
|
||||
'rc_enabled' => (bool) env('LADILL_RC_LEGACY_ENABLED', true),
|
||||
// New sales and automated fulfillment use Ladill (Dynadot domains, native hosting).
|
||||
'rc_new_orders_enabled' => (bool) env('LADILL_RC_NEW_ORDERS_ENABLED', false),
|
||||
// Renew existing ResellerClub services (hosting, domains, VPS, etc.).
|
||||
'rc_renewals_enabled' => (bool) env('LADILL_RC_RENEWALS_ENABLED', true),
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'api_url' => env('IDENTITY_API_URL', 'https://ladill.com/api'),
|
||||
'api_key' => env('IDENTITY_API_KEY_MERCHANT'),
|
||||
];
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Ladill App Launcher — SHARED, IDENTICAL across every app/service repo
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Lists ONLY fully-extracted apps (each on its own subdomain). To replicate the
|
||||
| launcher in a new app, copy these three things verbatim into that repo:
|
||||
| - config/ladill_launcher.php (this file)
|
||||
| - resources/views/partials/launcher.blade.php
|
||||
| - public/images/launcher-icons/* (the icon set)
|
||||
|
|
||||
| When a service becomes FULLY extracted: add one row below AND drop its icon in
|
||||
| public/images/launcher-icons/ — in EVERY repo. That's the only edit needed.
|
||||
| Do NOT list a service here until it is fully extracted to its own subdomain.
|
||||
|
|
||||
| URLs are absolute (built from the platform root) so this file is byte-identical
|
||||
| in every app; the blade omits whichever row matches the app's APP_URL host.
|
||||
| Icons are served from /images/launcher-icons/<icon>.
|
||||
*/
|
||||
|
||||
$root = config('app.platform_domain', 'ladill.com');
|
||||
|
||||
return [
|
||||
'apps' => [
|
||||
['name' => 'Bird', 'url' => 'https://bird.'.$root, 'icon' => 'bird.svg'],
|
||||
['name' => 'Email', 'url' => 'https://email.'.$root, 'icon' => 'email.svg'],
|
||||
['name' => 'Mail', 'url' => 'https://mail.'.$root, 'icon' => 'mail.svg'],
|
||||
['name' => 'Domains', 'url' => 'https://domains.'.$root, 'icon' => 'domains.svg'],
|
||||
['name' => 'Servers', 'url' => 'https://servers.'.$root, 'icon' => 'servers.svg'],
|
||||
['name' => 'Hosting', 'url' => 'https://hosting.'.$root, 'icon' => 'hosting.svg'],
|
||||
['name' => 'QR Plus', 'url' => 'https://qrplus.'.$root.'/sso/connect?redirect='.urlencode('https://qrplus.'.$root.'/dashboard'), 'icon' => 'qrplus.svg'],
|
||||
['name' => 'Events', 'url' => 'https://events.'.$root.'/sso/connect?redirect='.urlencode('https://events.'.$root.'/dashboard'), 'icon' => 'events.svg'],
|
||||
['name' => 'Mini', 'url' => 'https://mini.'.$root.'/sso/connect?redirect='.urlencode('https://mini.'.$root.'/dashboard'), 'icon' => 'mini.svg'],
|
||||
['name' => 'Give', 'url' => 'https://give.'.$root.'/sso/connect?redirect='.urlencode('https://give.'.$root.'/dashboard'), 'icon' => 'give.svg'],
|
||||
['name' => 'Merchant', 'url' => 'https://merchant.'.$root.'/sso/connect?redirect='.urlencode('https://merchant.'.$root.'/dashboard'), 'icon' => 'merchant.svg'],
|
||||
['name' => 'Transfer', 'url' => 'https://transfer.'.$root.'/sso/connect?redirect='.urlencode('https://transfer.'.$root.'/dashboard'), 'icon' => 'transfer.svg'],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
use Monolog\Handler\NullHandler;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
use Monolog\Handler\SyslogUdpHandler;
|
||||
use Monolog\Processor\PsrLogMessageProcessor;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Log Channel
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default log channel that is utilized to write
|
||||
| messages to your logs. The value provided here should match one of
|
||||
| the channels present in the list of "channels" configured below.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('LOG_CHANNEL', 'stack'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Deprecations Log Channel
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the log channel that should be used to log warnings
|
||||
| regarding deprecated PHP and library features. This allows you to get
|
||||
| your application ready for upcoming major versions of dependencies.
|
||||
|
|
||||
*/
|
||||
|
||||
'deprecations' => [
|
||||
'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
|
||||
'trace' => env('LOG_DEPRECATIONS_TRACE', false),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Log Channels
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the log channels for your application. Laravel
|
||||
| utilizes the Monolog PHP logging library, which includes a variety
|
||||
| of powerful log handlers and formatters that you're free to use.
|
||||
|
|
||||
| Available drivers: "single", "daily", "slack", "syslog",
|
||||
| "errorlog", "monolog", "custom", "stack"
|
||||
|
|
||||
*/
|
||||
|
||||
'channels' => [
|
||||
|
||||
'stack' => [
|
||||
'driver' => 'stack',
|
||||
'channels' => explode(',', (string) env('LOG_STACK', 'single')),
|
||||
'ignore_exceptions' => false,
|
||||
],
|
||||
|
||||
'single' => [
|
||||
'driver' => 'single',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'daily' => [
|
||||
'driver' => 'daily',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'days' => env('LOG_DAILY_DAYS', 14),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'slack' => [
|
||||
'driver' => 'slack',
|
||||
'url' => env('LOG_SLACK_WEBHOOK_URL'),
|
||||
'username' => env('LOG_SLACK_USERNAME', env('APP_NAME', 'Laravel')),
|
||||
'emoji' => env('LOG_SLACK_EMOJI', ':boom:'),
|
||||
'level' => env('LOG_LEVEL', 'critical'),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'papertrail' => [
|
||||
'driver' => 'monolog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
|
||||
'handler_with' => [
|
||||
'host' => env('PAPERTRAIL_URL'),
|
||||
'port' => env('PAPERTRAIL_PORT'),
|
||||
'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
|
||||
],
|
||||
'processors' => [PsrLogMessageProcessor::class],
|
||||
],
|
||||
|
||||
'stderr' => [
|
||||
'driver' => 'monolog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'handler' => StreamHandler::class,
|
||||
'handler_with' => [
|
||||
'stream' => 'php://stderr',
|
||||
],
|
||||
'formatter' => env('LOG_STDERR_FORMATTER'),
|
||||
'processors' => [PsrLogMessageProcessor::class],
|
||||
],
|
||||
|
||||
'syslog' => [
|
||||
'driver' => 'syslog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'errorlog' => [
|
||||
'driver' => 'errorlog',
|
||||
'level' => env('LOG_LEVEL', 'debug'),
|
||||
'replace_placeholders' => true,
|
||||
],
|
||||
|
||||
'null' => [
|
||||
'driver' => 'monolog',
|
||||
'handler' => NullHandler::class,
|
||||
],
|
||||
|
||||
'emergency' => [
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Mailer
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default mailer that is used to send all email
|
||||
| messages unless another mailer is explicitly specified when sending
|
||||
| the message. All additional mailers can be configured within the
|
||||
| "mailers" array. Examples of each type of mailer are provided.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('MAIL_MAILER', 'log'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Mailer Configurations
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure all of the mailers used by your application plus
|
||||
| their respective settings. Several examples have been configured for
|
||||
| you and you are free to add your own as your application requires.
|
||||
|
|
||||
| Laravel supports a variety of mail "transport" drivers that can be used
|
||||
| when delivering an email. You may specify which one you're using for
|
||||
| your mailers below. You may also add additional mailers if needed.
|
||||
|
|
||||
| Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2",
|
||||
| "postmark", "resend", "log", "array",
|
||||
| "failover", "roundrobin"
|
||||
|
|
||||
*/
|
||||
|
||||
'mailers' => [
|
||||
|
||||
'smtp' => [
|
||||
'transport' => 'smtp',
|
||||
'scheme' => env('MAIL_SCHEME'),
|
||||
'url' => env('MAIL_URL'),
|
||||
'host' => env('MAIL_HOST', '127.0.0.1'),
|
||||
'port' => env('MAIL_PORT', 2525),
|
||||
'username' => env('MAIL_USERNAME'),
|
||||
'password' => env('MAIL_PASSWORD'),
|
||||
'timeout' => null,
|
||||
'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)),
|
||||
],
|
||||
|
||||
'ses' => [
|
||||
'transport' => 'ses',
|
||||
],
|
||||
|
||||
'postmark' => [
|
||||
'transport' => 'postmark',
|
||||
// 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
|
||||
// 'client' => [
|
||||
// 'timeout' => 5,
|
||||
// ],
|
||||
],
|
||||
|
||||
'resend' => [
|
||||
'transport' => 'resend',
|
||||
],
|
||||
|
||||
'sendmail' => [
|
||||
'transport' => 'sendmail',
|
||||
'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
|
||||
],
|
||||
|
||||
'log' => [
|
||||
'transport' => 'log',
|
||||
'channel' => env('MAIL_LOG_CHANNEL'),
|
||||
],
|
||||
|
||||
'array' => [
|
||||
'transport' => 'array',
|
||||
],
|
||||
|
||||
'failover' => [
|
||||
'transport' => 'failover',
|
||||
'mailers' => [
|
||||
'smtp',
|
||||
'log',
|
||||
],
|
||||
'retry_after' => 60,
|
||||
],
|
||||
|
||||
'roundrobin' => [
|
||||
'transport' => 'roundrobin',
|
||||
'mailers' => [
|
||||
'ses',
|
||||
'postmark',
|
||||
],
|
||||
'retry_after' => 60,
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Global "From" Address
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| You may wish for all emails sent by your application to be sent from
|
||||
| the same address. Here you may specify a name and address that is
|
||||
| used globally for all emails that are sent by your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'from' => [
|
||||
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
|
||||
'name' => env('MAIL_FROM_NAME', env('APP_NAME', 'Laravel')),
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
$platformHost = parse_url((string) env('APP_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com';
|
||||
|
||||
return [
|
||||
'account_url' => env(
|
||||
'LADILL_ACCOUNT_URL',
|
||||
'https://'.env('ACCOUNT_DOMAIN', 'account.'.$platformHost)
|
||||
),
|
||||
|
||||
'brands' => [
|
||||
'ladill' => [
|
||||
'name' => 'Ladill',
|
||||
'logo' => 'ladill-logo-white.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('APP_URL', 'https://ladill.com'),
|
||||
'footer_account' => 'an account with Ladill',
|
||||
'dashboard_path' => '/dashboard',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'ladill.com',
|
||||
],
|
||||
'hosting' => [
|
||||
'name' => 'Ladill Hosting',
|
||||
'logo' => 'ladillhosting-logo-email.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('LADILL_HOSTING_APP_URL', 'https://hosting.ladill.com'),
|
||||
'footer_account' => 'a Ladill Hosting account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'hosting.ladill.com',
|
||||
],
|
||||
'domains' => [
|
||||
'name' => 'Ladill Domains',
|
||||
'logo' => 'ladilldomains-logo-email.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('LADILL_DOMAINS_APP_URL', 'https://domains.ladill.com'),
|
||||
'footer_account' => 'a Ladill Domains account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'domains.ladill.com',
|
||||
],
|
||||
'bird' => [
|
||||
'name' => 'Ladill Bird',
|
||||
'logo' => 'ladillbird-logo-email.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('LADILL_BIRD_APP_URL', 'https://bird.ladill.com'),
|
||||
'footer_account' => 'a Ladill Bird account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'bird.ladill.com',
|
||||
],
|
||||
'mail' => [
|
||||
'name' => 'Ladill Mail',
|
||||
'logo' => 'ladillmail-logo-email.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('LADILL_WEBMAIL_URL', 'https://mail.ladill.com'),
|
||||
'footer_account' => 'a Ladill Mail account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'mail.ladill.com',
|
||||
],
|
||||
'email' => [
|
||||
'name' => 'Ladill Email',
|
||||
'logo' => 'ladillemail-logo-email.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('LADILL_EMAIL_APP_URL', 'https://email.ladill.com'),
|
||||
'footer_account' => 'a Ladill Email account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'email.ladill.com',
|
||||
],
|
||||
'qrplus' => [
|
||||
'name' => 'Ladill QR Plus',
|
||||
'logo' => 'ladillqrplus-logo-email.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('LADILL_QR_APP_URL', 'https://qrplus.ladill.com'),
|
||||
'footer_account' => 'a Ladill QR Plus account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'qrplus.ladill.com',
|
||||
],
|
||||
'events' => [
|
||||
'name' => 'Ladill Events',
|
||||
'logo' => 'ladillevents-logo-email.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('LADILL_EVENTS_APP_URL', 'https://events.ladill.com'),
|
||||
'footer_account' => 'a Ladill Events account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'events.ladill.com',
|
||||
],
|
||||
'transfer' => [
|
||||
'name' => 'Ladill Transfer',
|
||||
'logo' => 'ladilltransfer-logo-email.png',
|
||||
'logo_class' => 'email-logo email-logo-transfer',
|
||||
'app_url' => env('LADILL_TRANSFER_APP_URL', 'https://transfer.ladill.com'),
|
||||
'footer_account' => 'a Ladill Transfer account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'transfer.ladill.com',
|
||||
],
|
||||
'mini' => [
|
||||
'name' => 'Ladill Merchant',
|
||||
'logo' => 'ladillmerchant-logo-email.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('LADILL_MERCHANT_APP_URL', 'https://merchant.ladill.com'),
|
||||
'footer_account' => 'a Ladill Merchant account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'merchant.ladill.com',
|
||||
],
|
||||
'servers' => [
|
||||
'name' => 'Ladill Servers',
|
||||
'logo' => 'ladillservers-logo-email.png',
|
||||
'logo_class' => 'email-logo',
|
||||
'app_url' => env('LADILL_SERVERS_APP_URL', 'https://servers.ladill.com'),
|
||||
'footer_account' => 'a Ladill Servers account',
|
||||
'dashboard_path' => '/',
|
||||
'support_path' => '/support',
|
||||
'home_label' => 'servers.ladill.com',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
// Consumer config for the platform Mailbox provisioning API (§4). Mail infra
|
||||
// (Postfix/Dovecot via mail DB + pools) lives on the platform; this app
|
||||
// provisions through the API. The user is identified by public_id.
|
||||
'api_url' => env('MAILBOX_API_URL', 'https://ladill.com/api/mailboxes'),
|
||||
'api_key' => env('MAILBOX_API_KEY_EMAIL'),
|
||||
];
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'app_name' => 'Give',
|
||||
];
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'api_url' => env('PAY_API_URL', 'https://ladill.com/api/pay'),
|
||||
'api_key' => env('PAY_API_KEY_MERCHANT'),
|
||||
];
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'price_per_qr_ghs' => (float) env('QR_PRICE_PER_QR_GHS', 5.0),
|
||||
'min_topup_ghs' => (float) env('QR_MIN_TOPUP_GHS', 5.0),
|
||||
'max_pdf_bytes' => (int) env('QR_MAX_PDF_BYTES', 104857600), // 100 MB
|
||||
'short_code_length' => (int) env('QR_SHORT_CODE_LENGTH', 8),
|
||||
'scan_unique_window_hours' => (int) env('QR_SCAN_UNIQUE_WINDOW_HOURS', 24),
|
||||
];
|
||||
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Queue Connection Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Laravel's queue supports a variety of backends via a single, unified
|
||||
| API, merchant you convenient access to each backend using identical
|
||||
| syntax for each. The default queue connection is defined below.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('QUEUE_CONNECTION', 'database'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Queue Connections
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the connection options for every queue backend
|
||||
| used by your application. An example configuration is provided for
|
||||
| each backend supported by Laravel. You're also free to add more.
|
||||
|
|
||||
| Drivers: "sync", "database", "beanstalkd", "sqs", "redis",
|
||||
| "deferred", "background", "failover", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'connections' => [
|
||||
|
||||
'sync' => [
|
||||
'driver' => 'sync',
|
||||
],
|
||||
|
||||
'database' => [
|
||||
'driver' => 'database',
|
||||
'connection' => env('DB_QUEUE_CONNECTION'),
|
||||
'table' => env('DB_QUEUE_TABLE', 'jobs'),
|
||||
'queue' => env('DB_QUEUE', 'default'),
|
||||
'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90),
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'beanstalkd' => [
|
||||
'driver' => 'beanstalkd',
|
||||
'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'),
|
||||
'queue' => env('BEANSTALKD_QUEUE', 'default'),
|
||||
'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90),
|
||||
'block_for' => 0,
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'sqs' => [
|
||||
'driver' => 'sqs',
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
|
||||
'queue' => env('SQS_QUEUE', 'default'),
|
||||
'suffix' => env('SQS_SUFFIX'),
|
||||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'redis' => [
|
||||
'driver' => 'redis',
|
||||
'connection' => env('REDIS_QUEUE_CONNECTION', 'default'),
|
||||
'queue' => env('REDIS_QUEUE', 'default'),
|
||||
'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90),
|
||||
'block_for' => null,
|
||||
'after_commit' => false,
|
||||
],
|
||||
|
||||
'deferred' => [
|
||||
'driver' => 'deferred',
|
||||
],
|
||||
|
||||
'background' => [
|
||||
'driver' => 'background',
|
||||
],
|
||||
|
||||
'failover' => [
|
||||
'driver' => 'failover',
|
||||
'connections' => [
|
||||
'database',
|
||||
'deferred',
|
||||
],
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Job Batching
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following options configure the database and table that store job
|
||||
| batching information. These options can be updated to any database
|
||||
| connection and table which has been defined by your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'batching' => [
|
||||
'database' => env('DB_CONNECTION', 'sqlite'),
|
||||
'table' => 'job_batches',
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Failed Queue Jobs
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These options configure the behavior of failed queue job logging so you
|
||||
| can control how and where failed jobs are stored. Laravel ships with
|
||||
| support for storing failed jobs in a simple file or in a database.
|
||||
|
|
||||
| Supported drivers: "database-uuids", "dynamodb", "file", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'failed' => [
|
||||
'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
|
||||
'database' => env('DB_CONNECTION', 'sqlite'),
|
||||
'table' => 'failed_jobs',
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Third Party Services
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This file is for storing the credentials for third party services such
|
||||
| as Mailgun, Postmark, AWS and more. This file provides the de facto
|
||||
| location for this type of information, allowing packages to have
|
||||
| a conventional file to locate the various service credentials.
|
||||
|
|
||||
*/
|
||||
|
||||
/*
|
||||
| Ladill SSO (OIDC) — this app is a first-party client of the platform
|
||||
| identity provider at auth.ladill.com (Authorization Code + PKCE). Mirrors
|
||||
| the monolith's reference client; redirect points back at this app.
|
||||
*/
|
||||
'ladill_sso' => [
|
||||
'issuer' => 'https://'.config('app.auth_domain'),
|
||||
'client_id' => env('LADILL_SSO_CLIENT_ID'),
|
||||
'client_secret' => env('LADILL_SSO_CLIENT_SECRET'),
|
||||
'redirect' => rtrim((string) env('APP_URL', 'https://merchant.ladill.com'), '/').'/sso/callback',
|
||||
],
|
||||
|
||||
'ladill_webmail' => [
|
||||
'url' => env('LADILL_WEBMAIL_URL', 'https://mail.ladill.com'),
|
||||
],
|
||||
|
||||
'postmark' => [
|
||||
'key' => env('POSTMARK_API_KEY'),
|
||||
],
|
||||
|
||||
'resend' => [
|
||||
'key' => env('RESEND_API_KEY'),
|
||||
],
|
||||
|
||||
'ses' => [
|
||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
],
|
||||
|
||||
'slack' => [
|
||||
'notifications' => [
|
||||
'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
|
||||
'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
|
||||
],
|
||||
],
|
||||
|
||||
'termii' => [
|
||||
'api_key' => env('TERMII_API_KEY'),
|
||||
'sender_id' => env('TERMII_SENDER_ID', 'LaDill'),
|
||||
],
|
||||
|
||||
// Paystack — guest checkout (and the card fallback for logged-in buyers).
|
||||
'paystack' => [
|
||||
'base_url' => env('PAYSTACK_BASE_URL', 'https://api.paystack.co'),
|
||||
'public_key' => env('PAYSTACK_PUBLIC_KEY'),
|
||||
'secret_key' => env('PAYSTACK_SECRET_KEY'),
|
||||
'webhook_secret' => env('PAYSTACK_WEBHOOK_SECRET', env('PAYSTACK_SECRET_KEY')),
|
||||
'checkout_email' => env('PAYSTACK_CHECKOUT_EMAIL', 'pay@ladill.com'),
|
||||
],
|
||||
|
||||
];
|
||||
@@ -0,0 +1,217 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Session Driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option determines the default session driver that is utilized for
|
||||
| incoming requests. Laravel supports a variety of storage options to
|
||||
| persist session data. Database storage is a great default choice.
|
||||
|
|
||||
| Supported: "file", "cookie", "database", "memcached",
|
||||
| "redis", "dynamodb", "array"
|
||||
|
|
||||
*/
|
||||
|
||||
'driver' => env('SESSION_DRIVER', 'database'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Lifetime
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify the number of minutes that you wish the session
|
||||
| to be allowed to remain idle before it expires. If you want them
|
||||
| to expire immediately when the browser is closed then you may
|
||||
| indicate that via the expire_on_close configuration option.
|
||||
|
|
||||
*/
|
||||
|
||||
'lifetime' => (int) env('SESSION_LIFETIME', 120),
|
||||
|
||||
'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Encryption
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option allows you to easily specify that all of your session data
|
||||
| should be encrypted before it's stored. All encryption is performed
|
||||
| automatically by Laravel and you may use the session like normal.
|
||||
|
|
||||
*/
|
||||
|
||||
'encrypt' => env('SESSION_ENCRYPT', false),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session File Location
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When utilizing the "file" session driver, the session files are placed
|
||||
| on disk. The default storage location is defined here; however, you
|
||||
| are free to provide another location where they should be stored.
|
||||
|
|
||||
*/
|
||||
|
||||
'files' => storage_path('framework/sessions'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Connection
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" or "redis" session drivers, you may specify a
|
||||
| connection that should be used to manage these sessions. This should
|
||||
| correspond to a connection in your database configuration options.
|
||||
|
|
||||
*/
|
||||
|
||||
'connection' => env('SESSION_CONNECTION'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Database Table
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using the "database" session driver, you may specify the table to
|
||||
| be used to store sessions. Of course, a sensible default is defined
|
||||
| for you; however, you're welcome to change this to another table.
|
||||
|
|
||||
*/
|
||||
|
||||
'table' => env('SESSION_TABLE', 'sessions'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cache Store
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When using one of the framework's cache driven session backends, you may
|
||||
| define the cache store which should be used to store the session data
|
||||
| between requests. This must match one of your defined cache stores.
|
||||
|
|
||||
| Affects: "dynamodb", "memcached", "redis"
|
||||
|
|
||||
*/
|
||||
|
||||
'store' => env('SESSION_STORE'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Sweeping Lottery
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Some session drivers must manually sweep their storage location to get
|
||||
| rid of old sessions from storage. Here are the chances that it will
|
||||
| happen on a given request. By default, the odds are 2 out of 100.
|
||||
|
|
||||
*/
|
||||
|
||||
'lottery' => [2, 100],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may change the name of the session cookie that is created by
|
||||
| the framework. Typically, you should not need to change this value
|
||||
| since doing so does not grant a meaningful security improvement.
|
||||
|
|
||||
*/
|
||||
|
||||
'cookie' => env(
|
||||
'SESSION_COOKIE',
|
||||
Str::slug((string) env('APP_NAME', 'laravel')).'-session'
|
||||
),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The session cookie path determines the path for which the cookie will
|
||||
| be regarded as available. Typically, this will be the root path of
|
||||
| your application, but you're free to change this when necessary.
|
||||
|
|
||||
*/
|
||||
|
||||
'path' => env('SESSION_PATH', '/'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Session Cookie Domain
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This value determines the domain and subdomains the session cookie is
|
||||
| available to. By default, the cookie will be available to the root
|
||||
| domain without subdomains. Typically, this shouldn't be changed.
|
||||
|
|
||||
*/
|
||||
|
||||
'domain' => env('SESSION_DOMAIN'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTPS Only Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By setting this option to true, session cookies will only be sent back
|
||||
| to the server if the browser has a HTTPS connection. This will keep
|
||||
| the cookie from being sent to you when it can't be done securely.
|
||||
|
|
||||
*/
|
||||
|
||||
'secure' => env('SESSION_SECURE_COOKIE'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| HTTP Access Only
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Setting this value to true will prevent JavaScript from accessing the
|
||||
| value of the cookie and the cookie will only be accessible through
|
||||
| the HTTP protocol. It's unlikely you should disable this option.
|
||||
|
|
||||
*/
|
||||
|
||||
'http_only' => env('SESSION_HTTP_ONLY', true),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Same-Site Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option determines how your cookies behave when cross-site requests
|
||||
| take place, and can be used to mitigate CSRF attacks. By default, we
|
||||
| will set this value to "lax" to permit secure cross-site requests.
|
||||
|
|
||||
| See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value
|
||||
|
|
||||
| Supported: "lax", "strict", "none", null
|
||||
|
|
||||
*/
|
||||
|
||||
'same_site' => env('SESSION_SAME_SITE', 'lax'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Partitioned Cookies
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Setting this value to true will tie the cookie to the top-level site for
|
||||
| a cross-site context. Partitioned cookies are accepted by the browser
|
||||
| when flagged "secure" and the Same-Site attribute is set to "none".
|
||||
|
|
||||
*/
|
||||
|
||||
'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
|
||||
|
||||
];
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'title' => 'Ladill Merchant',
|
||||
'logo' => 'images/logo/ladillmerchant-logo.svg',
|
||||
'description' => 'Your Ladill Merchant session has ended. Sign in again to manage storefronts, orders, and payouts.',
|
||||
];
|
||||
Reference in New Issue
Block a user