#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 }