====== Автоматическая настройка новой машины Ubuntu ======
===== Описание =====
Данный скрипт автоматически выполняет первичную настройку новой машины Ubuntu, включая:
* Обновление системы
* Изменение hostname
* Установку Docker и Docker Compose
* Настройку пользователя для работы с Docker
**Требования:** Ubuntu 18.04+ с правами sudo
===== Быстрый запуск =====
==== Метод 1: Скачивание и запуск одной командой ====
curl -fsSL https://raw.githubusercontent.com/your-repo/setup-new-machine.sh -o setup-new-machine.sh && chmod +x setup-new-machine.sh && ./setup-new-machine.sh
==== Метод 2: Пошаговое скачивание ====
# Скачать скрипт
wget https://raw.githubusercontent.com/your-repo/setup-new-machine.sh
# Или используя curl
curl -O https://raw.githubusercontent.com/your-repo/setup-new-machine.sh
# Сделать исполняемым
chmod +x setup-new-machine.sh
# Запустить
./setup-new-machine.sh
==== Метод 3: Создание скрипта вручную ====
# Создать файл скрипта
nano setup-new-machine.sh
# Скопировать содержимое скрипта (см. ниже)
# Сохранить файл (Ctrl+X, Y, Enter)
# Сделать исполняемым
chmod +x setup-new-machine.sh
# Запустить
./setup-new-machine.sh
===== Полный код скрипта =====
Сохраните данный код в файл **setup-new-machine.sh**
#!/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 "$@"
===== Подробная инструкция по использованию =====
==== Шаг 1: Подготовка ====
- Убедитесь, что у вас есть права **sudo** на машине
- Проверьте подключение к интернету
- Рекомендуется выполнять на чистой установке Ubuntu
==== Шаг 2: Получение скрипта ====
**Вариант A: Прямое скачивание**
wget https://your-domain.com/setup-new-machine.sh
**Вариант B: Создание через curl**
curl -fsSL https://your-domain.com/setup-new-machine.sh -o setup-new-machine.sh
**Вариант C: Создание вручную**
nano setup-new-machine.sh
# Вставить содержимое скрипта из раздела выше
# Сохранить: Ctrl+X, затем Y, затем Enter
==== Шаг 3: Запуск скрипта ====
# Сделать файл исполняемым
chmod +x setup-new-machine.sh
# Запустить скрипт
./setup-new-machine.sh
==== Шаг 4: Следование инструкциям ====
- Скрипт запросит новое **имя хоста** (hostname)
- Введите желаемое имя (например: **web-server-01**)
- Подтвердите продолжение установки
- Дождитесь завершения всех операций
**Рекомендуемые форматы hostname:**
* web-server-01
* app-prod-01
* db-master-01
* dev-machine
==== Шаг 5: Завершение ====
После выполнения скрипта **обязательно**:
- Перелогиньтесь в системе, или
- Выполните: newgrp docker, или
- Перезагрузите систему: sudo reboot
===== Что делает скрипт =====
^ Действие ^ Описание ^ Команды ^
| **Обновление системы** | Обновляет все пакеты до актуальных версий | ''apt update && apt upgrade'' |
| **Смена hostname** | Устанавливает новое имя хоста | ''hostnamectl set-hostname'' |
| **Настройка /etc/hosts** | Добавляет запись для нового hostname | ''echo "127.0.1.1 hostname" >> /etc/hosts'' |
| **Установка пакетов** | Устанавливает зависимости для Docker | ''apt install ca-certificates curl gnupg'' |
| **Добавление репозитория** | Подключает официальный репозиторий Docker | ''curl + gpg + tee'' |
| **Установка Docker** | Устанавливает Docker Engine и Compose | ''apt install docker-ce docker-compose-plugin'' |
| **Настройка пользователя** | Добавляет пользователя в группу docker | ''usermod -aG docker'' |
===== Проверка результата =====
После перелогинивания проверьте установку:
# Проверка hostname
hostname
# Проверка Docker
docker --version
docker compose version
# Проверка работы Docker без sudo
docker run hello-world
===== Устранение проблем =====
==== Docker требует sudo ====
Если Docker требует sudo, выполните:
# Проверить членство в группе
groups $USER
# Если группы docker нет, добавить вручную
sudo usermod -aG docker $USER
# Применить изменения
newgrp docker
# ИЛИ перелогиниться
==== Ошибка при изменении hostname ====
# Проверить текущий hostname
hostnamectl status
# Установить вручную
sudo hostnamectl set-hostname your-new-hostname
# Проверить файл hosts
sudo nano /etc/hosts
==== Проблемы с репозиторием Docker ====
# Очистить старые ключи
sudo rm -f /etc/apt/keyrings/docker.gpg
# Добавить ключ заново
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Обновить пакеты
sudo apt update
===== Дополнительные возможности =====
==== Автоматический запуск без вопросов ====
Для автоматической установки с предустановленным hostname:
# Создать версию с предустановленным именем
export NEW_HOSTNAME="my-server-01"
./setup-new-machine.sh
==== Логирование процесса ====
# Запуск с сохранением логов
./setup-new-machine.sh 2>&1 | tee setup-log.txt
===== Заключение =====
Данный скрипт значительно упрощает процесс первичной настройки новой машины Ubuntu и установки Docker. После его выполнения система готова для:
* Разработки приложений в контейнерах
* Развертывания Docker Compose проектов
* Работы с Docker без прав root
* Корректной идентификации в сети по hostname
**Время выполнения:** 5-15 минут (в зависимости от скорости интернета)