gitea-install/deploy.ps1

207 lines
6.2 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Requires -Version 5.1
<#
.SYNOPSIS
Скрипт развертывания Gitea через Docker Compose (Windows)
.EXAMPLE
.\deploy.ps1 install
.\deploy.ps1 install -NonInteractive
.\deploy.ps1 update
.\deploy.ps1 backup
#>
param(
[Parameter(Position = 0)]
[ValidateSet("install", "start", "stop", "restart", "update", "status", "logs", "backup", "restore", "uninstall", "help")]
[string]$Command = "install",
[Parameter(Position = 1)]
[string]$BackupFile,
[switch]$NonInteractive
)
$ErrorActionPreference = "Stop"
$script:ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location $script:ScriptDir
. "$script:ScriptDir\lib\common.ps1"
function Show-Usage {
@"
Использование: .\deploy.ps1 [команда] [опции]
Команды:
install — первичное развертывание (по умолчанию)
start — запуск контейнеров
stop — остановка контейнеров
restart — перезапуск
update — обновление образов и перезапуск
status — статус контейнеров
logs — просмотр логов Gitea
backup — резервная копия данных
restore — восстановление из backup
uninstall — остановка и удаление контейнеров (данные сохраняются)
Опции install:
-NonInteractive Без интерактивных вопросов (значения из .env.example, пароль — автогенерация)
Примеры:
.\deploy.ps1 install
.\deploy.ps1 install -NonInteractive
.\deploy.ps1 update
.\deploy.ps1 backup
.\deploy.ps1 restore -BackupFile backups\gitea-backup-20260101.tar.gz
"@
}
function Invoke-Install {
Test-Dependencies
Invoke-SetupEnvInteractive -NonInteractive:$NonInteractive
Write-Info "Загрузка образов..."
docker compose pull
Write-Info "Запуск Gitea..."
docker compose up -d
Start-Sleep -Seconds 5
docker compose ps
$domain = if ($env:GITEA_DOMAIN) { $env:GITEA_DOMAIN } else { "localhost" }
$httpPort = if ($env:GITEA_HTTP_PORT) { $env:GITEA_HTTP_PORT } else { "3000" }
$sshPort = if ($env:GITEA_SSH_PORT) { $env:GITEA_SSH_PORT } else { "2222" }
Write-Info "Gitea развернута!"
Write-Info " Web: http://${domain}:${httpPort}"
Write-Info " SSH: ssh://git@${domain}:${sshPort}"
Write-Info "При первом входе откройте Web UI и завершите мастер настройки."
}
function Invoke-Start {
Test-Dependencies
Import-EnvFile
docker compose up -d
docker compose ps
}
function Invoke-Stop {
Test-Dependencies
docker compose down
Write-Info "Контейнеры остановлены."
}
function Invoke-Restart {
Test-Dependencies
Import-EnvFile
docker compose restart
docker compose ps
}
function Invoke-Update {
Test-Dependencies
Import-EnvFile
Write-Info "Обновление образов..."
docker compose pull
docker compose up -d
docker compose ps
Write-Info "Обновление завершено."
}
function Invoke-Status {
Test-Dependencies
docker compose ps
}
function Invoke-Logs {
Test-Dependencies
docker compose logs -f --tail=100 gitea
}
function Invoke-Backup {
Test-Dependencies
Import-EnvFile
$backupDir = Join-Path $script:ScriptDir "backups"
$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
$backupFile = Join-Path $backupDir "gitea-backup-$timestamp.tar.gz"
New-Item -ItemType Directory -Force -Path $backupDir | Out-Null
Write-Info "Создание резервной копии: $backupFile"
docker run --rm `
-v gitea_gitea_data:/gitea_data:ro `
-v gitea_postgres_data:/postgres_data:ro `
-v "${backupDir}:/backup" `
alpine:3.20 `
sh -c "tar czf /backup/gitea-backup-$timestamp.tar.gz -C / gitea_data postgres_data"
Write-Info "Резервная копия сохранена: $backupFile"
}
function Invoke-Restore {
if (-not $BackupFile -or -not (Test-Path $BackupFile)) {
throw "Укажите существующий файл: .\deploy.ps1 restore -BackupFile backups\gitea-backup-....tar.gz"
}
Test-Dependencies
Import-EnvFile
Write-Warn "Восстановление перезапишет текущие данные!"
$confirm = Read-Host "Продолжить? [y/N]"
if ($confirm -notmatch '^[Yy]$') {
Write-Info "Отменено."
return
}
Write-Info "Остановка контейнеров..."
docker compose down
$backupDir = (Resolve-Path (Split-Path $BackupFile -Parent)).Path
$backupName = Split-Path $BackupFile -Leaf
Write-Info "Восстановление из $BackupFile..."
docker run --rm `
-v gitea_gitea_data:/gitea_data `
-v gitea_postgres_data:/postgres_data `
-v "${backupDir}:/backup:ro" `
alpine:3.20 `
sh -c "cd / && tar xzf /backup/$backupName"
Write-Info "Запуск контейнеров..."
docker compose up -d
Write-Info "Восстановление завершено."
}
function Invoke-Uninstall {
Test-Dependencies
Write-Warn "Контейнеры будут удалены. Тома с данными сохранятся."
$confirm = Read-Host "Продолжить? [y/N]"
if ($confirm -notmatch '^[Yy]$') {
Write-Info "Отменено."
return
}
docker compose down
Write-Info "Контейнеры удалены. Для полного удаления данных: docker volume rm gitea_gitea_data gitea_postgres_data"
}
try {
switch ($Command) {
"install" { Invoke-Install }
"start" { Invoke-Start }
"stop" { Invoke-Stop }
"restart" { Invoke-Restart }
"update" { Invoke-Update }
"status" { Invoke-Status }
"logs" { Invoke-Logs }
"backup" { Invoke-Backup }
"restore" { Invoke-Restore }
"uninstall" { Invoke-Uninstall }
"help" { Show-Usage }
}
}
catch {
Write-Err $_.Exception.Message
exit 1
}