From 2f599546413f663ba5c58a497444be38dfcff026 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Thu, 13 Oct 2022 21:15:42 +0000 Subject: [PATCH] feat(region): Remove hardcode for region of server installation --- .../cloudflare/cloudflare_factory.dart | 1 + .../dns_provider_api_settings.dart | 10 ++++++++ .../dns_providers/dns_provider_factory.dart | 13 ++--------- .../rest_maps/provider_api_settings.dart | 5 +++- .../digital_ocean/digital_ocean.dart | 8 ++++--- .../digital_ocean/digital_ocean_factory.dart | 8 ++++--- .../server_providers/hetzner/hetzner.dart | 8 ++++--- .../hetzner/hetzner_factory.dart | 8 ++++--- .../server_provider_api_settings.dart | 11 +++++++++ .../server_provider_factory.dart | 6 ++--- .../hetzner_metrics_repository.dart | 2 +- .../provider_volume_cubit.dart | 23 ++++++++++--------- .../server_detailed_info_repository.dart | 2 +- .../server_installation_cubit.dart | 6 +++-- .../server_installation_repository.dart | 16 +++++++------ 15 files changed, 78 insertions(+), 49 deletions(-) create mode 100644 lib/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart create mode 100644 lib/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart diff --git a/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_factory.dart b/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_factory.dart index 9266471b..ccb58e6a 100644 --- a/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_factory.dart +++ b/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_factory.dart @@ -1,5 +1,6 @@ import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart'; class CloudflareApiFactory extends DnsProviderApiFactory { diff --git a/lib/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart b/lib/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart new file mode 100644 index 00000000..6b737df5 --- /dev/null +++ b/lib/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart @@ -0,0 +1,10 @@ +import 'package:selfprivacy/logic/api_maps/rest_maps/provider_api_settings.dart'; + +class DnsProviderApiSettings extends ProviderApiSettings { + const DnsProviderApiSettings({ + super.hasLogger = false, + super.isWithToken = true, + this.customToken, + }); + final String? customToken; +} diff --git a/lib/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart b/lib/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart index 01f59e98..fb573135 100644 --- a/lib/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart +++ b/lib/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart @@ -1,17 +1,8 @@ import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider.dart'; -import 'package:selfprivacy/logic/api_maps/rest_maps/provider_api_settings.dart'; - -class DnsProviderApiSettings extends ProviderApiSettings { - const DnsProviderApiSettings({ - final super.hasLogger = false, - final super.isWithToken = true, - final this.customToken, - }); - final String? customToken; -} +import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart'; abstract class DnsProviderApiFactory { DnsProviderApi getDnsProvider({ - final DnsProviderApiSettings settings = const DnsProviderApiSettings(), + final DnsProviderApiSettings settings, }); } diff --git a/lib/logic/api_maps/rest_maps/provider_api_settings.dart b/lib/logic/api_maps/rest_maps/provider_api_settings.dart index 4350fbe7..9e601d2a 100644 --- a/lib/logic/api_maps/rest_maps/provider_api_settings.dart +++ b/lib/logic/api_maps/rest_maps/provider_api_settings.dart @@ -1,5 +1,8 @@ class ProviderApiSettings { - const ProviderApiSettings({this.hasLogger = false, this.isWithToken = true}); + const ProviderApiSettings({ + this.hasLogger = false, + this.isWithToken = true, + }); final bool hasLogger; final bool isWithToken; } diff --git a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart index f24f49ca..2354e5ab 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart @@ -15,6 +15,7 @@ import 'package:selfprivacy/utils/password_generator.dart'; class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { DigitalOceanApi({ + required this.region, this.hasLogger = false, this.isWithToken = true, }); @@ -23,7 +24,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { @override bool isWithToken; - final String region = 'fra1'; + final String region; @override BaseOptions get options { @@ -318,6 +319,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { final String dbPassword = StringGenerators.dbPassword(); final int dbId = dataBase.id; + final String? dbUuid = dataBase.uuid; final String apiToken = StringGenerators.apiToken(); final String hostname = getHostnameFromDomain(domainName); @@ -334,7 +336,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { 'server_type': 'cx11', 'start_after_create': false, 'image': 'ubuntu-20.04', - 'volumes': [dbId], + 'volumes': dbUuid == null ? [dbId] : [dbUuid], 'networks': [], 'user_data': userdataString, 'labels': {}, @@ -373,7 +375,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { if (!success) { await Future.delayed(const Duration(seconds: 10)); - await deleteVolume(dbId); + await deleteVolume(dbUuid ?? dbId.toString()); } if (hetznerError != null) { diff --git a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean_factory.dart b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean_factory.dart index 565f7c84..7508e04e 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean_factory.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean_factory.dart @@ -1,6 +1,6 @@ -import 'package:selfprivacy/logic/api_maps/rest_maps/provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_provider.dart'; @@ -8,18 +8,20 @@ class DigitalOceanApiFactory extends ServerProviderApiFactory with VolumeProviderApiFactory { @override ServerProviderApi getServerProvider({ - final ProviderApiSettings settings = const ProviderApiSettings(), + required final ServerProviderApiSettings settings, }) => DigitalOceanApi( + region: settings.region, hasLogger: settings.hasLogger, isWithToken: settings.isWithToken, ); @override VolumeProviderApi getVolumeProvider({ - final ProviderApiSettings settings = const ProviderApiSettings(), + required final ServerProviderApiSettings settings, }) => DigitalOceanApi( + region: settings.region, hasLogger: settings.hasLogger, isWithToken: settings.isWithToken, ); diff --git a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart index dceb5a47..fe577c03 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart @@ -14,12 +14,14 @@ import 'package:selfprivacy/logic/models/server_basic_info.dart'; import 'package:selfprivacy/utils/password_generator.dart'; class HetznerApi extends ServerProviderApi with VolumeProviderApi { - HetznerApi({final this.hasLogger = false, final this.isWithToken = true}); + HetznerApi({required this.region, this.hasLogger = false, this.isWithToken = true,}); @override bool hasLogger; @override bool isWithToken; + final String region; + @override BaseOptions get options { final BaseOptions options = BaseOptions(baseUrl: rootAddress); @@ -114,7 +116,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { 'size': 10, 'name': StringGenerators.dbStorageName(), 'labels': {'labelkey': 'value'}, - 'location': 'fsn1', + 'location': region, 'automount': false, 'format': 'ext4' }, @@ -337,7 +339,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { 'user_data': userdataString, 'labels': {}, 'automount': true, - 'location': 'fsn1' + 'location': region, }; print('Decoded data: $data'); diff --git a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner_factory.dart b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner_factory.dart index 60f61d1b..f303966b 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner_factory.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner_factory.dart @@ -1,6 +1,6 @@ -import 'package:selfprivacy/logic/api_maps/rest_maps/provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_provider.dart'; @@ -8,18 +8,20 @@ class HetznerApiFactory extends ServerProviderApiFactory with VolumeProviderApiFactory { @override ServerProviderApi getServerProvider({ - final ProviderApiSettings settings = const ProviderApiSettings(), + required final ServerProviderApiSettings settings, }) => HetznerApi( + region: settings.region, hasLogger: settings.hasLogger, isWithToken: settings.isWithToken, ); @override VolumeProviderApi getVolumeProvider({ - final ProviderApiSettings settings = const ProviderApiSettings(), + required final ServerProviderApiSettings settings, }) => HetznerApi( + region: settings.region, hasLogger: settings.hasLogger, isWithToken: settings.isWithToken, ); diff --git a/lib/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart b/lib/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart new file mode 100644 index 00000000..b1513bf6 --- /dev/null +++ b/lib/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart @@ -0,0 +1,11 @@ +import 'package:selfprivacy/logic/api_maps/rest_maps/provider_api_settings.dart'; + +class ServerProviderApiSettings extends ProviderApiSettings { + const ServerProviderApiSettings({ + required this.region, + super.hasLogger = false, + super.isWithToken = true, + }); + + final String region; +} diff --git a/lib/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart b/lib/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart index 10f4c40f..4fad8797 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart @@ -1,15 +1,15 @@ -import 'package:selfprivacy/logic/api_maps/rest_maps/provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_provider.dart'; abstract class ServerProviderApiFactory { ServerProviderApi getServerProvider({ - final ProviderApiSettings settings = const ProviderApiSettings(), + required final ServerProviderApiSettings settings, }); } mixin VolumeProviderApiFactory { VolumeProviderApi getVolumeProvider({ - final ProviderApiSettings settings = const ProviderApiSettings(), + required final ServerProviderApiSettings settings, }); } diff --git a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart index 134c955e..5b363406 100644 --- a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart +++ b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart @@ -26,7 +26,7 @@ class HetznerMetricsRepository { break; } - final HetznerApi api = HetznerApi(hasLogger: false); + final HetznerApi api = HetznerApi(hasLogger: false, region: 'fra1',); final List> results = await Future.wait([ api.getMetrics(start, end, 'cpu'), diff --git a/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart b/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart index f6a2e7a6..1eb47bf3 100644 --- a/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart +++ b/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/api_maps/graphql_maps/server_api/server.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_creator.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; @@ -34,7 +35,7 @@ class ApiProviderVolumeCubit } Future getPricePerGb() async => - providerApi!.getVolumeProvider().getPricePerGb(); + providerApi!.getVolumeProvider(settings: const ServerProviderApiSettings(region: 'fra1',),).getPricePerGb(); Future refresh() async { emit(const ApiProviderVolumeState([], LoadingStatus.refreshing, false)); @@ -47,7 +48,7 @@ class ApiProviderVolumeCubit } final List volumes = - await providerApi!.getVolumeProvider().getVolumes(); + await providerApi!.getVolumeProvider(settings: const ServerProviderApiSettings(region: 'fra1',),).getVolumes(); if (volumes.isEmpty) { return emit(const ApiProviderVolumeState([], LoadingStatus.error, false)); @@ -59,15 +60,15 @@ class ApiProviderVolumeCubit Future attachVolume(final DiskVolume volume) async { final ServerHostingDetails server = getIt().serverDetails!; await providerApi! - .getVolumeProvider() - .attachVolume(volume.providerVolume!.id, server.id); + .getVolumeProvider(settings: const ServerProviderApiSettings(region: 'fra1',),) + .attachVolume(volume.providerVolume!.id.toString(), server.id); refresh(); } Future detachVolume(final DiskVolume volume) async { await providerApi! - .getVolumeProvider() - .detachVolume(volume.providerVolume!.id); + .getVolumeProvider(settings: const ServerProviderApiSettings(region: 'fra1',),) + .detachVolume(volume.providerVolume!.id.toString()); refresh(); } @@ -80,8 +81,8 @@ class ApiProviderVolumeCubit 'Starting resize', ); emit(state.copyWith(isResizing: true)); - final bool resized = await providerApi!.getVolumeProvider().resizeVolume( - volume.providerVolume!.id, + final bool resized = await providerApi!.getVolumeProvider(settings: const ServerProviderApiSettings(region: 'fra1',),).resizeVolume( + volume.providerVolume!.id.toString(), newSizeGb, ); @@ -117,7 +118,7 @@ class ApiProviderVolumeCubit Future createVolume() async { final ServerVolume? volume = - await providerApi!.getVolumeProvider().createVolume(); + await providerApi!.getVolumeProvider(settings: const ServerProviderApiSettings(region: 'fra1',),).createVolume(); final diskVolume = DiskVolume(providerVolume: volume); await attachVolume(diskVolume); @@ -130,8 +131,8 @@ class ApiProviderVolumeCubit Future deleteVolume(final DiskVolume volume) async { await providerApi! - .getVolumeProvider() - .deleteVolume(volume.providerVolume!.id); + .getVolumeProvider(settings: const ServerProviderApiSettings(region: 'fra1',),) + .deleteVolume(volume.providerVolume!.id.toString()); refresh(); } diff --git a/lib/logic/cubit/server_detailed_info/server_detailed_info_repository.dart b/lib/logic/cubit/server_detailed_info/server_detailed_info_repository.dart index dada896b..d4149f61 100644 --- a/lib/logic/cubit/server_detailed_info/server_detailed_info_repository.dart +++ b/lib/logic/cubit/server_detailed_info/server_detailed_info_repository.dart @@ -5,7 +5,7 @@ import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart'; import 'package:selfprivacy/logic/models/timezone_settings.dart'; class ServerDetailsRepository { - HetznerApi hetzner = HetznerApi(); + HetznerApi hetzner = HetznerApi(region: 'fra1'); ServerApi server = ServerApi(); Future load() async { diff --git a/lib/logic/cubit/server_installation/server_installation_cubit.dart b/lib/logic/cubit/server_installation/server_installation_cubit.dart index b32fe79a..8e121044 100644 --- a/lib/logic/cubit/server_installation/server_installation_cubit.dart +++ b/lib/logic/cubit/server_installation/server_installation_cubit.dart @@ -5,8 +5,10 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:equatable/equatable.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_creator.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/provider_api_settings.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart'; import 'package:selfprivacy/logic/models/hive/backblaze_credential.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart'; @@ -61,7 +63,7 @@ class ServerInstallationCubit extends Cubit { RegExp getServerProviderApiTokenValidation() => repository.serverProviderApiFactory! - .getServerProvider() + .getServerProvider(settings: const ServerProviderApiSettings(region: 'fra1',),) .getApiTokenValidation(); RegExp getDnsProviderApiTokenValidation() => repository.dnsProviderApiFactory! @@ -73,7 +75,7 @@ class ServerInstallationCubit extends Cubit { ) async => repository.serverProviderApiFactory! .getServerProvider( - settings: const ProviderApiSettings(isWithToken: false), + settings: const ServerProviderApiSettings(region: 'fra1', isWithToken: false), ) .isApiTokenValid(providerToken); diff --git a/lib/logic/cubit/server_installation/server_installation_repository.dart b/lib/logic/cubit/server_installation/server_installation_repository.dart index 39593b1f..10306c61 100644 --- a/lib/logic/cubit/server_installation/server_installation_repository.dart +++ b/lib/logic/cubit/server_installation/server_installation_repository.dart @@ -11,9 +11,11 @@ import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/config/hive_config.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_creator.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/logic/models/hive/backblaze_credential.dart'; @@ -151,7 +153,7 @@ class ServerInstallationRepository { ) async { ServerHostingDetails serverDetails; - final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); + final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(settings: const ServerProviderApiSettings(region: 'fra1',),); serverDetails = await api.powerOn(); return serverDetails; @@ -227,7 +229,7 @@ class ServerInstallationRepository { required final Future Function(ServerHostingDetails serverDetails) onSuccess, }) async { - final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); + final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(settings: const ServerProviderApiSettings(region: 'fra1',),); try { final ServerHostingDetails? serverDetails = await api.createServer( dnsApiToken: cloudFlareKey, @@ -332,7 +334,7 @@ class ServerInstallationRepository { final DnsProviderApi dnsProviderApi = dnsProviderApiFactory!.getDnsProvider(); final ServerProviderApi serverApi = - serverProviderApiFactory!.getServerProvider(); + serverProviderApiFactory!.getServerProvider(settings: const ServerProviderApiSettings(region: 'fra1',),); await dnsProviderApi.removeSimilarRecords( ip4: serverDetails.ip4, @@ -404,12 +406,12 @@ class ServerInstallationRepository { } Future restart() async { - final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); + final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(settings: const ServerProviderApiSettings(region: 'fra1',),); return api.restart(); } Future powerOn() async { - final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); + final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(settings: const ServerProviderApiSettings(region: 'fra1',),); return api.powerOn(); } @@ -652,7 +654,7 @@ class ServerInstallationRepository { } Future> getServersOnProviderAccount() async { - final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); + final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(settings: const ServerProviderApiSettings(region: 'fra1',),); return api.getServers(); } @@ -730,7 +732,7 @@ class ServerInstallationRepository { } Future deleteServer(final ServerDomain serverDomain) async { - final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); + final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(settings: const ServerProviderApiSettings(region: 'fra1',),); final DnsProviderApi dnsProviderApi = dnsProviderApiFactory!.getDnsProvider();