439ef605a1
Resend mail transport:
- composer require resend/resend-laravel (v1.4)
- Laravel 11 ships the 'resend' mailer config in config/mail.php + services
- To switch to production email: set MAIL_MAILER=resend + RESEND_API_KEY,
register the domain at resend.com/domains, and add the TXT + DKIM CNAME
records in Cloudflare. .env.example documents the required steps.
Backblaze B2 offsite backup:
- New filesystems 'b2' disk (S3-compatible, env: B2_KEY/SECRET/BUCKET/REGION/ENDPOINT)
- BackupAllTenantsCommand: after writing each tenant's zip to local disk, it
uploads the same file to the b2 disk under {YYYY-MM-DD}/{slug}.zip — only
when both B2_KEY and B2_BUCKET are set, so unconfigured installs are no-op
- Without offsite, backups live on the same VPS as production: a single
hardware failure loses everything. B2 + Resend together make the install
genuinely production-ready (people get email + offsite backup).
Tests (2 new):
- backup uploads to b2 (fake disk) when configured
- backup skips offsite when env vars not present
Full suite: 140 passed. Force-rebuild deploy required so composer install
picks up resend/resend-php.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
96 lines
3.1 KiB
PHP
96 lines
3.1 KiB
PHP
<?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,
|
|
],
|
|
|
|
// Backblaze B2 (S3-compatible). Offsite backup target for backup:tenants.
|
|
// Required env: B2_KEY, B2_SECRET, B2_BUCKET, B2_REGION (e.g. us-west-002),
|
|
// B2_ENDPOINT (e.g. https://s3.us-west-002.backblazeb2.com).
|
|
'b2' => [
|
|
'driver' => 's3',
|
|
'key' => env('B2_KEY'),
|
|
'secret' => env('B2_SECRET'),
|
|
'region' => env('B2_REGION', 'us-west-002'),
|
|
'bucket' => env('B2_BUCKET'),
|
|
'endpoint' => env('B2_ENDPOINT'),
|
|
'use_path_style_endpoint' => false,
|
|
'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'),
|
|
],
|
|
|
|
];
|