#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # shellcheck disable=SC1091 source "${SCRIPT_DIR}/lib/common.sh" NON_INTERACTIVE=false usage() { cat <<'EOF' Использование: ./deploy.sh [команда] [опции] Команды: install — первичное развертывание (по умолчанию) start — запуск контейнеров stop — остановка контейнеров restart — перезапуск update — обновление образов и перезапуск status — статус контейнеров logs — просмотр логов Gitea backup — резервная копия данных restore — восстановление из backup (./deploy.sh restore <файл.tar.gz>) uninstall — остановка и удаление контейнеров (данные сохраняются) Опции install: -y, --yes Без интерактивных вопросов (значения из .env.example, пароль — автогенерация) Примеры: ./deploy.sh install ./deploy.sh install -y ./deploy.sh update ./deploy.sh backup ./deploy.sh restore backups/gitea-backup-20260101.tar.gz EOF } cmd_install() { log "Проверка зависимостей..." check_dependencies setup_env_interactive "$NON_INTERACTIVE" log "Загрузка образов..." docker compose pull log "Запуск Gitea..." docker compose up -d log "Ожидание готовности сервисов..." sleep 5 docker compose ps log "Gitea развернута!" log " Web: http://${GITEA_DOMAIN:-localhost}:${GITEA_HTTP_PORT:-3000}" log " SSH: ssh://git@${GITEA_DOMAIN:-localhost}:${GITEA_SSH_PORT:-2222}" log "При первом входе откройте Web UI и завершите мастер настройки." } cmd_start() { check_dependencies ensure_env docker compose up -d docker compose ps } cmd_stop() { check_dependencies docker compose down log "Контейнеры остановлены." } cmd_restart() { check_dependencies ensure_env docker compose restart docker compose ps } cmd_update() { check_dependencies ensure_env log "Обновление образов..." docker compose pull docker compose up -d docker compose ps log "Обновление завершено." } cmd_status() { check_dependencies docker compose ps } cmd_logs() { check_dependencies docker compose logs -f --tail=100 gitea } cmd_backup() { check_dependencies ensure_env BACKUP_DIR="${SCRIPT_DIR}/backups" TIMESTAMP="$(date +%Y%m%d-%H%M%S)" BACKUP_FILE="${BACKUP_DIR}/gitea-backup-${TIMESTAMP}.tar.gz" mkdir -p "$BACKUP_DIR" log "Создание резервной копии: $BACKUP_FILE" docker compose exec -T db pg_dump -U "${POSTGRES_USER:-gitea}" "${POSTGRES_DB:-gitea}" \ > "${BACKUP_DIR}/gitea-db-${TIMESTAMP}.sql" docker run --rm \ -v gitea_gitea_data:/gitea_data:ro \ -v gitea_postgres_data:/postgres_data:ro \ -v "${BACKUP_DIR}:/backup" \ alpine:3.20 \ sh -c "tar czf /backup/gitea-backup-${TIMESTAMP}.tar.gz -C / gitea_data postgres_data && rm -f /backup/gitea-db-${TIMESTAMP}.sql" log "Резервная копия сохранена: $BACKUP_FILE" } cmd_restore() { local backup_file="${1:-}" if [[ -z "$backup_file" || ! -f "$backup_file" ]]; then err "Укажите существующий файл резервной копии." err "Пример: ./deploy.sh restore backups/gitea-backup-20260101.tar.gz" exit 1 fi check_dependencies ensure_env warn "Восстановление перезапишет текущие данные!" read -r -p "Продолжить? [y/N] " confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then log "Отменено." exit 0 fi log "Остановка контейнеров..." docker compose down log "Восстановление из $backup_file..." docker run --rm \ -v gitea_gitea_data:/gitea_data \ -v gitea_postgres_data:/postgres_data \ -v "$(dirname "$(realpath "$backup_file")"):/backup:ro" \ alpine:3.20 \ sh -c "cd / && tar xzf /backup/$(basename "$backup_file")" log "Запуск контейнеров..." docker compose up -d log "Восстановление завершено." } cmd_uninstall() { check_dependencies warn "Контейнеры будут удалены. Тома с данными сохранятся." read -r -p "Продолжить? [y/N] " confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then log "Отменено." exit 0 fi docker compose down log "Контейнеры удалены. Для полного удаления данных: docker volume rm gitea_gitea_data gitea_postgres_data" } COMMAND="${1:-install}" shift $(( $# > 0 ? 1 : 0 )) || true if [[ "$COMMAND" == "install" ]]; then while [[ $# -gt 0 ]]; do case "$1" in -y|--yes) NON_INTERACTIVE=true; shift ;; -h|--help|help) usage; exit 0 ;; *) err "Неизвестная опция: $1"; usage; exit 1 ;; esac done fi case "$COMMAND" in install) cmd_install ;; start) cmd_start ;; stop) cmd_stop ;; restart) cmd_restart ;; update) cmd_update ;; status) cmd_status ;; logs) cmd_logs ;; backup) cmd_backup ;; restore) cmd_restore "${1:-}" ;; uninstall) cmd_uninstall ;; -h|--help|help) usage ;; *) err "Неизвестная команда: $COMMAND" usage exit 1 ;; esac