archtechx / tenancy

Automatic multi-tenancy for Laravel. No code changes needed.
https://tenancyforlaravel.com
MIT License
3.65k stars 429 forks source link

Central App - Setup issues #212

Closed SuperGizmo closed 4 years ago

SuperGizmo commented 5 years ago

Good evening,

I hope you are well.

I've got installed your package (great with Nova, thank you!) However, I seem to run into an issue with the Central App. All I see is the error message: "Tenant could not be identified on this domain - Did you forget to create a tenant for this domain?"

I'm running: Laravel 6.x Nova 2.6 Stancl/Tenancy 2.1 Ubuntu -> php 7.3 Laravel Valet (ubuntu version)

Within my config/tenancy.php file, I have my domain name entered into exempt_domains.

Any assistance will be very appreciated.

Many thanks,

Daniel.

stancl commented 5 years ago

Hi,

What URL are you visiting and how does your exempt_domains config look like?

SuperGizmo commented 5 years ago

Hey Stancl,

Thank you for your reply.

Urls: subdomain.crm.fran <- works fine crm.fran <- having troubles

Snippet from Tenancy.php file

'exempt_domains' => [ // e.g. domains which host landing pages, sign up pages, etc
      'crm.fran',
  ],

Whole Tenancy.php file

<?php

declare(strict_types=1);

return [
    'storage_driver' => 'db',
    'storage_drivers' => [
        'db' => [
            'driver' => Stancl\Tenancy\StorageDrivers\Database\DatabaseStorageDriver::class,
            'data_column' => 'data',
            'custom_columns' => [
                // 'plan',
            ],
            'connection' => null,
            'table_names' => [
                'TenantModel' => 'tenants',
                'DomainModel' => 'domains',
            ],
        ],
        'redis' => [
            'driver' => Stancl\Tenancy\StorageDrivers\RedisStorageDriver::class,
            'connection' => 'tenancy',
        ],
    ],
    'tenant_route_namespace' => 'App\Http\Controllers',
    'exempt_domains' => [ // e.g. domains which host landing pages, sign up pages, etc
         'crm.fran',
    ],
    'database' => [
        'based_on' => null, // The connection that will be used as a base for the dynamically created tenant connection.
        'prefix' => 'tenant',
        'suffix' => '',
    ],
    'redis' => [
        'prefix_base' => 'tenant',
        'prefixed_connections' => [
            // 'default',
        ],
    ],
    'cache' => [
        'tag_base' => 'tenant',
    ],
    'filesystem' => [ // https://tenancy.samuelstancl.me/docs/v2/filesystem-tenancy/
        'suffix_base' => 'tenant',
        // Disks which should be suffixed with the suffix_base + tenant id.
        'disks' => [
            'local',
            'public',
            // 's3',
        ],
        'root_override' => [
            // Disks whose roots should be overriden after storage_path() is suffixed.
            'local' => '%storage_path%/app/',
            'public' => '%storage_path%/app/public/',
        ],
    ],
    'database_managers' => [
        // Tenant database managers handle the creation & deletion of tenant databases.
        'sqlite' => Stancl\Tenancy\TenantDatabaseManagers\SQLiteDatabaseManager::class,
        'mysql' => Stancl\Tenancy\TenantDatabaseManagers\MySQLDatabaseManager::class,
        'pgsql' => Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLDatabaseManager::class,
    ],
    'database_manager_connections' => [
        // Connections used by TenantDatabaseManagers. This tells, for example, the
        // MySQLDatabaseManager to use the mysql connection to create databases.
        'sqlite' => 'sqlite',
        'mysql' => 'mysql',
        'pgsql' => 'pgsql',
    ],
    'bootstrappers' => [
        // Tenancy bootstrappers are executed when tenancy is initialized.
        // Their responsibility is making Laravel features tenant-aware.
        'database' => Stancl\Tenancy\TenancyBootstrappers\DatabaseTenancyBootstrapper::class,
        'cache' => Stancl\Tenancy\TenancyBootstrappers\CacheTenancyBootstrapper::class,
        'filesystem' => Stancl\Tenancy\TenancyBootstrappers\FilesystemTenancyBootstrapper::class,
        'queue' => Stancl\Tenancy\TenancyBootstrappers\QueueTenancyBootstrapper::class,
        // 'redis' => Stancl\Tenancy\TenancyBootstrappers\RedisTenancyBootstrapper::class, // Note: phpredis is needed
    ],
    'features' => [
        // Features are classes that provide additional functionality
        // not needed for tenancy to be bootstrapped. They are run
        // regardless of whether tenancy has been initialized.

        // Stancl\Tenancy\Features\TenantConfig::class,
        // Stancl\Tenancy\Features\TelescopeTags::class,
        // Stancl\Tenancy\Features\TenantRedirect::class,
    ],
    'storage_to_config_map' => [ // Used by the TenantConfig feature
        // 'paypal_api_key' => 'services.paypal.api_key',
    ],
    'home_url' => '/app',
    'queue_database_creation' => false,
    'migrate_after_creation' => false, // run migrations after creating a tenant
    'seed_after_migration' => false, // should the seeder run after automatic migration
    'seeder_parameters' => [
        '--class' => 'DatabaseSeeder', // root seeder class to run after automatic migrations, eg: 'DatabaseSeeder'
    ],
    'queue_database_deletion' => false,
    'delete_database_after_tenant_deletion' => false, // delete the tenant's database after deleting the tenant
    'unique_id_generator' => Stancl\Tenancy\UniqueIDGenerators\UUIDGenerator::class,
];
SuperGizmo commented 5 years ago

Good morning,

I'm sorry to pressure, is there any movement on this?

Many thanks,

Daniel

stancl commented 5 years ago

Can you try running composer config:clear? If that doesn't help, maybe the issue is specific to Valet.

Astyk commented 4 years ago

did you mean artisan config:clear?

stancl commented 4 years ago

Right. Yeah, php artisan config:clear.

SuperGizmo commented 4 years ago

Hi Guys,

Sorry for the delay in posting.

Yes, i assumed it was artisan clear ;) - Sadly that did not work. I'm rebuilding my dev server at the moment so will try again when that's rebuilt.

Many thanks for your assistance!

Daniel.

stancl commented 4 years ago

Okay. I'm closing this for now. If you have any further questions, definitely reach out.

iCynta commented 1 month ago

Im very new to this package. I have the same issue. Below is my tenancy.php

`<?php

declare(strict_types=1);

use Stancl\Tenancy\Database\Models\Domain; use Stancl\Tenancy\Database\Models\Tenant;

return [

/**
 * The list of domains hosting your central app.
 *
 * Only relevant if you're using the domain or subdomain identification middleware.
 */
'central_domains' => [
    '127.0.0.1',
    'localhost',
    'eleganza.local',
],

'tenant_model' =>  \App\Tenant::class,
'id_generator' => Stancl\Tenancy\UUIDGenerator::class,
'domain_model' => Domain::class,
/**
 * Tenancy bootstrappers are executed when tenancy is initialized.
 * Their responsibility is making Laravel features tenant-aware.
 *
 * To configure their behavior, see the config keys below.
 */
'bootstrappers' => [
    Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper::class,
    Stancl\Tenancy\Bootstrappers\CacheTenancyBootstrapper::class,
    Stancl\Tenancy\Bootstrappers\FilesystemTenancyBootstrapper::class,
    Stancl\Tenancy\Bootstrappers\QueueTenancyBootstrapper::class,
    // Stancl\Tenancy\Bootstrappers\RedisTenancyBootstrapper::class, // Note: phpredis is needed
],

/**
 * Database tenancy config. Used by DatabaseTenancyBootstrapper.
 */
'database' => [
    'central_connection' => env('DB_CONNECTION', 'central'),

    /**
     * Connection used as a "template" for the dynamically created tenant database connection.
     * Note: don't name your template connection tenant. That name is reserved by package.
     */
    'template_tenant_connection' => null,

    /**
     * Tenant database names are created like this:
     * prefix + tenant_id + suffix.
     */
    'prefix' => 'tenant',
    'suffix' => '',

    /**
     * TenantDatabaseManagers are classes that handle the creation & deletion of tenant databases.
     */
    'managers' => [
        'sqlite' => Stancl\Tenancy\TenantDatabaseManagers\SQLiteDatabaseManager::class,
        'mysql' => Stancl\Tenancy\TenantDatabaseManagers\MySQLDatabaseManager::class,
        'pgsql' => Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLDatabaseManager::class,

    /**
     * Use this database manager for MySQL to have a DB user created for each tenant database.
     * You can customize the grants given to these users by changing the $grants property.
     */
        // 'mysql' => Stancl\Tenancy\TenantDatabaseManagers\PermissionControlledMySQLDatabaseManager::class,

    /**
     * Disable the pgsql manager above, and enable the one below if you
     * want to separate tenant DBs by schemas rather than databases.
     */
        // 'pgsql' => Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLSchemaManager::class, // Separate by schema instead of database
    ],
],

/**
 * Cache tenancy config. Used by CacheTenancyBootstrapper.
 *
 * This works for all Cache facade calls, cache() helper
 * calls and direct calls to injected cache stores.
 *
 * Each key in cache will have a tag applied on it. This tag is used to
 * scope the cache both when writing to it and when reading from it.
 *
 * You can clear cache selectively by specifying the tag.
 */
'cache' => [
    'tag_base' => 'tenant', // This tag_base, followed by the tenant_id, will form a tag that will be applied on each cache call.
],

/**
 * Filesystem tenancy config. Used by FilesystemTenancyBootstrapper.
 * https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper.
 */
'filesystem' => [
    /**
     * Each disk listed in the 'disks' array will be suffixed by the suffix_base, followed by the tenant_id.
     */
    'suffix_base' => 'tenant',
    'disks' => [
        'local',
        'public',
        // 's3',
    ],

    /**
     * Use this for local disks.
     *
     * See https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper
     */
    'root_override' => [
        // Disks whose roots should be overridden after storage_path() is suffixed.
        'local' => '%storage_path%/app/',
        'public' => '%storage_path%/app/public/',
    ],

    /**
     * Should storage_path() be suffixed.
     *
     * Note: Disabling this will likely break local disk tenancy. Only disable this if you're using an external file storage service like S3.
     *
     * For the vast majority of applications, this feature should be enabled. But in some
     * edge cases, it can cause issues (like using Passport with Vapor - see #196), so
     * you may want to disable this if you are experiencing these edge case issues.
     */
    'suffix_storage_path' => true,

    /**
     * By default, asset() calls are made multi-tenant too. You can use global_asset() and mix()
     * for global, non-tenant-specific assets. However, you might have some issues when using
     * packages that use asset() calls inside the tenant app. To avoid such issues, you can
     * disable asset() helper tenancy and explicitly use tenant_asset() calls in places
     * where you want to use tenant-specific assets (product images, avatars, etc).
     */
    'asset_helper_tenancy' => true,
],

/**
 * Redis tenancy config. Used by RedisTenancyBootstrapper.
 *
 * Note: You need phpredis to use Redis tenancy.
 *
 * Note: You don't need to use this if you're using Redis only for cache.
 * Redis tenancy is only relevant if you're making direct Redis calls,
 * either using the Redis facade or by injecting it as a dependency.
 */
'redis' => [
    'prefix_base' => 'tenant', // Each key in Redis will be prepended by this prefix_base, followed by the tenant id.
    'prefixed_connections' => [ // Redis connections whose keys are prefixed, to separate one tenant's keys from another.
        // 'default',
    ],
],

'exempt_domains' => [
    parse_url(env('CENTRAL_DOMAIN', 'http://icynta.in'), PHP_URL_HOST),
],

/**
 * Features are classes that provide additional functionality
 * not needed for tenancy to be bootstrapped. They are run
 * regardless of whether tenancy has been initialized.
 *
 * See the documentation page for each class to
 * understand which ones you want to enable.
 */
'features' => [
    // Stancl\Tenancy\Features\UserImpersonation::class,
    // Stancl\Tenancy\Features\TelescopeTags::class,
    // Stancl\Tenancy\Features\UniversalRoutes::class,
    // Stancl\Tenancy\Features\TenantConfig::class, // https://tenancyforlaravel.com/docs/v3/features/tenant-config
    // Stancl\Tenancy\Features\CrossDomainRedirect::class, // https://tenancyforlaravel.com/docs/v3/features/cross-domain-redirect
    // Stancl\Tenancy\Features\ViteBundler::class,
],

/**
 * Should tenancy routes be registered.
 *
 * Tenancy routes include tenant asset routes. By default, this route is
 * enabled. But it may be useful to disable them if you use external
 * storage (e.g. S3 / Dropbox) or have a custom asset controller.
 */
'routes' => true,

/**
 * Parameters used by the tenants:migrate command.
 */
'migration_parameters' => [
    '--force' => true, // This needs to be true to run migrations in production.
    '--path' => [database_path('migrations/tenant')],
    '--realpath' => true,
],

/**
 * Parameters used by the tenants:seed command.
 */
'seeder_parameters' => [
    '--class' => 'DatabaseSeeder', // root seeder class
    // '--force' => true,
],

]; `

stancl commented 1 month ago

This thread is from v2. On v3 just follow the quickstart guide.