Задать вопрос
odies
@odies
Фрилансер, электронщик

Авто создание поддомена с сайтом?

Здравствуйте. Планирую открыть свой сервис донат страничек под игровые сервера Minecraft. Идея выглядит так:
Пользователь регистрируется на сервисе, с указанием названия своего сервера, скрипт обрабатывает форму и выполняет sh скрипт на выделенном сервере под Debian. Sh скрипт создает папку с названием сервера пользователя, рсспаковывает приготовленный заранее архив, создает config.php файл со стандартными для моей cms настройками, указывая там адрес сайта, названия, создает базу. В итоге получаем поддомен с установленным и настроения скриптом.

Что имею:
Xeon E5 выделенную машину.
Скрипт донат станицы
Скрипт на sh с созданием каталога и распоковкой архива
Знания и немного бюджета.

Нерешенные моменты:
Как с помощью php формы выполнить Sh скрипт с параметрами типо %username_dir% , %site_title%, что бы Sh создавал папку с именем, распаковал туда заранее имеющийся архив сайта и создал конфиг по шаблону с адресом, названием сайта, указанными пользователем при регистрации.

Я мог бы в принципе нанять фрилансера, но хочу лично понять принцип и разработать. Заранее спасибо за любые идеи.
  • Вопрос задан
  • 2886 просмотров
Подписаться 12 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
copist
@copist
Empower people to give
Когда я впервые познакомился с сервером, который создаёт поддомены третьего уровня, а также умеет "парковать" домены второго уровня, я прежде всего представил себе, что там автоматически создаются директории для пользовательских скриптов, конфиг для апача и какой-то рутовый демон делает sudo service apache reload

Но на деле оказалось не так.
1. В DNS стоит правило (см https://toster.ru/q/7456) - все поддомены ***.myservice.ru отправляются на один IP
* IN A 192.168.1.1
Замени 192.168.1.1 на IP твоего сервера

2. В апаче/nginx не стоит привязка виртуального хоста к имени домена (myservice.ru или иной), все запросы отправляются на обработку на один скрипт (PHP?)

nginx
{
    listen 80;
    # server_name не указывать
}


3. В коде приложения (PHP) вычисляется домен в запросе HTTP и исходя из этого строится ответ
У пользователя в таблице user прописано имя домена, то есть пользователь Вася - это домен vasya.myservice.ru

$domainName = $_SERVER['HTTP_HOST']; // vasya.myservice.ru
$userDomain = $db->findUserByDomain($domainName);
echo 'Владелец этой страницы: ', $userDomain->fullName; // Владелец этой страницы: Вася
// ...


Это если речь про веб-интерфейс. А если у тебя реально разные приложения (бинарники?) ставятся из архива, то тебе нужно запускать разные команды из PHP, например

1. Создать директорию, сгенерировать конфиги htaccess или host для Apache
2. Распаковать архив /или слинковать какую-то общую часть через symlink
3. Заставить Apache сделать reload конфигов

Для этих команд тебе пригодится php.net/manual/en/function.system.php php.net/manual/en/function.exec.php или php.net/manual/en/function.shell-exec.php

Последний пункт самый небезопасный, потому нужно пользователю апач дать права на выполнение команды от рута. Лучше делать это по крону или от имени специального сервиса-демона, а не из PHP.
Ответ написан
neovictor
@neovictor
Фрилансер
WildCard в помощь,
+проверка имени поддомена, никаких папок с сайтами не нужно
Ответ написан
Комментировать
@Fenix957
Когда пользователь добавляет все это пусть php создает допустим newusers.txt а по крону у тебя будет запускаться какой нибудь скрипт который по очереди парсит этот файл и создает все что тебя надо . в зависимости от того на сколько часто регаются пользователи и ставь на крон время . если очень часто пусть скрипт проверят какждую минут . а по завершению скрипта пусть удаляет файл . на счет поддоменов уже сказали ) хотя есть множество вариантов когда просто создается папка и она становиться поддоменом . htaccess в помощь )
Ответ написан
Комментировать
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
system()
upd: А вообще такие вещи через htaccess разруливаются.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Проще некуда:
1. В DNS прописываем * и IP-шник.
2. Проверка HOST на URI-роутере при запросе на anyusername.servername.com
3. Делаем перевод в нужную папку (или грузим нужный скрипт) в зависимости от домена 3-го уровня, откуда берём пользователя (предварительно проверив его существование).
4. Также, можно сделать и с системными сервисами, не являющимися пользовательскими поддоменами с прозрачной "прокидкой" сессии.
Всё.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы