initial commit

This commit is contained in:
unknown
2026-02-19 20:05:04 +03:00
parent 1ee67d8159
commit 05097d5dda
32 changed files with 4413 additions and 3 deletions

View 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 ""
}

View 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 завершён: Базовая настройка выполнена"

View 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 завершён: Сеть настроена"

View 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 завершён: Система обновлена"

View 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 завершён: Базовые пакеты установлены"

View 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 завершён: Администратор создан"

View 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 настроен (только ключи)"

View 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 настроен"

View 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 настроен"

View 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 настроен"

View 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 ""

View 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

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

View 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 ""

View File

@@ -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-сервера