From 05097d5ddac8411f7ef52503699d835c7ed7fe73753aee9c4168f222a89b7e5c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 19 Feb 2026 20:05:04 +0300 Subject: [PATCH] initial commit --- 01/01-k-server-initial-setup.00.sh | 366 ++++++++++++++++++++++++++ 01/01-k-server-initial-setup.01.sh | 63 +++++ 01/01-k-server-initial-setup.02.sh | 168 ++++++++++++ 01/01-k-server-initial-setup.03.sh | 50 ++++ 01/01-k-server-initial-setup.04.sh | 81 ++++++ 01/01-k-server-initial-setup.05.sh | 84 ++++++ 01/01-k-server-initial-setup.06.sh | 141 ++++++++++ 01/01-k-server-initial-setup.07.sh | 143 ++++++++++ 01/01-k-server-initial-setup.08.sh | 87 ++++++ 01/01-k-server-initial-setup.09.sh | 104 ++++++++ 01/01-k-server-initial-setup.99.sh | 161 ++++++++++++ 01/01-k-server-initial-setup.all.sh | 151 +++++++++++ 01/01-k-server-initial-setup.help.sh | 85 ++++++ 02/02-k-git-server-deploy.00.sh | 380 +++++++++++++++++++++++++++ 02/02-k-git-server-deploy.01.sh | 46 ++++ 02/02-k-git-server-deploy.02.sh | 52 ++++ 02/02-k-git-server-deploy.03.sh | 59 +++++ 02/02-k-git-server-deploy.04.sh | 67 +++++ 02/02-k-git-server-deploy.05.sh | 126 +++++++++ 02/02-k-git-server-deploy.06.sh | 62 +++++ 02/02-k-git-server-deploy.07.sh | 107 ++++++++ 02/02-k-git-server-deploy.08.sh | 132 ++++++++++ 02/02-k-git-server-deploy.09.sh | 148 +++++++++++ 02/02-k-git-server-deploy.10.sh | 138 ++++++++++ 02/02-k-git-server-deploy.11.sh | 105 ++++++++ 02/02-k-git-server-deploy.12.sh | 303 +++++++++++++++++++++ 02/02-k-git-server-deploy.13.sh | 278 ++++++++++++++++++++ 02/02-k-git-server-deploy.14.sh | 275 +++++++++++++++++++ 02/02-k-git-server-deploy.99.sh | 184 +++++++++++++ 02/02-k-git-server-deploy.all.sh | 155 +++++++++++ 02/02-k-git-server-deploy.help.sh | 95 +++++++ README.md | 20 +- 32 files changed, 4413 insertions(+), 3 deletions(-) create mode 100755 01/01-k-server-initial-setup.00.sh create mode 100755 01/01-k-server-initial-setup.01.sh create mode 100755 01/01-k-server-initial-setup.02.sh create mode 100755 01/01-k-server-initial-setup.03.sh create mode 100755 01/01-k-server-initial-setup.04.sh create mode 100755 01/01-k-server-initial-setup.05.sh create mode 100755 01/01-k-server-initial-setup.06.sh create mode 100755 01/01-k-server-initial-setup.07.sh create mode 100755 01/01-k-server-initial-setup.08.sh create mode 100755 01/01-k-server-initial-setup.09.sh create mode 100755 01/01-k-server-initial-setup.99.sh create mode 100755 01/01-k-server-initial-setup.all.sh create mode 100755 01/01-k-server-initial-setup.help.sh create mode 100755 02/02-k-git-server-deploy.00.sh create mode 100755 02/02-k-git-server-deploy.01.sh create mode 100755 02/02-k-git-server-deploy.02.sh create mode 100755 02/02-k-git-server-deploy.03.sh create mode 100755 02/02-k-git-server-deploy.04.sh create mode 100755 02/02-k-git-server-deploy.05.sh create mode 100755 02/02-k-git-server-deploy.06.sh create mode 100755 02/02-k-git-server-deploy.07.sh create mode 100755 02/02-k-git-server-deploy.08.sh create mode 100755 02/02-k-git-server-deploy.09.sh create mode 100755 02/02-k-git-server-deploy.10.sh create mode 100755 02/02-k-git-server-deploy.11.sh create mode 100755 02/02-k-git-server-deploy.12.sh create mode 100755 02/02-k-git-server-deploy.13.sh create mode 100755 02/02-k-git-server-deploy.14.sh create mode 100755 02/02-k-git-server-deploy.99.sh create mode 100755 02/02-k-git-server-deploy.all.sh create mode 100755 02/02-k-git-server-deploy.help.sh diff --git a/01/01-k-server-initial-setup.00.sh b/01/01-k-server-initial-setup.00.sh new file mode 100755 index 0000000..2f03543 --- /dev/null +++ b/01/01-k-server-initial-setup.00.sh @@ -0,0 +1,366 @@ +#!/bin/bash +#=============================================================================== +# КОНФИГУРАЦИЯ И ФУНКЦИИ ДЛЯ ПЕРВОНАЧАЛЬНОЙ НАСТРОЙКИ СЕРВЕРА +#=============================================================================== +# Этот файл подключается ко всем остальным скриптам через source (.) +# +# Структура файлов: +# 00.sh - конфигурация и функции (этот файл) +# 01.sh - базовая настройка (hostname, timezone, locale) +# 02.sh - настройка сети (netplan) +# 03.sh - обновление системы +# 04.sh - установка базовых пакетов +# 05.sh - создание администратора +# 06.sh - настройка SSH +# 07.sh - настройка firewall (nftables) +# 08.sh - настройка Fail2ban +# 09.sh - настройка swap +# 99.sh - финальная проверка +# all.sh - запуск всех шагов +#=============================================================================== + +#------------------------------------------------------------------------------- +# КОНФИГУРАЦИЯ +#------------------------------------------------------------------------------- + +# Параметры сервера (ИЗМЕНИТЕ ПОД ВАШИ НУЖДЫ!) +SERVER_HOSTNAME='mygit' +SERVER_DOMAIN='git.example.com' +ADMIN_USER='admin' +SERVER_TIMEZONE='Europe/Minsk' + +# Сетевые интерфейсы +IFACE_EXT='ens192' +IFACE_INT='ens160' + +#------------------------------------------------------------------------------- +# НАСТРОЙКА СЕТИ (NETPLAN) +#------------------------------------------------------------------------------- + +# Внешний интерфейс (IFACE_EXT) +# Используйте DHCP или статический IP + +# DHCP для внешнего интерфейса (true/false) +NET_EXT_DHCP=false + +# Статический IP для внешнего интерфейса (если NET_EXT_DHCP=false) +NET_EXT_ADDRESS='123.4.5.6/24' # IP-адрес с маской +NET_EXT_GATEWAY='123.4.5.250' # Шлюз +NET_EXT_DNS='8.8.8.8,8.8.4.4' # DNS-серверы (через запятую) + +# Внутренний интерфейс (IFACE_INT) +# DHCP для внутреннего интерфейса (true/false) +NET_INT_DHCP=false + +# Статический IP для внутреннего интерфейса (если NET_INT_DHCP=false) +NET_INT_ADDRESS='10.10.10.30/24' # IP-адрес с маской +# NET_INT_GATEWAY='' # Шлюз (обычно не нужен) +# NET_INT_DNS='' # DNS (обычно не нужен) + +# Лог-файл +LOG_FILE="/var/log/server-setup.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 +} + +# Проверка сетевых интерфейсов +check_network_interfaces() { + 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 не найден" + print_info "Доступные интерфейсы:" + ip link show | grep -E "^[0-9]:" | awk '{print " " $2}' | tr -d ':' + 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" ]] +} + +# Проверка swap +has_swap() { + swapon --show | grep -q . +} + +#------------------------------------------------------------------------------- +# ФУНКЦИИ УСТАНОВКИ +#------------------------------------------------------------------------------- + +# Установка пакетов с проверкой +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" +} + +#------------------------------------------------------------------------------- +# ФУНКЦИИ ПОЛЬЗОВАТЕЛЬСКОГО ВВОДА +#------------------------------------------------------------------------------- + +# Запрос подтверждения +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'" +} + +#------------------------------------------------------------------------------- +# ФУНКЦИИ КОНФИГУРАЦИИ +#------------------------------------------------------------------------------- + +# Установка hostname +set_hostname() { + local hostname="$1" + local domain="$2" + + hostnamectl set-hostname "$hostname" + + # Добавить в /etc/hosts если нет + if ! grep -q "$hostname" /etc/hosts; then + echo "127.0.1.1 $hostname.$domain $hostname" >> /etc/hosts + fi + + print_success "Hostname установлен: $hostname" +} + +# Установка timezone +set_timezone() { + local timezone="$1" + timedatectl set-timezone "$timezone" + print_success "Timezone установлен: $timezone" +} + +# Установка локали +set_locale() { + local locale="${1:-en_US.UTF-8}" + localectl set-locale LANG="$locale" + locale-gen "$locale" 2>/dev/null || true + print_success "Локаль установлена: $locale" +} + +#------------------------------------------------------------------------------- +# ФУНКЦИИ SSH +#------------------------------------------------------------------------------- + +# Создание SSH-директории для пользователя +setup_ssh_dir() { + local user="$1" + local home_dir + + home_dir=$(getent passwd "$user" | cut -d: -f6) + + mkdir -p "$home_dir/.ssh" + chmod 700 "$home_dir/.ssh" + touch "$home_dir/.ssh/authorized_keys" + chmod 600 "$home_dir/.ssh/authorized_keys" + chown -R "$user:$user" "$home_dir/.ssh" + + print_success "SSH-директория создана: $home_dir/.ssh" +} + +# Генерация пароля +generate_password() { + openssl rand -base64 12 +} + +#------------------------------------------------------------------------------- +# ФУНКЦИИ FIREWALL +#------------------------------------------------------------------------------- + +# Проверка nftables +check_nftables() { + if command -v nft &>/dev/null; then + print_success "nftables установлен" + return 0 + else + print_warning "nftables не установлен" + return 1 + fi +} + +# Показать текущие правила nftables +show_nftables_rules() { + if nft list ruleset &>/dev/null; then + nft list ruleset + else + print_info "Нет активных правил nftables" + fi +} + +#------------------------------------------------------------------------------- +# ИНИЦИАЛИЗАЦИЯ ПРИ ПОДКЛЮЧЕНИИ +#------------------------------------------------------------------------------- + +# Показать текущую конфигурацию +show_config() { + echo "" + echo -e "${CYAN}Текущая конфигурация:${NC}" + echo " Hostname: $SERVER_HOSTNAME" + echo " Domain: $SERVER_DOMAIN" + echo " Admin user: $ADMIN_USER" + echo " Timezone: $SERVER_TIMEZONE" + echo "" + echo -e "${CYAN}Сетевые интерфейсы:${NC}" + echo " IFACE_EXT: $IFACE_EXT ($( [[ "$NET_EXT_DHCP" == "true" ]] && echo "DHCP" || echo "$NET_EXT_ADDRESS"))" + echo " IFACE_INT: $IFACE_INT ($( [[ "$NET_INT_DHCP" == "true" ]] && echo "DHCP" || echo "$NET_INT_ADDRESS"))" + echo "" +} diff --git a/01/01-k-server-initial-setup.01.sh b/01/01-k-server-initial-setup.01.sh new file mode 100755 index 0000000..c3d1ebe --- /dev/null +++ b/01/01-k-server-initial-setup.01.sh @@ -0,0 +1,63 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 1: БАЗОВАЯ НАСТРОЙКА СИСТЕМЫ +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.01.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 1: БАЗОВАЯ НАСТРОЙКА СИСТЕМЫ" + +#------------------------------------------------------------------------------- +# 1.1 Проверка ОС +#------------------------------------------------------------------------------- +print_subheader "Проверка операционной системы" +check_os + +#------------------------------------------------------------------------------- +# 1.2 Установка hostname +#------------------------------------------------------------------------------- +print_subheader "Установка hostname" + +CURRENT_HOSTNAME=$(hostname) +print_info "Текущий hostname: $CURRENT_HOSTNAME" + +if [[ "$CURRENT_HOSTNAME" == "$SERVER_HOSTNAME" ]]; then + print_success "Hostname уже установлен: $SERVER_HOSTNAME" +else + set_hostname "$SERVER_HOSTNAME" "$SERVER_DOMAIN" +fi + +#------------------------------------------------------------------------------- +# 1.3 Установка timezone +#------------------------------------------------------------------------------- +print_subheader "Установка timezone" + +CURRENT_TZ=$(timedatectl show --property=Timezone --value 2>/dev/null || echo "unknown") +print_info "Текущий timezone: $CURRENT_TZ" + +if [[ "$CURRENT_TZ" == "$SERVER_TIMEZONE" ]]; then + print_success "Timezone уже установлен: $SERVER_TIMEZONE" +else + set_timezone "$SERVER_TIMEZONE" +fi + +#------------------------------------------------------------------------------- +# 1.4 Установка локали +#------------------------------------------------------------------------------- +print_subheader "Настройка локали" + +set_locale "en_US.UTF-8" + +# Также добавляем русскую локаль (опционально) +if ! locale -a | grep -q "ru_RU.utf8"; then + print_info "Добавление русской локали..." + locale-gen ru_RU.UTF-8 2>/dev/null || true +fi + +print_success "Шаг 1 завершён: Базовая настройка выполнена" diff --git a/01/01-k-server-initial-setup.02.sh b/01/01-k-server-initial-setup.02.sh new file mode 100755 index 0000000..4cf53ad --- /dev/null +++ b/01/01-k-server-initial-setup.02.sh @@ -0,0 +1,168 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 2: НАСТРОЙКА СЕТИ +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.02.sh +# +# Параметры сети настраиваются в файле 00.sh: +# NET_EXT_DHCP, NET_EXT_ADDRESS, NET_EXT_GATEWAY, NET_EXT_DNS +# NET_INT_DHCP, NET_INT_ADDRESS +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 2: НАСТРОЙКА СЕТИ" + +#------------------------------------------------------------------------------- +# 2.1 Проверка интерфейсов +#------------------------------------------------------------------------------- +print_subheader "Проверка сетевых интерфейсов" + +check_network_interfaces + +#------------------------------------------------------------------------------- +# 2.2 Установка netplan +#------------------------------------------------------------------------------- +print_subheader "Проверка netplan" + +if is_installed netplan.io; then + print_success "netplan.io установлен" +else + print_info "Установка netplan.io..." + apt install -y netplan.io +fi + +#------------------------------------------------------------------------------- +# 2.3 Показать текущую конфигурацию сети +#------------------------------------------------------------------------------- +print_subheader "Параметры сети из конфигурации" + +echo " Внешний интерфейс ($IFACE_EXT):" +if [[ "$NET_EXT_DHCP" == "true" ]]; then + echo " Режим: DHCP" +else + echo " Режим: Статический IP" + echo " Адрес: $NET_EXT_ADDRESS" + echo " Шлюз: $NET_EXT_GATEWAY" + echo " DNS: $NET_EXT_DNS" +fi + +echo "" +echo " Внутренний интерфейс ($IFACE_INT):" +if [[ "$NET_INT_DHCP" == "true" ]]; then + echo " Режим: DHCP" +else + echo " Режим: Статический IP" + echo " Адрес: $NET_INT_ADDRESS" +fi +echo "" + +#------------------------------------------------------------------------------- +# 2.4 Создание конфигурации netplan +#------------------------------------------------------------------------------- +print_subheader "Создание конфигурации netplan" + +NETPLAN_FILE="/etc/netplan/01-netcfg.yaml" + +# Проверка существующей конфигурации +if [[ -f "$NETPLAN_FILE" ]]; then + print_warning "Конфигурация netplan уже существует" + read -p "Перезаписать? [y/N]: " REWRITE + if [[ ! "$REWRITE" =~ ^[Yy]$ ]]; then + print_info "Конфигурация оставлена без изменений" + print_success "Шаг 2 завершён (пропуск)" + exit 0 + fi + # Backup + cp "$NETPLAN_FILE" "${NETPLAN_FILE}.backup.$(date +%Y%m%d_%H%M%S)" +fi + +# Генерация конфигурации в зависимости от настроек +{ + echo "# Netplan configuration for Git Server" + echo "# Автоматически сгенерировано скриптом 01-k-server-initial-setup.02.sh" + echo "" + echo "network:" + echo " version: 2" + echo " renderer: networkd" + echo " ethernets:" + echo " ${IFACE_EXT}:" + + if [[ "$NET_EXT_DHCP" == "true" ]]; then + # DHCP для внешнего интерфейса + echo " dhcp4: true" + else + # Статический IP для внешнего интерфейса + echo " dhcp4: false" + echo " addresses:" + echo " - ${NET_EXT_ADDRESS}" + echo " routes:" + echo " - to: default" + echo " via: ${NET_EXT_GATEWAY}" + # DNS + IFS=',' read -ra DNS_ARRAY <<< "$NET_EXT_DNS" + echo " nameservers:" + echo " addresses:" + for dns in "${DNS_ARRAY[@]}"; do + echo " - ${dns}" + done + fi + + echo " ${IFACE_INT}:" + + if [[ "$NET_INT_DHCP" == "true" ]]; then + # DHCP для внутреннего интерфейса + echo " dhcp4: true" + else + # Статический IP для внутреннего интерфейса + echo " dhcp4: false" + echo " addresses:" + echo " - ${NET_INT_ADDRESS}" + fi + +} > "$NETPLAN_FILE" + +print_success "Конфигурация netplan создана: $NETPLAN_FILE" + +#------------------------------------------------------------------------------- +# 2.5 Показать созданную конфигурацию +#------------------------------------------------------------------------------- +echo "" +echo -e "${CYAN}Созданная конфигурация:${NC}" +echo "" +cat "$NETPLAN_FILE" + +#------------------------------------------------------------------------------- +# 2.6 Применение +#------------------------------------------------------------------------------- +echo "" +print_warning "Внимание! Применение новой сетевой конфигурации может нарушить подключение." +echo "" + +read -p "Применить сетевую конфигурацию сейчас? [y/N]: " APPLY_NET + +if [[ "$APPLY_NET" =~ ^[Yy]$ ]]; then + print_info "Проверка конфигурации..." + + # Попробовать netplan try с таймаутом (вернёт старую конфигурацию при проблемах) + if netplan try --timeout 15 2>&1; then + print_success "Сетевая конфигурация применена" + else + print_error "Ошибка в конфигурации netplan или прервано пользователем" + print_info "Конфигурация не применена. Проверьте и исправьте $NETPLAN_FILE" + exit 1 + fi +else + print_warning "Конфигурация не применена" + echo "" + echo "Примените вручную после проверки:" + echo " sudo netplan try --timeout 30" + echo " # или" + echo " sudo netplan apply" +fi + +print_success "Шаг 2 завершён: Сеть настроена" diff --git a/01/01-k-server-initial-setup.03.sh b/01/01-k-server-initial-setup.03.sh new file mode 100755 index 0000000..8af6647 --- /dev/null +++ b/01/01-k-server-initial-setup.03.sh @@ -0,0 +1,50 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 3: ОБНОВЛЕНИЕ СИСТЕМЫ +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.03.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 3: ОБНОВЛЕНИЕ СИСТЕМЫ" + +#------------------------------------------------------------------------------- +# 3.1 Обновление списков пакетов +#------------------------------------------------------------------------------- +print_subheader "Обновление списков пакетов" + +apt update +print_success "Списки пакетов обновлены" + +#------------------------------------------------------------------------------- +# 3.2 Обновление установленных пакетов +#------------------------------------------------------------------------------- +print_subheader "Обновление установленных пакетов" + +apt upgrade -y +print_success "Пакеты обновлены" + +#------------------------------------------------------------------------------- +# 3.3 Обновление системы (dist-upgrade) +#------------------------------------------------------------------------------- +print_subheader "Обновление системы (dist-upgrade)" + +apt dist-upgrade -y +print_success "Система обновлена" + +#------------------------------------------------------------------------------- +# 3.4 Очистка +#------------------------------------------------------------------------------- +print_subheader "Очистка неиспользуемых пакетов" + +apt autoremove -y +apt autoclean + +print_success "Очистка выполнена" + +print_success "Шаг 3 завершён: Система обновлена" diff --git a/01/01-k-server-initial-setup.04.sh b/01/01-k-server-initial-setup.04.sh new file mode 100755 index 0000000..ec544ed --- /dev/null +++ b/01/01-k-server-initial-setup.04.sh @@ -0,0 +1,81 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 4: УСТАНОВКА БАЗОВЫХ ПАКЕТОВ +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.04.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 4: УСТАНОВКА БАЗОВЫХ ПАКЕТОВ" + +#------------------------------------------------------------------------------- +# 4.1 Системные утилиты +#------------------------------------------------------------------------------- +print_subheader "Системные утилиты" + +install_packages \ + vim \ + nano \ + curl \ + wget \ + git \ + htop \ + iotop \ + ncdu \ + tree \ + rsync \ + unzip \ + zip \ + tmux \ + screen \ + \ + open-vm-tools \ + less + +#------------------------------------------------------------------------------- +# 4.2 Сеть и диагностика +#------------------------------------------------------------------------------- +print_subheader "Сеть и диагностика" + +install_packages \ + net-tools \ + dnsutils \ + iputils-ping \ + traceroute \ + mtr \ + tcpdump \ + ethtool + +#------------------------------------------------------------------------------- +# 4.3 Безопасность +#------------------------------------------------------------------------------- +print_subheader "Безопасность" + +install_packages \ + nftables \ + fail2ban \ + openssl + +#------------------------------------------------------------------------------- +# 4.4 Дополнительно +#------------------------------------------------------------------------------- +print_subheader "Дополнительные пакеты" + +install_packages \ + software-properties-common \ + apt-transport-https \ + ca-certificates \ + gnupg \ + lsb-release \ + \ + vim-tiny \ + logrotate \ + bash-completion \ + command-not-found + +print_success "Шаг 4 завершён: Базовые пакеты установлены" diff --git a/01/01-k-server-initial-setup.05.sh b/01/01-k-server-initial-setup.05.sh new file mode 100755 index 0000000..d971af1 --- /dev/null +++ b/01/01-k-server-initial-setup.05.sh @@ -0,0 +1,84 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 5: СОЗДАНИЕ АДМИНИСТРАТОРА +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.05.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 5: СОЗДАНИЕ АДМИНИСТРАТОРА" + +#------------------------------------------------------------------------------- +# 5.1 Проверка существования пользователя +#------------------------------------------------------------------------------- +print_subheader "Проверка пользователя" + +if user_exists "$ADMIN_USER"; then + print_warning "Пользователь $ADMIN_USER уже существует" + + # Проверка членства в sudo + if groups "$ADMIN_USER" | grep -q sudo; then + print_success "Пользователь уже в группе sudo" + else + print_info "Добавление в группу sudo..." + usermod -aG sudo "$ADMIN_USER" + print_success "Пользователь добавлен в sudo" + fi +else + # Создание пользователя + print_info "Создание пользователя $ADMIN_USER..." + adduser --gecos "" --disabled-password "$ADMIN_USER" + + # Добавление в группы + usermod -aG sudo,adm,systemd-journal "$ADMIN_USER" + + print_success "Пользователь $ADMIN_USER создан" +fi + +#------------------------------------------------------------------------------- +# 5.2 Установка пароля +#------------------------------------------------------------------------------- +print_subheader "Пароль пользователя" + +echo "" +print_warning "Установка пароля для $ADMIN_USER (для console доступа)" +echo "" + +read -p "Установить пароль сейчас? [Y/n]: " SET_PASS +SET_PASS=${SET_PASS:-Y} + +if [[ "$SET_PASS" =~ ^[Yy]$ ]]; then + passwd "$ADMIN_USER" + print_success "Пароль установлен" +else + print_info "Пароль можно установить позже: sudo passwd $ADMIN_USER" +fi + +#------------------------------------------------------------------------------- +# 5.3 Настройка SSH-директории +#------------------------------------------------------------------------------- +print_subheader "Настройка SSH" + +setup_ssh_dir "$ADMIN_USER" + +#------------------------------------------------------------------------------- +# 5.4 Информация +#------------------------------------------------------------------------------- +echo "" +echo -e "${YELLOW}============================================================${NC}" +echo -e "${YELLOW} ВАЖНО: Добавьте SSH-ключ для входа!${NC}" +echo -e "${YELLOW}============================================================${NC}" +echo "" +echo " Добавьте ваш публичный SSH-ключ:" +echo " sudo nano /home/$ADMIN_USER/.ssh/authorized_keys" +echo "" +echo " Или командой:" +echo " echo 'ssh-ed25519 AAAA...' | sudo tee /home/$ADMIN_USER/.ssh/authorized_keys" +echo "" + +print_success "Шаг 5 завершён: Администратор создан" diff --git a/01/01-k-server-initial-setup.06.sh b/01/01-k-server-initial-setup.06.sh new file mode 100755 index 0000000..1f67f44 --- /dev/null +++ b/01/01-k-server-initial-setup.06.sh @@ -0,0 +1,141 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 6: НАСТРОЙКА SSH +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.06.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 6: НАСТРОЙКА SSH" + +SSH_CONFIG="/etc/ssh/sshd_config" + +#------------------------------------------------------------------------------- +# 6.1 Проверка SSH-сервиса +#------------------------------------------------------------------------------- +print_subheader "Проверка SSH" + +if service_running sshd || service_running ssh; then + print_success "SSH-сервер запущен" +else + print_warning "SSH-сервер не запущен" + print_info "Установка OpenSSH..." + apt install -y openssh-server +fi + +#------------------------------------------------------------------------------- +# 6.2 Backup конфигурации +#------------------------------------------------------------------------------- +print_subheader "Резервная копия" + +if [[ -f "$SSH_CONFIG" ]]; then + cp "$SSH_CONFIG" "${SSH_CONFIG}.backup.$(date +%Y%m%d_%H%M%S)" + print_success "Backup создан" +fi + +#------------------------------------------------------------------------------- +# 6.3 Создание новой конфигурации +#------------------------------------------------------------------------------- +print_subheader "Создание конфигурации" + +cat > "$SSH_CONFIG" << 'EOF' +# SSH Server Configuration - Ubuntu 24.04 +# АВТОРИЗАЦИЯ ТОЛЬКО ПО КЛЮЧАМ + +# Сетевые настройки +Port 22 +AddressFamily any +ListenAddress 0.0.0.0 +ListenAddress :: + +# Ключи хоста +HostKey /etc/ssh/ssh_host_rsa_key +HostKey /etc/ssh/ssh_host_ecdsa_key +HostKey /etc/ssh/ssh_host_ed25519_key + +# Аутентификация - ТОЛЬКО КЛЮЧИ +PermitRootLogin prohibit-password +PubkeyAuthentication yes +AuthorizedKeysFile .ssh/authorized_keys + +# ОТКЛЮЧИТЬ парольную аутентификацию +PasswordAuthentication no +PermitEmptyPasswords no +KbdInteractiveAuthentication no +ChallengeResponseAuthentication no +UsePAM no + +# Безопасность сессий +X11Forwarding no +AllowAgentForwarding yes +AllowTcpForwarding no +PermitTunnel no +PermitUserEnvironment no + +# Логирование +SyslogFacility AUTH +LogLevel VERBOSE + +# Таймауты +LoginGraceTime 30 +ClientAliveInterval 300 +ClientAliveCountMax 2 +MaxAuthTries 3 +MaxSessions 5 + +# Криптография (современные алгоритмы) +KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 +Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com +MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com + +# Разрешённые пользователи (раскомментируйте и настройте) +AllowUsers admin git komisar + +# SFTP подсистема +Subsystem sftp /usr/lib/openssh/sftp-server +EOF + +print_success "SSH конфигурация создана" + +#------------------------------------------------------------------------------- +# 6.4 Проверка конфигурации +#------------------------------------------------------------------------------- +print_subheader "Проверка конфигурации" + +if sshd -t; then + print_success "Конфигурация SSH валидна" +else + print_error "Ошибка в конфигурации SSH!" + exit 1 +fi + +#------------------------------------------------------------------------------- +# 6.5 Перезапуск SSH +#------------------------------------------------------------------------------- +print_subheader "Перезапуск SSH" + +systemctl restart sshd 2>/dev/null || systemctl restart ssh +systemctl enable sshd 2>/dev/null || systemctl enable ssh + +print_success "SSH перезапущен" + +#------------------------------------------------------------------------------- +# 6.6 Предупреждение +#------------------------------------------------------------------------------- +echo "" +echo -e "${YELLOW}============================================================${NC}" +echo -e "${YELLOW} ВАЖНО: Парольная авторизация ОТКЛЮЧЕНА!${NC}" +echo -e "${YELLOW}============================================================${NC}" +echo "" +echo " Убедитесь, что SSH-ключ добавлен для $ADMIN_USER:" +echo " cat /home/$ADMIN_USER/.ssh/authorized_keys" +echo "" +echo " Проверьте вход с другой консоли ПЕРЕД закрытием текущей сессии!" +echo "" + +print_success "Шаг 6 завершён: SSH настроен (только ключи)" diff --git a/01/01-k-server-initial-setup.07.sh b/01/01-k-server-initial-setup.07.sh new file mode 100755 index 0000000..08c377b --- /dev/null +++ b/01/01-k-server-initial-setup.07.sh @@ -0,0 +1,143 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 7: НАСТРОЙКА FIREWALL (nftables) +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.07.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 7: НАСТРОЙКА FIREWALL (nftables)" + +NFT_CONF="/etc/nftables.conf" + +#------------------------------------------------------------------------------- +# 7.1 Проверка nftables +#------------------------------------------------------------------------------- +print_subheader "Проверка nftables" + +if ! is_installed nftables; then + print_info "Установка nftables..." + apt install -y nftables +fi + +print_success "nftables установлен" + +#------------------------------------------------------------------------------- +# 7.2 Backup существующей конфигурации +#------------------------------------------------------------------------------- +print_subheader "Резервная копия" + +if [[ -f "$NFT_CONF" ]]; then + cp "$NFT_CONF" "${NFT_CONF}.backup.$(date +%Y%m%d_%H%M%S)" + print_success "Backup создан" +fi + +#------------------------------------------------------------------------------- +# 7.3 Создание конфигурации +#------------------------------------------------------------------------------- +print_subheader "Создание конфигурации" + +cat > "$NFT_CONF" << EOF +#!/usr/sbin/nft -f + +# Firewall для Git Server +# $IFACE_EXT - внешний интерфейс (ограниченный доступ) +# $IFACE_INT - внутренний интерфейс (доверенная зона) + +flush ruleset + +table inet filter { + chain input { + type filter hook input priority 0; policy drop; + + # Разрешить loopback + iif lo accept + + # Установленные соединения + ct state established,related accept + + # Блокировать invalid пакеты + ct state invalid drop + + # ICMP (ограниченно) + ip protocol icmp icmp type echo-request limit rate 1/second accept + ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 1/second accept + ip protocol icmp icmp type { destination-unreachable, time-exceeded } accept + ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, time-exceeded } accept + + # === ВНЕШНИЙ ИНТЕРФЕЙС ($IFACE_EXT) === + # SSH для администрирования + iifname $IFACE_EXT tcp dport 22 accept + # HTTP (для Let's Encrypt) + iifname $IFACE_EXT tcp dport 80 accept + # HTTPS + iifname $IFACE_EXT tcp dport 443 accept + + # === ВНУТРЕННИЙ ИНТЕРФЕЙС ($IFACE_INT) - доверенная зона === + iifname $IFACE_INT tcp dport 22 accept + iifname $IFACE_INT tcp dport 80 accept + iifname $IFACE_INT tcp dport 443 accept + iifname $IFACE_INT tcp dport 3000 accept + + # Логирование заблокированных (опционально) + # log prefix "nft drop: " counter + + # Счётчик отброшенных + counter + } + + chain forward { + type filter hook forward priority 0; policy drop; + } + + chain output { + type filter hook output priority 0; policy accept; + } +} +EOF + +print_success "Конфигурация создана" + +#------------------------------------------------------------------------------- +# 7.4 Проверка синтаксиса +#------------------------------------------------------------------------------- +print_subheader "Проверка синтаксиса" + +if nft -c -f "$NFT_CONF" 2>&1; then + print_success "Синтаксис валиден" +else + print_error "Ошибка синтаксиса nftables" + exit 1 +fi + +#------------------------------------------------------------------------------- +# 7.5 Применение +#------------------------------------------------------------------------------- +print_subheader "Применение правил" + +echo "" +echo -e "${YELLOW}Внимание! После применения firewall могут быть заблокированы подключения.${NC}" +echo "" + +read -p "Применить правила firewall? [y/N]: " APPLY_FW + +if [[ "$APPLY_FW" =~ ^[Yy]$ ]]; then + nft -f "$NFT_CONF" + systemctl enable nftables + print_success "Firewall применён" + + # Показать правила + echo "" + print_info "Активные правила:" + nft list ruleset | head -40 +else + print_warning "Правила не применены" + print_info "Примените вручную: sudo nft -f $NFT_CONF" +fi + +print_success "Шаг 7 завершён: Firewall настроен" diff --git a/01/01-k-server-initial-setup.08.sh b/01/01-k-server-initial-setup.08.sh new file mode 100755 index 0000000..bd89e1a --- /dev/null +++ b/01/01-k-server-initial-setup.08.sh @@ -0,0 +1,87 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 8: НАСТРОЙКА FAIL2BAN +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.08.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 8: НАСТРОЙКА FAIL2BAN" + +#------------------------------------------------------------------------------- +# 8.1 Проверка установки +#------------------------------------------------------------------------------- +print_subheader "Проверка fail2ban" + +if ! is_installed fail2ban; then + print_info "Установка fail2ban..." + apt install -y fail2ban +fi + +print_success "fail2ban установлен" + +#------------------------------------------------------------------------------- +# 8.2 Создание конфигурации +#------------------------------------------------------------------------------- +print_subheader "Создание конфигурации" + +cat > /etc/fail2ban/jail.local << EOF +# Fail2ban configuration for Git Server + +[DEFAULT] +# Время бана +bantime = 1h +# Время наблюдения +findtime = 10m +# Количество попыток +maxretry = 3 +# Backend +backend = systemd +# Email для уведомлений (опционально) +# destemail = admin@example.com +# sendername = Fail2Ban + +[sshd] +enabled = true +port = ssh +filter = sshd +logpath = /var/log/auth.log +maxretry = 3 +bantime = 1h +findtime = 10m +EOF + +print_success "Конфигурация создана" + +#------------------------------------------------------------------------------- +# 8.3 Запуск сервиса +#------------------------------------------------------------------------------- +print_subheader "Запуск fail2ban" + +systemctl enable fail2ban +systemctl restart fail2ban + +if service_running fail2ban; then + print_success "fail2ban запущен" +else + print_error "fail2ban не запустился" + systemctl status fail2ban --no-pager + exit 1 +fi + +#------------------------------------------------------------------------------- +# 8.4 Проверка статуса +#------------------------------------------------------------------------------- +print_subheader "Статус fail2ban" + +echo "" +fail2ban-client status +echo "" +fail2ban-client status sshd 2>/dev/null || true + +print_success "Шаг 8 завершён: Fail2ban настроен" diff --git a/01/01-k-server-initial-setup.09.sh b/01/01-k-server-initial-setup.09.sh new file mode 100755 index 0000000..47fa063 --- /dev/null +++ b/01/01-k-server-initial-setup.09.sh @@ -0,0 +1,104 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 9: НАСТРОЙКА SWAP +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.09.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 9: НАСТРОЙКА SWAP" + +#------------------------------------------------------------------------------- +# 9.1 Проверка существующего swap +#------------------------------------------------------------------------------- +print_subheader "Проверка swap" + +if has_swap; then + print_success "Swap уже настроен:" + swapon --show + free -h + print_success "Шаг 9 завершён (пропуск)" + exit 0 +else + print_info "Swap не найден" +fi + +#------------------------------------------------------------------------------- +# 9.2 Запрос размера +#------------------------------------------------------------------------------- +print_subheader "Создание swap" + +echo "" +echo "Рекомендуемый размер swap: 1-2GB" +echo "" + +read -p "Размер swap в GB [2]: " SWAP_SIZE +SWAP_SIZE=${SWAP_SIZE:-2} + +SWAP_FILE="/swapfile" + +#------------------------------------------------------------------------------- +# 9.3 Создание swap-файла +#------------------------------------------------------------------------------- +print_info "Создание swap-файла ${SWAP_SIZE}GB..." + +# Проверка свободного места +FREE_SPACE=$(df -BG / | tail -1 | awk '{print $4}' | tr -d 'G') +if [[ "$FREE_SPACE" -lt "$SWAP_SIZE" ]]; then + print_error "Недостаточно свободного места: ${FREE_SPACE}GB < ${SWAP_SIZE}GB" + exit 1 +fi + +# Создание +fallocate -l "${SWAP_SIZE}G" "$SWAP_FILE" +chmod 600 "$SWAP_FILE" +mkswap "$SWAP_FILE" +swapon "$SWAP_FILE" + +print_success "Swap создан" + +#------------------------------------------------------------------------------- +# 9.4 Добавление в fstab +#------------------------------------------------------------------------------- +print_subheader "Настройка fstab" + +if ! grep -q "$SWAP_FILE" /etc/fstab; then + echo "$SWAP_FILE none swap sw 0 0" >> /etc/fstab + print_success "Swap добавлен в fstab" +else + print_info "Swap уже в fstab" +fi + +#------------------------------------------------------------------------------- +# 9.5 Оптимизация swappiness +#------------------------------------------------------------------------------- +print_subheader "Оптимизация swappiness" + +# Установить swappiness = 10 (меньше использовать swap) +SWAPPINESS=10 +sysctl vm.swappiness=$SWAPPINESS + +if ! grep -q "vm.swappiness" /etc/sysctl.conf; then + echo "vm.swappiness = $SWAPPINESS" >> /etc/sysctl.conf + print_success "swappiness настроен" +else + sed -i "s/vm.swappiness.*/vm.swappiness = $SWAPPINESS/" /etc/sysctl.conf + print_success "swappiness обновлён" +fi + +#------------------------------------------------------------------------------- +# 9.6 Проверка +#------------------------------------------------------------------------------- +print_subheader "Проверка" + +echo "" +free -h +echo "" +swapon --show + +print_success "Шаг 9 завершён: Swap настроен" diff --git a/01/01-k-server-initial-setup.99.sh b/01/01-k-server-initial-setup.99.sh new file mode 100755 index 0000000..3cde70f --- /dev/null +++ b/01/01-k-server-initial-setup.99.sh @@ -0,0 +1,161 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 99: ФИНАЛЬНАЯ ПРОВЕРКА +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.99.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +print_header "ШАГ 99: ФИНАЛЬНАЯ ПРОВЕРКА" + +echo "" +echo -e "${BLUE}================================================================${NC}" +echo -e "${BLUE} СТАТУС СИСТЕМЫ${NC}" +echo -e "${BLUE}================================================================${NC}" + +#------------------------------------------------------------------------------- +# Системная информация +#------------------------------------------------------------------------------- +echo "" +echo "Система:" +echo " Hostname: $(hostname)" +echo " OS: $(lsb_release -d 2>/dev/null | cut -f2 || cat /etc/os-release | grep PRETTY_NAME | cut -d\" -f2)" +echo " Kernel: $(uname -r)" +echo " Uptime: $(uptime -p)" +echo " Timezone: $(timedatectl show --property=Timezone --value 2>/dev/null || cat /etc/timezone)" +echo "" + +#------------------------------------------------------------------------------- +# Проверка сервисов +#------------------------------------------------------------------------------- +echo "Сервисы:" + +# SSH +if service_running sshd || service_running ssh; then + echo -e " SSH: ${GREEN}OK${NC}" +else + echo -e " SSH: ${RED}FAILED${NC}" +fi + +# nftables +if nft list table inet filter &>/dev/null; then + echo -e " Firewall: ${GREEN}OK${NC}" +else + echo -e " Firewall: ${YELLOW}НЕ НАСТРОЕН${NC}" +fi + +# Fail2ban +if service_running fail2ban; then + echo -e " Fail2ban: ${GREEN}OK${NC}" +else + echo -e " Fail2ban: ${YELLOW}НЕ ЗАПУЩЕН${NC}" +fi + +echo "" + +#------------------------------------------------------------------------------- +# Проверка пользователя +#------------------------------------------------------------------------------- +echo "Пользователь:" + +if user_exists "$ADMIN_USER"; then + echo -e " $ADMIN_USER: ${GREEN}OK${NC}" + if groups "$ADMIN_USER" | grep -q sudo; then + echo " Группы: $(groups $ADMIN_USER | cut -d: -f2)" + fi + if [[ -f "/home/$ADMIN_USER/.ssh/authorized_keys" ]]; then + KEY_COUNT=$(wc -l < "/home/$ADMIN_USER/.ssh/authorized_keys") + echo " SSH ключи: $KEY_COUNT" + else + echo -e " SSH ключи: ${YELLOW}НЕ ДОБАВЛЕНЫ${NC}" + fi +else + echo -e " $ADMIN_USER: ${RED}НЕ СОЗДАН${NC}" +fi + +echo "" + +#------------------------------------------------------------------------------- +# Сеть +#------------------------------------------------------------------------------- +echo "Сеть:" +echo " Интерфейсы:" + +for iface in $IFACE_EXT $IFACE_INT; do + if ip link show "$iface" &>/dev/null; then + STATE=$(ip link show "$iface" | grep -oP 'state \K\w+') + IP=$(ip -4 addr show "$iface" | grep -oP 'inet \K[\d.]+' | head -1) + if [[ "$iface" == "$IFACE_EXT" ]]; then + echo " $iface (внешний): $STATE, $IP" + else + echo " $iface (внутренний): $STATE, $IP" + fi + fi +done + +echo "" + +#------------------------------------------------------------------------------- +# Ресурсы +#------------------------------------------------------------------------------- +echo "Ресурсы:" + +# Память +MEM_TOTAL=$(free -h | grep Mem | awk '{print $2}') +MEM_USED=$(free -h | grep Mem | awk '{print $3}') +echo " Память: $MEM_USED / $MEM_TOTAL" + +# Swap +if has_swap; then + SWAP_TOTAL=$(free -h | grep Swap | awk '{print $2}') + SWAP_USED=$(free -h | grep Swap | awk '{print $3}') + echo " Swap: $SWAP_USED / $SWAP_TOTAL" +else + echo " Swap: не настроен" +fi + +# Диск +DISK_USAGE=$(df -h / | tail -1 | awk '{print $3 " / " $2 " (" $5 ")"}') +echo " Диск /: $DISK_USAGE" + +echo "" + +#------------------------------------------------------------------------------- +# Firewall правила +#------------------------------------------------------------------------------- +echo "Firewall (открытые порты):" +nft list table inet filter 2>/dev/null | grep "dport" | grep -oE "dport [0-9]+" | sort -u | awk '{print " " $2}' | tr '\n' ' ' +echo "" +echo "" + +#------------------------------------------------------------------------------- +# Итог +#------------------------------------------------------------------------------- +echo -e "${GREEN}================================================================${NC}" +echo -e "${GREEN} ПЕРВОНАЧАЛЬНАЯ НАСТРОЙКА ЗАВЕРШЕНА${NC}" +echo -e "${GREEN}================================================================${NC}" +echo "" + +if [[ ! -f "/home/$ADMIN_USER/.ssh/authorized_keys" ]] || [[ ! -s "/home/$ADMIN_USER/.ssh/authorized_keys" ]]; then + echo -e "${YELLOW}============================================================${NC}" + echo -e "${YELLOW} ВАЖНО: Добавьте SSH-ключ для $ADMIN_USER!${NC}" + echo -e "${YELLOW}============================================================${NC}" + echo "" + echo " sudo nano /home/$ADMIN_USER/.ssh/authorized_keys" + echo "" +fi + +echo "Следующие шаги:" +echo " 1. Добавьте SSH-ключ для $ADMIN_USER" +echo " 2. Проверьте вход по SSH с другой консоли" +echo " 3. Проверьте сетевую конфигурацию: /etc/netplan/01-netcfg.yaml" +echo " 4. Перезагрузите сервер: reboot" +echo " 5. Запустите скрипт развёртывания Git-сервера" +echo "" +echo "Лог установки: $LOG_FILE" +echo "" diff --git a/01/01-k-server-initial-setup.all.sh b/01/01-k-server-initial-setup.all.sh new file mode 100755 index 0000000..087cbc2 --- /dev/null +++ b/01/01-k-server-initial-setup.all.sh @@ -0,0 +1,151 @@ +#!/bin/bash +#=============================================================================== +# ГЛАВНЫЙ СКРИПТ: ЗАПУСК ВСЕХ ШАГОВ ПЕРВОНАЧАЛЬНОЙ НАСТРОЙКИ +#=============================================================================== +# Запуск: sudo bash 01-k-server-initial-setup.all.sh [step_number] +# +# Без аргументов - запуск всех шагов по порядку +# С номером шага - запуск конкретного шага +# +# Примеры: +# sudo bash 01-k-server-initial-setup.all.sh # все шаги +# sudo bash 01-k-server-initial-setup.all.sh 6 # только шаг 6 (SSH) +# sudo bash 01-k-server-initial-setup.all.sh 6-8 # шаги с 6 по 8 +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +init_log +check_root + +#------------------------------------------------------------------------------- +# Список шагов +#------------------------------------------------------------------------------- +declare -A STEPS=( + ["01"]="Базовая настройка (hostname, timezone)" + ["02"]="Настройка сети (netplan)" + ["03"]="Обновление системы" + ["04"]="Установка базовых пакетов" + ["05"]="Создание администратора" + ["06"]="Настройка SSH" + ["07"]="Настройка Firewall (nftables)" + ["08"]="Настройка Fail2ban" + ["09"]="Настройка Swap" + ["99"]="Финальная проверка" +) + +#------------------------------------------------------------------------------- +# Функция запуска шага +#------------------------------------------------------------------------------- +run_step() { + local step="$1" + local script="$SCRIPT_DIR/01-k-server-initial-setup.${step}.sh" + + if [[ ! -f "$script" ]]; then + print_error "Скрипт не найден: $script" + return 1 + fi + + print_header "ЗАПУСК ШАГА ${step}: ${STEPS[$step]}" + + if bash "$script"; then + print_success "Шаг $step завершён успешно" + return 0 + else + print_error "Шаг $step завершился с ошибкой" + return 1 + fi +} + +#------------------------------------------------------------------------------- +# Обработка аргументов +#------------------------------------------------------------------------------- +if [[ -n "$1" ]]; then + # Запуск конкретного шага или диапазона + + if [[ "$1" =~ ^([0-9]+)-([0-9]+)$ ]]; then + # Диапазон шагов + START_STEP="${BASH_REMATCH[1]}" + END_STEP="${BASH_REMATCH[2]}" + + print_info "Запуск шагов с $START_STEP по $END_STEP" + + for step in $(echo "${!STEPS[@]}" | tr ' ' '\n' | sort); do + if [[ "$step" -ge "$START_STEP" && "$step" -le "$END_STEP" ]]; then + run_step "$step" || exit 1 + fi + done + + elif [[ "$1" =~ ^[0-9]+$ ]]; then + # Один шаг + run_step "$1" || exit 1 + else + print_error "Неверный аргумент: $1" + echo "Использование: $0 [step_number|start-end]" + exit 1 + fi + +else + # Запуск всех шагов + + echo "" + echo -e "${BLUE}================================================================${NC}" + echo -e "${BLUE} ПОЛНЫЙ ЗАПУСК ПЕРВОНАЧАЛЬНОЙ НАСТРОЙКИ СЕРВЕРА${NC}" + echo -e "${BLUE}================================================================${NC}" + echo "" + + # Показать конфигурацию + show_config + + echo "Будут выполнены следующие шаги:" + echo "" + + for step in $(echo "${!STEPS[@]}" | tr ' ' '\n' | sort); do + echo " [$step] ${STEPS[$step]}" + done + + echo "" + read -p "Начать настройку? [y/N]: " CONFIRM + + if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then + echo "Отменено." + exit 0 + fi + + # Запуск шагов + FAILED_STEPS=() + + for step in $(echo "${!STEPS[@]}" | tr ' ' '\n' | sort); do + echo "" + echo -e "${CYAN}============================================================${NC}" + echo -e "${CYAN} ШАГ $step: ${STEPS[$step]}${NC}" + echo -e "${CYAN}============================================================${NC}" + + if run_step "$step"; then + : + else + FAILED_STEPS+=("$step") + echo "" + read -p "Продолжить со следующим шагом? [y/N]: " CONTINUE + if [[ ! "$CONTINUE" =~ ^[Yy]$ ]]; then + break + fi + fi + done + + # Итог + echo "" + echo -e "${BLUE}================================================================${NC}" + echo -e "${BLUE} ИТОГ ВЫПОЛНЕНИЯ${NC}" + echo -e "${BLUE}================================================================${NC}" + + if [[ ${#FAILED_STEPS[@]} -eq 0 ]]; then + echo -e "${GREEN}Все шаги выполнены успешно!${NC}" + else + echo -e "${RED}Завершились с ошибкой: ${FAILED_STEPS[*]}${NC}" + echo "" + echo "Для повторного запуска:" + echo " sudo bash $0 <номер_шага>" + fi +fi diff --git a/01/01-k-server-initial-setup.help.sh b/01/01-k-server-initial-setup.help.sh new file mode 100755 index 0000000..3a0b053 --- /dev/null +++ b/01/01-k-server-initial-setup.help.sh @@ -0,0 +1,85 @@ +#!/bin/bash +#=============================================================================== +# СПРАВКА ПО СКРИПТАМ ПЕРВОНАЧАЛЬНОЙ НАСТРОЙКИ СЕРВЕРА +#=============================================================================== +# Запуск: bash 01-k-server-initial-setup.help.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/01-k-server-initial-setup.00.sh" + +echo "" +echo -e "${BLUE}================================================================${NC}" +echo -e "${BLUE} СПРАВКА ПО СКРИПТАМ ПЕРВОНАЧАЛЬНОЙ НАСТРОЙКИ${NC}" +echo -e "${BLUE}================================================================${NC}" +echo "" + +echo "СТРУКТУРА ФАЙЛОВ:" +echo "" +echo " 00.sh - Конфигурация и функции (подключается автоматически)" +echo " 01.sh - Базовая настройка (hostname, timezone, locale)" +echo " 02.sh - Настройка сети (netplan)" +echo " 03.sh - Обновление системы" +echo " 04.sh - Установка базовых пакетов" +echo " 05.sh - Создание администратора" +echo " 06.sh - Настройка SSH (только ключи)" +echo " 07.sh - Настройка Firewall (nftables)" +echo " 08.sh - Настройка Fail2ban" +echo " 09.sh - Настройка Swap" +echo " 99.sh - Финальная проверка" +echo " all.sh - Запуск всех шагов" +echo "" + +echo "ИСПОЛЬЗОВАНИЕ:" +echo "" +echo " Полный запуск:" +echo " sudo bash 01-k-server-initial-setup.all.sh" +echo "" +echo " Конкретный шаг:" +echo " sudo bash 01-k-server-initial-setup.06.sh # только SSH" +echo "" +echo " Диапазон шагов:" +echo " sudo bash 01-k-server-initial-setup.all.sh 6-8 # SSH, Firewall, Fail2ban" +echo "" + +echo "ВАЖНЫЕ МОМЕНТЫ:" +echo "" +echo " 1. Сначала отредактируйте 00.sh - укажите свои параметры:" +echo " SERVER_HOSTNAME, SERVER_DOMAIN, ADMIN_USER, SERVER_TIMEZONE," +echo " IFACE_EXT, IFACE_INT" +echo "" +echo " 2. После шага 06 (SSH) проверьте вход по ключу с ДРУГОЙ консоли!" +echo " Парольная авторизация отключается." +echo "" +echo " 3. После завершения - добавьте SSH-ключ:" +echo " sudo nano /home/admin/.ssh/authorized_keys" +echo "" + +echo "КОНФИГУРАЦИЯ ПО УМОЛЧАНИЮ:" +echo "" +show_config + +echo "ПОЛЕЗНЫЕ КОМАНДЫ:" +echo "" +echo " Статус SSH: systemctl status sshd" +echo " Статус firewall: nft list ruleset" +echo " Статус fail2ban: fail2ban-client status" +echo " Лог установки: cat /var/log/server-setup.log" +echo "" + +echo "УСТРАНЕНИЕ ПРОБЛЕМ:" +echo "" +echo " Потерян доступ SSH:" +echo " - Используйте console-доступ (IPMI, VNC провайдера)" +echo " - Временно включите пароли в /etc/ssh/sshd_config:" +echo " PasswordAuthentication yes" +echo "" +echo " Firewall блокирует:" +echo " - Очистите правила: nft flush ruleset" +echo " - Или временно разрешите всё:" +echo " nft add rule inet filter input accept" +echo "" +echo " Сеть не работает:" +echo " - Проверьте конфигурацию: cat /etc/netplan/01-netcfg.yaml" +echo " - Примените: netplan apply" +echo "" diff --git a/02/02-k-git-server-deploy.00.sh b/02/02-k-git-server-deploy.00.sh new file mode 100755 index 0000000..f9d0f34 --- /dev/null +++ b/02/02-k-git-server-deploy.00.sh @@ -0,0 +1,380 @@ +#!/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 diff --git a/02/02-k-git-server-deploy.01.sh b/02/02-k-git-server-deploy.01.sh new file mode 100755 index 0000000..71bdc63 --- /dev/null +++ b/02/02-k-git-server-deploy.01.sh @@ -0,0 +1,46 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 1: ПОДГОТОВКА СИСТЕМЫ +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.01.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 1: ПОДГОТОВКА СИСТЕМЫ" + +#------------------------------------------------------------------------------- +# 1.1 Проверка системы +#------------------------------------------------------------------------------- +print_subheader "Проверка системы" +check_os +check_network + +#------------------------------------------------------------------------------- +# 1.2 Обновление системы +#------------------------------------------------------------------------------- +print_subheader "Обновление системы" + +print_info "Обновление списков пакетов..." +apt update + +print_info "Обновление установленных пакетов..." +apt upgrade -y + +print_info "Очистка неиспользуемых пакетов..." +apt autoremove -y + +print_success "Система обновлена" + +#------------------------------------------------------------------------------- +# 1.3 Установка базовых зависимостей +#------------------------------------------------------------------------------- +print_subheader "Установка зависимостей" + +install_packages git wget curl sqlite3 + +print_success "Шаг 1 завершён: Система подготовлена" diff --git a/02/02-k-git-server-deploy.02.sh b/02/02-k-git-server-deploy.02.sh new file mode 100755 index 0000000..1341186 --- /dev/null +++ b/02/02-k-git-server-deploy.02.sh @@ -0,0 +1,52 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 2: СОЗДАНИЕ ПОЛЬЗОВАТЕЛЯ GIT +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.02.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 2: СОЗДАНИЕ ПОЛЬЗОВАТЕЛЯ GIT" + +#------------------------------------------------------------------------------- +# 2.1 Создание пользователя +#------------------------------------------------------------------------------- +print_subheader "Создание пользователя git" + +if user_exists git; then + print_warning "Пользователь git уже существует" +else + adduser --system --shell /bin/bash \ + --gecos "Git Version Control" \ + --group --disabled-password \ + --home "$GIT_HOME" git + print_success "Пользователь git создан" +fi + +#------------------------------------------------------------------------------- +# 2.2 Создание директорий +#------------------------------------------------------------------------------- +print_subheader "Создание директорий" + +# Основные директории Gitea +create_dir "$GITEA_DATA" "git:git" "750" +create_dir "$GITEA_DATA/custom" "git:git" "750" +create_dir "$GITEA_DATA/data" "git:git" "750" +create_dir "$GITEA_DATA/log" "git:git" "750" +create_dir "$GITEA_DATA/repositories" "git:git" "750" + +# Директория конфигурации +create_dir "/etc/gitea" "root:git" "770" + +# SSH директория для пользователя git +create_dir "$GIT_HOME/.ssh" "git:git" "700" +touch "$GIT_HOME/.ssh/authorized_keys" 2>/dev/null || true +chmod 600 "$GIT_HOME/.ssh/authorized_keys" +chown git:git "$GIT_HOME/.ssh/authorized_keys" + +print_success "Шаг 2 завершён: Пользователь и директории созданы" diff --git a/02/02-k-git-server-deploy.03.sh b/02/02-k-git-server-deploy.03.sh new file mode 100755 index 0000000..fcc29f2 --- /dev/null +++ b/02/02-k-git-server-deploy.03.sh @@ -0,0 +1,59 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 3: УСТАНОВКА GITEA +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.03.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 3: УСТАНОВКА GITEA v${GITEA_VERSION}" + +#------------------------------------------------------------------------------- +# 3.1 Определение архитектуры +#------------------------------------------------------------------------------- +print_subheader "Определение архитектуры" + +GITEA_ARCH=$(get_gitea_arch) +if [[ $? -ne 0 ]]; then + print_error "Неподдерживаемая архитектура: $(uname -m)" + exit 1 +fi + +print_success "Архитектура: $(uname -m) -> $GITEA_ARCH" + +#------------------------------------------------------------------------------- +# 3.2 Скачивание Gitea +#------------------------------------------------------------------------------- +print_subheader "Скачивание Gitea" + +GITEA_URL="https://github.com/go-gitea/gitea/releases/download/v${GITEA_VERSION}/gitea-${GITEA_VERSION}-linux-${GITEA_ARCH}" + +if [[ -x "$GITEA_BIN" ]]; then + INSTALLED_VER=$($GITEA_BIN --version 2>/dev/null | awk '{print $3}') + if [[ "$INSTALLED_VER" == "$GITEA_VERSION" ]]; then + print_warning "Gitea $GITEA_VERSION уже установлена" + print_success "Шаг 3 завершён (пропуск)" + exit 0 + else + print_info "Обновление Gitea с $INSTALLED_VER до $GITEA_VERSION" + fi +fi + +print_info "URL: $GITEA_URL" +wget -q --show-progress -O "$GITEA_BIN" "$GITEA_URL" +chmod +x "$GITEA_BIN" + +#------------------------------------------------------------------------------- +# 3.3 Проверка установки +#------------------------------------------------------------------------------- +print_subheader "Проверка установки" + +INSTALLED_VERSION=$($GITEA_BIN --version) +print_success "Gitea установлена: $INSTALLED_VERSION" + +print_success "Шаг 3 завершён: Gitea установлена" diff --git a/02/02-k-git-server-deploy.04.sh b/02/02-k-git-server-deploy.04.sh new file mode 100755 index 0000000..76b6aa7 --- /dev/null +++ b/02/02-k-git-server-deploy.04.sh @@ -0,0 +1,67 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 4: СОЗДАНИЕ SYSTEMD UNIT +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.04.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 4: СОЗДАНИЕ SYSTEMD UNIT" + +#------------------------------------------------------------------------------- +# 4.1 Создание unit-файла +#------------------------------------------------------------------------------- +print_subheader "Создание systemd unit" + +cat > /etc/systemd/system/gitea.service << EOF +[Unit] +Description=Gitea (Git with a cup of tea) +After=network.target +Wants=network.target + +[Service] +User=git +Group=git +WorkingDirectory=$GITEA_DATA +Environment=USER=git HOME=$GIT_HOME GITEA_WORK_DIR=$GITEA_DATA +ExecStart=$GITEA_BIN web --config $GITEA_CONFIG +Restart=always +RestartSec=3 + +# Безопасность +CapabilityBoundingSet=CAP_NET_BIND_SERVICE +AmbientCapabilities=CAP_NET_BIND_SERVICE +NoNewPrivileges=true +ProtectSystem=strict +ProtectHome=read-only +ReadWritePaths=$GITEA_DATA /etc/gitea $GIT_HOME +PrivateTmp=true + +[Install] +WantedBy=multi-user.target +EOF + +print_success "Systemd unit создан" + +#------------------------------------------------------------------------------- +# 4.2 Перезагрузка systemd +#------------------------------------------------------------------------------- +print_subheader "Перезагрузка systemd" + +systemctl daemon-reload +print_success "Systemd перезагружен" + +#------------------------------------------------------------------------------- +# 4.3 Включение автозапуска +#------------------------------------------------------------------------------- +print_subheader "Включение автозапуска" + +systemctl enable gitea +print_success "Автозапуск Gitea включён" + +print_success "Шаг 4 завершён: Systemd unit создан" diff --git a/02/02-k-git-server-deploy.05.sh b/02/02-k-git-server-deploy.05.sh new file mode 100755 index 0000000..ccea118 --- /dev/null +++ b/02/02-k-git-server-deploy.05.sh @@ -0,0 +1,126 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 5: КОНФИГУРАЦИЯ GITEA +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.05.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 5: КОНФИГУРАЦИЯ GITEA" + +#------------------------------------------------------------------------------- +# 5.1 Проверка существующей конфигурации +#------------------------------------------------------------------------------- +print_subheader "Проверка конфигурации" + +if [[ -f "$GITEA_CONFIG" ]] && grep -q "INSTALL_LOCK = true" "$GITEA_CONFIG"; then + print_warning "Конфигурация уже существует и заблокирована" + read -p "Перезаписать конфигурацию? [y/N]: " REWRITE + if [[ ! "$REWRITE" =~ ^[Yy]$ ]]; then + print_info "Конфигурация оставлена без изменений" + print_success "Шаг 5 завершён (пропуск)" + exit 0 + fi + # Backup существующей конфигурации + cp "$GITEA_CONFIG" "${GITEA_CONFIG}.backup.$(date +%Y%m%d_%H%M%S)" +fi + +#------------------------------------------------------------------------------- +# 5.2 Генерация секретных ключей +#------------------------------------------------------------------------------- +print_subheader "Генерация секретных ключей" + +SECRET_KEY=$(generate_secret) +INTERNAL_TOKEN=$($GITEA_BIN generate secret INTERNAL_TOKEN 2>/dev/null || generate_secret) +JWT_SECRET=$($GITEA_BIN generate secret JWT_SECRET 2>/dev/null || generate_secret) + +print_success "Секретные ключи сгенерированы" + +#------------------------------------------------------------------------------- +# 5.3 Создание конфигурационного файла +#------------------------------------------------------------------------------- +print_subheader "Создание конфигурации" + +cat > "$GITEA_CONFIG" << EOF +; Gitea Configuration +; Автоматически сгенерировано скриптом развёртывания + +[server] +APP_DATA_PATH = $GITEA_DATA/data +DOMAIN = $GIT_DOMAIN +HTTP_PORT = 3000 +ROOT_URL = https://$GIT_DOMAIN/ +DISABLE_SSH = false +SSH_PORT = 22 +START_SSH_SERVER = false +LFS_START_SERVER = true + +[lfs] +PATH = $GITEA_DATA/data/lfs + +[database] +DB_TYPE = sqlite3 +PATH = $GITEA_DATA/data/gitea.db + +[repository] +ROOT = $GITEA_DATA/repositories +DEFAULT_PUSH_CREATE_PRIVATE = true +MAX_CREATION_LIMIT = 50 + +[security] +INSTALL_LOCK = true +SECRET_KEY = $SECRET_KEY +INTERNAL_TOKEN = $INTERNAL_TOKEN + +[service] +DISABLE_REGISTRATION = false +REQUIRE_SIGNIN_VIEW = false +ENABLE_NOTIFY_MAIL = false +DEFAULT_KEEP_EMAIL_PRIVATE = true +ENABLE_BASIC_AUTHENTICATION = true + +[oauth2] +JWT_SECRET = $JWT_SECRET + +[mailer] +ENABLED = false + +[session] +PROVIDER = file +PROVIDER_CONFIG = $GITEA_DATA/data/sessions + +[picture] +AVATAR_UPLOAD_PATH = $GITEA_DATA/data/avatars +REPOSITORY_AVATAR_UPLOAD_PATH = $GITEA_DATA/data/repo-avatars + +[attachment] +PATH = $GITEA_DATA/data/attachments + +[log] +ROOT_PATH = $GITEA_DATA/log +MODE = file +LEVEL = Info + +[other] +SHOW_FOOTER_VERSION = false +SHOW_FOOTER_TEMPLATE_LOAD_TIME = false +EOF + +print_success "Конфигурация создана" + +#------------------------------------------------------------------------------- +# 5.4 Установка прав +#------------------------------------------------------------------------------- +print_subheader "Установка прав" + +chown root:git "$GITEA_CONFIG" +chmod 640 "$GITEA_CONFIG" + +print_success "Права установлены" + +print_success "Шаг 5 завершён: Конфигурация Gitea создана" diff --git a/02/02-k-git-server-deploy.06.sh b/02/02-k-git-server-deploy.06.sh new file mode 100755 index 0000000..3e0b896 --- /dev/null +++ b/02/02-k-git-server-deploy.06.sh @@ -0,0 +1,62 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 6: ЗАПУСК GITEA +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.06.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 6: ЗАПУСК GITEA" + +#------------------------------------------------------------------------------- +# 6.1 Запуск сервиса +#------------------------------------------------------------------------------- +print_subheader "Запуск Gitea" + +if service_running gitea; then + print_warning "Gitea уже запущена, перезапуск..." + systemctl restart gitea +else + systemctl start gitea +fi + +sleep 3 + +#------------------------------------------------------------------------------- +# 6.2 Проверка статуса +#------------------------------------------------------------------------------- +print_subheader "Проверка статуса" + +if check_gitea_status; then + print_success "Gitea успешно запущена" +else + print_error "Gitea не запустилась!" + echo "" + echo "Последние строки лога:" + journalctl -u gitea --no-pager -n 30 + echo "" + print_info "Для диагностики запустите вручную:" + echo " sudo systemctl stop gitea" + echo " sudo -u git GITEA_WORK_DIR=$GITEA_DATA $GITEA_BIN web --config $GITEA_CONFIG" + exit 1 +fi + +#------------------------------------------------------------------------------- +# 6.3 Проверка доступности +#------------------------------------------------------------------------------- +print_subheader "Проверка доступности" + +if wait_for_gitea; then + print_success "Gitea отвечает на порту 3000" +else + print_error "Gitea не отвечает" + exit 1 +fi + +print_info "Веб-интерфейс доступен на: http://localhost:3000" +print_success "Шаг 6 завершён: Gitea запущена" diff --git a/02/02-k-git-server-deploy.07.sh b/02/02-k-git-server-deploy.07.sh new file mode 100755 index 0000000..7100807 --- /dev/null +++ b/02/02-k-git-server-deploy.07.sh @@ -0,0 +1,107 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 7: УСТАНОВКА NGINX (HTTP ONLY) +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.07.sh +# +# Важно: Этот шаг создаёт только HTTP конфигурацию. +# SSL-сертификаты получаются на шаге 8. +# HTTPS активируется на шаге 9. +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 7: УСТАНОВКА NGINX (HTTP ONLY)" + +#------------------------------------------------------------------------------- +# 7.1 Установка Nginx +#------------------------------------------------------------------------------- +print_subheader "Установка Nginx" + +install_packages nginx + +systemctl enable nginx +print_success "Nginx установлен" + +#------------------------------------------------------------------------------- +# 7.2 Создание директории для Certbot +#------------------------------------------------------------------------------- +print_subheader "Создание директории для Certbot" + +create_dir "/var/www/certbot" "www-data:www-data" "755" + +#------------------------------------------------------------------------------- +# 7.3 Создание HTTP-only конфигурации +#------------------------------------------------------------------------------- +print_subheader "Создание HTTP конфигурации" + +# Временная HTTP-only конфигурация для получения сертификата +cat > /etc/nginx/sites-available/gitea << EOF +# Gitea HTTP Configuration (временная для получения SSL) +# После получения сертификата будет заменена на HTTPS конфигурацию + +server { + listen 80; + listen [::]:80; + server_name $GIT_DOMAIN; + + # Для Let's Encrypt challenge + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + # Проксирование в Gitea + location / { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Host \$host; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto \$scheme; + + # Таймауты для git операций + proxy_connect_timeout 300; + proxy_send_timeout 300; + proxy_read_timeout 300; + + # Размер для больших push + client_max_body_size 100M; + } + + # Логи + access_log /var/log/nginx/gitea.access.log; + error_log /var/log/nginx/gitea.error.log; +} +EOF + +print_success "HTTP конфигурация создана" + +#------------------------------------------------------------------------------- +# 7.4 Активация конфигурации +#------------------------------------------------------------------------------- +print_subheader "Активация конфигурации" + +# Удалить default если существует +rm -f /etc/nginx/sites-enabled/default + +# Активировать gitea +ln -sf /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/ + +#------------------------------------------------------------------------------- +# 7.5 Проверка и перезагрузка +#------------------------------------------------------------------------------- +print_subheader "Проверка конфигурации" + +if check_nginx_config; then + systemctl reload nginx + print_success "Nginx перезагружен" +else + print_error "Ошибка в конфигурации Nginx" + exit 1 +fi + +print_info "Веб-интерфейс доступен на: http://$GIT_DOMAIN" +print_success "Шаг 7 завершён: Nginx установлен (HTTP only)" diff --git a/02/02-k-git-server-deploy.08.sh b/02/02-k-git-server-deploy.08.sh new file mode 100755 index 0000000..6c74178 --- /dev/null +++ b/02/02-k-git-server-deploy.08.sh @@ -0,0 +1,132 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 8: ПОЛУЧЕНИЕ SSL-СЕРТИФИКАТА +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.08.sh +# +# Получает SSL-сертификат от Let's Encrypt через Certbot +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 8: ПОЛУЧЕНИЕ SSL-СЕРТИФИКАТА" + +#------------------------------------------------------------------------------- +# 8.1 Установка Certbot +#------------------------------------------------------------------------------- +print_subheader "Установка Certbot" + +install_packages certbot python3-certbot-nginx + +print_success "Certbot установлен" + +#------------------------------------------------------------------------------- +# 8.2 Проверка DNS +#------------------------------------------------------------------------------- +print_subheader "Проверка DNS" + +if ! check_dns; then + print_error "Домен $GIT_DOMAIN не резолвится. Невозможно получить сертификат." + echo "" + echo "Проверьте DNS A-запись для $GIT_DOMAIN" + echo "Она должна указывать на внешний IP этого сервера" + exit 1 +fi + +#------------------------------------------------------------------------------- +# 8.3 Проверка доступности порта 80 +#------------------------------------------------------------------------------- +print_subheader "Проверка доступности" + +print_info "Проверка доступности http://$GIT_DOMAIN..." +if curl -sI "http://$GIT_DOMAIN" | head -1 | grep -q "200\|301\|302"; then + print_success "Сервер доступен по HTTP" +else + print_warning "Не удалось проверить доступность. Продолжаем..." +fi + +#------------------------------------------------------------------------------- +# 8.4 Проверка существующего сертификата +#------------------------------------------------------------------------------- +print_subheader "Проверка сертификата" + +CERT_PATH="/etc/letsencrypt/live/$GIT_DOMAIN/fullchain.pem" + +if [[ -f "$CERT_PATH" ]]; then + print_warning "SSL-сертификат уже существует" + + # Показать информацию о сертификате + EXPIRE_DATE=$(openssl x509 -enddate -noout -in "$CERT_PATH" 2>/dev/null | cut -d= -f2) + print_info "Текущий сертификат истекает: $EXPIRE_DATE" + + read -p "Получить новый сертификат? [y/N]: " RENEW + if [[ ! "$RENEW" =~ ^[Yy]$ ]]; then + print_info "Используется существующий сертификат" + print_success "Шаг 8 завершён (пропуск)" + exit 0 + fi +fi + +#------------------------------------------------------------------------------- +# 8.5 Получение сертификата +#------------------------------------------------------------------------------- +print_subheader "Получение сертификата" + +print_info "Email для Let's Encrypt: $CERT_EMAIL" +print_info "Домен: $GIT_DOMAIN" + +# Используем webroot метод (более надёжный) +if certbot certonly --webroot \ + -w /var/www/certbot \ + -d "$GIT_DOMAIN" \ + --email "$CERT_EMAIL" \ + --agree-tos \ + --no-eff-email \ + --non-interactive; then + + print_success "SSL-сертификат получен" +else + print_error "Не удалось получить сертификат" + echo "" + echo "Возможные причины:" + echo " 1. DNS A-запись не указывает на этот сервер" + echo " 2. Порт 80 заблокирован firewall" + echo " 3. Nginx не запущен или неправильно настроен" + echo "" + echo "Проверьте:" + echo " dig $GIT_DOMAIN" + echo " curl -I http://$GIT_DOMAIN" + echo " systemctl status nginx" + exit 1 +fi + +#------------------------------------------------------------------------------- +# 8.6 Настройка автообновления +#------------------------------------------------------------------------------- +print_subheader "Настройка автообновления" + +systemctl enable certbot.timer +systemctl start certbot.timer + +print_success "Автообновление сертификатов настроено" + +#------------------------------------------------------------------------------- +# 8.7 Проверка сертификата +#------------------------------------------------------------------------------- +print_subheader "Проверка сертификата" + +if [[ -f "$CERT_PATH" ]]; then + print_success "Сертификат установлен: $CERT_PATH" + + # Показать детали + openssl x509 -subject -issuer -dates -noout -in "$CERT_PATH" 2>/dev/null +else + print_error "Сертификат не найден" + exit 1 +fi + +print_success "Шаг 8 завершён: SSL-сертификат получен" diff --git a/02/02-k-git-server-deploy.09.sh b/02/02-k-git-server-deploy.09.sh new file mode 100755 index 0000000..f1ef2a1 --- /dev/null +++ b/02/02-k-git-server-deploy.09.sh @@ -0,0 +1,148 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 9: АКТИВАЦИЯ HTTPS В NGINX +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.09.sh +# +# Заменяет HTTP конфигурацию на HTTPS с редиректом +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 9: АКТИВАЦИЯ HTTPS В NGINX" + +#------------------------------------------------------------------------------- +# 9.1 Проверка сертификата +#------------------------------------------------------------------------------- +print_subheader "Проверка сертификата" + +CERT_PATH="/etc/letsencrypt/live/$GIT_DOMAIN/fullchain.pem" +KEY_PATH="/etc/letsencrypt/live/$GIT_DOMAIN/privkey.pem" + +if [[ ! -f "$CERT_PATH" ]] || [[ ! -f "$KEY_PATH" ]]; then + print_error "SSL-сертификат не найден!" + print_info "Сначала выполните шаг 08: bash 02-k-git-server-deploy.08.sh" + exit 1 +fi + +print_success "SSL-сертификат найден" + +#------------------------------------------------------------------------------- +# 9.2 Создание HTTPS конфигурации +#------------------------------------------------------------------------------- +print_subheader "Создание HTTPS конфигурации" + +# Backup текущей конфигурации +cp /etc/nginx/sites-available/gitea /etc/nginx/sites-available/gitea.http-only.bak + +cat > /etc/nginx/sites-available/gitea << EOF +# Gitea Full Configuration (HTTP + HTTPS) + +# HTTP -> HTTPS redirect +server { + listen 80; + listen [::]:80; + server_name $GIT_DOMAIN; + + # Для Let's Encrypt challenge (важно для обновления сертификатов) + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + # Редирект всего остального на HTTPS + location / { + return 301 https://\$server_name\$request_uri; + } +} + +# HTTPS +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name $GIT_DOMAIN; + + # SSL сертификаты + ssl_certificate $CERT_PATH; + ssl_certificate_key $KEY_PATH; + + # SSL настройки (современные стандарты) + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; + ssl_prefer_server_ciphers off; + ssl_session_timeout 1d; + ssl_session_cache shared:SSL:10m; + + # Заголовки безопасности + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header X-Frame-Options SAMEORIGIN always; + add_header X-Content-Type-Options nosniff always; + add_header X-XSS-Protection "1; mode=block" always; + + # Проксирование в Gitea + location / { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Host \$host; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto \$scheme; + + # Таймауты для git операций + proxy_connect_timeout 300; + proxy_send_timeout 300; + proxy_read_timeout 300; + + # Размер для больших push + client_max_body_size 100M; + } + + # Логи + access_log /var/log/nginx/gitea.access.log; + error_log /var/log/nginx/gitea.error.log; +} +EOF + +print_success "HTTPS конфигурация создана" + +#------------------------------------------------------------------------------- +# 9.3 Проверка конфигурации +#------------------------------------------------------------------------------- +print_subheader "Проверка конфигурации" + +if check_nginx_config; then + print_success "Конфигурация валидна" +else + print_error "Ошибка в конфигурации Nginx" + echo "" + echo "Восстановление HTTP-only конфигурации..." + mv /etc/nginx/sites-available/gitea.http-only.bak /etc/nginx/sites-available/gitea + exit 1 +fi + +#------------------------------------------------------------------------------- +# 9.4 Перезагрузка Nginx +#------------------------------------------------------------------------------- +print_subheader "Перезагрузка Nginx" + +systemctl reload nginx +print_success "Nginx перезагружен" + +#------------------------------------------------------------------------------- +# 9.5 Проверка HTTPS +#------------------------------------------------------------------------------- +print_subheader "Проверка HTTPS" + +print_info "Проверка https://$GIT_DOMAIN..." +sleep 2 + +if curl -sI "https://$GIT_DOMAIN" | head -1 | grep -q "200\|301\|302"; then + print_success "HTTPS работает" +else + print_warning "Не удалось проверить HTTPS. Проверьте вручную." +fi + +print_info "Веб-интерфейс доступен на: https://$GIT_DOMAIN" +print_success "Шаг 9 завершён: HTTPS активирован" diff --git a/02/02-k-git-server-deploy.10.sh b/02/02-k-git-server-deploy.10.sh new file mode 100755 index 0000000..763f895 --- /dev/null +++ b/02/02-k-git-server-deploy.10.sh @@ -0,0 +1,138 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 10: ОБНОВЛЕНИЕ FIREWALL +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.10.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 10: ОБНОВЛЕНИЕ FIREWALL (nftables)" + +#------------------------------------------------------------------------------- +# 10.1 Проверка текущих правил +#------------------------------------------------------------------------------- +print_subheader "Текущие правила" + +if command -v nft &>/dev/null; then + echo "Текущие правила nftables:" + nft list ruleset 2>/dev/null | head -30 +else + print_warning "nftables не установлен. Установка..." + apt install -y nftables +fi + +#------------------------------------------------------------------------------- +# 10.2 Создание новой конфигурации +#------------------------------------------------------------------------------- +print_subheader "Создание конфигурации" + +# Backup существующей конфигурации +if [[ -f /etc/nftables.conf ]]; then + cp /etc/nftables.conf /etc/nftables.conf.backup.$(date +%Y%m%d_%H%M%S) +fi + +cat > /etc/nftables.conf << EOF +#!/usr/sbin/nft -f + +# Firewall для Git Server (Gitea) +# eth0 ($IFACE_EXT) - внешний интерфейс (ограниченный доступ) +# eth1 ($IFACE_INT) - внутренний интерфейс (доверенная зона) + +flush ruleset + +table inet filter { + chain input { + type filter hook input priority 0; policy drop; + + # Разрешить loopback + iif lo accept + + # Установленные соединения + ct state established,related accept + + # Блокировать invalid пакеты + ct state invalid drop + + # ICMP (ограниченно) + ip protocol icmp icmp type echo-request limit rate 1/second accept + ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 1/second accept + ip protocol icmp icmp type { destination-unreachable, time-exceeded } accept + ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, time-exceeded } accept + + # === ВНЕШНИЙ ИНТЕРФЕЙС ($IFACE_EXT) === + # SSH для администрирования + iifname $IFACE_EXT tcp dport 22 accept + + # HTTP (для Let's Encrypt challenge) + iifname $IFACE_EXT tcp dport 80 accept + + # HTTPS (Gitea) + iifname $IFACE_EXT tcp dport 443 accept + + # === ВНУТРЕННИЙ ИНТЕРФЕЙС ($IFACE_INT) - доверенная зона === + iifname $IFACE_INT tcp dport 22 accept + iifname $IFACE_INT tcp dport 80 accept + iifname $IFACE_INT tcp dport 443 accept + iifname $IFACE_INT tcp dport 3000 accept + + # Логирование заблокированных (опционально - раскомментируйте для отладки) + # log prefix "nft drop: " counter + + # Счётчик отброшенных пакетов + counter + } + + chain forward { + type filter hook forward priority 0; policy drop; + } + + chain output { + type filter hook output priority 0; policy accept; + } +} +EOF + +print_success "Конфигурация создана" + +#------------------------------------------------------------------------------- +# 10.3 Проверка синтаксиса +#------------------------------------------------------------------------------- +print_subheader "Проверка синтаксиса" + +if nft -c -f /etc/nftables.conf 2>&1; then + print_success "Синтаксис валиден" +else + print_error "Ошибка синтаксиса nftables" + exit 1 +fi + +#------------------------------------------------------------------------------- +# 10.4 Применение правил +#------------------------------------------------------------------------------- +print_subheader "Применение правил" + +read -p "Применить правила firewall? [y/N]: " APPLY + +if [[ "$APPLY" =~ ^[Yy]$ ]]; then + nft -f /etc/nftables.conf + systemctl enable nftables + print_success "Firewall применён" +else + print_warning "Правила не применены" + print_info "Примените вручную: nft -f /etc/nftables.conf" +fi + +#------------------------------------------------------------------------------- +# 10.5 Показать активные правила +#------------------------------------------------------------------------------- +print_subheader "Активные правила" + +echo "" +nft list ruleset + +print_success "Шаг 10 завершён: Firewall настроен" diff --git a/02/02-k-git-server-deploy.11.sh b/02/02-k-git-server-deploy.11.sh new file mode 100755 index 0000000..731b6ba --- /dev/null +++ b/02/02-k-git-server-deploy.11.sh @@ -0,0 +1,105 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 11: СОЗДАНИЕ АДМИНИСТРАТОРА GITEA +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.11.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 11: СОЗДАНИЕ АДМИНИСТРАТОРА GITEA" + +#------------------------------------------------------------------------------- +# 11.1 Проверка Gitea +#------------------------------------------------------------------------------- +print_subheader "Проверка Gitea" + +if ! service_running gitea; then + print_error "Gitea не запущена!" + print_info "Сначала выполните шаг 06: bash 02-k-git-server-deploy.06.sh" + exit 1 +fi + +print_success "Gitea запущена" + +#------------------------------------------------------------------------------- +# 11.2 Генерация пароля +#------------------------------------------------------------------------------- +print_subheader "Генерация пароля" + +GITEA_PASS=$(generate_password) +print_success "Пароль сгенерирован" + +#------------------------------------------------------------------------------- +# 11.3 Проверка существования пользователя +#------------------------------------------------------------------------------- +print_subheader "Проверка пользователя" + +if su -c "$GITEA_BIN admin user list --config $GITEA_CONFIG" git 2>/dev/null | grep -q "$GITEA_ADMIN"; then + print_warning "Пользователь $GITEA_ADMIN уже существует" + read -p "Задать новый пароль? [y/N]: " NEW_PASS + if [[ "$NEW_PASS" =~ ^[Yy]$ ]]; then + read -s -p "Введите новый пароль: " GITEA_PASS + echo "" + + su -c "$GITEA_BIN admin user change-password --username '$GITEA_ADMIN' --password '$GITEA_PASS' --config $GITEA_CONFIG" git + print_success "Пароль изменён" + else + print_info "Пароль оставлен без изменений" + fi + + save_admin_credentials "$GITEA_ADMIN" "(не изменён)" + print_success "Шаг 11 завершён" + exit 0 +fi + +#------------------------------------------------------------------------------- +# 11.4 Создание пользователя-администратора +#------------------------------------------------------------------------------- +print_subheader "Создание администратора" + +print_info "Создание пользователя: $GITEA_ADMIN" +print_info "Email: $GITEA_ADMIN_EMAIL" + +if su -c "$GITEA_BIN admin user create \ + --username '$GITEA_ADMIN' \ + --email '$GITEA_ADMIN_EMAIL' \ + --password '$GITEA_PASS' \ + --admin \ + --config '$GITEA_CONFIG'" git 2>&1; then + + print_success "Администратор создан" +else + print_error "Не удалось создать администратора" + print_info "Попробуйте создать через веб-интерфейс: https://$GIT_DOMAIN" + exit 1 +fi + +#------------------------------------------------------------------------------- +# 11.5 Сохранение учётных данных +#------------------------------------------------------------------------------- +print_subheader "Сохранение учётных данных" + +save_admin_credentials "$GITEA_ADMIN" "$GITEA_PASS" + +#------------------------------------------------------------------------------- +# 11.6 Вывод информации +#------------------------------------------------------------------------------- +echo "" +echo -e "${YELLOW}============================================================${NC}" +echo -e "${YELLOW} ДАННЫЕ АДМИНИСТРАТОРА GITEA${NC}" +echo -e "${YELLOW}============================================================${NC}" +echo "" +echo " URL: https://$GIT_DOMAIN" +echo " Логин: $GITEA_ADMIN" +echo " Пароль: $GITEA_PASS" +echo "" +echo -e "${RED}ВАЖНО: Смените пароль после первого входа!${NC}" +echo -e "${RED}Данные сохранены в /root/.gitea-admin-credentials${NC}" +echo "" + +print_success "Шаг 11 завершён: Администратор создан" diff --git a/02/02-k-git-server-deploy.12.sh b/02/02-k-git-server-deploy.12.sh new file mode 100755 index 0000000..1715aae --- /dev/null +++ b/02/02-k-git-server-deploy.12.sh @@ -0,0 +1,303 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 12: СКРИПТЫ РЕЗЕРВНОГО КОПИРОВАНИЯ +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.12.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 12: СКРИПТЫ РЕЗЕРВНОГО КОПИРОВАНИЯ" + +#------------------------------------------------------------------------------- +# 12.1 Создание директории для бэкапов +#------------------------------------------------------------------------------- +print_subheader "Создание директории для бэкапов" + +create_dir "/var/backups/gitea" "root:root" "750" + +#------------------------------------------------------------------------------- +# 12.2 Скрипт резервного копирования +#------------------------------------------------------------------------------- +print_subheader "Создание скрипта бэкапа" + +cat > /usr/local/bin/gitea-backup.sh << 'BACKUP_SCRIPT' +#!/bin/bash +#=============================================================================== +# Скрипт резервного копирования Gitea +# Запуск: sudo /usr/local/bin/gitea-backup.sh [nfs|local] +#=============================================================================== + +set -e + +# Конфигурация +BACKUP_DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_NAME="gitea-backup-${BACKUP_DATE}" +LOCAL_BACKUP_DIR="/var/backups/gitea" +NFS_BACKUP_DIR="/mnt/nfs-backups/gitea" +GITEA_DATA="/var/lib/gitea" +GITEA_CONFIG="/etc/gitea" + +# Создание директории +mkdir -p "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" + +echo "=== Начало резервного копирования ===" +echo "Дата: $(date)" + +# Остановка Gitea +echo "Остановка Gitea..." +systemctl stop gitea + +# Бэкап репозиториев +echo "Архивирование репозиториев..." +tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/repositories.tar.gz" \ + -C "${GITEA_DATA}" repositories/ 2>/dev/null || true + +# Бэкап базы данных +echo "Копирование базы данных..." +cp "${GITEA_DATA}/data/gitea.db" "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/" 2>/dev/null || true + +# Бэкап конфигурации +echo "Архивирование конфигурации..." +tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/config.tar.gz" \ + -C "$(dirname ${GITEA_CONFIG})" "$(basename ${GITEA_CONFIG})" 2>/dev/null || true + +# Бэкап LFS (если есть) +if [ -d "${GITEA_DATA}/data/lfs" ]; then + echo "Архивирование LFS..." + tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/lfs.tar.gz" \ + -C "${GITEA_DATA}/data" lfs/ 2>/dev/null || true +fi + +# Бэкап аватаров (если есть) +if [ -d "${GITEA_DATA}/data/avatars" ]; then + tar -czf "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/avatars.tar.gz" \ + -C "${GITEA_DATA}/data" avatars/ 2>/dev/null || true +fi + +# Запуск Gitea +echo "Запуск Gitea..." +systemctl start gitea + +# Метаданные +cat > "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}/backup.info" << EOF +Backup Date: $(date) +Gitea Version: $(/usr/local/bin/gitea --version 2>/dev/null || echo "unknown") +Hostname: $(hostname) +Repositories: $(ls -1d ${GITEA_DATA}/repositories/*/*.git 2>/dev/null | wc -l) +Size: $(du -sh ${LOCAL_BACKUP_DIR}/${BACKUP_NAME} 2>/dev/null | cut -f1) +EOF + +# Копирование на NFS +if mountpoint -q "$(dirname $NFS_BACKUP_DIR)" 2>/dev/null; then + echo "Копирование на NFS..." + mkdir -p "${NFS_BACKUP_DIR}" + cp -r "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" "${NFS_BACKUP_DIR}/" || echo "Ошибка копирования на NFS" +fi + +# Очистка старых бэкапов (30 дней) +echo "Очистка старых бэкапов..." +find "${LOCAL_BACKUP_DIR}" -maxdepth 1 -type d -name "gitea-backup-*" -mtime +30 -exec rm -rf {} \; 2>/dev/null || true + +echo "=== Резервное копирование завершено ===" +echo "Расположение: ${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" +echo "Размер: $(du -sh ${LOCAL_BACKUP_DIR}/${BACKUP_NAME} | cut -f1)" +BACKUP_SCRIPT + +chmod +x /usr/local/bin/gitea-backup.sh +print_success "Скрипт бэкапа создан: /usr/local/bin/gitea-backup.sh" + +#------------------------------------------------------------------------------- +# 12.3 Скрипт восстановления +#------------------------------------------------------------------------------- +print_subheader "Создание скрипта восстановления" + +cat > /usr/local/bin/gitea-restore.sh << 'RESTORE_SCRIPT' +#!/bin/bash +#=============================================================================== +# Скрипт восстановления Gitea из бэкапа +# Запуск: sudo /usr/local/bin/gitea-restore.sh /path/to/backup +#=============================================================================== + +set -e + +BACKUP_DIR="$1" + +if [ -z "$BACKUP_DIR" ]; then + echo "Использование: $0 /path/to/backup-directory" + echo "" + echo "Доступные бэкапы:" + ls -1d /var/backups/gitea/gitea-backup-* 2>/dev/null || echo " Нет бэкапов" + exit 1 +fi + +if [ ! -d "$BACKUP_DIR" ]; then + echo "Ошибка: Директория $BACKUP_DIR не существует" + exit 1 +fi + +echo "=== Восстановление Gitea ===" +echo "Источник: $BACKUP_DIR" +read -p "Продолжить? [y/N]: " CONFIRM +[[ ! "$CONFIRM" =~ ^[Yy]$ ]] && exit 0 + +GITEA_DATA="/var/lib/gitea" +GITEA_CONFIG="/etc/gitea" + +# Остановка +systemctl stop gitea + +# Восстановление репозиториев +if [ -f "$BACKUP_DIR/repositories.tar.gz" ]; then + echo "Восстановление репозиториев..." + rm -rf "${GITEA_DATA}/repositories" + tar -xzf "$BACKUP_DIR/repositories.tar.gz" -C "${GITEA_DATA}" +fi + +# Восстановление базы данных +if [ -f "$BACKUP_DIR/gitea.db" ]; then + echo "Восстановление базы данных..." + cp "$BACKUP_DIR/gitea.db" "${GITEA_DATA}/data/gitea.db" + chown git:git "${GITEA_DATA}/data/gitea.db" +fi + +# Восстановление конфигурации +if [ -f "$BACKUP_DIR/config.tar.gz" ]; then + echo "Восстановление конфигурации..." + tar -xzf "$BACKUP_DIR/config.tar.gz" -C / +fi + +# Восстановление LFS +if [ -f "$BACKUP_DIR/lfs.tar.gz" ]; then + echo "Восстановление LFS..." + tar -xzf "$BACKUP_DIR/lfs.tar.gz" -C "${GITEA_DATA}/data" +fi + +# Права +chown -R git:git "$GITEA_DATA" + +# Запуск +echo "Запуск Gitea..." +systemctl start gitea + +echo "=== Восстановление завершено ===" +RESTORE_SCRIPT + +chmod +x /usr/local/bin/gitea-restore.sh +print_success "Скрипт восстановления создан: /usr/local/bin/gitea-restore.sh" + +#------------------------------------------------------------------------------- +# 12.4 Скрипт экспорта на GitHub +#------------------------------------------------------------------------------- +print_subheader "Создание скрипта экспорта на GitHub" + +cat > /usr/local/bin/gitea-to-github.sh << 'EXPORT_SCRIPT' +#!/bin/bash +#=============================================================================== +# Экспорт репозиториев на GitHub +# Запуск: sudo /usr/local/bin/gitea-to-github.sh +# +# ТРЕБУЕТСЯ НАСТРОЙКА: +# - Создайте Personal Access Token на GitHub (Settings -> Developer settings -> Personal access tokens) +# - Права: repo (full control) +#=============================================================================== + +set -e + +GITEA_REPO_DIR="/var/lib/gitea/repositories" + +# НАСТРОЙТЕ ЭТИ ПАРАМЕТРЫ! +GITHUB_USER="" # Ваш GitHub username +GITHUB_TOKEN="" # Ваш GitHub Personal Access Token + +if [ -z "$GITHUB_USER" ] || [ -z "$GITHUB_TOKEN" ]; then + echo "=== Экспорт репозиториев на GitHub ===" + echo "" + echo "Настройте переменные в скрипте:" + echo " sudo nano /usr/local/bin/gitea-to-github.sh" + echo "" + echo "Укажите:" + echo " GITHUB_USER - ваш GitHub username" + echo " GITHUB_TOKEN - Personal Access Token с правами 'repo'" + echo "" + echo "Для получения токена:" + echo " 1. GitHub -> Settings -> Developer settings -> Personal access tokens -> Tokens (classic)" + echo " 2. Generate new token (classic)" + echo " 3. Выберите права 'repo'" + echo "" + echo "Доступные репозитории:" + find "$GITEA_REPO_DIR" -name "*.git" -type d 2>/dev/null | while read repo; do + owner=$(basename $(dirname "$repo")) + name=$(basename "$repo" .git) + echo " $owner/$name" + done + exit 1 +fi + +echo "=== Экспорт репозиториев на GitHub ===" +echo "" + +export_repo() { + local REPO_PATH="$1" + local OWNER=$(basename $(dirname "$REPO_PATH")) + local NAME=$(basename "$REPO_PATH" .git) + + echo "Экспорт $OWNER/$NAME..." + + # Создание репозитория на GitHub (если не существует) + curl -s -X POST \ + -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/user/repos" \ + -d "{\"name\":\"$NAME\",\"private\":true}" > /dev/null 2>&1 || true + + # Зеркалирование + TEMP_DIR=$(mktemp -d) + git clone --bare "$REPO_PATH" "$TEMP_DIR" 2>/dev/null + cd "$TEMP_DIR" + git push --mirror "https://$GITHUB_TOKEN@github.com/$GITHUB_USER/$NAME.git" 2>/dev/null || true + cd / + rm -rf "$TEMP_DIR" + + echo " -> https://github.com/$GITHUB_USER/$NAME" +} + +# Интерактивный выбор +echo "Доступные репозитории:" +find "$GITEA_REPO_DIR" -name "*.git" -type d | while read repo; do + owner=$(basename $(dirname "$repo")) + name=$(basename "$repo" .git) + echo " $owner/$name" +done + +echo "" +read -p "Введите owner/repo для экспорта (или 'all' для всех): " TARGET + +if [ "$TARGET" = "all" ]; then + find "$GITEA_REPO_DIR" -name "*.git" -type d | while read repo; do + export_repo "$repo" + done +else + IFS='/' read -r OWNER NAME <<< "$TARGET" + REPO_PATH="$GITEA_REPO_DIR/$OWNER/$NAME.git" + + if [ -d "$REPO_PATH" ]; then + export_repo "$REPO_PATH" + else + echo "Репозиторий не найден: $REPO_PATH" + exit 1 + fi +fi + +echo "" +echo "=== Экспорт завершён ===" +EXPORT_SCRIPT + +chmod +x /usr/local/bin/gitea-to-github.sh +print_success "Скрипт экспорта создан: /usr/local/bin/gitea-to-github.sh" + +print_success "Шаг 12 завершён: Скрипты бэкапа созданы" diff --git a/02/02-k-git-server-deploy.13.sh b/02/02-k-git-server-deploy.13.sh new file mode 100755 index 0000000..a7c5e64 --- /dev/null +++ b/02/02-k-git-server-deploy.13.sh @@ -0,0 +1,278 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 13: НАСТРОЙКА ПОЧТЫ (msmtp) +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.13.sh +# +# msmtp - легковесный SMTP-клиент для отправки почты через внешний сервер +# Поддерживает: Gmail, Яндекс, Mail.ru, корпоративные SMTP +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 13: НАСТРОЙКА ПОЧТЫ (msmtp)" + +#------------------------------------------------------------------------------- +# 13.1 Информация +#------------------------------------------------------------------------------- +print_subheader "Информация о решении" + +echo "msmtp - легковесный SMTP-клиент (~0 MB RAM)" +echo "" +echo "Преимущества:" +echo " - Минимальное потребление ресурсов" +echo " - Отправка через надёжные внешние SMTP-серверы" +echo " - Не нужен DKIM/SPF/DMARC для своего домена" +echo " - Простая настройка" +echo "" +echo "Требуется внешний SMTP-сервер:" +echo " - Gmail (требует App Password)" +echo " - Яндекс.Почта" +echo " - Mail.ru" +echo " - Корпоративный SMTP" +echo "" + +read -p "Продолжить настройку почты? [y/N]: " CONTINUE +if [[ ! "$CONTINUE" =~ ^[Yy]$ ]]; then + print_info "Настройка почты пропущена" + exit 0 +fi + +#------------------------------------------------------------------------------- +# 13.2 Ввод параметров SMTP +#------------------------------------------------------------------------------- +print_subheader "Настройка SMTP" + +echo "Выберите SMTP-провайдера:" +echo " 1) Gmail (требует App Password)" +echo " 2) Яндекс.Почта" +echo " 3) Mail.ru" +echo " 4) Корпоративный SMTP" +echo " 5) Пропустить (настроить позже)" +echo "" + +read -p "Выбор [1-5]: " SMTP_CHOICE + +case $SMTP_CHOICE in + 1) + SMTP_HOST="smtp.gmail.com" + SMTP_PORT="587" + SMTP_TLS="on" + SMTP_STARTTLS="on" + read -p "Gmail адрес (user@gmail.com): " SMTP_USER + read -s -p "App Password (16 символов): " SMTP_PASS + echo "" + SMTP_FROM="$SMTP_USER" + ;; + 2) + SMTP_HOST="smtp.yandex.ru" + SMTP_PORT="587" + SMTP_TLS="on" + SMTP_STARTTLS="on" + read -p "Яндекс.Почта (user@yandex.ru): " SMTP_USER + read -s -p "Пароль приложения: " SMTP_PASS + echo "" + SMTP_FROM="$SMTP_USER" + ;; + 3) + SMTP_HOST="smtp.mail.ru" + SMTP_PORT="587" + SMTP_TLS="on" + SMTP_STARTTLS="on" + read -p "Mail.ru адрес (user@mail.ru): " SMTP_USER + read -s -p "Пароль приложения: " SMTP_PASS + echo "" + SMTP_FROM="$SMTP_USER" + ;; + 4) + read -p "SMTP хост: " SMTP_HOST + read -p "SMTP порт [587]: " SMTP_PORT + SMTP_PORT=${SMTP_PORT:-587} + read -p "SMTP пользователь: " SMTP_USER + read -s -p "SMTP пароль: " SMTP_PASS + echo "" + read -p "Email отправителя: " SMTP_FROM + SMTP_TLS="on" + SMTP_STARTTLS="on" + ;; + 5|*) + print_info "Настройка почты отложена" + echo "" + echo "Для ручной настройки отредактируйте:" + echo " /etc/msmtprc" + echo " /etc/gitea/app.ini" + exit 0 + ;; +esac + +#------------------------------------------------------------------------------- +# 13.3 Установка msmtp +#------------------------------------------------------------------------------- +print_subheader "Установка msmtp" + +install_packages msmtp msmtp-mta mailutils + +print_success "msmtp установлен" + +#------------------------------------------------------------------------------- +# 13.4 Создание конфигурации msmtp +#------------------------------------------------------------------------------- +print_subheader "Создание конфигурации msmtp" + +# Backup существующей конфигурации +if [[ -f /etc/msmtprc ]]; then + cp /etc/msmtprc /etc/msmtprc.backup.$(date +%Y%m%d_%H%M%S) +fi + +cat > /etc/msmtprc << EOF +# msmtp configuration for Git Server +# Автоматически сгенерировано скриптом 02-k-git-server-deploy.13.sh + +# Общие настройки +defaults +auth on +tls ${SMTP_TLS} +tls_starttls ${SMTP_STARTTLS} +tls_trust_file /etc/ssl/certs/ca-certificates.crt +logfile /var/log/msmtp.log + +# Учётная запись по умолчанию +account default +host ${SMTP_HOST} +port ${SMTP_PORT} +user ${SMTP_USER} +password ${SMTP_PASS} +from ${SMTP_FROM} +EOF + +# Права на файл (пароль!) +chmod 600 /etc/msmtprc +chown root:root /etc/msmtprc + +print_success "Конфигурация msmtp создана" + +#------------------------------------------------------------------------------- +# 13.5 Настройка алиасов +#------------------------------------------------------------------------------- +print_subheader "Настройка алиасов" + +cat > /etc/aliases << EOF +# Почтовые алиасы +root: ${SMTP_FROM} +git: ${SMTP_FROM} +gitea: ${SMTP_FROM} +EOF + +newaliases 2>/dev/null || true +print_success "Алиасы настроены" + +#------------------------------------------------------------------------------- +# 13.6 Создание лог-файла +#------------------------------------------------------------------------------- +print_subheader "Создание лог-файла" + +touch /var/log/msmtp.log +chmod 644 /var/log/msmtp.log +print_success "Лог-файл создан" + +#------------------------------------------------------------------------------- +# 13.7 Тестовая отправка +#------------------------------------------------------------------------------- +print_subheader "Тестовая отправка письма" + +echo "" +read -p "Email для тестовой отправки: " TEST_EMAIL + +if [[ -n "$TEST_EMAIL" ]]; then + print_info "Отправка тестового письма на $TEST_EMAIL..." + + TEST_SUBJECT="Gitea Server Mail Test" + TEST_BODY="This is a test email from Gitea Server ($(hostname)). +Sent at: $(date) +SMTP Host: $SMTP_HOST +SMTP User: $SMTP_USER" + + if echo "$TEST_BODY" | mail -s "$TEST_SUBJECT" "$TEST_EMAIL"; then + print_success "Письмо отправлено. Проверьте почтовый ящик $TEST_EMAIL" + + # Показать лог + sleep 2 + if [[ -s /var/log/msmtp.log ]]; then + echo "" + echo "Лог отправки:" + tail -5 /var/log/msmtp.log + fi + else + print_error "Ошибка отправки письма" + echo "Проверьте лог: /var/log/msmtp.log" + fi +fi + +#------------------------------------------------------------------------------- +# 13.8 Настройка Gitea +#------------------------------------------------------------------------------- +print_subheader "Настройка Gitea" + +if [[ -f "$GITEA_CONFIG" ]]; then + # Backup + cp "$GITEA_CONFIG" "${GITEA_CONFIG}.backup.$(date +%Y%m%d_%H%M%S)" + + # Обновить или добавить секцию [mailer] + # Удаляем старую секцию mailer если есть + sed -i '/^\[mailer\]/,/^\[/{/^\[mailer\]/d;/^\[/!d}' "$GITEA_CONFIG" 2>/dev/null || true + + # Добавляем новую секцию + cat >> "$GITEA_CONFIG" << EOF + +[mailer] +ENABLED = true +PROTOCOL = sendmail +SENDMAIL_PATH = /usr/bin/msmtp +SENDMAIL_ARGS = "-t" +FROM = $SMTP_FROM +SUBJECT_PREFIX = [Gitea] +EOF + + print_success "Конфигурация Gitea обновлена" + + # Перезапуск Gitea + read -p "Перезапустить Gitea? [Y/n]: " RESTART_GITEA + RESTART_GITEA=${RESTART_GITEA:-Y} + + if [[ "$RESTART_GITEA" =~ ^[Yy]$ ]]; then + systemctl restart gitea + print_success "Gitea перезапущена" + fi +else + print_warning "Конфигурация Gitea не найдена: $GITEA_CONFIG" +fi + +#------------------------------------------------------------------------------- +# 13.9 Итог +#------------------------------------------------------------------------------- +echo "" +echo -e "${GREEN}============================================================${NC}" +echo -e "${GREEN} ПОЧТОВЫЙ СЕРВЕР НАСТРОЕН${NC}" +echo -e "${GREEN}============================================================${NC}" +echo "" +echo "SMTP сервер: $SMTP_HOST:$SMTP_PORT" +echo "Пользователь: $SMTP_USER" +echo "Отправитель: $SMTP_FROM" +echo "" +echo "Файлы конфигурации:" +echo " msmtp: /etc/msmtprc" +echo " aliases: /etc/aliases" +echo " log: /var/log/msmtp.log" +echo "" +echo "Тест отправки:" +echo " echo 'Test body' | mail -s 'Test subject' user@example.com" +echo "" +echo "Gitea настройки:" +echo " Mailer включён, использует msmtp" +echo "" + +print_success "Шаг 13 завершён: Почта настроена" diff --git a/02/02-k-git-server-deploy.14.sh b/02/02-k-git-server-deploy.14.sh new file mode 100755 index 0000000..a15f328 --- /dev/null +++ b/02/02-k-git-server-deploy.14.sh @@ -0,0 +1,275 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 14: НАСТРОЙКА LOGROTATE +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.14.sh +# +# Настраивает ротацию логов для: +# - Gitea +# - Nginx +# - msmtp +# - Скриптов установки +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 14: НАСТРОЙКА LOGROTATE" + +#------------------------------------------------------------------------------- +# 14.1 Проверка установки logrotate +#------------------------------------------------------------------------------- +print_subheader "Проверка logrotate" + +if is_installed logrotate; then + print_success "logrotate установлен" +else + print_info "Установка logrotate..." + apt install -y logrotate +fi + +#------------------------------------------------------------------------------- +# 14.2 Настройка ротации логов Gitea +#------------------------------------------------------------------------------- +print_subheader "Настройка ротации логов Gitea" + +GITEA_LOG_DIR="$GITEA_DATA/log" + +# Создаём директорию если нет +mkdir -p "$GITEA_LOG_DIR" +chown git:git "$GITEA_LOG_DIR" + +cat > /etc/logrotate.d/gitea << 'EOF' +# Logrotate configuration for Gitea +# Автоматически сгенерировано скриптом 02-k-git-server-deploy.14.sh + +/var/lib/gitea/log/*.log { + daily + missingok + rotate 14 + compress + delaycompress + notifempty + create 0640 git git + sharedscripts + postrotate + # Gitea не требует сигнала для reopening логов + # Она автоматически открывает новые файлы + endscript +} +EOF + +print_success "Конфигурация Gitea создана: /etc/logrotate.d/gitea" + +#------------------------------------------------------------------------------- +# 14.3 Настройка ротации логов Nginx +#------------------------------------------------------------------------------- +print_subheader "Настройка ротации логов Nginx" + +# Проверяем существующую конфигурацию (обычно уже есть) +if [[ -f /etc/logrotate.d/nginx ]]; then + print_info "Nginx logrotate уже настроен" + + # Показать текущую конфигурацию + echo "" + cat /etc/logrotate.d/nginx +else + cat > /etc/logrotate.d/nginx << 'EOF' +# Logrotate configuration for Nginx +# Автоматически сгенерировано скриптом 02-k-git-server-deploy.14.sh + +/var/log/nginx/*.log { + daily + missingok + rotate 14 + compress + delaycompress + notifempty + create 0640 www-data adm + sharedscripts + prerotate + if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ + run-parts /etc/logrotate.d/httpd-prerotate; \ + fi + endscript + postrotate + invoke-rc.d nginx rotate >/dev/null 2>&1 || true + endscript +} +EOF + + print_success "Конфигурация Nginx создана: /etc/logrotate.d/nginx" +fi + +#------------------------------------------------------------------------------- +# 14.4 Настройка ротации логов msmtp +#------------------------------------------------------------------------------- +print_subheader "Настройка ротации логов msmtp" + +# Создаём лог-файл если нет +touch /var/log/msmtp.log +chmod 644 /var/log/msmtp.log + +cat > /etc/logrotate.d/msmtp << 'EOF' +# Logrotate configuration for msmtp +# Автоматически сгенерировано скриптом 02-k-git-server-deploy.14.sh + +/var/log/msmtp.log { + weekly + missingok + rotate 8 + compress + delaycompress + notifempty + create 0644 root root +} +EOF + +print_success "Конфигурация msmtp создана: /etc/logrotate.d/msmtp" + +#------------------------------------------------------------------------------- +# 14.5 Настройка ротации логов установки +#------------------------------------------------------------------------------- +print_subheader "Настройка ротации логов установки" + +cat > /etc/logrotate.d/git-server-setup << 'EOF' +# Logrotate configuration for Git Server Setup Scripts +# Автоматически сгенерировано скриптом 02-k-git-server-deploy.14.sh + +/var/log/git-server-deploy.log +/var/log/server-setup.log +{ + monthly + missingok + rotate 6 + compress + delaycompress + notifempty + create 0644 root root +} +EOF + +print_success "Конфигурация setup logs создана: /etc/logrotate.d/git-server-setup" + +#------------------------------------------------------------------------------- +# 14.6 Настройка ротации логов Fail2ban +#------------------------------------------------------------------------------- +print_subheader "Настройка ротации логов Fail2ban" + +if is_installed fail2ban; then + # Проверяем существующую конфигурацию + if [[ -f /etc/logrotate.d/fail2ban ]]; then + print_info "Fail2ban logrotate уже настроен" + else + cat > /etc/logrotate.d/fail2ban << 'EOF' +# Logrotate configuration for Fail2ban +# Автоматически сгенерировано скриптом 02-k-git-server-deploy.14.sh + +/var/log/fail2ban.log { + weekly + missingok + rotate 8 + compress + delaycompress + notifempty + create 0640 root adm + postrotate + /usr/bin/fail2ban-client flushlogs >/dev/null 2>&1 || true + endscript +} +EOF + + print_success "Конфигурация Fail2ban создана: /etc/logrotate.d/fail2ban" + fi +else + print_info "Fail2ban не установлен, пропуск" +fi + +#------------------------------------------------------------------------------- +# 14.7 Тестирование конфигурации +#------------------------------------------------------------------------------- +print_subheader "Тестирование конфигурации" + +echo "Проверка всех конфигураций logrotate..." +echo "" + +ALL_OK=true + +for config in /etc/logrotate.d/gitea /etc/logrotate.d/nginx /etc/logrotate.d/msmtp /etc/logrotate.d/git-server-setup; do + if [[ -f "$config" ]]; then + if logrotate -d "$config" 2>&1 | head -5; then + echo -e " $(basename $config): ${GREEN}OK${NC}" + else + echo -e " $(basename $config): ${RED}ERROR${NC}" + ALL_OK=false + fi + fi +done + +echo "" + +if $ALL_OK; then + print_success "Все конфигурации валидны" +else + print_warning "Есть ошибки в конфигурациях" +fi + +#------------------------------------------------------------------------------- +# 14.8 Принудительный запуск (опционально) +#------------------------------------------------------------------------------- +print_subheader "Тестовый запуск" + +echo "Logrotate запускается автоматически через cron.daily" +echo "" +echo "Текущее расписание:" +if [[ -f /etc/cron.daily/logrotate ]]; then + echo " /etc/cron.daily/logrotate - запускается ежедневно" +fi +echo "" + +read -p "Запустить logrotate сейчас (dry-run)? [y/N]: " RUN_NOW + +if [[ "$RUN_NOW" =~ ^[Yy]$ ]]; then + print_info "Dry-run всех логов..." + logrotate -v /etc/logrotate.conf 2>&1 | tail -30 +fi + +#------------------------------------------------------------------------------- +# 14.9 Итог +#------------------------------------------------------------------------------- +echo "" +echo -e "${GREEN}============================================================${NC}" +echo -e "${GREEN} LOGROTATE НАСТРОЕН${NC}" +echo -e "${GREEN}============================================================${NC}" +echo "" +echo "Настроена ротация логов:" +echo "" +echo " Gitea: /var/lib/gitea/log/*.log" +echo " Ротация: ежедневно, хранить 14 дней" +echo "" +echo " Nginx: /var/log/nginx/*.log" +echo " Ротация: ежедневно, хранить 14 дней" +echo "" +echo " msmtp: /var/log/msmtp.log" +echo " Ротация: еженедельно, хранить 8 недель" +echo "" +echo " Setup scripts: /var/log/git-server-deploy.log" +echo " /var/log/server-setup.log" +echo " Ротация: ежемесячно, хранить 6 месяцев" +echo "" +echo "Конфигурационные файлы:" +echo " /etc/logrotate.d/gitea" +echo " /etc/logrotate.d/nginx" +echo " /etc/logrotate.d/msmtp" +echo " /etc/logrotate.d/git-server-setup" +echo "" +echo "Полезные команды:" +echo " Тест: logrotate -d /etc/logrotate.d/gitea" +echo " Принудительно: logrotate -f /etc/logrotate.conf" +echo " Статус: cat /var/lib/logrotate/status" +echo "" + +print_success "Шаг 14 завершён: Logrotate настроен" diff --git a/02/02-k-git-server-deploy.99.sh b/02/02-k-git-server-deploy.99.sh new file mode 100755 index 0000000..cae27ea --- /dev/null +++ b/02/02-k-git-server-deploy.99.sh @@ -0,0 +1,184 @@ +#!/bin/bash +#=============================================================================== +# ШАГ 99: ФИНАЛЬНАЯ ПРОВЕРКА +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.99.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +print_header "ШАГ 99: ФИНАЛЬНАЯ ПРОВЕРКА" + +echo "" +echo -e "${BLUE}================================================================${NC}" +echo -e "${BLUE} ПРОВЕРКА КОМПОНЕНТОВ СИСТЕМЫ${NC}" +echo -e "${BLUE}================================================================${NC}" + +#------------------------------------------------------------------------------- +# Проверка сервисов +#------------------------------------------------------------------------------- +echo "" +echo "Статус сервисов:" +echo "" + +# Gitea +if service_running gitea; then + echo -e " Gitea: ${GREEN}OK${NC} (port 3000)" +else + echo -e " Gitea: ${RED}FAILED${NC}" +fi + +# Nginx +if service_running nginx; then + echo -e " Nginx: ${GREEN}OK${NC} (ports 80, 443)" +else + echo -e " Nginx: ${RED}FAILED${NC}" +fi + +# SSH +if service_running sshd || service_running ssh; then + echo -e " SSH: ${GREEN}OK${NC} (port 22)" +else + echo -e " SSH: ${RED}FAILED${NC}" +fi + +# Certbot timer +if service_running certbot.timer; then + echo -e " Certbot: ${GREEN}OK${NC} (auto-renewal)" +else + echo -e " Certbot: ${YELLOW}WARNING${NC} (timer not running)" +fi + +#------------------------------------------------------------------------------- +# Проверка SSL +#------------------------------------------------------------------------------- +echo "" +echo "SSL-сертификат:" + +CERT_PATH="/etc/letsencrypt/live/$GIT_DOMAIN/fullchain.pem" +if [[ -f "$CERT_PATH" ]]; then + EXPIRE=$(openssl x509 -enddate -noout -in "$CERT_PATH" 2>/dev/null | cut -d= -f2) + ISSUER=$(openssl x509 -issuer -noout -in "$CERT_PATH" 2>/dev/null | cut -d= -f2) + echo -e " Статус: ${GREEN}OK${NC}" + echo " Истекает: $EXPIRE" + echo " Издатель: $ISSUER" +else + echo -e " Статус: ${RED}НЕ НАЙДЕН${NC}" +fi + +#------------------------------------------------------------------------------- +# Проверка DNS +#------------------------------------------------------------------------------- +echo "" +echo "DNS:" + +if host $GIT_DOMAIN &>/dev/null; then + GIT_IP=$(host $GIT_DOMAIN | head -1 | awk '{print $NF}') + echo -e " $GIT_DOMAIN: ${GREEN}$GIT_IP${NC}" +else + echo -e " $GIT_DOMAIN: ${RED}НЕ РЕЗОЛВИТСЯ${NC}" +fi + +#------------------------------------------------------------------------------- +# Проверка доступности +#------------------------------------------------------------------------------- +echo "" +echo "Доступность:" + +# HTTP check +if curl -sI "http://$GIT_DOMAIN" 2>/dev/null | head -1 | grep -q "200\|301"; then + echo -e " HTTP: ${GREEN}OK${NC}" +else + echo -e " HTTP: ${YELLOW}CHECK MANUALLY${NC}" +fi + +# HTTPS check +if curl -skI "https://$GIT_DOMAIN" 2>/dev/null | head -1 | grep -q "200"; then + echo -e " HTTPS: ${GREEN}OK${NC}" +else + echo -e " HTTPS: ${YELLOW}CHECK MANUALLY${NC}" +fi + +# Gitea API check +if curl -s "http://localhost:3000/api/v1/version" 2>/dev/null | grep -q "version"; then + echo -e " Gitea API: ${GREEN}OK${NC}" +else + echo -e " Gitea API: ${YELLOW}CHECK MANUALLY${NC}" +fi + +#------------------------------------------------------------------------------- +# Проверка firewall +#------------------------------------------------------------------------------- +echo "" +echo "Firewall (nftables):" + +if nft list table inet filter &>/dev/null; then + OPEN_PORTS=$(nft list table inet filter 2>/dev/null | grep "dport" | grep -oE "dport [0-9]+" | sort -u | tr '\n' ' ') + echo -e " Статус: ${GREEN}OK${NC}" + echo " Открытые: $OPEN_PORTS" +else + echo -e " Статус: ${YELLOW}НЕ НАСТРОЕН${NC}" +fi + +#------------------------------------------------------------------------------- +# Проверка скриптов +#------------------------------------------------------------------------------- +echo "" +echo "Скрипты:" + +if [[ -x /usr/local/bin/gitea-backup.sh ]]; then + echo -e " backup: ${GREEN}OK${NC}" +else + echo -e " backup: ${RED}MISSING${NC}" +fi + +if [[ -x /usr/local/bin/gitea-restore.sh ]]; then + echo -e " restore: ${GREEN}OK${NC}" +else + echo -e " restore: ${RED}MISSING${NC}" +fi + +if [[ -x /usr/local/bin/gitea-to-github.sh ]]; then + echo -e " to-github: ${GREEN}OK${NC}" +else + echo -e " to-github: ${RED}MISSING${NC}" +fi + +#------------------------------------------------------------------------------- +# Итоговая информация +#------------------------------------------------------------------------------- +echo "" +echo -e "${GREEN}================================================================${NC}" +echo -e "${GREEN} РАЗВЁРТЫВАНИЕ ЗАВЕРШЕНО${NC}" +echo -e "${GREEN}================================================================${NC}" +echo "" +echo "Веб-интерфейс: https://$GIT_DOMAIN" +echo "SSH git clone: git clone git@$GIT_DOMAIN:user/repo.git" +echo "HTTPS git clone: git clone https://$GIT_DOMAIN/user/repo.git" +echo "" + +if [[ -f /root/.gitea-admin-credentials ]]; then + echo "Администратор: см. /root/.gitea-admin-credentials" +else + echo "Администратор: создайте через веб-интерфейс" +fi + +echo "" +echo "Полезные команды:" +echo " Статус Gitea: systemctl status gitea" +echo " Логи Gitea: journalctl -u gitea -f" +echo " Бэкап: /usr/local/bin/gitea-backup.sh" +echo " Восстановление: /usr/local/bin/gitea-restore.sh /path/to/backup" +echo "" +echo "Следующие шаги:" +echo " 1. Войдите в веб-интерфейс: https://$GIT_DOMAIN" +echo " 2. Смените пароль администратора" +echo " 3. Создайте пользователей" +echo " 4. Добавьте SSH-ключи пользователей" +echo " 5. Создайте репозитории" +echo " 6. Настройте NFS для бэкапов (опционально)" +echo "" diff --git a/02/02-k-git-server-deploy.all.sh b/02/02-k-git-server-deploy.all.sh new file mode 100755 index 0000000..05f8d0b --- /dev/null +++ b/02/02-k-git-server-deploy.all.sh @@ -0,0 +1,155 @@ +#!/bin/bash +#=============================================================================== +# ГЛАВНЫЙ СКРИПТ: ЗАПУСК ВСЕХ ШАГОВ +#=============================================================================== +# Запуск: sudo bash 02-k-git-server-deploy.all.sh [step_number] +# +# Без аргументов - запуск всех шагов по порядку +# С номером шага - запуск конкретного шага +# +# Примеры: +# sudo bash 02-k-git-server-deploy.all.sh # все шаги +# sudo bash 02-k-git-server-deploy.all.sh 7 # только шаг 7 +# sudo bash 02-k-git-server-deploy.all.sh 7-9 # шаги с 7 по 9 +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +init_log +check_root + +#------------------------------------------------------------------------------- +# Список шагов +#------------------------------------------------------------------------------- +declare -A STEPS=( + ["01"]="Подготовка системы" + ["02"]="Создание пользователя git" + ["03"]="Установка Gitea" + ["04"]="Systemd unit" + ["05"]="Конфигурация Gitea" + ["06"]="Запуск Gitea" + ["07"]="Nginx (HTTP only)" + ["08"]="SSL-сертификат" + ["09"]="Nginx (HTTPS)" + ["10"]="Firewall" + ["11"]="Администратор Gitea" + ["12"]="Скрипты бэкапа" + ["13"]="Настройка почты (msmtp)" + ["14"]="Настройка logrotate" + ["99"]="Финальная проверка" +) + +#------------------------------------------------------------------------------- +# Функция запуска шага +#------------------------------------------------------------------------------- +run_step() { + local step="$1" + local script="$SCRIPT_DIR/02-k-git-server-deploy.${step}.sh" + + if [[ ! -f "$script" ]]; then + print_error "Скрипт не найден: $script" + return 1 + fi + + print_header "ЗАПУСК ШАГА ${step}: ${STEPS[$step]}" + + if bash "$script"; then + print_success "Шаг $step завершён успешно" + return 0 + else + print_error "Шаг $step завершился с ошибкой" + return 1 + fi +} + +#------------------------------------------------------------------------------- +# Обработка аргументов +#------------------------------------------------------------------------------- +if [[ -n "$1" ]]; then + # Запуск конкретного шага или диапазона + + if [[ "$1" =~ ^([0-9]+)-([0-9]+)$ ]]; then + # Диапазон шагов (например, 7-9) + START_STEP="${BASH_REMATCH[1]}" + END_STEP="${BASH_REMATCH[2]}" + + print_info "Запуск шагов с $START_STEP по $END_STEP" + + for step in "${!STEPS[@]}"; do + if [[ "$step" -ge "$START_STEP" && "$step" -le "$END_STEP" ]]; then + run_step "$step" || exit 1 + fi + done | sort + + elif [[ "$1" =~ ^[0-9]+$ ]]; then + # Один шаг + run_step "$1" || exit 1 + else + print_error "Неверный аргумент: $1" + echo "Использование: $0 [step_number|start-end]" + echo " $0 - все шаги" + echo " $0 7 - только шаг 7" + echo " $0 7-9 - шаги с 7 по 9" + exit 1 + fi + +else + # Запуск всех шагов + + echo "" + echo -e "${BLUE}================================================================${NC}" + echo -e "${BLUE} ПОЛНЫЙ ЗАПУСК РАЗВЁРТЫВАНИЯ GIT-СЕРВЕРА${NC}" + echo -e "${BLUE}================================================================${NC}" + echo "" + echo "Будут выполнены следующие шаги:" + echo "" + + for step in $(echo "${!STEPS[@]}" | tr ' ' '\n' | sort); do + echo " [$step] ${STEPS[$step]}" + done + + echo "" + read -p "Начать развёртывание? [y/N]: " CONFIRM + + if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then + echo "Отменено." + exit 0 + fi + + # Запуск шагов по порядку + FAILED_STEPS=() + + for step in $(echo "${!STEPS[@]}" | tr ' ' '\n' | sort); do + echo "" + echo -e "${CYAN}============================================================${NC}" + echo -e "${CYAN} ШАГ $step: ${STEPS[$step]}${NC}" + echo -e "${CYAN}============================================================${NC}" + + if run_step "$step"; then + : + else + FAILED_STEPS+=("$step") + echo "" + read -p "Продолжить со следующим шагом? [y/N]: " CONTINUE + if [[ ! "$CONTINUE" =~ ^[Yy]$ ]]; then + break + fi + fi + done + + # Итог + echo "" + echo -e "${BLUE}================================================================${NC}" + echo -e "${BLUE} ИТОГ ВЫПОЛНЕНИЯ${NC}" + echo -e "${BLUE}================================================================${NC}" + + if [[ ${#FAILED_STEPS[@]} -eq 0 ]]; then + echo -e "${GREEN}Все шаги выполнены успешно!${NC}" + else + echo -e "${RED}Завершились с ошибкой: ${FAILED_STEPS[*]}${NC}" + echo "" + echo "Для повторного запуска конкретного шага:" + echo " sudo bash $0 <номер_шага>" + fi +fi diff --git a/02/02-k-git-server-deploy.help.sh b/02/02-k-git-server-deploy.help.sh new file mode 100755 index 0000000..06f0216 --- /dev/null +++ b/02/02-k-git-server-deploy.help.sh @@ -0,0 +1,95 @@ +#!/bin/bash +#=============================================================================== +# СПРАВКА ПО СКРИПТАМ РАЗВЁРТЫВАНИЯ GIT-СЕРВЕРА +#=============================================================================== +# Запуск: bash 02-k-git-server-deploy.help.sh +#=============================================================================== + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" + +echo "" +echo -e "${BLUE}================================================================${NC}" +echo -e "${BLUE} СПРАВКА ПО СКРИПТАМ РАЗВЁРТЫВАНИЯ GIT-СЕРВЕРА${NC}" +echo -e "${BLUE}================================================================${NC}" +echo "" + +echo "СТРУКТУРА ФАЙЛОВ:" +echo "" +echo " 00.sh - Конфигурация и функции (подключается автоматически)" +echo " 01.sh - Подготовка системы" +echo " 02.sh - Создание пользователя git" +echo " 03.sh - Установка Gitea" +echo " 04.sh - Systemd unit" +echo " 05.sh - Конфигурация Gitea" +echo " 06.sh - Запуск Gitea" +echo " 07.sh - Nginx (HTTP only)" +echo " 08.sh - SSL-сертификат" +echo " 09.sh - Nginx (HTTPS)" +echo " 10.sh - Firewall" +echo " 11.sh - Администратор Gitea" +echo " 12.sh - Скрипты бэкапа" +echo " 13.sh - Настройка почты (msmtp)" +echo " 14.sh - Настройка logrotate" +echo " 99.sh - Финальная проверка" +echo " all.sh - Запуск всех шагов" +echo "" + +echo "ИСПОЛЬЗОВАНИЕ:" +echo "" +echo " Полный запуск:" +echo " sudo bash 02-k-git-server-deploy.all.sh" +echo "" +echo " Конкретный шаг:" +echo " sudo bash 02-k-git-server-deploy.07.sh" +echo "" +echo " Диапазон шагов:" +echo " sudo bash 02-k-git-server-deploy.all.sh 7-9" +echo "" + +echo "ВАЖНЫЕ МОМЕНТЫ:" +echo "" +echo " 1. Сначала отредактируйте 00.sh - укажите свои параметры:" +echo " GIT_DOMAIN, CERT_EMAIL, GITEA_ADMIN, GITEA_ADMIN_EMAIL," +echo " IFACE_EXT, IFACE_INT" +echo "" +echo " 2. Порядок важен! Сертификаты (08) получаются ДО активации HTTPS (09)" +echo "" +echo " 3. При ошибках - можно перезапустить конкретный шаг" +echo "" + +echo "ПОЛЕЗНЫЕ КОМАНДЫ:" +echo "" +echo " Проверка Gitea: systemctl status gitea" +echo " Логи Gitea: journalctl -u gitea -f" +echo " Проверка Nginx: nginx -t" +echo " Статус firewall: nft list ruleset" +echo " Создать бэкап: /usr/local/bin/gitea-backup.sh" +echo " Статус logrotate: cat /var/lib/logrotate/status" +echo "" + +echo "УСТРАНЕНИЕ ПРОБЛЕМ:" +echo "" +echo " Gitea не запускается:" +echo " sudo systemctl stop gitea" +echo " sudo -u git GITEA_WORK_DIR=/var/lib/gitea /usr/local/bin/gitea web --config /etc/gitea/app.ini" +echo "" +echo " Ошибка SSH-ключей (read-only file system):" +echo " sudo mkdir -p /home/git/.ssh" +echo " sudo chmod 700 /home/git/.ssh" +echo " sudo chown git:git /home/git/.ssh" +echo "" +echo " SSL не получается:" +echo " Проверьте DNS: dig git.example.com" +echo " Проверьте порт 80: curl -I http://git.example.com" +echo "" +echo " Почта не отправляется:" +echo " Проверьте лог: tail -f /var/log/msmtp.log" +echo " Проверьте конфиг: cat /etc/msmtprc" +echo " Тест: echo 'Test' | mail -s 'Test' user@example.com" +echo "" + +echo "ЛОГИ:" +echo "" +echo " Лог установки: /var/log/git-server-deploy.log" +echo "" diff --git a/README.md b/README.md index 086aa11..d268d92 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,17 @@ -# gitserver - -Установка и настройка минимально GIT-сервера \ No newline at end of file +# Установка и настройка минимально **GIT-сервера** + +1. Первоначальная настройка сервера *Ubuntu 24* (устанавливаем сервер из ISO в минимальной конфигурации) +2. Установка и настройка сервисов + +------ + +1. Скрипты для настройки сервера в "**01**" + + все настройки нужно сделать в `01-k-server-initial-setup.00.sh` + +2. Скрипты для настройки сервисов в "**02**" + + все настройки нужно сделать в `02-k-git-server-deploy.00.sh` + +------ +