Часто настраиваю сервера под MODX, устал держать в памяти шаги. Будет шпаргалкой.

apt install sudo
sudo apt update
sudo apt install curl
sudo apt install software-properties-common
sudo apt install python-software-properties
sudo apt install language-pack-ru-base
sudo echo "ru_RU.CP1251 CP1251" >>/var/lib/locales/supported.d/ru
sudo locale-gen
sudo locale-gen en_US.UTF-8
export LANG=en_US.UTF-8
export LANG=C.UTF-8
export LC_ALL=C
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
npm install --global gulp
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install nginx php7.0-fpm mysql-server php7.0-mcrypt php7.0-mysql php7.0-curl php-db php7.0-gd php7.0-xml php7.0-json php7.0-imap php7.0-dev libyaml-dev python3-pip unzip zip mc htop bind9 cron php7.0-zip php7.0-yaml php7.0-mbstring
sudo apt install php7.1-fpm php7.1-mcrypt php7.1-mysql php7.1-curl php7.1-gd php7.1-xml php7.1-json php7.1-imap php7.1-dev php7.1-zip php7.1-yaml php7.1-mbstring
sudo apt install php7.2-fpm php7.2-mysql php7.2-curl php7.2-gd php7.2-xml php7.2-json php7.2-imap php7.2-dev php7.2-zip php7.2-yaml php7.2-mbstring
sudo apt install git
sudo apt install python-ipaddr python3-ipaddr
sudo pip3 install pyyaml
sudo pip3 install pymysql
sudo apt update
sudo apt upgrade
sudo service php7.0-fpm restart
sudo service php7.1-fpm restart
sudo nginx -t
sudo service nginx reload
sudo mkdir /etc/nginx/conf.inc
sudo mkdir /etc/nginx/conf.inc/main
sudo mkdir /etc/nginx/conf.inc/access
sudo mkdir /etc/nginx/conf.inc/domains
sudo touch /etc/nginx/blockips.conf


Возможно, придётся установить YAML иначе:
sudo apt-get install libyaml-dev
sudo apt-get install php-pear
sudo pecl install yaml


Возможно, возникнет ошибка при попытке обновить список пакетов командой apt update, вроде этой:
Err:4 http://ppa.launchpad.net/ondrej/php/ubuntu xenial InRelease The following signatures couldn't be verified because the public key is not available: NO_PUBKEY [...]
Вместо 3 точек будет публичный ключ, копируем его и вставляем в конец команды, вместо трёх точек:
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com ...
После этого снова apt update.

Если нам надо установить PHP 5.6, дополнительно выполняем:
sudo apt install php5.6-fpm php5.6-mcrypt php5.6-mysql php5.6-curl php5.6-gd php5.6-xml php5.6-json php5.6-imap php5.6-dev php5.6-zip php5.6-yaml php5.6-mbstring



В файле /etc/nginx/nginx.conf заменить всё на:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    #multi_accept on;
}

http {
    # >> IP blocks
    include blockips.conf;
    # << IP blocks

    # >> Basic Settings
    merge_slashes off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_max_body_size 100M;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    # << Basic Settings

    # >> SSL Settings
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    # << SSL Settings

    # >> Logging Settings
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    # << Logging Settings

    # >> Gzip Settings
    gzip on;
    gzip_disable "msie6";
    # << Gzip Settings

    # >> Virtual Host Configs
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    # << Virtual Host Configs
}


Командуем:
sudo nginx -t
sudo service nginx reload


В файле /etc/ssh/sshd_config:

Комментируем
#Subsystem sftp /usr/lib/openssh/sftp-server

Добавляем в конец:
Subsystem sftp internal-sftp
Match Group sftp
    ChrootDirectory %h
    AllowTCPForwarding no
    ForceCommand internal-sftp

Командуем:
sudo addgroup sftp
sudo service ssh restart


В файлах:
/etc/php5.6/cli/php.ini:
/etc/php5.6/fpm/php.ini:
/etc/php7.0/cli/php.ini:
/etc/php7.0/fpm/php.ini:
/etc/php7.1/cli/php.ini:
/etc/php7.1/fpm/php.ini:

Раскоментируем строку:
date.timezone = Europe/Moscow

Возможно, придется добавить расширение yaml в php конфиг, если в папке fpm/conf.d и cli/conf.d нет файла 20-yaml.ini:

Добавим строку рядом с другими подобными (поиск по «extension»):
extension=yaml.so

Командуем:
sudo service php5.6-fpm restart
sudo service php7.0-fpm restart
sudo service php7.1-fpm restart


Есть вероятность, что SQL MODE будет не тот. От этого MODX будет сыпать ошибки в собственный лог и ТВ не будут сохраняться. Наверняка последствий больше, однако лечится это так:
sudo mcedit /etc/mysql/my.cnf
В конец дописываем:
[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION"
Сохраняем. Командуем:
sudo systemctl restart mysql


Даймон для хост-панельки



github.com/gvozdb/modxPanelDaemon

Качаем, располагаем в директории /root/scripts/py/modxpaneldaemon/

— Создаем папки log и tmp в директории даймона
— Настраиваем config.yaml (обязательно ввести уникальный secret_key)

Выполняем 2 команды для создания сайта хост-панели и pma
/bin/bash /root/scripts/py/modxpaneldaemon/script/sh/addmodx.sh -p "пароль_mysql" -h h1.you_main_domain.ru -u host -d h1.you_main_domain.ru
/bin/bash /root/scripts/py/modxpaneldaemon/script/sh/addplace.sh -p "пароль_mysql" -h h1.you_main_domain.ru -u pma -d pma.you_main_domain.ru


Чтобы даймон стал сервисом (/etc/init.d/modxpanel start|stop|restart), надо создать файл /etc/init.d/modxpanel
#!/bin/bash

prog=modxpanel
RETVAL=0

start() {
    echo Starting $prog:
    /usr/bin/env python3 /root/scripts/py/modxpaneldaemon/modxpaneldaemon.py start
    RETVAL=$?
    return $RETVAL
}

stop() {
    echo Stopping $prog:
    /usr/bin/env python3 /root/scripts/py/modxpaneldaemon/modxpaneldaemon.py stop
    RETVAL=$?
    return $RETVAL
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: $prog {start|stop|restart}"
        exit 1
    ;;
esac

exit 0


И сделать его исполняемым:
sudo chmod +x /etc/init.d/modxpanel


Хост-панель



github.com/gvozdb/hostPanel

Качаем и устанавливаем в систему сайта host.you_main_domain.ru
Настраиваем при установке (обязательно ввести secret_key, что используется в конфиге даймона)

Быстрый запуск chmod



В корневой директории каждого юзера есть файл chmod, который ставит права на файлы и папки. Периодически, после ковыряния рутом надо запускать его, чтобы не было проблем с правами. Можно запускать вручную так:
sh /var/www/username/chmod
А можно сократить до безобразия. Для этого идём в /root/.bashrc и в конец добавляем:
# short run chmod for user
ch() {
    sh /var/www/$1/chmod
}
Теперь запустить сброс прав на файлы и папки куда быстрее:
ch username


Docker и Sprut.io


Ставим Docker:
cd /tmp
wget -qO- https://get.docker.com/ | sh

Проверяем, что Docker установился:
sudo docker run hello-world


sprut.io/ru/install