Files
ubuntu-20.04/2-install.sh
T
2026-06-22 23:30:35 +03:00

387 lines
16 KiB
Bash

#!/bin/bash
# wget https://git.kosenka.ru/kosenka/ubuntu-20.04/raw/branch/master/2-install.sh -O 2-install.sh && bash 2-install.sh
# Адаптировано для Ubuntu 20.04 (Focal Fossa)
# Устанавливаемая версия PHP
FPM_V="8.2"
# Значения по умолчанию — будут переопределены интерактивным опросом
USERNAME="admin"
USERNAME_EMAIL=""
USERNAME_PASS=""
SITE_NAME="eis"
SITE_ROOT="/home/$USERNAME/$SITE_NAME"
ANGIE_SITECONF="/etc/angie/sites-available/$SITE_NAME.conf"
ANGIE_ENABLED="/etc/angie/sites-enabled/$SITE_NAME"
MARIADB_ROOT_PASS=""
MARIADB_DB=""
MARIADB_USER=""
MARIADB_PASS=""
# Проверка на запуск от имени root
if [[ $EUID -ne 0 ]]; then
echo "Этот скрипт должен быть запущен с правами root (sudo)."
exit 1
fi
# Функция проверки результата
check_result() {
if [ $1 -ne 0 ]; then
echo "Ошибка: $2"
exit $1
fi
}
# Функция генерации пароля
gen_pass() {
matrix=$1
length=$2
if [ -z "$matrix" ]; then
matrix="A-Za-z0-9"
fi
if [ -z "$length" ]; then
length=20
fi
head /dev/urandom | tr -dc $matrix | head -c$length
}
# Функция отображает запрос и ждет ответа
function confirm() {
while true; do
read -p "$1 ? (y/n) " yn
case $yn in
[Yy]* ) return 0;;
[Nn]* ) return 1;;
esac
done
}
# Интерактивный опрос параметров установки
prompt_settings() {
echo ""
echo "========================================"
echo " Настройка параметров установки"
echo "========================================"
echo ""
# 1. Имя пользователя
read -p "1. Имя системного пользователя [${USERNAME}]: " _input
USERNAME="${_input:-$USERNAME}"
# 2. Email пользователя
read -p "2. Email пользователя: " _input
while [[ -z "$_input" ]]; do
read -p " Email не может быть пустым. Email пользователя: " _input
done
USERNAME_EMAIL="$_input"
# 3. Пароль пользователя (с предзаполненным сгенерированным значением)
_gen_pass=$(gen_pass "A-Za-z0-9!@#%^" 20)
read -p "3. Пароль пользователя [${_gen_pass}]: " _input
USERNAME_PASS="${_input:-$_gen_pass}"
# 4. Root-пароль MariaDB (с предзаполненным сгенерированным значением)
_gen_dbroot=$(gen_pass "A-Za-z0-9" 20)
read -p "4. Root-пароль MariaDB [${_gen_dbroot}]: " _input
MARIADB_ROOT_PASS="${_input:-$_gen_dbroot}"
# 4.1. Имя базы данных
_default_db="${USERNAME}_db"
read -p "4.1. Имя базы данных MariaDB [${_default_db}]: " _input
MARIADB_DB="${_input:-$_default_db}"
MARIADB_USER="$MARIADB_DB"
# Пароль пользователя БД — генерируем отдельно
_gen_dbpass=$(gen_pass "A-Za-z0-9" 20)
MARIADB_PASS="$_gen_dbpass"
# 5. Имя сайта
read -p "5. Имя сайта (папка /home/${USERNAME}/<имя>) [${SITE_NAME}]: " _input
SITE_NAME="${_input:-$SITE_NAME}"
# Пересчитываем зависимые переменные
SITE_ROOT="/home/$USERNAME/$SITE_NAME"
ANGIE_SITECONF="/etc/angie/sites-available/$SITE_NAME.conf"
ANGIE_ENABLED="/etc/angie/sites-enabled/$SITE_NAME"
# Проверка — пользователь не должен существовать
if [ -n "$(grep ^${USERNAME}: /etc/passwd /etc/group 2>/dev/null)" ]; then
echo "Ошибка: пользователь '$USERNAME' уже существует."
echo "Удалите его: userdel -r $USERNAME"
exit 1
fi
echo ""
echo "========================================"
echo " Итоговые параметры:"
echo "========================================"
echo " Пользователь : $USERNAME"
echo " Email : $USERNAME_EMAIL"
echo " Пароль : $USERNAME_PASS"
echo " Сайт : $SITE_NAME ($SITE_ROOT)"
echo " MariaDB root : $MARIADB_ROOT_PASS"
echo " БД / Юзер БД : $MARIADB_DB"
echo " Пароль БД : $MARIADB_PASS"
echo "========================================"
echo ""
confirm "Продолжить установку с этими параметрами"
if [ $? -ne 0 ]; then
echo "Установка отменена."
exit 0
fi
}
install_user() {
/usr/sbin/useradd "$USERNAME" -s "/bin/bash" -c "$USERNAME_EMAIL" -m -d "/home/$USERNAME" -U
check_result $? "user creation failed"
echo "$USERNAME:$USERNAME_PASS" | /usr/sbin/chpasswd
if [ $? -ne 0 ]; then
/usr/sbin/deluser "$USERNAME" > /dev/null 2>&1
check_result 2 "Пароль не соответствует правилам парольной защиты"
exit 2
fi
chmod a+x /home/$USERNAME
usermod -aG users "$USERNAME"
}
# Функция для установки Angie (форк Nginx)
install_angie() {
echo "[ * ] Установка Angie (форк Nginx)..."
# https://angie.software/angie/docs/installation/oss_packages/#angie-install-deb-oss
mkdir -p /etc/ssl/angie/
apt-get -qq install -y curl
curl -o /etc/apt/trusted.gpg.d/angie-signing.gpg https://angie.software/keys/angie-signing.gpg
# Ubuntu 20.04 = focal
echo "deb https://download.angie.software/angie/$(. /etc/os-release && echo "$ID/$VERSION_ID $VERSION_CODENAME") main" | tee /etc/apt/sources.list.d/angie.list > /dev/null
apt-get update
apt-get install -y angie
# Создаём структуру для виртуальных хостов
mkdir -p /etc/angie/sites-available /etc/angie/sites-enabled 2>/dev/null || true
# Добавляем include в основной конфиг, если ещё нет
ANGIE_CONF_FILE="/etc/angie/angie.conf"
if ! grep -q "sites-enabled" "$ANGIE_CONF_FILE"; then
sed -i '/http {/a \ include /etc/angie/sites-enabled/*;' "$ANGIE_CONF_FILE"
echo "Добавлен include для sites-enabled в $ANGIE_CONF_FILE"
fi
sed -i -e "s/user angie;/user $USERNAME;/g" "$ANGIE_CONF_FILE"
systemctl enable angie
systemctl start angie
}
# Создание сайта
create_site() {
echo "[ * ] Создание сайта: $SITE_NAME"
mkdir -p "$SITE_ROOT"
mkdir -p "$SITE_ROOT/web"
chown -R $USERNAME:$USERNAME "$SITE_ROOT"
chmod -R 755 "$SITE_ROOT"
# Создаём index.php
cat << 'EOF' > "$SITE_ROOT/web/index.php"
<?php
echo "<h1>Привет от Angie + PHP !</h1>";
echo "<p>Сайт работает: ".$_SERVER['SERVER_NAME']."</p>";
if (extension_loaded('mysqli') || extension_loaded('pdo_mysql')) {
echo "<p>✅ Расширение MySQL загружено.</p>";
} else {
echo "<p>❌ Расширение MySQL НЕ загружено.</p>";
}
if (function_exists('mssql_connect') || function_exists('sqlsrv_connect')) {
echo "<p>✅ Поддержка MSSQL (FreeTDS) доступна.</p>";
} else {
echo "<p>❌ Поддержка MSSQL недоступна. Установите pdo_dblib или sqlsrv при необходимости.</p>";
}
phpinfo();
?>
EOF
# Создаём конфиг Angie
cat << EOF > "$ANGIE_SITECONF"
server {
charset utf-8;
client_max_body_size 128M;
listen 80;
server_name eis;
root $SITE_ROOT/web;
index index.php;
access_log /var/log/angie/$SITE_NAME-access.log;
error_log /var/log/angie/$SITE_NAME-error.log;
location / {
try_files \$uri \$uri/ /index.php\$is_args\$args;
}
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files \$uri =404;
}
location ~ ^/assets/.*\.php$ {
deny all;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
try_files \$uri =404;
}
location ~* /\. {
deny all;
}
}
EOF
ln -sf "$ANGIE_SITECONF" "$ANGIE_ENABLED"
systemctl reload angie
}
# Установка MariaDB 10.11 (LTS)
install_mariadb() {
echo "[ * ] Установка MariaDB 10.11..."
# Официальный репозиторий MariaDB для Ubuntu 20.04
curl -fsSL https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash -s -- --mariadb-server-version="mariadb-10.11"
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -qq install -y mariadb-server mariadb-client libmariadb-dev
systemctl enable mariadb
systemctl start mariadb
# Задаём пароль root и настраиваем базу
mysql -u root << MARIADB_SCRIPT
ALTER USER 'root'@'localhost' IDENTIFIED BY '$MARIADB_ROOT_PASS';
CREATE DATABASE IF NOT EXISTS \`$MARIADB_DB\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '$MARIADB_USER'@'localhost' IDENTIFIED BY '$MARIADB_PASS';
GRANT ALL PRIVILEGES ON \`$MARIADB_DB\`.* TO '$MARIADB_USER'@'localhost';
FLUSH PRIVILEGES;
MARIADB_SCRIPT
echo "[ * ] MariaDB: база '$MARIADB_DB', пользователь '$MARIADB_USER' — созданы."
}
# Установка fail2ban
install_fail2ban() {
echo "[ * ] Установка fail2ban..."
apt-get -qq install -y fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local 2>/dev/null || true
systemctl enable fail2ban
systemctl start fail2ban
}
# Установка PHP-FPM
install_php_fpm() {
echo "[ * ] Установка PHP-FPM $FPM_V..."
apt-get -qq install -y lsb-release ca-certificates software-properties-common
# ИЗМЕНЕНО: add-apt-repository корректно работает в Ubuntu 20.04
add-apt-repository -y ppa:ondrej/php
apt-get -qq update
apt-get -qq install -y php$FPM_V-fpm php$FPM_V-cli php$FPM_V-common php$FPM_V-xsl
apt-get -qq install -y php$FPM_V-memcached php$FPM_V-odbc
apt-get -qq install -y php$FPM_V-readline php$FPM_V-pdo php$FPM_V-smbclient
apt-get -qq install -y php$FPM_V-imap php$FPM_V-imagick php$FPM_V-igbinary php$FPM_V-exif php$FPM_V-mbstring php$FPM_V-mysql
apt-get -qq install -y php$FPM_V-curl php$FPM_V-zip php$FPM_V-gd php$FPM_V-opcache php$FPM_V-intl php$FPM_V-xml php$FPM_V-xmlrpc
apt-get -qq install -y php$FPM_V-ldap php$FPM_V-soap php$FPM_V-fileinfo composer
# ИЗМЕНЕНО: убран php$FPM_V-sockets и php$FPM_V-xmlreader (включены в php-common в 20.04)
# ИЗМЕНЕНО: исправлены ссылки на www.conf (убраны некорректные гиперссылки)
WWW_CONF="/etc/php/$FPM_V/fpm/pool.d/www.conf"
sed -i -e "s/user = www-data/user = $USERNAME/g" "$WWW_CONF"
sed -i -e "s/group = www-data/group = $USERNAME/g" "$WWW_CONF"
sed -i -e "s/listen.owner = www-data/listen.owner = $USERNAME/g" "$WWW_CONF"
sed -i -e "s|listen = /run/php/php${FPM_V}-fpm.sock|listen = 127.0.0.1:9000|g" "$WWW_CONF"
sed -i -e 's/pm = dynamic/pm = ondemand/g' "$WWW_CONF"
sed -i -e 's/pm.max_children = 5/pm.max_children = 8/g' "$WWW_CONF"
sed -i -e 's/pm.max_requests = 500/pm.max_requests = 4000/g' "$WWW_CONF"
sed -i -e 's/;pm.process_idle_timeout/pm.process_idle_timeout/g' "$WWW_CONF"
sed -i -e 's/;pm.status_path/pm.status_path/g' "$WWW_CONF"
sed -i -e 's/;env/env/g' "$WWW_CONF"
FPM_INI="/etc/php/$FPM_V/fpm/php.ini"
sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' "$FPM_INI"
sed -i -e 's/;session.save_path = "\/tmp"/session.save_path = "\/tmp"/g' "$FPM_INI"
sed -i -e 's/short_open_tag = On/short_open_tag = Off/g' "$FPM_INI"
sed -i -e 's/post_max_size = 8M/post_max_size = 128M/g' "$FPM_INI"
sed -i -e 's/upload_max_filesize = 2M/upload_max_filesize = 128M/g' "$FPM_INI"
sed -i -e "s|;open_basedir =|open_basedir =/mnt/FOTOSVID:/home/$USERNAME/$SITE_NAME:/tmp:/bin:/usr/bin:/usr/local/bin:/usr/share:/opt|g" "$FPM_INI"
sed -i -e 's/disable_functions =/disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,system,passthru,shell_exec,popen/g' "$FPM_INI"
CLI_INI="/etc/php/$FPM_V/cli/php.ini"
sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' "$CLI_INI"
sed -i -e 's/;session.save_path = "\/tmp"/session.save_path = "\/tmp"/g' "$CLI_INI"
sed -i -e 's/short_open_tag = On/short_open_tag = Off/g' "$CLI_INI"
sed -i -e 's/post_max_size = 8M/post_max_size = 128M/g' "$CLI_INI"
sed -i -e 's/upload_max_filesize = 2M/upload_max_filesize = 128M/g' "$CLI_INI"
sed -i -e "s|;open_basedir =|open_basedir =/mnt/FOTOSVID:/home/$USERNAME/$SITE_NAME:/home/$USERNAME/.config:/home/$USERNAME/.cache:/home/$USERNAME/.local:/tmp:/bin:/usr/bin:/usr/local/bin:/usr/share:/opt|g" "$CLI_INI"
sed -i -e 's/disable_functions =/disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,system,passthru,shell_exec,popen/g' "$CLI_INI"
systemctl enable php$FPM_V-fpm
systemctl start php$FPM_V-fpm
}
# Установка FreeTDS (для подключения к MS SQL)
install_freetds() {
echo "[ * ] Установка FreeTDS..."
apt-get -qq install -y freetds-dev freetds-bin freetds-common tdsodbc odbcinst
export TDS_FDW_VERSION="2.0.4"
wget https://github.com/tds-fdw/tds_fdw/archive/v${TDS_FDW_VERSION}.tar.gz
tar -xvzf v${TDS_FDW_VERSION}.tar.gz
cd tds_fdw-${TDS_FDW_VERSION}/
make USE_PGXS=1
make USE_PGXS=1 install
cd ..
systemctl restart mariadb
echo "[FreeTDS]
Description=FreeTDS driver
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Threading=2" >> /etc/odbcinst.ini
odbcinst -i -d -f /etc/odbcinst.ini
}
# Основная логика установки
main() {
echo "[ * ] Начинаем установку компонентов..."
# Интерактивный опрос параметров
prompt_settings
apt-get -qq update
apt-get -qq upgrade -y
apt-get -qq dist-upgrade -y
# Установка базовых утилит
apt-get -qq install -y cifs-utils pwgen wget curl gnupg lsb-release git htop ca-certificates
apt-get -qq install -y apt-utils squashfs-tools tzdata fdisk gdisk mc net-tools locales iproute2 smbclient
apt-get -qq install -y lsof gnupg2 apt-transport-https software-properties-common gnupg gcc make
install_fail2ban
if confirm "Install user"; then
install_user
fi
if confirm "Install Angie"; then
install_angie
create_site
fi
if confirm "Install Memcached"; then
apt-get -qq install -y memcached
systemctl enable memcached
systemctl start memcached
fi
if confirm "Install LibreOffice"; then
apt-get -qq install -y libreoffice-core --no-install-recommends libreoffice-writer default-jre-headless libreoffice-java-common
fi
if confirm "Install MariaDB"; then
install_mariadb
fi
if confirm "Install PHP"; then
install_php_fpm
fi
if confirm "Install FreeTDS"; then
install_freetds
fi
echo ""
echo "[ * ] Установка завершена!"
echo "Проверьте службы:"
echo " systemctl status angie"
echo " systemctl status mariadb"
echo " systemctl status php$FPM_V-fpm"
echo " systemctl status fail2ban"
}
# Запуск
main