diff --git a/app/controllers/api/v1/admin/tenants_controller.rb b/app/controllers/api/v1/admin/tenants_controller.rb
index fb4399e8ceddd81c7d17e8edd071020a3f6cdd2d..b14634abe3b95d15d85f0c4cf5338b0d7865d202 100644
--- a/app/controllers/api/v1/admin/tenants_controller.rb
+++ b/app/controllers/api/v1/admin/tenants_controller.rb
@@ -41,10 +41,7 @@ module Api
           tenant = Tenant.new(name:, client_secret: tenant_params[:client_secret])
 
           if tenant.save
-            create_roles(tenant.name)
-            create_site_settings(tenant.name)
-            create_rooms_configs_options(tenant.name)
-            create_role_permissions(tenant.name)
+            TenantSetup.new(name).call
             render_data status: :created
           else
             render_error errors: tenant.errors.to_a, status: :bad_request
@@ -67,95 +64,6 @@ module Api
 
         def cache; end
 
-        private
-
-        def create_roles(provider)
-          Role.create! [
-            { name: 'Administrator', provider: },
-            { name: 'User', provider: },
-            { name: 'Guest', provider: }
-          ]
-        end
-
-        def create_site_settings(provider)
-          SiteSetting.create! [
-            { setting: Setting.find_by(name: 'PrimaryColor'), value: '#467fcf', provider: },
-            { setting: Setting.find_by(name: 'PrimaryColorLight'), value: '#e8eff9', provider: },
-            { setting: Setting.find_by(name: 'PrimaryColorDark'), value: '#316cbe', provider: },
-            { setting: Setting.find_by(name: 'BrandingImage'),
-              value: ActionController::Base.helpers.image_path('bbb_logo.png'),
-              provider: },
-            { setting: Setting.find_by(name: 'Terms'), value: '', provider: },
-            { setting: Setting.find_by(name: 'PrivacyPolicy'), value: '', provider: },
-            { setting: Setting.find_by(name: 'RegistrationMethod'), value: SiteSetting::REGISTRATION_METHODS[:open], provider: },
-            { setting: Setting.find_by(name: 'ShareRooms'), value: 'true', provider: },
-            { setting: Setting.find_by(name: 'PreuploadPresentation'), value: 'true', provider: },
-            { setting: Setting.find_by(name: 'RoleMapping'), value: '', provider: },
-            { setting: Setting.find_by(name: 'DefaultRole'), provider:, value: 'User' }
-          ]
-        end
-
-        def create_rooms_configs_options(provider)
-          RoomsConfiguration.create! [
-            { meeting_option: MeetingOption.find_by(name: 'record'), value: 'default_enabled', provider: },
-            { meeting_option: MeetingOption.find_by(name: 'muteOnStart'), value: 'optional', provider: },
-            { meeting_option: MeetingOption.find_by(name: 'guestPolicy'), value: 'optional', provider: },
-            { meeting_option: MeetingOption.find_by(name: 'glAnyoneCanStart'), value: 'optional', provider: },
-            { meeting_option: MeetingOption.find_by(name: 'glAnyoneJoinAsModerator'), value: 'optional', provider: },
-            { meeting_option: MeetingOption.find_by(name: 'glRequireAuthentication'), value: 'optional', provider: },
-            { meeting_option: MeetingOption.find_by(name: 'glViewerAccessCode'), value: 'optional', provider: },
-            { meeting_option: MeetingOption.find_by(name: 'glModeratorAccessCode'), value: 'optional', provider: }
-          ]
-        end
-
-        def create_role_permissions(provider)
-          admin = Role.find_by(name: 'Administrator', provider:)
-          user = Role.find_by(name: 'User', provider:)
-          guest = Role.find_by(name: 'Guest', provider:)
-
-          create_room = Permission.find_by(name: 'CreateRoom')
-          manage_users = Permission.find_by(name: 'ManageUsers')
-          manage_rooms = Permission.find_by(name: 'ManageRooms')
-          manage_recordings = Permission.find_by(name: 'ManageRecordings')
-          manage_site_settings = Permission.find_by(name: 'ManageSiteSettings')
-          manage_roles = Permission.find_by(name: 'ManageRoles')
-          shared_list = Permission.find_by(name: 'SharedList')
-          can_record = Permission.find_by(name: 'CanRecord')
-          room_limit = Permission.find_by(name: 'RoomLimit')
-
-          RolePermission.create! [
-            { role: admin, permission: create_room, value: 'true' },
-            { role: admin, permission: manage_users, value: 'true' },
-            { role: admin, permission: manage_rooms, value: 'true' },
-            { role: admin, permission: manage_recordings, value: 'true' },
-            { role: admin, permission: manage_site_settings, value: 'true' },
-            { role: admin, permission: manage_roles, value: 'true' },
-            { role: admin, permission: shared_list, value: 'true' },
-            { role: admin, permission: can_record, value: 'true' },
-            { role: admin, permission: room_limit, value: '100' },
-
-            { role: user, permission: create_room, value: 'true' },
-            { role: user, permission: manage_users, value: 'false' },
-            { role: user, permission: manage_rooms, value: 'false' },
-            { role: user, permission: manage_recordings, value: 'false' },
-            { role: user, permission: manage_site_settings, value: 'false' },
-            { role: user, permission: manage_roles, value: 'false' },
-            { role: user, permission: shared_list, value: 'true' },
-            { role: user, permission: can_record, value: 'true' },
-            { role: user, permission: room_limit, value: '100' },
-
-            { role: guest, permission: create_room, value: 'false' },
-            { role: guest, permission: manage_users, value: 'false' },
-            { role: guest, permission: manage_rooms, value: 'false' },
-            { role: guest, permission: manage_recordings, value: 'false' },
-            { role: guest, permission: manage_site_settings, value: 'false' },
-            { role: guest, permission: manage_roles, value: 'false' },
-            { role: guest, permission: shared_list, value: 'true' },
-            { role: guest, permission: can_record, value: 'true' },
-            { role: guest, permission: room_limit, value: '100' }
-          ]
-        end
-
         def delete_roles(provider)
           Role.where(provider:).destroy_all
         end
diff --git a/app/services/tenant_setup.rb b/app/services/tenant_setup.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d1754bae91e513c8363d2a074139045df0f8b036
--- /dev/null
+++ b/app/services/tenant_setup.rb
@@ -0,0 +1,119 @@
+# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/.
+#
+# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below).
+#
+# This program is free software; you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free Software
+# Foundation; either version 3.0 of the License, or (at your option) any later
+# version.
+#
+# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with Greenlight; if not, see <http://www.gnu.org/licenses/>.
+
+# frozen_string_literal: true
+
+# Creates the roles, site settings, and room config options for the given tenant.
+class TenantSetup
+  def initialize(provider)
+    @provider = provider
+  end
+
+  def call
+    create_roles
+    create_site_settings
+    create_rooms_configs_options
+    create_role_permissions
+  end
+
+  def create_roles
+    Role.create! [
+      { name: 'Administrator', provider: @provider },
+      { name: 'User', provider: @provider },
+      { name: 'Guest', provider: @provider }
+    ]
+  end
+
+  def create_site_settings
+    SiteSetting.create! [
+      { setting: Setting.find_by(name: 'PrimaryColor'), value: '#467fcf', provider: @provider },
+      { setting: Setting.find_by(name: 'PrimaryColorLight'), value: '#e8eff9', provider: @provider },
+      { setting: Setting.find_by(name: 'PrimaryColorDark'), value: '#316cbe', provider: @provider },
+      { setting: Setting.find_by(name: 'BrandingImage'),
+        value: ActionController::Base.helpers.image_path('bbb_logo.png'),
+        provider: @provider },
+      { setting: Setting.find_by(name: 'Terms'), value: '', provider: @provider },
+      { setting: Setting.find_by(name: 'PrivacyPolicy'), value: '', provider: @provider },
+      { setting: Setting.find_by(name: 'RegistrationMethod'), value: SiteSetting::REGISTRATION_METHODS[:open],
+        provider: @provider },
+      { setting: Setting.find_by(name: 'ShareRooms'), value: 'true', provider: @provider },
+      { setting: Setting.find_by(name: 'PreuploadPresentation'), value: 'true', provider: @provider },
+      { setting: Setting.find_by(name: 'RoleMapping'), value: '', provider: @provider },
+      { setting: Setting.find_by(name: 'DefaultRole'), provider: @provider, value: 'User' }
+    ]
+  end
+
+  def create_rooms_configs_options
+    RoomsConfiguration.create! [
+      { meeting_option: MeetingOption.find_by(name: 'record'), value: 'default_enabled', provider: @provider },
+      { meeting_option: MeetingOption.find_by(name: 'muteOnStart'), value: 'optional', provider: @provider },
+      { meeting_option: MeetingOption.find_by(name: 'guestPolicy'), value: 'optional', provider: @provider },
+      { meeting_option: MeetingOption.find_by(name: 'glAnyoneCanStart'), value: 'optional', provider: @provider },
+      { meeting_option: MeetingOption.find_by(name: 'glAnyoneJoinAsModerator'), value: 'optional', provider: @provider },
+      { meeting_option: MeetingOption.find_by(name: 'glRequireAuthentication'), value: 'optional', provider: @provider },
+      { meeting_option: MeetingOption.find_by(name: 'glViewerAccessCode'), value: 'optional', provider: @provider },
+      { meeting_option: MeetingOption.find_by(name: 'glModeratorAccessCode'), value: 'optional', provider: @provider }
+    ]
+  end
+
+  def create_role_permissions
+    admin = Role.find_by(name: 'Administrator', provider: @provider)
+    user = Role.find_by(name: 'User', provider: @provider)
+    guest = Role.find_by(name: 'Guest', provider: @provider)
+
+    create_room = Permission.find_by(name: 'CreateRoom')
+    manage_users = Permission.find_by(name: 'ManageUsers')
+    manage_rooms = Permission.find_by(name: 'ManageRooms')
+    manage_recordings = Permission.find_by(name: 'ManageRecordings')
+    manage_site_settings = Permission.find_by(name: 'ManageSiteSettings')
+    manage_roles = Permission.find_by(name: 'ManageRoles')
+    shared_list = Permission.find_by(name: 'SharedList')
+    can_record = Permission.find_by(name: 'CanRecord')
+    room_limit = Permission.find_by(name: 'RoomLimit')
+
+    RolePermission.create! [
+      { role: admin, permission: create_room, value: 'true' },
+      { role: admin, permission: manage_users, value: 'true' },
+      { role: admin, permission: manage_rooms, value: 'true' },
+      { role: admin, permission: manage_recordings, value: 'true' },
+      { role: admin, permission: manage_site_settings, value: 'true' },
+      { role: admin, permission: manage_roles, value: 'true' },
+      { role: admin, permission: shared_list, value: 'true' },
+      { role: admin, permission: can_record, value: 'true' },
+      { role: admin, permission: room_limit, value: '100' },
+
+      { role: user, permission: create_room, value: 'true' },
+      { role: user, permission: manage_users, value: 'false' },
+      { role: user, permission: manage_rooms, value: 'false' },
+      { role: user, permission: manage_recordings, value: 'false' },
+      { role: user, permission: manage_site_settings, value: 'false' },
+      { role: user, permission: manage_roles, value: 'false' },
+      { role: user, permission: shared_list, value: 'true' },
+      { role: user, permission: can_record, value: 'true' },
+      { role: user, permission: room_limit, value: '100' },
+
+      { role: guest, permission: create_room, value: 'false' },
+      { role: guest, permission: manage_users, value: 'false' },
+      { role: guest, permission: manage_rooms, value: 'false' },
+      { role: guest, permission: manage_recordings, value: 'false' },
+      { role: guest, permission: manage_site_settings, value: 'false' },
+      { role: guest, permission: manage_roles, value: 'false' },
+      { role: guest, permission: shared_list, value: 'true' },
+      { role: guest, permission: can_record, value: 'true' },
+      { role: guest, permission: room_limit, value: '100' }
+    ]
+  end
+end
diff --git a/lib/tasks/add_default_tenant.rake b/lib/tasks/add_default_tenant.rake
new file mode 100644
index 0000000000000000000000000000000000000000..f9c83c5e0105c85ca84f41960e666d22ad0b7c6f
--- /dev/null
+++ b/lib/tasks/add_default_tenant.rake
@@ -0,0 +1,33 @@
+# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/.
+#
+# Copyright (c) 2022 BigBlueButton Inc. and by respective authors (see below).
+#
+# This program is free software; you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free Software
+# Foundation; either version 3.0 of the License, or (at your option) any later
+# version.
+#
+# Greenlight is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with Greenlight; if not, see <http://www.gnu.org/licenses/>.
+
+# frozen_string_literal: true
+
+require_relative 'task_helpers'
+
+desc 'Add default tenant'
+task :add_default_tenant, [:secret] => :environment do |_t, args|
+  err 'Missing secret' unless args.secret
+
+  tenant = Tenant.new(name: 'bn', client_secret: args.secret)
+
+  if tenant.save
+    TenantSetup.new('bn').call
+    success 'Tenant created successfully.'
+  else
+    err "Tenant not created. Errors: #{tenant.errors.to_a}"
+  end
+end