#!/bin/bash #=============================================================================== # КОНФИГУРАЦИЯ И ФУНКЦИИ ДЛЯ РАЗВЁРТЫВАНИЯ GIT-СЕРВЕРА #=============================================================================== # Этот файл подключается ко всем остальным скриптам через source (.) # # Структура файлов: # 00.sh - конфигурация и функции (этот файл) # 01.sh - подготовка системы # 02.sh - создание пользователя git # 03.sh - установка Gitea # 04.sh - systemd unit # 05.sh - конфигурация Gitea # 06.sh - запуск Gitea # 07.sh - установка Nginx (HTTP only) # 08.sh - получение SSL-сертификата # 09.sh - активация HTTPS в Nginx # 10.sh - обновление firewall # 11.sh - создание администратора Gitea # 12.sh - скрипты бэкапа # 99.sh - финальная проверка # all.sh - запуск всех шагов #=============================================================================== # Включение строгого режима (можно отключить в конкретных скриптах) # set -e #------------------------------------------------------------------------------- # КОНФИГУРАЦИЯ #------------------------------------------------------------------------------- # Параметры сервера (ИЗМЕНИТЕ ПОД ВАШИ НУЖДЫ!) GIT_DOMAIN='git.example.com' CERT_EMAIL='admin@example.com' GITEA_ADMIN='gitadmin' GITEA_ADMIN_EMAIL='admin@example.com' # Внешний и внутренний интерфейсы IFACE_EXT='ens192' IFACE_INT='ens160' # Версия Gitea (проверить актуальную на https://github.com/go-gitea/gitea/releases) GITEA_VERSION="1.25.4" # Пути GITEA_BIN="/usr/local/bin/gitea" GITEA_CONFIG="/etc/gitea/app.ini" GITEA_DATA="/var/lib/gitea" GIT_HOME="/home/git" GITEA_REPO_DIR="$GITEA_DATA/repositories" # Лог-файл LOG_FILE="/var/log/git-server-deploy.log" # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color #------------------------------------------------------------------------------- # БАЗОВЫЕ ФУНКЦИИ #------------------------------------------------------------------------------- # Инициализация логирования init_log() { exec > >(tee -a "$LOG_FILE") 2>&1 echo "" echo "===============================================================================" echo " Лог: $(date '+%Y-%m-%d %H:%M:%S')" echo " Скрипт: $(basename "$0")" echo "===============================================================================" } # Заголовок секции print_header() { echo -e "\n${BLUE}================================================================${NC}" echo -e "${BLUE} $1${NC}" echo -e "${BLUE}================================================================${NC}\n" } # Подзаголовок print_subheader() { echo -e "\n${CYAN}--- $1 ---${NC}\n" } # Успешное выполнение print_success() { echo -e "${GREEN}[OK]${NC} $1" } # Предупреждение print_warning() { echo -e "${YELLOW}[WARN]${NC} $1" } # Ошибка print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Информация print_info() { echo -e "${CYAN}[INFO]${NC} $1" } #------------------------------------------------------------------------------- # ФУНКЦИИ ПРОВЕРКИ #------------------------------------------------------------------------------- # Проверка прав root check_root() { if [[ $EUID -ne 0 ]]; then print_error "Скрипт должен запускаться от root (sudo)" exit 1 fi } # Проверка ОС check_os() { if [[ ! -f /etc/os-release ]]; then print_error "Не удалось определить ОС" exit 1 fi if ! grep -q "Ubuntu 24" /etc/os-release; then print_warning "Этот скрипт тестировался на Ubuntu 24.04" else print_success "Ubuntu 24.04 подтверждена" fi } # Проверка DNS check_dns() { print_info "Проверка DNS для $GIT_DOMAIN..." if host $GIT_DOMAIN &>/dev/null; then local GIT_IP=$(host $GIT_DOMAIN | head -1 | awk '{print $NF}') print_success "$GIT_DOMAIN -> $GIT_IP" return 0 else print_warning "Домен $GIT_DOMAIN не резолвится. HTTPS может не работать." return 1 fi } # Проверка сетевых интерфейсов check_network() { print_info "Сетевые интерфейсы:" ip -br addr show echo "" # Проверка внешнего интерфейса if ip link show "$IFACE_EXT" &>/dev/null; then print_success "Внешний интерфейс $IFACE_EXT найден" else print_error "Внешний интерфейс $IFACE_EXT не найден" return 1 fi # Проверка внутреннего интерфейса if ip link show "$IFACE_INT" &>/dev/null; then print_success "Внутренний интерфейс $IFACE_INT найден" else print_warning "Внутренний интерфейс $IFACE_INT не найден" fi return 0 } # Проверка установленного пакета is_installed() { dpkg -l "$1" 2>/dev/null | grep -q "^ii" } # Проверка существования пользователя user_exists() { id "$1" &>/dev/null } # Проверка запущенного сервиса service_running() { systemctl is-active --quiet "$1" } # Проверка существования файла/директории path_exists() { [[ -e "$1" ]] } #------------------------------------------------------------------------------- # ФУНКЦИИ УСТАНОВКИ #------------------------------------------------------------------------------- # Установка пакетов с проверкой install_packages() { local packages=("$@") local to_install=() for pkg in "${packages[@]}"; do if ! is_installed "$pkg"; then to_install+=("$pkg") fi done if [[ ${#to_install[@]} -eq 0 ]]; then print_success "Все пакеты уже установлены" return 0 fi print_info "Установка пакетов: ${to_install[*]}" apt install -y "${to_install[@]}" print_success "Пакеты установлены" } # Создание директории с правами create_dir() { local path="$1" local owner="${2:-root:root}" local mode="${3:-755}" if [[ ! -d "$path" ]]; then mkdir -p "$path" print_success "Создана директория: $path" else print_info "Директория существует: $path" fi chown "$owner" "$path" chmod "$mode" "$path" } #------------------------------------------------------------------------------- # ФУНКЦИИ GITEA #------------------------------------------------------------------------------- # Определение архитектуры для скачивания Gitea get_gitea_arch() { local ARCH=$(uname -m) case $ARCH in x86_64) echo "amd64" ;; aarch64) echo "arm64" ;; armv7l) echo "arm-6" ;; *) return 1 ;; esac } # Генерация случайного пароля generate_password() { openssl rand -base64 12 } # Генерация секретного ключа generate_secret() { openssl rand -hex 32 } # Проверка статуса Gitea check_gitea_status() { if service_running gitea; then print_success "Gitea запущена" return 0 else print_error "Gitea не запущена" return 1 fi } # Ожидание запуска Gitea wait_for_gitea() { local timeout=30 local count=0 print_info "Ожидание запуска Gitea..." while ! curl -s "http://localhost:3000" &>/dev/null; do sleep 1 ((count++)) if [[ $count -ge $timeout ]]; then print_error "Gitea не ответила за $timeout секунд" return 1 fi done print_success "Gitea готова" return 0 } #------------------------------------------------------------------------------- # ФУНКЦИИ NGINX #------------------------------------------------------------------------------- # Проверка конфигурации Nginx check_nginx_config() { if nginx -t 2>&1; then print_success "Конфигурация Nginx валидна" return 0 else print_error "Ошибка в конфигурации Nginx" return 1 fi } # Перезагрузка Nginx reload_nginx() { if check_nginx_config; then systemctl reload nginx print_success "Nginx перезагружен" return 0 else return 1 fi } #------------------------------------------------------------------------------- # ФУНКЦИИ ПОЛЬЗОВАТЕЛЬСКОГО ВВОДА #------------------------------------------------------------------------------- # Запрос подтверждения confirm() { local prompt="${1:-Продолжить?}" local default="${2:-N}" local response read -p "$prompt [$default]: " response response=${response:-$default} [[ "$response" =~ ^[Yy]$ ]] } # Запрос ввода с значением по умолчанию prompt_input() { local prompt="$1" local default="$2" local var_name="$3" local response read -p "$prompt [$default]: " response response=${response:-$default} eval "$var_name='$response'" } #------------------------------------------------------------------------------- # ФУНКЦИИ СОХРАНЕНИЯ ДАННЫХ #------------------------------------------------------------------------------- # Сохранение данных администратора save_admin_credentials() { local username="$1" local password="$2" local filepath="/root/.gitea-admin-credentials" cat > "$filepath" << EOF # Gitea Admin Credentials # Создано: $(date) # ВАЖНО: Удалите этот файл после сохранения пароля! URL: https://$GIT_DOMAIN Username: $username Password: $password Команда для смены пароля: su - git -c "$GITEA_BIN admin user change-password --username $username --config $GITEA_CONFIG" EOF chmod 600 "$filepath" print_info "Данные администратора сохранены в: $filepath" } #------------------------------------------------------------------------------- # ИНИЦИАЛИЗАЦИЯ ПРИ ПОДКЛЮЧЕНИИ #------------------------------------------------------------------------------- # Автоматическая инициализация при source # (раскомментируйте если нужно логировать все скрипты) # init_log