203 lines
5.6 KiB
Bash
203 lines
5.6 KiB
Bash
#!/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
|