Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Управление бэкендом с клиента (https://javascript.ru/forum/node-js-io-js/75350-upravlenie-behkendom-s-klienta.html)

Teamur 27.09.2018 07:20

Управление бэкендом с клиента
 
Как можно реализовать такой процесс:

На сервере я запускаю приложение
node server_1.js

На клиенте в input ввожу команду:
server_1.js stop, server_2.js start

На сервере:
server_1.js приняв команду запускает server_2.js, а сам закрывается

SuperZen 27.09.2018 11:06

А что должно произойти с подключенным клиентом?

Надо наверное какой-нибудь агент, к которому подключается клиент, и агент управляет созданием/удалением процессов.

https://nodejs.org/api/child_process.html

https://medium.freecodecamp.org/node...w-e69498fe970a

Teamur 27.09.2018 11:28

Сейчас у меня на сервере стоит nodemon, а серверный скрипт я правлю через winscp с открытием в sublimeText.

Я хочу избавится от установки на ПК любого софта кроме браузера.
Цель:
Я хочу зайдя на свою страницу администратора, ввести в input команду скажем get server.js
сервер возвращает его код, я в редакторе на самой странице правлю скрипт, нажимаю сохранить.
И server.js перезапускается.

То есть на клиенте я ввожу команду на получения ресурсов сервера для редактирования и последующего сохранения на сервере с перезапуском.

Это вроде CMS называется.

Вообщем я не хочу быть привязанным к ПК, чтобы я буквально с телефона мог редактировать серверный код.

Вроде как онлайн-редактор бэкенда моего сайта со страницы администратора.

SuperZen 27.09.2018 13:35

Раз есть страница администратора, тогда не понятно зачем вводить какие-то команды.

Банальный fileexplorer в браузере, ходи по папкам и выбирай файл, поправил файл, нажал кнопку перезапустить. Даже редактор кода можно вставить.

буквально 1 минута на поиск)
https://www.npmjs.com/package/node-file-manager
https://codemirror.net/
http://pm2.keymetrics.io/

Маэстро 12.02.2019 22:57

Хочу поднять эту тему. У меня тоже есть аналогичная потребность.

Цитата:

Сообщение от SuperZen (Сообщение 495476)
Раз есть страница администратора, тогда не понятно зачем вводить какие-то команды.

Если я правильно понял, нет никакой страницы администратора. Нечто очень простое типа такой страницы админа и надо сделать. Для простоты понимания уберем редактор кода, авторизацию на странице тоже не рамссматриваем. На сервере работает myserver.js, который как-то там запущен на Node.js

Что необходимо: чтобы я на смартфоне (на своей веб-странице "mypage") ввел какой-то параметр (пусть в простой input), нажал кнопку "OK" и после этого myserver.js должен перезапуститься с учетом нового параметра.

То есть, сервер, слушающий на каком-то порту XXXXX, должен получить такую вот "команду" с параметром и сам себя полностью перезапустить, да еще и работать в режиме daemon. Как такое сделать?

Нюанс в том, что с новым параметром myserver.js может запуститься, но свалиться по ошибке. Тогда вообще уже mypage станет бесполезной (она просто не откроется).

Рассмотрю любые идеи. На сервере Centos 7 стоит Apache и PHP 7. Может страницу mypage открывать на PHP и с помощью PHP как-то запускать/перезапускать myserver.js? Это как бы независимый от Node.js канал работы с сервером. Например что-то вроде такого:
exec('node myserver.js');

j0hnik 13.02.2019 07:19

Цитата:

Сообщение от Маэстро
Нюанс в том, что с новым параметром myserver.js может запуститься, но свалиться по ошибке. Тогда вообще уже mypage станет бесполезной (она просто не откроется).

Чтобы ничего не свалилось нужно наверное проверить на сервере "команду" с параметром, и если они валидные, перезапускать или что-то еще делать.

Маэстро 13.02.2019 11:12

Цитата:

Сообщение от j0hnik (Сообщение 503564)
Чтобы ничего не свалилось нужно наверное проверить на сервере "команду" с параметром, и если они валидные, перезапускать или что-то еще делать.

Конечно да, всё надо проверять. Но с точки зрения валидатора "команда" - это может быть просто цифра из диапазона 1-10 и она валидная. А сервер может свалиться по другим причинам. Не акцентируйте внимание на "команде". Отправка команды в инпуте - это я упрощенно сформулировал задачу. Данные для работы сервера могут быть переданы и другим способом, например, это может быть файл "mama.txt", предварительно положенный на сервер по FTP.

Для понимания задачи давайте упраздним и это. Задача сводится к тому, чтобы иметь свою страницу https://mysite.com/mypage.html с тремя кнопками "Рестарт", "Стоп" и "Пуск". Понятное дело, что если остановить сервер, генерирующий, страницу mypage.html, то дальше мрак. Но хотя бы вариант с одной кнопкой "Рестарт" можно сделать?
Как это реализовать через браузер?

j0hnik 13.02.2019 12:20

Маэстро,
Какой в этом смысл? если нужно перегружать при изменении файлов поставьте nodemon
если просто так от скуки то reload подойдет

Маэстро 13.02.2019 12:42

Цитата:

Сообщение от j0hnik (Сообщение 503582)
Какой в этом смысл?

Профессор, по этикету я не вправе делать Вам замечание, но зачем отвечать вопросом на вопрос? Если человек спрашивает, значит ему это зачем-то нужно. Вот один из смыслов:
Я нахожусь в одной стране, предприятие с локальной сетью в другой, вебсервер физически в третьей. Умные дяденьки (сисадмины) настроили следующую цепочку доступа к серверу:
Сначал я должен с помощью удаленного доступа (Microsoft) войти в локальную сеть предприятия (логин/пароль раз), подключиться к моей виртуальной рабочей станции в сети. Только из локальной сети я могу запустить программу winscp (логин/пароль два), чтобы подключиться к серверу и что-то на него скопировать. Чтобы выполнить какие-то команды на сервере или перезапустить Node.js-сервер я еще должен запустить Путти, зайти под SSH (логин/пароль три). Кроме всего этого виртуальная станция настроена таким образом, что через 5 минут (?!) бездействия она лочится и логин/пароль приходится вводить заново (N раз).
Я уважаю информационную безопасность, но для частной задачи хотелось бы не проходить крым/рым/медные трубы.

Неужели никому больше не требуется удаленно перезапускать Node-сервер?

Маэстро 13.02.2019 12:47

Цитата:

Сообщение от j0hnik (Сообщение 503582)
если нужно перегружать при изменении файлов поставьте nodemon если просто так от скуки то reload подойдет

этот текст был добавлен (отредатирован) уже после моего сообщения, поэтому дополню своё.
Спасибо за совет. Но можете подробнее? Как оперируя только одной вебстраницей сделать reload сервера?

j0hnik 13.02.2019 12:52

Цитата:

Сообщение от Маэстро
Как оперируя только одной вебстраницей сделать reload сервера?

самый обычный POST запрос.

Маэстро 13.02.2019 12:57

Цитата:

Сообщение от j0hnik (Сообщение 503587)
самый обычный POST запрос.

Это безусловно POST-запрос. А дальше? Кто должен принять этот запрос и перезапустить myserver.js под Нодой? Если можно, то прошу код в пару строк... ;)

Audaxviator 13.02.2019 13:57

Надо у старика Мюнхаузена спросить, он что-то подобное проделывал.

Маэстро 20.02.2019 15:42

Сам себя за волосы не вытащишь. Тут помощники нужны. В помощники я взял nodemon и Apache/PHP, которые уже стоят на сервере.
Решение задачи:
Создаем HTML-форму, которая POST-запросом отправляет на сервер содержимое input-поля с именем "s". Форма вызывает PHP-скрипт startstop.php
Данный скрипт принимает числовой параметр s и сохраняет его в файл startstop.js в тот же каталог, где лежит server.js
Nodemon, как известно, засекает изменение файла startstop.js в каталоге и перегружает server.js

упрощенный код startstop.php:
<?
if (!isset($_POST['s'])) exit;
$s = trim(substr($_POST['s'],0,10));
settype($s,"integer");
file_put_contents('путь_к_каталогу_сервера/startstop.js', $s);
echo $s."\n";
?>

начало кода в server.js
var command = fs.readFileSync('startstop.js');
if (command == 1)
 {
 var s = 'server stopped ' + "\n"; 
 fs.appendFileSync('имя_лог_файла',s);
 return; // завершение работы сервера
 }
else
 {
 // действия при старте server.js
 var absd = command;
 };

Примечания:
1. в HTML-форме есть еще поле password, которое опущено в данном примере
2. файл startstop.js сначала хотел назвать startstop.txt, но nodemon на него не реагирует, несмотря на то, что в настройках значится watching:*.* (пока не понял почему)
3. для автора этого поста: HTML-форму можно сделать на PHP, добавить в неё чтение файла server.js и отправку в браузер в поле TEXTAREA. Соответственно, после внесения изменений, отправить POST-запросом на сервер, где скрипт startstop.php сначала сохранит новый файл server.js, что перезапустит Node.js-сервер с новым кодом.

j0hnik 23.02.2019 05:44

Apache зачем? nodejs прекрасно принимает пост запросы и работает с файлами.

Маэстро 24.02.2019 00:26

Цитата:

Сообщение от j0hnik (Сообщение 503963)
Apache зачем? nodejs прекрасно принимает пост запросы и работает с файлами.

затем, что если node-myserver.js погасить (остановить) или он вывалится по ошибке, то уже никто никакой post-запрос не примет и никакой файл не запишет.

j0hnik 24.02.2019 02:07

Цитата:

Сообщение от Маэстро
затем, что если node-myserver.js погасить (остановить) или он вывалится по ошибке, то уже никто никакой post-запрос не примет и никакой файл не запишет.

Вам же просто перезагружать надо, nodemon я так понимаю для этого и поставили.

Маэстро 24.02.2019 02:22

Цитата:

Сообщение от j0hnik (Сообщение 504005)
Вам же просто перезагружать надо, nodemon я так понимаю для этого и поставили.

Не только перезагружать. Сервер надо запускать, останавливать и перезапускать с разными (переданными) параметрами. И еще раз повотряю: если сервер вывалится с ошибкой, то как его перезапускать, имея в руках только смартфон и в нем браузер?

Audaxviator 24.02.2019 11:40

Хех. Ну вот я напейсал такой модуль под названием childProcessExecFile.js
var execFile = require('child_process').execFile;

function childProcessExecFile(p, ...args) {
	return new Promise(function(resolve, reject) {
		execFile(p, args, function(err) {
			if(err) resolve(err);
			resolve('OK');
		});
	});
}

module.exports = childProcessExecFile;

Потом напейсал такой модуль
var childProcessExecFile = require('./childProcessExecFile');

childProcessExecFile('node', 'absolute_path_to_serv/server.js')
	.then( ok => {
		console.log(ok);
	})
	.catch( err => {
		console.log(err);
	});

И запустил приложение.
Видимо, это может значить, что на том же VPS можно параллельно запустить ещё один сайтик и через него запускать/останавливать соседний.


Часовой пояс GMT +3, время: 14:34.