UMGUM.COM (лучше) 

Простейшее управление аккаунтами ( Реализация простейшего управление аккаунтами. )

9 апреля 2010  (обновлено 31 января 2015)

Эта публикация отнесена в архив. Она неактуальна.
Ресурс по следующей ссылке является преемником: Автоматизация создания площадок сайтов web сервиса на базе "Nginx", PHP-FPM, "NodeJS", "MySQL", "MongoDB", "Memcached", "mSMTP", "inCron" и "Supervisord".

OS: Linux Debian Lenny/Squeeze.
Application: Linux Bash v.4 (Bourne again shell).

Следующая задача: автоматизировать, по минимуму, процесс создания "виртуальных площадок" для сайтов, размещаемых на схеме отрабатываемой в рамках статей этого раздела.

Примем за данность то, что у нас установлено и соответствующим образом настроено все программное обеспечение для поддержания функционирования web-сервера, что описывается в статьях этого подраздела. Мы много чего понаделали в смысле развёртывания системы web-сервисов и все этого должно работать, но в ручном режиме. Теперь нам нужно нечто, позволяющее заводить новые конфигурации двумя-тремя "лёгкими движениями руки", а не ковыряньем в командной строке, сверяясь по каждому пункту с кучкой взаимно пересекающихся руководств.

И так - пишем скрипты. Все, что мы уже нагородили - можно оставить, разве что пароли сменить на более стойкие; или удалить, для чистоты, часть пользовательских конфигураций.

Вначале рассмотрим, пошагово, те части конфигурации, что нужно будет сделать обязательно и один раз при развёртывании хостинга, а потом попробуем накидать нечто, создающее пользовательские конфигурации.


Устанавливаем утилиту генерации паролей:

# aptitude install pwgen makepasswd

Припоминаем то, что web-ресурсы будут располагаться на отдельном разделе, монтируемом в точке "/var/www". Дерево директорий мы выстроили ранее, при настройке серверов приложений.

Создадим для набора скриптов директорию "контрольной панели":

# mkdir -p /usr/local/etc/web/cp

Создадим индексный файл перечисления задействованных идентификаторов виртуальных площадок и введем туда значение условной точки отсчёта (я начал с первой тысячи, но ничто не мешает заменить точку отсчёта на другое значение):

# touch /usr/local/etc/web/cp/index
# echo "1000" > /usr/local/etc/web/cp/index

Создаем директорию файлов журналов операций:

# mkdir -p /usr/local/etc/web/cp/log

Создаем директорию файлов описания параметров площадок:

# mkdir -p /usr/local/etc/web/cp/acc

Пишем линейный интерактивный скрипт создания конфигурации площадки, отталкиваясь от наличия полного доменного имени размещаемого ресурса (разумеется, ничто не помешает нам после дополнить площадку другими доменными именами):

# touch /usr/local/etc/web/cp/add.sh
# chmod ug+x /usr/local/etc/web/cp/add.sh

#!/bin/bash

DOMAIN=${1}
PATHCP="/usr/local/etc/web/cp"

[ ! "${DOMAIN}" ] && { echo "Не указано полное доменное имя размещаемого ресурса"; echo "Формат команды добавления площадки: ${0} domain.name"; echo "Операция создания площадки прервана"; exit 1; }

[ "`grep " ${DOMAIN} " --count --ignore-case ${PATHCP}/index`" -ne "0" ] && { USERID=`grep " ${DOMAIN} " --ignore-case ${PATHCP}/index | awk '{print $1}'`; echo "Доменное имя ${DOMAIN} уже использовано для площадки пользователя u${USERID}"; echo "Операция создания площадки прервана!"; exit 1; }

echo "Читаем индекс, выбирая последний используемый идентификатор..."
LASTID=`tail --lines=1 ${PATHCP}/index | awk '{print $1}'`

echo "Ищем идентификатор, не конфликтующий с имеющимися в системе именами пользователей и групп..."
while [ "`grep ug${LASTID} --count --ignore-case /etc/group`" -ne "0" -a "`grep u${LASTID} --count --ignore-case /etc/passwd`" -ne "0" ]; do

  # Вычисляем следующий, после последнего обнаруженного, условный идентификатор
  let "LASTID=${LASTID}+1"

done

echo "Приступаем к созданию конфигурации площадки для доменного имени ${DOMAIN}..."
ID="${LASTID}"

# Генерируем пароли для пользователя площадки
SPASS=`makepasswd --crypt-md5 --chars=12`
SPASSPLAIN=`echo $SPASS | awk '{print $1}'`
SPASSCRYPT=`echo $SPASS | awk '{print $2}'`

echo "Регистрируем задействованный идентификатор и доменное имя в индексе..."
echo "${ID} ${DOMAIN} ;" >> ${PATHCP}/index

# Формируем файл суммарной информации о создаваемой площадке
cat << EOF > ${PATHCP}/acc/u${ID}
`date +"%Y-%m-%d %H:%M:%S"`

username=   u${ID}
usergroup=  ug${ID}
domain=     ${DOMAIN}
alias=      www.${DOMAIN}
login=      u${ID}
pass-sftp=  ${SPASSPLAIN}
EOF

echo "Создаем группу пользователя: ug${ID}..."
groupadd ug${ID}

echo "Создаем акаунт пользователя: u${ID}..."
useradd --shell /bin/false --home-dir /var/www/u${ID} --gid ug${ID} u${ID}
usermod --password ${SPASSCRYPT} u${ID}

echo "Вводим акаунт web сервера Apache2 в группу пользователя u${ID} для доступа к чтению контента..."
usermod --append --groups ug${ID} www-data

echo "Вводим акаунт web сервера Nginx в группу пользователя u${ID} для доступа к чтению контента..."
usermod --append --groups ug${ID} www-nginx

echo "Вводим акаунт пользователя u${ID} в специализированную группу OpenSSH для доступа к контенту директорий виртуальной площадки..."
usermod --append --groups www-ssh  u${ID}

echo "Создаем директорию www ресурса..."
mkdir -p /var/www/u${ID}/www

echo "Создаем директорию tmp хранения временных и файлов сессий..."
mkdir -p /var/www/u${ID}/tmp

echo "Создаем директорию log размещения журнальных файлов..."
mkdir -p /var/www/u${ID}/log

echo "Создаем директорию home пользовательских файлов..."
mkdir -p /var/www/u${ID}/home

echo "Раздаем соответствующие права доступа к ресурсам площадки..."
chown root:ug${ID} /var/www/u${ID}
chmod -R o-rw /var/www/u${ID}
chown -R u${ID}:ug${ID} /var/www/u${ID}/www
chown -R u${ID}:ug${ID} /var/www/u${ID}/tmp
chown -R root:ug${ID} /var/www/u${ID}/log
chown -R u${ID}:ug${ID} /var/www/u${ID}/home

echo "Создаем служебное пространство интерпретатора PHP..."
mkdir -p /var/www/php/u${ID}
mkdir -p /var/www/php/u${ID}/conf.d

echo "Копируем образец конфигурационного файла интерпретатора PHP в служебное пространство интерпретатора пользователя..."
cp /var/www/php/php.ini /var/www/php/u${ID}/php.ini

echo "Создаем пользовательскую конфигурацию интерпретатора PHP5..."
cat << EOF >> /var/www/php/u${ID}/php.ini

;; Redefinition user variables for u${ID} ;;
open_basedir =          /var/www/u${ID}
upload_tmp_dir =        /var/www/u${ID}/tmp
session.save_path =     /var/www/u${ID}/tmp
EOF

echo "Закрываем несанкционированный доступ в служебное пространство..."
chown -R root:ug${ID} /var/www/php/u${ID}
chmod o-rwx /var/www/php/u${ID}
chmod g-r /var/www/php/u${ID}

echo "Создаем конфигурацию виртуального хоста для сервера Apache2..."
touch /etc/apache2/sites-available/u${ID}
cat << EOF > /etc/apache2/sites-available/u${ID}
<VirtualHost 127.0.0.1:8080>
  ServerName ${DOMAIN}
  ServerAlias www.${DOMAIN}
  ServerAdmin support@${DOMAIN}
  DocumentRoot /var/www/u${ID}/www
  # AddDefaultCharset windows-1251
  suPHP_ConfigPath /var/www/php/u${ID}
  # SetEnv PHP_INI_SCAN_DIR /var/www/php/u${ID}/conf.d
  <Directory /var/www/u${ID}/www>
    Options +ExecCGI
    # AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
  LogLevel warn
  ErrorLog /var/www/u${ID}/log/apache.error.log
  CustomLog /var/www/u${ID}/log/apache.access.log combined
</VirtualHost>
EOF

echo "Создаем активирующую символическую ссылку на виртуальный хост в конфигурации Apache2..."
ln -s /etc/apache2/sites-available/u${ID} /etc/apache2/sites-enabled/u${ID}

echo "Заставляем Apache2 перечитать свои конфигурационные файлы и принять изменения..."
/etc/init.d/apache2 reload

echo "Создаем конфигурацию виртуального хоста для сервера Nginx..."
touch /etc/nginx/sites-available/u${ID}
cat << EOF > /etc/nginx/sites-available/u${ID}
server {
  listen *:80;
  server_name ${DOMAIN}
              www.${DOMAIN};
  charset utf-8;
  access_log /var/www/u${ID}/log/nginx.access.log;
  error_log /var/www/u${ID}/log/nginx.error.log;
  location ~ /\.ht {
    deny  all;
  }
  location / {
    proxy_pass  http://127.0.0.1:8080/;
    include     /etc/nginx/proxy.conf;
  }
  location ~* \.(css|gif|jpeg|jpg|js|txt|png|tif|tiff|ico|jng|bmp|doc|pdf|rtf|xls|ppt|rar|rpm|swf|xpi|zip|tgz|gz|bz2|tar|bin|exe|dll|deb|dmg|iso|img|msi|msp|msm|mid|midi|mp3|mpeg|mpg|mov|flv|asx|asf|wmv|avi)$ {
    root /var/www/u${ID}/www/;
  }
}
EOF

echo "Создаем активирующую символическую ссылку на виртуальный хост в конфигурации Nginx..."
ln -s /etc/nginx/sites-available/u${ID} /etc/nginx/sites-enabled/u${ID}

echo "Заставляем Nginx перечитать свои конфигурационные файлы и принять изменения..."
/etc/init.d/nginx reload

echo "Корректируем права доступа к журналам событий..."
chown -R root:ug${ID} /var/www/u${ID}/log
chmod -R o-rwx /var/www/u${ID}/log

echo "Создаем пользователя СУБД MySQL для площадки..."
MPASS=`/usr/bin/pwgen --capitalize --numerals --secure 12 1`
echo "pass-mysql= ${MPASS}" >> ${PATHCP}/acc/u${ID}
mysql -h localhost -u root --password="root.password" -e "create database if not exists u${ID}"
mysql -h localhost -u root --password="root.password" -e "grant alter,create,create temporary tables,delete,drop,index,insert,lock tables,select,update on u${ID}.* to 'u${ID}'@'localhost' identified by '${MPASS}'"

exit 0

Спрячем это хозяйство от всех, кроме суперпользователя:

# chown -R root:root /usr/local/etc/web/cp
# chmod -R go-rwx /usr/local/etc/web/cp

Разумеется, скрипты не могут претендовать даже на статус начального этапа в применении к поддержанию сервиса более или менее профессионального "хостинга". Скорее все вышеописанное можно рассматривать как "пищу для ума" и основы для вырабатывания более красивой схемы на основе учтённых базовых моментов.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )