Create setup.sh
This commit is contained in:
@@ -0,0 +1,230 @@
|
||||
#!/bin/bash
|
||||
|
||||
# --- НАСТРОЙКИ ---
|
||||
# Работаем только от root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Этот скрипт должен быть запущен от имени root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -e
|
||||
|
||||
# --- ЦВЕТА ---
|
||||
GREEN='\033[1;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[1;31m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||||
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||
error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||
|
||||
ask_yes_no() {
|
||||
local prompt="$1"
|
||||
while true; do
|
||||
read -p "$prompt (y/n): " INPUT < /dev/tty
|
||||
case "$INPUT" in
|
||||
[yY]|[yY][eE][sS]) CONFIRM="y"; return 0 ;;
|
||||
[nN]|[nN][oO]) CONFIRM="n"; return 1 ;;
|
||||
*) echo -e "${YELLOW}Введите 'y' или 'n'.${NC}" ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# --- 1. ОБНОВЛЕНИЕ СИСТЕМЫ ---
|
||||
update_system() {
|
||||
info "Обновление пакетов и установка зависимостей..."
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt-get -qqy update
|
||||
apt-get -qqy -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade
|
||||
apt-get -y autoremove
|
||||
|
||||
# Установка утилит:
|
||||
# putty-tools - для конвертации ключей
|
||||
# jq, git, curl, wget - нужны для работы многих скриптов и Coolify
|
||||
# htop - для мониторинга ресурсов
|
||||
apt-get install -y putty-tools curl wget jq git htop
|
||||
|
||||
info "Система обновлена и базовые утилиты установлены."
|
||||
}
|
||||
|
||||
# --- 2. НАСТРОЙКА SWAP (4GB) ---
|
||||
configure_swap() {
|
||||
info "--- ПРОВЕРКА SWAP ---"
|
||||
|
||||
# Проверяем, включен ли swap
|
||||
if swapon --show | grep -q "partition\|file"; then
|
||||
info "Swap уже активен. Пропуск создания."
|
||||
elif [ -f /swapfile ]; then
|
||||
warn "Файл /swapfile существует, но не активен. Пропуск во избежание конфликтов."
|
||||
else
|
||||
# OnlyOffice требователен к памяти, ставим 4GB для надежности
|
||||
info "Создание Swap-файла размером 4GB..."
|
||||
fallocate -l 4G /swapfile
|
||||
chmod 600 /swapfile
|
||||
mkswap /swapfile
|
||||
swapon /swapfile
|
||||
|
||||
# Добавляем в fstab для автозагрузки
|
||||
if ! grep -q "/swapfile" /etc/fstab; then
|
||||
echo '/swapfile none swap sw 0 0' >> /etc/fstab
|
||||
info "Swap добавлен в автозагрузку."
|
||||
fi
|
||||
|
||||
info "✅ Swap (4GB) успешно создан и подключен."
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 3. ГЕНЕРАЦИЯ КЛЮЧЕЙ ---
|
||||
generate_keys() {
|
||||
info "--- ГЕНЕРАЦИЯ КЛЮЧЕЙ ---"
|
||||
|
||||
KEY_PATH="/root/coolify_root_key"
|
||||
|
||||
rm -f "${KEY_PATH}" "${KEY_PATH}.pub" "${KEY_PATH}.ppk"
|
||||
|
||||
info "Генерация Ed25519 ключа..."
|
||||
ssh-keygen -t ed25519 -C "root-coolify-access" -f "$KEY_PATH" -N "" -q
|
||||
|
||||
info "Конвертация в PPK (для PuTTY)..."
|
||||
puttygen "$KEY_PATH" -o "${KEY_PATH}.ppk" -O private
|
||||
|
||||
mkdir -p /root/.ssh
|
||||
chmod 700 /root/.ssh
|
||||
|
||||
# Добавляем публичный ключ в authorized_keys
|
||||
if ! grep -qf "${KEY_PATH}.pub" /root/.ssh/authorized_keys 2>/dev/null; then
|
||||
cat "${KEY_PATH}.pub" >> /root/.ssh/authorized_keys
|
||||
info "Ключ добавлен в authorized_keys."
|
||||
fi
|
||||
chmod 600 /root/.ssh/authorized_keys
|
||||
|
||||
# Сохраняем ключи в переменные перед удалением
|
||||
PRIVATE_KEY_OPENSSH=$(cat "$KEY_PATH")
|
||||
PRIVATE_KEY_PPK=$(cat "${KEY_PATH}.ppk")
|
||||
|
||||
# Удаляем ключи с диска (для безопасности)
|
||||
rm -f "$KEY_PATH" "${KEY_PATH}.ppk" "${KEY_PATH}.pub"
|
||||
info "Временные файлы ключей удалены с диска."
|
||||
}
|
||||
|
||||
# --- 4. ФАЕРВОЛ ---
|
||||
setup_firewall() {
|
||||
info "--- НАСТРОЙКА UFW ---"
|
||||
|
||||
if ! command -v ufw &> /dev/null; then
|
||||
apt-get install -y ufw
|
||||
fi
|
||||
|
||||
ufw --force reset > /dev/null
|
||||
ufw default deny incoming
|
||||
ufw default allow outgoing
|
||||
|
||||
ufw allow 22/tcp comment 'SSH'
|
||||
ufw allow 80/tcp comment 'HTTP'
|
||||
ufw allow 443/tcp comment 'HTTPS'
|
||||
ufw allow 443/udp comment 'HTTP/3'
|
||||
|
||||
echo "y" | ufw enable
|
||||
info "✅ Порты 22, 80, 443 открыты."
|
||||
}
|
||||
|
||||
# --- 5. SSH HARDENING (ROOT) ---
|
||||
harden_ssh() {
|
||||
info "--- НАСТРОЙКА SSH ---"
|
||||
warn "ВНИМАНИЕ: Парольный вход будет отключен!"
|
||||
|
||||
SSHD_CONFIG="/etc/ssh/sshd_config"
|
||||
cp $SSHD_CONFIG "${SSHD_CONFIG}.bak"
|
||||
|
||||
# Разрешаем root только по ключам, отключаем пароли
|
||||
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin prohibit-password/' "$SSHD_CONFIG"
|
||||
sed -i 's/^#\?PubkeyAuthentication .*/PubkeyAuthentication yes/' "$SSHD_CONFIG"
|
||||
sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' "$SSHD_CONFIG"
|
||||
sed -i 's/^#\?ChallengeResponseAuthentication .*/ChallengeResponseAuthentication no/' "$SSHD_CONFIG"
|
||||
# UsePAM оставляем (или yes), полное отключение может ломать сессии на некоторых OS
|
||||
|
||||
systemctl restart ssh
|
||||
info "✅ SSH настроен: Root разрешен (только ключи), пароли отключены."
|
||||
}
|
||||
|
||||
# --- 6. DOCKER ---
|
||||
install_docker() {
|
||||
info "--- УСТАНОВКА DOCKER ---"
|
||||
if ! command -v docker &> /dev/null; then
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sh get-docker.sh
|
||||
rm get-docker.sh
|
||||
info "Docker установлен."
|
||||
else
|
||||
info "Docker уже установлен."
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 7. FAIL2BAN ---
|
||||
install_fail2ban() {
|
||||
info "--- FAIL2BAN ---"
|
||||
if ! command -v fail2ban-client &> /dev/null; then
|
||||
apt-get install -y fail2ban
|
||||
fi
|
||||
|
||||
cat <<EOF > /etc/fail2ban/jail.local
|
||||
[sshd]
|
||||
enabled = true
|
||||
port = ssh
|
||||
filter = sshd
|
||||
logpath = /var/log/auth.log
|
||||
maxretry = 3
|
||||
bantime = 3600
|
||||
EOF
|
||||
systemctl restart fail2ban
|
||||
systemctl enable fail2ban
|
||||
info "✅ Fail2Ban активен."
|
||||
}
|
||||
|
||||
# --- ЗАПУСК ---
|
||||
echo ""
|
||||
echo "Этот скрипт подготовит сервер для Coolify/Docker."
|
||||
echo "Будет настроен: Swap (4GB), Docker, UFW, SSH (Key-only), Fail2ban."
|
||||
echo ""
|
||||
ask_yes_no "Начать настройку?"
|
||||
if [[ "$CONFIRM" == "n" ]]; then exit 0; fi
|
||||
|
||||
update_system
|
||||
configure_swap
|
||||
generate_keys
|
||||
setup_firewall
|
||||
install_docker
|
||||
harden_ssh
|
||||
install_fail2ban
|
||||
|
||||
# --- ОТЧЕТ ---
|
||||
clear
|
||||
echo ""
|
||||
echo -e "${GREEN}==========================================================${NC}"
|
||||
echo -e "${GREEN} НАСТРОЙКА ЗАВЕРШЕНА УСПЕШНО${NC}"
|
||||
echo -e "${GREEN}==========================================================${NC}"
|
||||
echo ""
|
||||
echo "IP сервера: $(curl -s4 https://ifconfig.me)"
|
||||
echo "Пользователь: root"
|
||||
echo "Порт SSH: 22"
|
||||
echo "Swap: Активен (4GB)"
|
||||
echo "Docker: $(docker --version)"
|
||||
echo ""
|
||||
echo -e "${YELLOW}!!! СКОПИРУЙТЕ КЛЮЧИ ПРЯМО СЕЙЧАС !!!${NC}"
|
||||
echo "Ключи УДАЛЕНЫ с диска сервера. Вы видите их в последний раз."
|
||||
echo "Если вы закроете терминал без сохранения, доступ будет утерян."
|
||||
echo ""
|
||||
echo "----------------------------------------------------------"
|
||||
echo "PRIVATE KEY (OpenSSH) - Вставьте этот ключ в Coolify:"
|
||||
echo "----------------------------------------------------------"
|
||||
echo "$PRIVATE_KEY_OPENSSH"
|
||||
echo ""
|
||||
echo "----------------------------------------------------------"
|
||||
echo "PRIVATE KEY (PuTTY .ppk) - Если нужен доступ через Windows:"
|
||||
echo "----------------------------------------------------------"
|
||||
echo "$PRIVATE_KEY_PPK"
|
||||
echo "----------------------------------------------------------"
|
||||
echo ""
|
||||
echo -e "${GREEN}Готово. Теперь добавьте этот сервер в Coolify, используя OpenSSH ключ.${NC}"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user