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

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