207 lines
6.2 KiB
PowerShell
207 lines
6.2 KiB
PowerShell
#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
|
||
}
|