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