#!/bin/bash # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Функция для вывода сообщений print_message() { echo -e "${GREEN}[INFO]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } print_step() { echo -e "${BLUE}[STEP]${NC} $1" } # Функция для обновления /etc/hosts update_hosts_file() { local new_hostname="$1" local hosts_file="/etc/hosts" print_step "Обновление файла $hosts_file" # Создаем резервную копию sudo cp "$hosts_file" "${hosts_file}.backup.$(date +%Y%m%d_%H%M%S)" print_message "Создана резервная копия: ${hosts_file}.backup.$(date +%Y%m%d_%H%M%S)" # Добавляем новую запись в /etc/hosts если её нет if ! grep -q "127.0.1.1.*$new_hostname" "$hosts_file"; then echo "127.0.1.1 $new_hostname" | sudo tee -a "$hosts_file" > /dev/null print_message "Добавлена запись в $hosts_file: 127.0.1.1 $new_hostname" else print_warning "Запись для $new_hostname уже существует в $hosts_file" fi } # Проверка прав root check_sudo() { if ! sudo -n true 2>/dev/null; then print_error "Для выполнения скрипта необходимы права sudo" exit 1 fi } # Основная функция main() { clear echo -e "${GREEN}=================================${NC}" echo -e "${GREEN} Скрипт настройки новой машины ${NC}" echo -e "${GREEN}=================================${NC}" echo "" # Проверка sudo check_sudo # Получение текущего пользователя CURRENT_USER=$(whoami) print_message "Текущий пользователь: $CURRENT_USER" # Запрос нового hostname echo "" read -p "Введите новое имя хоста (hostname): " NEW_HOSTNAME # Проверка что hostname не пустой if [[ -z "$NEW_HOSTNAME" ]]; then print_error "Имя хоста не может быть пустым!" exit 1 fi # Проверка формата hostname if [[ ! "$NEW_HOSTNAME" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$ ]]; then print_error "Недопустимый формат hostname! Используйте только буквы, цифры и дефисы." exit 1 fi echo "" print_message "Будет установлено имя хоста: $NEW_HOSTNAME" read -p "Продолжить? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then print_message "Установка отменена пользователем" exit 0 fi echo "" print_step "Начинаем настройку системы..." # 1. Обновление системы print_step "Обновление системы" sudo apt update && sudo apt upgrade -y if [[ $? -eq 0 ]]; then print_message "Система успешно обновлена" else print_error "Ошибка при обновлении системы" exit 1 fi # 2. Установка нового hostname print_step "Установка нового hostname: $NEW_HOSTNAME" sudo hostnamectl set-hostname "$NEW_HOSTNAME" if [[ $? -eq 0 ]]; then print_message "Hostname успешно изменен на: $NEW_HOSTNAME" else print_error "Ошибка при изменении hostname" exit 1 fi # 3. Обновление файла /etc/hosts update_hosts_file "$NEW_HOSTNAME" # 4. Установка необходимых пакетов для Docker print_step "Установка необходимых пакетов" sudo apt install -y ca-certificates curl gnupg lsb-release if [[ $? -eq 0 ]]; then print_message "Необходимые пакеты установлены" else print_error "Ошибка при установке пакетов" exit 1 fi # 5. Добавление GPG ключа Docker и репозитория print_step "Добавление официального GPG ключа Docker" sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg print_step "Добавление репозитория Docker" echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 6. Установка Docker Engine и Docker Compose print_step "Обновление пакетов и установка Docker" sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin if [[ $? -eq 0 ]]; then print_message "Docker успешно установлен" else print_error "Ошибка при установке Docker" exit 1 fi # 7. Добавление пользователя в группу docker print_step "Добавление пользователя $CURRENT_USER в группу docker" sudo usermod -aG docker "$CURRENT_USER" if [[ $? -eq 0 ]]; then print_message "Пользователь $CURRENT_USER добавлен в группу docker" else print_error "Ошибка при добавлении пользователя в группу docker" exit 1 fi # 8. Проверка установки Docker print_step "Проверка версии Docker" docker --version 2>/dev/null if [[ $? -eq 0 ]]; then print_message "Docker установлен корректно" else print_warning "Docker установлен, но требуется перелогинивание для применения прав доступа" fi # Завершение echo "" echo -e "${GREEN}=================================${NC}" echo -e "${GREEN} Установка завершена! ${NC}" echo -e "${GREEN}=================================${NC}" echo "" print_message "Выполнены следующие действия:" echo " ✓ Система обновлена" echo " ✓ Hostname изменен на: $NEW_HOSTNAME" echo " ✓ Файл /etc/hosts обновлен" echo " ✓ Docker и Docker Compose установлены" echo " ✓ Пользователь $CURRENT_USER добавлен в группу docker" echo "" print_warning "ВАЖНО: Для применения всех изменений необходимо:" echo " 1. Перелогиниться в системе (выход и вход)" echo " 2. Или выполнить команду: newgrp docker" echo " 3. Или перезагрузить систему: sudo reboot" echo "" read -p "Хотите перезагрузить систему сейчас? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then print_message "Перезагружаем систему..." sudo reboot else print_message "Не забудьте перелогиниться для применения изменений!" echo "Для проверки Docker выполните: docker --version" fi } # Обработка сигналов для корректного завершения trap 'print_error "Скрипт прерван пользователем"; exit 1' INT TERM # Запуск основной функции main "$@"