Это старая версия документа!
# Автоматическая настройка новой машины Ubuntu
## Описание
Данный скрипт автоматически выполняет первичную настройку новой машины Ubuntu, включая: * Обновление системы * Изменение hostname * Установку Docker и Docker Compose * Настройку пользователя для работы с Docker
Требования: Ubuntu 18.04+ с правами sudo
## Быстрый запуск
### Метод 1: Скачивание и запуск одной командой
```bash 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: Пошаговое скачивание
```bash # Скачать скрипт 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: Создание скрипта вручную
```bash # Создать файл скрипта nano setup-new-machine.sh
# Скопировать содержимое скрипта (см. ниже) # Сохранить файл (Ctrl+X, Y, Enter)
# Сделать исполняемым chmod +x setup-new-machine.sh
# Запустить ./setup-new-machine.sh ```
## Полный код скрипта
Сохраните данный код в файл setup-new-machine.sh
```bash #!/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: Прямое скачивание ```bash wget https://your-domain.com/setup-new-machine.sh ```
Вариант B: Создание через curl ```bash curl -fsSL https://your-domain.com/setup-new-machine.sh -o setup-new-machine.sh ```
Вариант C: Создание вручную ```bash nano setup-new-machine.sh # Вставить содержимое скрипта из раздела выше # Сохранить: Ctrl+X, затем Y, затем Enter ```
### Шаг 3: Запуск скрипта
```bash # Сделать файл исполняемым 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` |
## Проверка результата
После перелогинивания проверьте установку:
```bash # Проверка hostname hostname
# Проверка Docker docker –version docker compose version
# Проверка работы Docker без sudo docker run hello-world ```
## Устранение проблем
### Docker требует sudo
Если Docker требует sudo, выполните:
```bash # Проверить членство в группе groups $USER
# Если группы docker нет, добавить вручную sudo usermod -aG docker $USER
# Применить изменения newgrp docker # ИЛИ перелогиниться ```
### Ошибка при изменении hostname
```bash # Проверить текущий hostname hostnamectl status
# Установить вручную sudo hostnamectl set-hostname your-new-hostname
# Проверить файл hosts sudo nano /etc/hosts ```
### Проблемы с репозиторием Docker
```bash # Очистить старые ключи 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:
```bash # Создать версию с предустановленным именем export NEW_HOSTNAME=«my-server-01» ./setup-new-machine.sh ```
### Логирование процесса
```bash # Запуск с сохранением логов ./setup-new-machine.sh 2>&1 | tee setup-log.txt ```
## Заключение
Данный скрипт значительно упрощает процесс первичной настройки новой машины Ubuntu и установки Docker. После его выполнения система готова для:
* Разработки приложений в контейнерах * Развертывания Docker Compose проектов * Работы с Docker без прав root * Корректной идентификации в сети по hostname
Время выполнения: 5-15 минут (в зависимости от скорости интернета)