#!/bin/bash # Color codes GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' echo -e "${GREEN}=====================================================${NC}" echo -e "${GREEN} АО КМУ «Гидромонтаж» - Адресная книга ${NC}" echo -e "${GREEN} Проверка окружения и безопасности ${NC}" echo -e "${GREEN}=====================================================${NC}" # Check running as root if [ "$EUID" -ne 0 ]; then echo -e "${RED}[X] Этот скрипт должен быть запущен с правами root (sudo).${NC}" exit 1 fi INSTALL_DIR="/opt/corp-address-book" # 1. Check if folder already exists and is not empty if [ -d "$INSTALL_DIR" ] && [ "$(ls -A "$INSTALL_DIR" 2>/dev/null)" ]; then echo -e "${RED}[X] ОШИБКА: Директория установки $INSTALL_DIR уже существует и не пуста!${NC}" echo -e "${RED} Во избежание перезаписи чужих файлов установка остановлена.${NC}" exit 1 fi # 2. Check if port 8180 is busy on the server if command -v lsof >/dev/null 2>&1; then if lsof -i :8180 >/dev/null 2>&1; then echo -e "${RED}[X] ОШИБКА: Порт 8180 уже занят другим процессом!${NC}" lsof -i :8180 exit 1 fi elif command -v netstat >/dev/null 2>&1; then if netstat -tuln | grep -q ":8180 "; then echo -e "${RED}[X] ОШИБКА: Порт 8180 уже занят другим процессом!${NC}" exit 1 fi fi # 3. Check if systemd service already exists if [ -f /etc/systemd/system/corp-address-book.service ]; then echo -e "${RED}[X] ОШИБКА: Системная служба 'corp-address-book.service' уже существует!${NC}" echo -e "${RED} Пожалуйста, удалите или переименуйте существующую службу перед установкой.${NC}" exit 1 fi echo -e "${GREEN}[✓] Проверка пройдена. Конфликтов не обнаружено.${NC}" echo -e "${YELLOW}[i] Начинаем установку...${NC}" echo -e "${YELLOW}[i] Копируем проект в директорию установки: $INSTALL_DIR...${NC}" mkdir -p "$INSTALL_DIR" cp -r . "$INSTALL_DIR" cd "$INSTALL_DIR" # Install Node.js if not present if ! [ -x "$(command -v node)" ]; then echo -e "${YELLOW}[!] Node.js не установлен. Устанавливаем Node.js...${NC}" curl -fsSL https://deb.nodesource.com/setup_20.x | bash - apt-get install -y nodejs git build-essential echo -e "${GREEN}[✓] Node.js успешно установлен!${NC}" else echo -e "${GREEN}[✓] Node.js обнаружен ($(node -v)).${NC}" fi # Setup environment variables if [ ! -f .env ]; then echo -e "${YELLOW}[!] Файл настроек .env отсутствует. Создаем новый...${NC}" RANDOM_PASS=$(openssl rand -base64 12 | tr -d '/+=') JWT_SEC=$(openssl rand -base64 32 | tr -d '/+=') cat < .env ADMIN_USERNAME=admin ADMIN_PASSWORD=$RANDOM_PASS JWT_SECRET=$JWT_SEC PORT=8180 DATABASE_PATH=$INSTALL_DIR/data/database.db EOT echo -e "${GREEN}[✓] Файл .env сгенерирован.${NC}" else echo -e "${GREEN}[✓] Обнаружен существующий файл настроек .env.${NC}" fi # Make sure SQLite directory exists mkdir -p "$INSTALL_DIR/data" # Build frontend assets echo -e "${YELLOW}[i] Установка пакетов и сборка фронтенда...${NC}" cd "$INSTALL_DIR/frontend" npm install npm run build # Install backend dependencies and bundle public folder echo -e "${YELLOW}[i] Установка пакетов бэкенда...${NC}" cd "$INSTALL_DIR/backend" npm install --only=production rm -rf public cp -r ../frontend/dist ./public # Create Systemd Service File echo -e "${YELLOW}[i] Создание системной службы Systemd...${NC}" cat < /etc/systemd/system/corp-address-book.service [Unit] Description=Corporate Address Book Web App After=network.target [Service] Type=simple User=root WorkingDirectory=$INSTALL_DIR/backend ExecStart=/usr/bin/node server.js Restart=on-failure Environment=NODE_ENV=production EnvironmentFile=$INSTALL_DIR/.env [Install] WantedBy=multi-user.target EOT # Reload systemd and start service systemctl daemon-reload systemctl enable corp-address-book systemctl restart corp-address-book # Fetch credentials from .env ADMIN_USERNAME=$(grep ADMIN_USERNAME $INSTALL_DIR/.env | cut -d '=' -f2) ADMIN_PASSWORD=$(grep ADMIN_PASSWORD $INSTALL_DIR/.env | cut -d '=' -f2) PORT=$(grep PORT $INSTALL_DIR/.env | cut -d '=' -f2) if [ $? -eq 0 ]; then echo -e "${GREEN}=====================================================${NC}" echo -e "${GREEN}[✓] СИСТЕМНАЯ СЛУЖБА ЗАПУЩЕНА УСПЕШНО!${NC}" echo -e "${GREEN}=====================================================${NC}" echo -e "Сайт адресной книги запущен локально на порту $PORT." echo -e "🔗 Адрес: ${YELLOW}http://192.168.1.250:${PORT}/${NC} (или IP-адрес вашего сервера)" echo -e "" echo -e "Данные для входа в панель администратора:" echo -e "Логин: ${YELLOW}$ADMIN_USERNAME${NC}" echo -e "Пароль: ${YELLOW}$ADMIN_PASSWORD${NC}" echo -e "" echo -e "${RED}Сохраните эти учетные данные! Вы можете отредактировать их в $INSTALL_DIR/.env${NC}" echo -e "=====================================================" else echo -e "${RED}[X] Ошибка при запуске службы corp-address-book.${NC}" exit 1 fi