Files
gitserver/02/02-k-git-server-deploy.00.sh
2026-02-19 20:05:04 +03:00

381 lines
11 KiB
Bash
Executable File
Raw 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.
#!/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