gitea-install/deploy.sh

203 lines
5.6 KiB
Bash
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.

#!/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