initial commit
This commit is contained in:
366
01/01-k-server-initial-setup.00.sh
Executable file
366
01/01-k-server-initial-setup.00.sh
Executable file
@@ -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 ""
|
||||||
|
}
|
||||||
63
01/01-k-server-initial-setup.01.sh
Executable file
63
01/01-k-server-initial-setup.01.sh
Executable file
@@ -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 завершён: Базовая настройка выполнена"
|
||||||
168
01/01-k-server-initial-setup.02.sh
Executable file
168
01/01-k-server-initial-setup.02.sh
Executable file
@@ -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 завершён: Сеть настроена"
|
||||||
50
01/01-k-server-initial-setup.03.sh
Executable file
50
01/01-k-server-initial-setup.03.sh
Executable file
@@ -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 завершён: Система обновлена"
|
||||||
81
01/01-k-server-initial-setup.04.sh
Executable file
81
01/01-k-server-initial-setup.04.sh
Executable file
@@ -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 завершён: Базовые пакеты установлены"
|
||||||
84
01/01-k-server-initial-setup.05.sh
Executable file
84
01/01-k-server-initial-setup.05.sh
Executable file
@@ -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 завершён: Администратор создан"
|
||||||
141
01/01-k-server-initial-setup.06.sh
Executable file
141
01/01-k-server-initial-setup.06.sh
Executable file
@@ -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 настроен (только ключи)"
|
||||||
143
01/01-k-server-initial-setup.07.sh
Executable file
143
01/01-k-server-initial-setup.07.sh
Executable file
@@ -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 настроен"
|
||||||
87
01/01-k-server-initial-setup.08.sh
Executable file
87
01/01-k-server-initial-setup.08.sh
Executable file
@@ -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 настроен"
|
||||||
104
01/01-k-server-initial-setup.09.sh
Executable file
104
01/01-k-server-initial-setup.09.sh
Executable file
@@ -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 настроен"
|
||||||
161
01/01-k-server-initial-setup.99.sh
Executable file
161
01/01-k-server-initial-setup.99.sh
Executable file
@@ -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 ""
|
||||||
151
01/01-k-server-initial-setup.all.sh
Executable file
151
01/01-k-server-initial-setup.all.sh
Executable file
@@ -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
|
||||||
85
01/01-k-server-initial-setup.help.sh
Executable file
85
01/01-k-server-initial-setup.help.sh
Executable file
@@ -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 ""
|
||||||
380
02/02-k-git-server-deploy.00.sh
Executable file
380
02/02-k-git-server-deploy.00.sh
Executable file
@@ -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
|
||||||
46
02/02-k-git-server-deploy.01.sh
Executable file
46
02/02-k-git-server-deploy.01.sh
Executable file
@@ -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 завершён: Система подготовлена"
|
||||||
52
02/02-k-git-server-deploy.02.sh
Executable file
52
02/02-k-git-server-deploy.02.sh
Executable file
@@ -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 завершён: Пользователь и директории созданы"
|
||||||
59
02/02-k-git-server-deploy.03.sh
Executable file
59
02/02-k-git-server-deploy.03.sh
Executable file
@@ -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 установлена"
|
||||||
67
02/02-k-git-server-deploy.04.sh
Executable file
67
02/02-k-git-server-deploy.04.sh
Executable file
@@ -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 создан"
|
||||||
126
02/02-k-git-server-deploy.05.sh
Executable file
126
02/02-k-git-server-deploy.05.sh
Executable file
@@ -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 создана"
|
||||||
62
02/02-k-git-server-deploy.06.sh
Executable file
62
02/02-k-git-server-deploy.06.sh
Executable file
@@ -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 запущена"
|
||||||
107
02/02-k-git-server-deploy.07.sh
Executable file
107
02/02-k-git-server-deploy.07.sh
Executable file
@@ -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)"
|
||||||
132
02/02-k-git-server-deploy.08.sh
Executable file
132
02/02-k-git-server-deploy.08.sh
Executable file
@@ -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-сертификат получен"
|
||||||
148
02/02-k-git-server-deploy.09.sh
Executable file
148
02/02-k-git-server-deploy.09.sh
Executable file
@@ -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 активирован"
|
||||||
138
02/02-k-git-server-deploy.10.sh
Executable file
138
02/02-k-git-server-deploy.10.sh
Executable file
@@ -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 настроен"
|
||||||
105
02/02-k-git-server-deploy.11.sh
Executable file
105
02/02-k-git-server-deploy.11.sh
Executable file
@@ -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 завершён: Администратор создан"
|
||||||
303
02/02-k-git-server-deploy.12.sh
Executable file
303
02/02-k-git-server-deploy.12.sh
Executable file
@@ -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 завершён: Скрипты бэкапа созданы"
|
||||||
278
02/02-k-git-server-deploy.13.sh
Executable file
278
02/02-k-git-server-deploy.13.sh
Executable file
@@ -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 завершён: Почта настроена"
|
||||||
275
02/02-k-git-server-deploy.14.sh
Executable file
275
02/02-k-git-server-deploy.14.sh
Executable file
@@ -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 настроен"
|
||||||
184
02/02-k-git-server-deploy.99.sh
Executable file
184
02/02-k-git-server-deploy.99.sh
Executable file
@@ -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 ""
|
||||||
155
02/02-k-git-server-deploy.all.sh
Executable file
155
02/02-k-git-server-deploy.all.sh
Executable file
@@ -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
|
||||||
95
02/02-k-git-server-deploy.help.sh
Executable file
95
02/02-k-git-server-deploy.help.sh
Executable file
@@ -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 ""
|
||||||
18
README.md
18
README.md
@@ -1,3 +1,17 @@
|
|||||||
# gitserver
|
# Установка и настройка минимально **GIT-сервера**
|
||||||
|
|
||||||
|
1. Первоначальная настройка сервера *Ubuntu 24* (устанавливаем сервер из ISO в минимальной конфигурации)
|
||||||
|
2. Установка и настройка сервисов
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
1. Скрипты для настройки сервера в "**01**"
|
||||||
|
|
||||||
|
все настройки нужно сделать в `01-k-server-initial-setup.00.sh`
|
||||||
|
|
||||||
|
2. Скрипты для настройки сервисов в "**02**"
|
||||||
|
|
||||||
|
все настройки нужно сделать в `02-k-git-server-deploy.00.sh`
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
Установка и настройка минимально GIT-сервера
|
|
||||||
Reference in New Issue
Block a user