У меня есть Asp. Net Core 3.1.3 WebApi с EfCore 3.1.3 и Pomelo.EntityFrameworkCore. MySql в качестве поставщика Этот WebApi построен и развернут в Docker.
Хост-сервер Debian 10, он настроен с UFW в качестве брандмауэра.
У меня установлен Mysql Сервер, установленный на хост-сервере.
Я установил адрес привязки 0.0.0.0 для Mysql
/ etc / mysql / mysql .conf.d / mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
bind-address = 0.0.0.0
Я создал правило в UFW, разрешающее только локальный хост и docker0
bridge ip адрес ![enter image description here](https://i.stack.imgur.com/oSrNU.png)
![enter image description here](https://i.stack.imgur.com/BHIt4.png)
В моей конфигурации docker, я добавил IP-адрес моего хост-сервера, но соединение с MySql не удается
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 3.1.3 initialized 'ApplicationContext' using provider 'Pomelo.EntityFrameworkCore.MySql' with options: using lazy-loading proxies ServerVersion 8.0.19 MySql
fail: Microsoft.EntityFrameworkCore.Database.Connection[20004]
An error occurred using the connection to database '<db_name>' on server '<host_ip_address>'.
info: Microsoft.EntityFrameworkCore.Infrastructure[10404]
A transient exception has been encountered during execution and the operation will be retried after 0ms.
MySql.Data.MySqlClient.MySqlException (0x80004005): Connect Timeout expired.
---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
В файле Startup.cs приведен конфиг для EfCore:
services.AddDbContext<ApplicationContext>(opts =>
{
opts
.UseLazyLoadingProxies()
.UseMySql(connectionString, mySqlOptions =>
mySqlOptions
.ServerVersion(new Version(dbOptions.Version), ServerType.MySql)
.CharSet(CharSet.Utf8Mb4)
.EnableRetryOnFailure(3))
.EnableDetailedErrors();
});
Для построения строки подключения я использую MySql. Data.MySqlClient.MySqlConnectionStringBuilder:
var builder = new MySql.Data.MySqlClient.MySqlConnectionStringBuilder
{
Server = dbOptions.Server,
Database = dbOptions.Name,
UserID = dbOptions.User,
Password = dbOptions.Password,
PersistSecurityInfo = true
};
return builder.ToString();
Я сгенерировал сценарий миграции и развернул его на сервере, так как Pomelo устанавливает имя базы данных как пустую строку при вызове dbCon text.Database.Migrate ();
В файле docker я предоставляю порты 80 и 443.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
...
Я отправил параметры базы данных как переменные среды в файле docker -compose.
Я выполнил некоторые операции по заполнению данных, чтобы добавить пользователей и роли из Identity.
var roleManager = provider.GetRequiredService<RoleManager<RoleModel>>();
roleManager.CreateAsync(new RoleModel(roleName)).GetAwaiter().GetResult();
...
Что я пропустил?