1
0

Добавить 2-install.sh

This commit is contained in:
kosenka 2025-09-01 20:45:24 +03:00
parent 8f8de4bc47
commit 0c764b60f7

363
2-install.sh Normal file
View File

@ -0,0 +1,363 @@
#!/bin/bash
# wget https://git.kosenka.ru/kosenka/ubuntu.22.04/raw/branch/master/2-install.sh -O 2-install.sh && bash 2-install.sh
# Устанавливаемая версия PHP
FPM_V="8.2"
# В системе будет создан пользователь: admin
USERNAME="admin"
# Email пользователя
USERNAME_EMAIL="eis-web@rfclass.ru"
# Пароль пользователя
USERNAME_PASS="nhb[jgjk#786"
# Имя сайта. Будет создана папка /home/$USERNAME/$SITE_NAME
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"
# Пароль для системного пользователя postgres
PGPASSWORD="6v5sgf79Qq9mGEku"
# Имя создаваемой базы данных в PostgreSQL
PGDB="admin_eis_pg"
# Имя пользователя для создаваемой базы данных в PostgreSQL
PGDBUSER="admin_eis_pg"
# Пароль пользователя для создаваемой базы данных в PostgreSQL
PGDBUSERPASS="A3liDUC72XDzFGLZ"
FOTOSVIDPASS="rDrh6inT2lYPhzjBEp!"
# Проверка на запуск от имени 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
}
# Проверка на то, что нет пользователя admin
if [ -n "$(grep ^admin: /etc/passwd /etc/group)" ]; then
echo "Пожалуйста, удалите пользователя $USERNAME: userdel -r $USERNAME"
check_result 1 "Пользователь $USERNAME существует"
fi
install_user() {
/usr/sbin/useradd "$USERNAME" -s "/bin/bash" -c "$USERNAME_EMAIL" -m -d "/home/$USERNAME" -U
check_result $? "user creation failed" "$E_INVALID"
echo "$USERNAME:$USERNAME_PASS" | /usr/sbin/chpasswd
if [ $? -ne 0 ]; then
# Delete user on failure
/usr/sbin/deluser "$USERNAME" > /dev/null 2>&1
check_result 2 "Пароль не соответствует правилам парольной защиты"
exit 2
fi
chmod a+x /home/$USERNAME
usermod -aG wheel "$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 apt-https
curl -o /etc/apt/trusted.gpg.d/angie-signing.gpg https://angie.software/keys/angie-signing.gpg
echo "deb https://download.angie.software/angie/$(. /etc/os-release && echo "$ID/$VERSION_ID $VERSION_CODENAME") main" | sudo 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"
# Включаем и запускаем Angie
systemctl enable angie
systemctl start angie
}
# Создание сайта
create_site() {
echo "[ * ] Создание сайта: $SITE_NAME"
# 1. Создаём директорию сайта
mkdir -p "$SITE_ROOT"
mkdir -p "$SITE_ROOT/web"
chown -R $USERNAME:$USERNAME "$SITE_ROOT"
chmod -R 755 "$SITE_ROOT"
# 2. Создаём index.php
cat << 'EOF' > "$SITE_ROOT/web/index.php"
<?php
echo "<h1>Привет от Angie + PHP $FPM_V!</h1>";
echo "<p>Сайт работает: <?php echo \$_SERVER['SERVER_NAME']; ?></p>";
// Информация о PostgreSQL
if (extension_loaded('pgsql')) {
echo "<p>✅ Расширение pgsql загружено.</p>";
} else {
echo "<p>❌ Расширение pgsql НЕ загружено.</p>";
}
// Информация о подключении к MS SQL (через FreeTDS)
if (function_exists('mssql_connect') || function_exists('sqlsrv_connect')) {
echo "<p>✅ Поддержка MSSQL (FreeTDS) доступна.</p>";
} else {
echo "<p>❌ Поддержка MSSQL недоступна. Установите pdo_dblib или sqlsrv при необходимости.</p>";
}
phpinfo();
?>
EOF
# 3. Создаём конфиг Angie
cat << EOF > "$ANGIE_SITECONF"
server {
charset utf-8;
client_max_body_size 128M;
listen 80; ## listen for ipv4
#listen [::]:80 default_server ipv6only=on; ## listen for ipv6
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 / {
# Redirect everything that isn't a real file to index.php
try_files \$uri \$uri/ /index.php\$is_args\$args;
}
# uncomment to avoid processing of calls to non-existing static files by Yii
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files \$uri =404;
}
#error_page 404 /404.html;
# deny accessing php files for the /assets directory
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;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
try_files \$uri =404;
}
location ~* /\. {
deny all;
}
}
EOF
# 4. Включаем сайт
ln -sf "$ANGIE_SITECONF" "$ANGIE_ENABLED"
# 5. Перезагружаем Angie
systemctl reload angie
}
# Установка PostgreSQL
install_postgresql() {
echo "[ * ] Установка PostgreSQL..."
apt-get -qq install -y postgresql16 postgresql16-server postgresql16-contrib
rm -rf /var/lib/pgsql
mkdir -p /var/lib/pgsql
chown postgres:postgres /var/lib/pgsql
sudo -u postgres initdb -D /var/lib/pgsql/data
sudo -u postgres wget https://git.kosenka.ru/kosenka/AltLinuxWeb/raw/branch/master/pg_hba.conf -O /var/lib/pgsql/data/pg_hba.conf
# Включаем автозапуск
systemctl enable postgresql
systemctl start postgresql
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '$PGPASSWORD'" > /dev/null 2>&1
sudo -u postgres psql -c "CREATE DATABASE $PGDB ENCODING UTF8 TEMPLATE template0;" > /dev/null 2>&1
sudo -u postgres psql -c "CREATE USER $PGDBUSER WITH PASSWORD '$PGDBUSERPASS';" > /dev/null 2>&1
sudo -u postgres psql -c "ALTER DATABASE $PGDB OWNER TO $PGDBUSER;" > /dev/null 2>&1
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $PGDB TO $PGDBUSER;" > /dev/null 2>&1
sudo -u postgres psql -c "GRANT CONNECT ON DATABASE template0 to $PGDBUSER;" > /dev/null 2>&1
}
# Установка 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 apt-https
apt-get -qq update
apt-get -qq install -y --fix-missing php$FPM_V-openssl php$FPM_V-fpm-fcgi php$FPM_V-xsl php$FPM_V-sockets php$FPM_V-pcntl
apt-get -qq install -y --fix-missing php$FPM_V-readline php$FPM_V-pdo php$FPM_V-pdo_pgsql php$FPM_V-pdo_odbc php$FPM_V-memcached php$FPM_V-smbclient
apt-get -qq install -y --fix-missing php$FPM_V-imap php$FPM_V-imagick php$FPM_V-igbinary php$FPM_V-exif php$FPM_V-mbstring php$FPM_V-pgsql
apt-get -qq install -y --fix-missing 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 --fix-missing php$FPM_V-ldap php$FPM_V-soap php$FPM_V-json php$FPM_V-xmlreader php$FPM_V-fileinfo php$FPM_V-sodium composer
sed -i -e "s/user = _php_fpm/user = $USERNAME/g" /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e "s/group = _webserver/group = $USERNAME/g" /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e 's/;listen = 127/listen = 127/g' /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e 's/listen=/;listen=/g' /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e 's/pm = dynamic/pm = ondemand/g' /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e 's/pm.max_children = 5/pm.max_children = 8/g' /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e 's/pm.max_requests = 500/pm.max_requests = 4000/g' /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e 's/;pm.process_idle_timeout/pm.process_idle_timeout/g' /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e 's/;pm.status_path/pm.status_path/g' /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e 's/;env/env/g' /etc/fpm$FPM_V/php-fpm.d/www.conf
sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/$FPM_V/fpm-fcgi/php.ini
sed -i -e 's/session.save_handler = files/session.save_handler = files/g' /etc/php/$FPM_V/fpm-fcgi/php.ini
sed -i -e 's/;session.save_path = "\/tmp"/session.save_path = "\/tmp"/g' /etc/php/$FPM_V/fpm-fcgi/php.ini
sed -i -e 's/short_open_tag = On/short_open_tag = Off/g' /etc/php/$FPM_V/fpm-fcgi/php.ini
sed -i -e 's/post_max_size = 20M/post_max_size = 128M/g' /etc/php/$FPM_V/fpm-fcgi/php.ini
sed -i -e 's/upload_max_filesize = 20M/upload_max_filesize = 128M/g' /etc/php/$FPM_V/fpm-fcgi/php.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" /etc/php/$FPM_V/fpm-fcgi/php.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' /etc/php/$FPM_V/fpm-fcgi/php.ini
sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/$FPM_V/cli/php.ini
sed -i -e 's/session.save_handler = files/session.save_handler = files/g' /etc/php/$FPM_V/cli/php.ini
sed -i -e 's/;session.save_path = "\/tmp"/session.save_path = "\/tmp"/g' /etc/php/$FPM_V/cli/php.ini
sed -i -e 's/short_open_tag = On/short_open_tag = Off/g' /etc/php/$FPM_V/cli/php.ini
sed -i -e 's/post_max_size = 20M/post_max_size = 128M/g' /etc/php/$FPM_V/cli/php.ini
sed -i -e 's/upload_max_filesize = 20M/upload_max_filesize = 128M/g' /etc/php/$FPM_V/cli/php.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" /etc/php/$FPM_V/cli/php.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' /etc/php/$FPM_V/cli/php.ini
# Включаем и запускаем PHP-FPM
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-utils libfreetds libfreetds-unixodbc libfreetds-devel
# sed -i -e 's/tds version = auto/tds version = 7.3/g' /etc/freetds/freetds.conf
echo "[FreeTDS]
Description=FreeTDS
Driver=/usr/lib64/libtdsodbc.so
Setup=/usr/lib64/libtdsodbc.so
" >> /etc/odbcinst.ini
odbcinst -i -d -f /etc/odbcinst.ini
}
# Основная логика установки
main() {
echo "[ * ] Начинаем установку компонентов..."
# Обновление системы
apt-get -qq update
apt-get -qq dist-upgrade -y
# Установка утилит
apt-get -qq install -y memcached cifs-utils pwgen wget curl gnupg lsb-release pwgen LibreOffice-still git htop ca-certificates apt-utils aptitude squashfs-tools tzdata fdisk gdisk mc net-tools locales iproute2
control sudowheel enabled
# Вызов функций установки
install_user
install_angie
create_site
install_postgresql
install_fail2ban
#install_php_fpm
#install_freetds
systemctl enable memcached
systemctl start memcached
mkdir /mnt/FOTOSVID
echo "[Unit]
Description=Mount SMB share
After=network.target
Wants=network.target
[Service]
Type=oneshot
ExecStartPre=sleep 15
ExecStart=/bin/mount -t cifs //10.77.1.250/FOTOSVID /mnt/FOTOSVID -o username=fotosvid,password=$FOTOSVIDPASS,rw,file_mode=0666,dir_mode=0777
[Install]
WantedBy=multi-user.target
" > /etc/systemd/system/mnt-fotosvid.service
systemctl daemon-reload
systemctl enable mnt-fotosvid.service
systemctl start mnt-fotosvid.service
echo "[ * ] Установка завершена!"
echo "Проверьте службы:"
echo " systemctl status angie"
echo " systemctl status postgresql"
echo " systemctl status php$FPM_V-fpm"
echo " systemctl status fail2ban"
}
# Запуск
main