Мы вдвоём с diego работаем над переносом, ниже подробно о действиях и результатах.
Сервер LERS: Ubuntu 22.04, Docker 20.10.21
Сервер БД: Ubuntu 22.04, PostgreSQL 14.5
- Установка контейнера. Конфиг Compose немного подправили, разрешив автоматическую загрузку и использовании сети хоста:
Спойлер
version: “3.9”
services:
lers:
image: lersamr/full:latest
restart: always
network_mode: host
volumes:
- /var/LERS:/var/LERS
- /etc/LERS:/etc/LERS
docker compose up -d
docker compose exec -it lers /install.sh
Установка проходит гладко, база данных создаётся, к ней успешно выполняются запросы, по окончании работает web-интерфейс, всё хорошо. При перезапуске контейнера так же нет никаких ошибок:
Спойлер
lers-lers-1 | I: Обновляются внешние модули.
lers-lers-1 | Poll Service started.
lers-lers-1 | I: Источник обновлений: https://update.lers.ru/v/3.49.2/updates
lers-lers-1 | Server is ready.
lers-lers-1 | info: Microsoft.Hosting.Lifetime[0]
lers-lers-1 | Application started. Press Ctrl+C to shut down.
lers-lers-1 | info: Microsoft.Hosting.Lifetime[0]
lers-lers-1 | Hosting environment: Production
lers-lers-1 | info: Microsoft.Hosting.Lifetime[0]
lers-lers-1 | Content root path: /usr/LERS/PollService
- Процесс переноса базы. Diego уже всё описал, останавливаем докер, запускаем перенос, процесс проходит без ошибок. Проблема проявляется, когда на перенесённой базе пытаемся запустить контейнер:
Спойлер
lers-lers-1 exited with code 255
lers-lers-1 | at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
lers-lers-1 | at Lers.Server.CLI.DbUpdateHandler.HandleAsync() in C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\Handlers\DbUpdateHandler.cs:line 39
lers-lers-1 | at Lers.Server.CLI.CommandLineHandler.HandleAsync(String verb, IServiceProvider services) in C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\CommandLineHandler.cs:line 37
lers-lers-1 | Exception data:
lers-lers-1 | Severity: ERROR
lers-lers-1 | SqlState: 42710
lers-lers-1 | MessageText: collation “default_collation” already exists
lers-lers-1 | File: pg_collation.c
lers-lers-1 | Line: 110
lers-lers-1 | Routine: CollationCreate
lers-lers-1 | I: Инициализация базы данных…
lers-lers-1 | I: Entity Framework Core 6.0.7 initialized ‘LersDbContext’ using provider ‘Npgsql.EntityFrameworkCore.PostgreSQL:6.0.5+9d79af6e2586d5d28da253ac075706a5575a1743’ with options: CommandTimeout=60 MigrationsAssembly=Lers.Dal.Migrations.Postgres
lers-lers-1 | I: Executed DbCommand (169ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
lers-lers-1 | SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname=‘__EFMigrationsHistory’);
lers-lers-1 | I: Executed DbCommand (2ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
lers-lers-1 | SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname=‘__EFMigrationsHistory’);
lers-lers-1 | I: Executed DbCommand (5ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
lers-lers-1 | SELECT “MigrationId”, “ProductVersion”
lers-lers-1 | FROM “__EFMigrationsHistory”
lers-lers-1 | ORDER BY “MigrationId”;
lers-lers-1 | I: Applying migration ‘20220331054708_Initialize’.
lers-lers-1 | E: Failed executing DbCommand (33ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
lers-lers-1 | CREATE COLLATION public.default_collation (LC_COLLATE = ‘ru-RU-u-ks-level2’,
lers-lers-1 | LC_CTYPE = ‘ru-RU-u-ks-level2’,
lers-lers-1 | PROVIDER = icu,
lers-lers-1 | DETERMINISTIC = False
lers-lers-1 | );
lers-lers-1 | Не удалось выполнить команду. Npgsql.PostgresException (0x80004005): 42710: collation “default_collation” already exists
lers-lers-1 | at Npgsql.Internal.NpgsqlConnector.g__ReadMessageLong|211_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
lers-lers-1 | at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
lers-lers-1 | at Npgsql.NpgsqlDataReader.NextResult()
lers-lers-1 | at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
lers-lers-1 | at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
lers-lers-1 | at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
lers-lers-1 | at Npgsql.NpgsqlCommand.ExecuteNonQuery()
lers-lers-1 | at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
lers-lers-1 | at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary2 parameterValues) lers-lers-1 | at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable
1 migrationCommands, IRelationalConnection connection)
lers-lers-1 | at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
lers-lers-1 | at Lers.Server.CLI.DbUpdateHandler.HandleAsync() in C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\Handlers\DbUpdateHandler.cs:line 39
lers-lers-1 | at Lers.Server.CLI.CommandLineHandler.HandleAsync(String verb, IServiceProvider services) in C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\CommandLineHandler.cs:line 37
lers-lers-1 | Exception data:
lers-lers-1 | Severity: ERROR
lers-lers-1 | SqlState: 42710
lers-lers-1 | MessageText: collation “default_collation” already exists
lers-lers-1 | File: pg_collation.c
lers-lers-1 | Line: 110
lers-lers-1 | Routine: CollationCreate
lers-lers-1 exited with code 255
lers-lers-1 | at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
lers-lers-1 | at Lers.Server.CLI.DbUpdateHandler.HandleAsync() in C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\Handlers\DbUpdateHandler.cs:line 39
lers-lers-1 | at Lers.Server.CLI.CommandLineHandler.HandleAsync(String verb, IServiceProvider services) in C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\CommandLineHandler.cs:line 37
lers-lers-1 | Exception data:
lers-lers-1 | Severity: ERROR
lers-lers-1 | SqlState: 42710
lers-lers-1 | MessageText: collation “default_collation” already exists
lers-lers-1 | File: pg_collation.c
lers-lers-1 | Line: 110
lers-lers-1 | Routine: CollationCreate
lers-lers-1 | I: Инициализация базы данных…
lers-lers-1 | I: Entity Framework Core 6.0.7 initialized ‘LersDbContext’ using provider ‘Npgsql.EntityFrameworkCore.PostgreSQL:6.0.5+9d79af6e2586d5d28da253ac075706a5575a1743’ with options: CommandTimeout=60 MigrationsAssembly=Lers.Dal.Migrations.Postgres
lers-lers-1 | I: Executed DbCommand (139ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
lers-lers-1 | SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname=‘__EFMigrationsHistory’);
lers-lers-1 | I: Executed DbCommand (2ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
lers-lers-1 | SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace WHERE c.relname=‘__EFMigrationsHistory’);
lers-lers-1 | I: Executed DbCommand (4ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
lers-lers-1 | SELECT “MigrationId”, “ProductVersion”
lers-lers-1 | FROM “__EFMigrationsHistory”
lers-lers-1 | ORDER BY “MigrationId”;
lers-lers-1 | I: Applying migration ‘20220331054708_Initialize’.
lers-lers-1 | E: Failed executing DbCommand (34ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
lers-lers-1 | CREATE COLLATION public.default_collation (LC_COLLATE = ‘ru-RU-u-ks-level2’,
lers-lers-1 | LC_CTYPE = ‘ru-RU-u-ks-level2’,
lers-lers-1 | PROVIDER = icu,
lers-lers-1 | DETERMINISTIC = False
lers-lers-1 | );
lers-lers-1 | Не удалось выполнить команду. Npgsql.PostgresException (0x80004005): 42710: collation “default_collation” already exists
lers-lers-1 | at Npgsql.Internal.NpgsqlConnector.g__ReadMessageLong|211_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
lers-lers-1 | at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
lers-lers-1 | at Npgsql.NpgsqlDataReader.NextResult()
lers-lers-1 | at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
lers-lers-1 | at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
lers-lers-1 | at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
lers-lers-1 | at Npgsql.NpgsqlCommand.ExecuteNonQuery()
lers-lers-1 | at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
lers-lers-1 | at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary2 parameterValues) lers-lers-1 | at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable
1 migrationCommands, IRelationalConnection connection)
lers-lers-1 | at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
lers-lers-1 | at Lers.Server.CLI.DbUpdateHandler.HandleAsync() in C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\Handlers\DbUpdateHandler.cs:line 39
lers-lers-1 | at Lers.Server.CLI.CommandLineHandler.HandleAsync(String verb, IServiceProvider services) in C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\CommandLineHandler.cs:line 37
lers-lers-1 | Exception data:
lers-lers-1 | Severity: ERROR
lers-lers-1 | SqlState: 42710
lers-lers-1 | MessageText: collation “default_collation” already exists
lers-lers-1 | File: pg_collation.c
lers-lers-1 | Line: 110
lers-lers-1 | Routine: CollationCreate
lers-lers-1 exited with code 255
lers-lers-1 exited with code 0
По логу видно, что он пытается несколько раз переинициализировать базу и перезапускает контейнер. В конце я его останавливаю вручную.
- Как итог, чтобы сервер запустить, перед запуском контейнера вручную переношу куда-нибудь файл /etc/LERS/Lers.Server.xml, стартую контейнер, в логах он предупреждает, что необходимо выполнить установку. Переношу обратно файл Lers.Server.xml в папку /etc/LERS, через небольшой промежуток времени он его подхватывает и начинает работать, не выводя никаких ошибок:
Спойлер
lers-lers-1 | ----------------------------------------------------------
lers-lers-1 | ВНИМАНИЕ!
lers-lers-1 | Контейнер ЛЭРС УЧЁТ запущен, но база данных ещё не настроена.
lers-lers-1 | Для настройки базы данных воспользуйтесь инструкцией:
lers-lers-1 | https://docs.lers.ru/uid/InstallDocker
lers-lers-1 | ----------------------------------------------------------
lers-lers-1 | I: Обновляются внешние модули.
lers-lers-1 | Poll Service started.
lers-lers-1 | I: Источник обновлений: https://update.lers.ru/v/3.49.2/updates
lers-lers-1 | Server is ready.
lers-lers-1 | info: Microsoft.Hosting.Lifetime[0]
lers-lers-1 | Application started. Press Ctrl+C to shut down.
lers-lers-1 | info: Microsoft.Hosting.Lifetime[0]
lers-lers-1 | Hosting environment: Production
lers-lers-1 | info: Microsoft.Hosting.Lifetime[0]
lers-lers-1 | Content root path: /usr/LERS/PollService
Правда при следующем перезапуске контейнера процедуру приходится повторять. Тот же эффект, если остановить контейнер, удалить /etc/LERS/Lers.Server.xml, запустить контейнер и запустить скрипт установки, которому указать учётные данные к существующей базе. Он ругается, но контейнер продолжает полноценно работать с перенесённой базой. Опять же до следующего перезапуска сервера:
Спойлер
$ sudo docker compose exec -it lers /install.sh
Адрес сервера БД: (localhost): server.url
Имя пользователя администратора сервера БД: (postgres): lers
Пароль пользователя lers: ********
Выбран удалённый сервер PostgreSQL.
Чтобы установка завершилась успешно, убедитесь, что к нему разрешены удалённые подключения.
Для этого нужно настроить разрешения в файле pg_hba.conf
Подробнее смотрите в нашей документации:
https://docs.lers.ru/uid/InstallPostgres
Продолжить установку? [y/n] (y): y
Имя базы данных: (LERS): LERS
Подключение к серверу БД …
База данных уже существует и будет использована для работы сервера ЛЭРС УЧЁТ.
Предоставляем доступ к БД для сервера и службы обновления…
Включаем SQL авторизацию на сервере БД…
Обновление базы данных …
I: Инициализация базы данных…
I: Entity Framework Core 6.0.7 initialized ‘LersDbContext’ using provider
‘Npgsql.EntityFrameworkCore.PostgreSQL:6.0.5+9d79af6e2586d5d28da253ac075706a5575a1743’ with options:
CommandTimeout=60 MigrationsAssembly=Lers.Dal.Migrations.Postgres
I: Executed DbCommand (140ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON
n.oid=c.relnamespace WHERE c.relname=‘__EFMigrationsHistory’);
I: Executed DbCommand (4ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON
n.oid=c.relnamespace WHERE c.relname=‘__EFMigrationsHistory’);
I: Executed DbCommand (4ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
SELECT “MigrationId”, “ProductVersion”
FROM “__EFMigrationsHistory”
ORDER BY “MigrationId”;
I: Applying migration ‘20220331054708_Initialize’.
E: Failed executing DbCommand (38ms) [Parameters=[], CommandType=‘Text’, CommandTimeout=‘60’]
CREATE COLLATION public.default_collation (LC_COLLATE = ‘ru-RU-u-ks-level2’,
LC_CTYPE = ‘ru-RU-u-ks-level2’,
PROVIDER = icu,
DETERMINISTIC = False
);
Не удалось выполнить команду. Npgsql.PostgresException (0x80004005): 42710: collation
“default_collation” already exists
at Npgsql.Internal.NpgsqlConnector.g__ReadMessageLong|211_0(NpgsqlConnector connector,
Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean
isReadingPrependedMessage)
at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken
cancellationToken)
at Npgsql.NpgsqlDataReader.NextResult()
at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken
cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken
cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteNonQuery()
at
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject
parameterObject)
at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection
connection, IReadOnlyDictionary2 parameterValues) at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable
1
migrationCommands, IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Lers.Server.CLI.DbUpdateHandler.HandleAsync() in
C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\Handlers\DbUpdateHandler.cs:line 39
at Lers.Server.CLI.CommandLineHandler.HandleAsync(String verb, IServiceProvider services) in
C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\CommandLineHandler.cs:line 37
Exception data:
Severity: ERROR
SqlState: 42710
MessageText: collation “default_collation” already exists
File: pg_collation.c
Line: 110
Routine: CollationCreate
Lers.Setup.Bootstrapper.InstallerException: Не удалось обновить базу данных. Код выхода: 255
Не удалось выполнить команду. Npgsql.PostgresException (0x80004005): 42710: collation
“default_collation” already exists
at Npgsql.Internal.NpgsqlConnector.g__ReadMessageLong|211_0(NpgsqlConnector connector,
Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean
isReadingPrependedMessage)
at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken
cancellationToken)
at Npgsql.NpgsqlDataReader.NextResult()
at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken
cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken
cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteNonQuery()
at
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject
parameterObject)
at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection
connection, IReadOnlyDictionary2 parameterValues) at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable
1
migrationCommands, IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Lers.Server.CLI.DbUpdateHandler.HandleAsync() in
C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\Handlers\DbUpdateHandler.cs:line 39
at Lers.Server.CLI.CommandLineHandler.HandleAsync(String verb, IServiceProvider services) in
C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Server\Lers.Server\CLI\CommandLineHandler.cs:line 37
Exception data:
Severity: ERROR
SqlState: 42710
MessageText: collation “default_collation” already exists
File: pg_collation.c
Line: 110
Routine: CollationCreate
at async Task Lers.Setup.Bootstrapper.Installer.MigrateDatabase(InstallerInfo info) in
C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Build\Install\Lers.Setup.Bootstrapper.Core\
Installer.cs:150
at async Task Lers.Setup.Bootstrapper.Installer.InstallDatabaseAsync(InstallerInfo info) in
C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Build\Install\Lers.Setup.Bootstrapper.Core\
Installer.cs:126
at async Task Lers.Setup.Bootstrapper.Installer.InstallAsync(InstallerInfo info) in
C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Build\Install\Lers.Setup.Bootstrapper.Core\
Installer.cs:31
at async Task Program.$(string[] args) in
C:\BuildAgent\work\e86d0e5a552eeb1e\LersUchet\Build\Install\Lers.Setup.Bootstrapper.Cli\Program.cs:
49