Добавил скрипт установки на linux из бинарных пакетов

This commit is contained in:
Антон Чичков 2024-07-18 11:47:35 +10:00
parent 954a1c75c6
commit 38c8055a61

262
linux/install.ps1 Normal file
View File

@ -0,0 +1,262 @@
param ([string]$version, [switch]$server, [switch]$pollservice, [switch]$force, [switch] $update)
Set-StrictMode -Version 1
###################################
# Вспомогательные функции
###################################
# Запрашивает адрес сервера ЛЭРС
function Get-ServerAddress
{
do
{
$serverAddress = Read-Host -Prompt "Введите адрес сервера ЛЭРС, к которому подключится служба опроса."
# Проверяем, что это действительно сервер ЛЭРС
try {
$response = Invoke-RestMethod -Method GET -Uri "$serverAddress/api/v1/serverInfo"
if ($response.type -ne "LersServer")
{
throw "Неверный тип сервера"
}
return $serverAddress
}
catch {
Write-Error "$serverAddress не является сервером ЛЭРС. $_"
}
} while ($true)
}
###################################
# Константы
###################################
$dotnetRuntimeVersion="8.0"
$lersUser = "lers"
$lersDir = "/usr/LERS"
$dataDir = "/var/LERS"
$configDir = "/etc/LERS"
$serverExecutable = "$lersDir/Server/Lers.Server.dll"
$pollServiceExecutable = "$lersDir/PollService/Lers.PollService.dll"
$serverServiceName = "lers.server.service"
$pollserviceServiceName = "lers.pollservice.service"
###################################
# Ресурсы
###################################
$serverSystemd = @"
[Unit]
Description=ЛЭРС УЧЁТ - Сервер
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=$lersUser
ExecStart=/usr/bin/dotnet $serverExecutable
[Install]
WantedBy=multi-user.target
"@
$pollserviceSystemd = @"
[Unit]
Description=ЛЭРС УЧЁТ - Служба опроса
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=$lersUser
ExecStart=/usr/bin/dotnet $pollServiceExecutable
[Install]
WantedBy=multi-user.target
"@
###################################
# Убедимся, что запущены от ROOT.
###################################
if ($PSVersionTable.Platform -eq "Unix") {
if ( $(whoami) -ne "root") {
Write-Host "Запустите скрипт от имени root через sudo"
exit 1
}
}
# Определяем откуда будем качать.
if ($version)
{
$serverUrl = "https://update.lers.ru/v/$version/files/Server.zip"
$pollServiceUrl = "https://update.lers.ru/v/$version/files/PollService.zip"
}
else
{
$serverUrl = "https://update.lers.ru/download/files/Server.zip"
$pollServiceUrl = "https://update.lers.ru/download/files/PollService.zip"
}
$isServerInstalled = Test-Path -Path $serverExecutable
$isPollServiceInstalled = Test-Path -Path $pollServiceExecutable
## Останавливаем запущенные службы, если они есть
if ($isServerInstalled)
{
systemctl stop $serverServiceName
}
if ($isPollServiceInstalled)
{
systemctl stop $pollserviceServiceName
}
if ($update)
{
# В режиме обновления игнорируем ключи -server и -pollservice
# Вместо этого по наличию файлов определяем установлены ли сервер и служба опроса
$server = $isServerInstalled
$pollservice = $isPollServiceInstalled
}
elseif (-not $server -and -not $pollservice)
{
$server = $true
$pollservice = $true
}
# Устанавливаем рантайм aspnet
dnf install aspnetcore-runtime-$dotnetRuntimeVersion -y
# Устанавливаем зависимости блока отчётов
if ($server)
{
Write-Host "Устанавливаются зависимости модуля отчётов сервера ЛЭРС"
dnf install libgdiplus -y
}
# Создаём пользователя
getent passwd $lersUser
if($?)
{
Write-Host "Пользователь $lersUser уже существует."
}
else
{
Write-Host "Создаётся пользователь $lersUser"
useradd $lersUser
}
# Создаём папки для настроек и данных
if ($force -and -not $update)
{
Remove-Item -Path $configDir -Recurse -Force
}
New-Item -ItemType Directory -Path $dataDir -Force
New-Item -ItemType Directory -Path $configDir -Force
# Загружаем и распаковываем архивы с программой
if ($server)
{
wget $serverUrl -O Server.zip
Expand-Archive -LiteralPath 'Server.zip' -DestinationPath $lersDir -Force
Remove-Item -Path 'Server.zip' -Force
}
if ($pollservice)
{
wget $pollServiceUrl -O PollService.zip
Expand-Archive -LiteralPath 'PollService.zip' -DestinationPath $lersDir -Force
Remove-Item -Path 'PollService.zip' -Force
}
# Настраиваем подключение службы опроса
if (-not $update)
{
if ($pollservice)
{
if ($server)
{
# Сервер установлен, обращаемся к адресу по умолчанию.
$serverAddress = "http://localhost:10000";
}
else
{
# Сервер не установлен, запрашиваем.
$serverAddress = Get-ServerAddress;
}
$templateConfig = "$lersDir/PollService/Lers.PollService.ini.template"
$config = "$lersDir/PollService/Lers.PollService.ini"
(Get-Content $templateConfig).Replace("`$SERVER_ADDRESS`$:`$SERVER_PORT`$", $serverAddress) | Set-Content $config -Force
Write-Host "Служба опроса настроена на подключение к серверу $serverAddress"
}
if ($server)
{
# Запускаем конфигурацию сервера
dotnet $lersDir/Server.Bootstrapper/Lers.Setup.Bootstrapper.Cli.dll
}
}
# Загружаем обновления для раздачи
if ($server)
{
dotnet $lersDir/Updater/Lers.UpdateService.dll update-dist
dotnet $lersDir/Updater/Lers.UpdateService.dll update-plugins
}
# Устанавливаем пользователю разрешения на папки с данными.
chown -R $lersUser $dataDir
chown -R $lersUser $configDir
if ($update)
{
# Обновляем существующую БД
dotnet $serverExecutable cli db-update
}
else
{
# Создаём службы systemd
if ($server)
{
$serverSystemd | Set-Content /etc/systemd/system/$serverServiceName -Force
}
if ($pollservice)
{
$pollserviceSystemd | Set-Content /etc/systemd/system/$pollserviceServiceName -Force
}
}