Автоматически запускать навсегда (узел) при перезапуске системы

Я использую модуль навсегда узла, чтобы поддерживать работу моего сервера узла. Однако Forever прекращает работу при перезагрузке системы. Можно ли как-нибудь автоматически запустить сервер узла (с навсегда) при перезапуске системы?


person kehers    schedule 14.11.2012    source источник
comment
Этот сервер в облаке? Есть ли у вас загрузочные скрипты для него?   -  person Jorge Aranda    schedule 14.11.2012
comment
Оформить заказ PM2! Он также поддерживает создание сценариев запуска (systemd, systemv...) pm2.keymetrics.io/docs /использование/запуск   -  person Unitech    schedule 04.11.2016


Ответы (15)


Я бы предложил использовать crontab. Его легко использовать.

Как

  1. Чтобы начать редактирование, выполните следующую команду, заменив «testuser» на желаемого пользователя среды выполнения для процесса node. Если вы выберете другого пользователя, кроме себя, вам придется запускать это с помощью sudo.

    $ crontab -u testuser -e
    
  2. Если вы никогда не делали этого раньше, он спросит вас, в каком редакторе вы хотите редактировать. Мне нравится vim, но порекомендую nano из-за простоты использования.

  3. В редакторе добавьте следующую строку:

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
    
  4. Сохраните файл. Вы должны получить сообщение о том, что cron установлен.

  5. Для дальнейшего подтверждения установки cron выполните следующее (снова заменив «testuser» на ваше целевое имя пользователя), чтобы получить список установленных на данный момент cron:

    $ crontab -u testuser -l 
    

Обратите внимание, что, по моему мнению, вы всегда должны использовать полные пути при выполнении двоичных файлов в cron. Кроме того, если путь к вашему навсегда скрипту неверен, запустите which forever, чтобы получить полный путь.

Учитывая, что forever вызывает node, вы также можете указать полный путь к node:

@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js

Дальнейшее чтение

person Julian Lannigan    schedule 14.11.2012
comment
Любые советы о том, что проверить, если это, кажется, ничего не делает? - person UpTheCreek; 07.05.2013
comment
Такой подход хорош, но только для тех случаев, когда система перезагружается. Если сервер выключается, а затем включается - это задание cron не будет выполняться. - person ecdeveloper; 17.05.2013
comment
Что заставляет вас думать, что? en.wikipedia.org/wiki/Cron#Predefined_scheduling_definitions Объясняет, что @reboot cron запускается на Демон cron запускается. Чтобы добавить, я никогда не сталкивался с ситуацией, которая предполагала бы, что мой cron, установленный на @reboot, не запускается при загрузке системы. То, как вы его закрыли, не имеет значения для этого. - person Julian Lannigan; 17.05.2013
comment
@JulianLannigan Мне нравится идея использовать crontab вместо сценария инициализации из-за простоты решения. Есть ли какие-либо недостатки (помимо возможности перезапуска из командной строки) использования вашего решения вместо более традиционного подхода к сценариям инициализации? - person ; 28.05.2013
comment
С помощью сценария инициализации вы могли бы остановить службу myapp? Было бы удобно приостановить работу сервера, и я не уверен, как лучше всего это сделать. - person Stephen Smith; 08.11.2013
comment
@Stephen, это не сценарий инициализации, скорее, он использует библиотеку навсегда для управления демоном. Все, что делает директива перезагрузки cron, — это запускает ваш демон. После этого вы можете делать все, что хотите, через библиотеку навсегда. См. github.com/nodejitsu/. - person Julian Lannigan; 12.11.2013
comment
Добавление @reboot записей в мой crontab у меня не сработало; также не было тех же записей (минус @reboot, конечно) в /etc/rc.local. Так и есть, пока я не начал записи с /usr/bin/sudo -u {user}. Поэтому я думаю, что шаг 1 следует изменить. Я протестировал эту форму как с вызовом /usr/bin/sudo, так и без него; это работает только с: (cd /path/to/; /usr/bin/sudo -u myuser /usr/local/bin/forever start /path/to/app.js). - person Arthur; 12.11.2013
comment
@JulianLannigan Я имел в виду то, что сказал Том. Я думаю, что предпочел бы сценарий инициализации, так как мне нужен простой способ запуска/остановки/перезапуска через командную строку в 1 команде. - person Stephen Smith; 14.11.2013
comment
@Arthur Вам не нужно запускать sudo из crontab. Вот почему, если вы хотите запустить его от другого пользователя, вы указываете это в файле -u. Используя это, вы записываете / редактируете crontab для этого конкретного пользователя, и когда демон запускается, он будет обрабатывать все пользовательские crontab как их соответствующих пользователей. - person Julian Lannigan; 25.11.2013
comment
@Stephen В этом смысл forever! Прочитайте документы, потому что вы можете сделать все это с помощью одной команды. forever start /your/path/to/your/app.js forever stop /your/path/to/your/app.js forever restart /your/path/to/your/app.js github.com/nodejitsu/ - person Julian Lannigan; 25.11.2013
comment
Я понимаю это, но было бы здорово навсегда остановить приложение-псевдоним, а не эту гигантскую команду. Я думаю, это просто сводится к предпочтениям. Мне нравится находить самое элегантное решение, какое только возможно. - person Stephen Smith; 10.12.2013
comment
похоже, что /home еще не смонтирован, поэтому это не сработает, если ваш код находится в /home. - person chovy; 24.12.2013
comment
Этот подход не работает для меня. Когда мой сервер перезагружается, навсегда не запускается. Даже если я вошел с учетной записью пользователя удаленно через SSH, навсегда все равно не запускается. Я использую CentOS x86 6.5. - person Vince Yuan; 04.03.2014
comment
Я обнаружил, что вышеописанное не помогло мне, потому что node не находится на пути, когда cron пытается работать вечно, даже с параметром -c. Однако оказывается, что вы можете добавить оператор PATH= прямо в crontab, если он находится над операторами расписания. Как только PATH установлен, оператор @reboot работает как сон. - person YorkshireKev; 25.05.2014
comment
Спасибо за ваш комментарий @chovy, это было очень полезно. Для тех, кто использует переменные среды из bashrc, обратите внимание на его комментарий. Поскольку /home не смонтирован, это не сработает. Установите переменные в команде crontab, например @reboot varname=value ... - person lsborg; 28.09.2014
comment
у меня это началось при перезагрузке, я вижу серверы, использующие команду forever list, но они не работают. КОГДА я вручную запускаю сервер узла сохранения - он работает, даже если он уже запущен при перезагрузке. - person Dariux; 21.11.2014
comment
Это сработало для меня, но меня немного беспокоят простые отключения и перезапуск. Это будет работать? - person vncprado; 27.02.2015
comment
@chovy home определенно смонтирован, но я не могу сказать то же самое, если использую ~ - person Eat at Joes; 07.03.2015
comment
если «/home» не работает: где еще нужно установить приложение? Значит, его можно использовать с учетными данными пользователя? (извините, я нуб убунту) - person Alex; 22.05.2015
comment
Приложение, созданное с помощью express.js, использует bin/www для запуска службы, а bin/www использует синтаксис #!/usr/bin/env node, чтобы потребовать, чтобы node.js обрабатывал его, к сожалению, /usr/local/bin не в загрузочном PATH, поэтому мое решение заключается в том, чтобы поместить следующую строку вверху моего файла crontab: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin чтобы расширить переменную PATH для корневых пользователей, это работает для меня - person Hover Ruan; 02.08.2015

Для этого вы можете использовать сервис навсегда.

npm install -g forever-service
forever-service install test

Это предоставит app.js в текущем каталоге как услугу через навсегда. Служба будет автоматически перезапускаться при каждом перезапуске системы. Также при остановке он попытается изящно остановиться. Этот сценарий также обеспечивает сценарий logrotate.

URL-адрес Github: http://github.com/zapty/forever-service

ПРИМЕЧАНИЕ. Я являюсь автором навсегда службы.

person arva    schedule 21.08.2014
comment
Это прекрасно! Как я могу передать NODE_ENV с навсегда-сервисом? - person ItalyPaleAle; 15.01.2015
comment
Используйте опцию -e PORT=80 ENV=prod FOO=bar - person arva; 13.02.2015
comment
Спасибо, не знаю почему, но я не смог заставить cron работать, и это помогло. - person Ricky Goldman; 17.05.2015
comment
Я не понимаю, как запустить службу навсегда. Что это за тест в тесте установки навсегда? Моя команда для запуска моего приложения навсегда: /usr/local/bin/forever start -c /usr/local/bin/node /home/alex/public/node_modules/http-server/bin/http-server -s -d ложный. Что я должен был написать? - person Alex; 22.05.2015
comment
test здесь имя службы. когда вы запускаете тест установки вечной службы, он создает службу с именем test для запуска app.js в этом каталоге, который будет запускаться как служба. Я бы посоветовал прочитать справочную документацию на странице gihub и добавить туда проблему, если вы не можете ее понять. - person arva; 27.05.2015
comment
Блестящий маленький инструмент. Спасибо. На настройку ушло около 2 секунд, работает как чемпион. Этот ответ заслуживает большего количества голосов для этого конкретного варианта использования. - person tpie; 07.06.2015
comment
@Alex - чтобы уточнить комментарий arva - в примере forever-service install test, test будет именем службы, но не именем фактической программы/узла .js файла для запуска. По умолчанию предполагается, что имя программы app.js, но вы можете переопределить его с помощью флага --script следующим образом: forever-service install test --script main.js. (Не проверено, поэтому, пожалуйста, поправьте меня, если есть неправильные детали синтаксиса.) - person Dan Nissenbaum; 22.06.2015
comment
@DanNissenbaum Спасибо за ответ. Сейчас я использую PM2, который прекрасно работает. Инструкции: digitalocean.com/community/tutorials/ - person Alex; 22.06.2015
comment
@Alex Это должен быть ответ, а не комментарий. - person Ted Bigham; 14.12.2015
comment
Это здорово! Спасибо @arva - person Dominik; 22.12.2015
comment
Да! Эта великолепная работа заслуживает еще одного спасибо! - person 1111161171159459134; 25.02.2016
comment
Лучшее приложение!!! Создает службу несколькими нажатиями клавиш, все stdout записываются в отдельный файл журнала в каталоге /var/log для каждой созданной вами службы (до сих пор не знаю, записывается ли stderr отдельно). 100% рекомендуется! - person dmikam; 10.03.2016
comment
Пользователи ОС Windows, имейте в виду, что это еще не поддерживается, я только что понял, когда запускаю команду установки службы! - person Vikas; 18.03.2016
comment
Не работает на последней версии Ubuntu из-за отсутствия Upstart - person Ludek Vodicka; 28.12.2016
comment
ОС windows не поддерживается - person Prashant Tapase; 25.09.2018
comment
Forever-Service — лучшая функция, которую должен иметь пакет Forever... но никогда не было. - person Rana Tallal; 28.04.2019

  1. Установите PM2 глобально с помощью NPM

    npm install pm2 -g

  2. Запустите свой скрипт с pm2

    pm2 start app.js

  3. создать активный сценарий запуска

    pm2 startup

    ПРИМЕЧАНИЕ. Запуск PM2 предназначен для запуска PM2 при перезагрузке системы. После запуска PM2 перезапускает все процессы, которыми он управлял до того, как система вышла из строя.

Если вы хотите отключить автоматический запуск, просто используйте pm2 unstartup.

Если вы хотите, чтобы сценарий запуска выполнялся под другим пользователем, просто используйте параметр -u <username> и параметр --hp <user_home>:.

person fsamuel    schedule 02.06.2017
comment
Пожалуйста, не публикуйте один и тот же ответ на несколько вопросов. - person FelixSFD; 03.06.2017
comment
Мне очень нравится, как pm2 дорабатывается и поставляется с отличным инструментом мониторинга. Надеюсь, это будет выделено больше для других. @rv7 Я уверен, что вы это видели, но есть решение для Windows: npmjs.com /package/pm2-windows-service. Хотя сам не пробовал. - person John Lee; 21.06.2019
comment
Это выглядит намного проще, чем возиться с сервисом навсегда и навсегда. - person Martin Braun; 29.05.2021

Этот случай действителен для Debian.

Добавьте следующее в /etc/rc.local

/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}

  • {{user}} заменяет ваше имя пользователя.
  • {{app path}} заменяет путь к вашему приложению. Например, /var/www/test/app.js
person NiLL    schedule 14.11.2012
comment
Этот метод не работает с корректным завершением работы, хотя для многих людей это, вероятно, не проблема. - person UpTheCreek; 21.05.2013
comment
Кстати, я думаю, вы должны редактировать /etc/rc.local, а не /etc/init.d/rc.local - person UpTheCreek; 21.05.2013
comment
Согласитесь с @UpTheCreek, что /etc/rc.local является более подходящим местом для добавления этого - см.: unix.stackexchange.com/a/ 59945 за прекрасное объяснение. - person So Over It; 07.06.2013
comment
Кроме того, вы можете указать «текущий рабочий каталог» в app.js, чтобы обеспечить правильную загрузку соответствующих файлов — process.chdir('/your/path/to/your/app'); Node.js ref docs здесь - person So Over It; 07.06.2013
comment
Если вам нужно установить переменные среды для вашего сценария Node.JS (например, $PORT для экспресс), добавление следующей строки в /etc/rc.local помогло мне: ( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" ) - person sffc; 27.12.2013
comment
Использование sudo для смены пользователя выводит эту ошибку в журнал ошибок rc.local: sudo: извините, у вас должен быть tty для запуска sudo - person woj.sierak; 05.07.2015

Альтернативный метод crontab, вдохновленный этим ответом и этот пост в блоге.

<сильный>1. Создайте файл сценария bash (замените bob на нужного пользователя).

vi /home/bob/node_server_init.sh

<сильный>2. Скопируйте и вставьте это в только что созданный файл.

#!/bin/sh

export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null

Обязательно отредактируйте указанные выше пути в соответствии с вашей конфигурацией!

<сильный>3. Убедитесь, что скрипт bash может быть выполнен.

chmod 700 /home/bob/node_server_init.sh

<сильный>4. Протестируйте сценарий bash.

sh /home/bob/node_server_init.sh

<сильный>5. Замените "bob" пользователем среды выполнения для узла.

crontab -u bob -e

<сильный>6. Скопируйте и вставьте (замените b на нужного пользователя).

@reboot /bin/sh /home/bob/node_server_init.sh

Сохраните кронтаб.

Вы дошли до конца, ваш приз — перезагрузка (для тестирования) :)

person Emre    schedule 18.02.2014
comment
Этот метод работал лучше всего для меня. Forever выйдет из строя, когда я укажу полный путь к файлу server.js. Если бы я запускал его в том же каталоге, навсегда работал бы нормально. Причина, по которой это не удалось, заключается в том, что файл server.js включал другие файлы, но пути были перепутаны. Используя этот метод, я мог бы записать свой .sh-скрипт в каталог, а затем запустить все, что связано с ним. - person BeardedGeek; 21.12.2015

Скопированный ответ из прикрепленного вопроса .

Вы можете использовать PM2 — это диспетчер производственных процессов для приложений Node.js со встроенным балансировщиком нагрузки.

Установить PM2

$ npm install pm2 -g

Запустить приложение

$ pm2 start app.js

Если вы используете экспресс, вы можете запустить свое приложение, например

pm2 start ./bin/www --name="app"

Список всех запущенных процессов:

$ pm2 list

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

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

Отображение журналов

$ pm2 logs ['all'|app_name|app_id]
person Vikash Rajpurohit    schedule 03.11.2016
comment
Как он запускается АВТОМАТИЧЕСКИ при загрузке системы? Вы просто копируете/вставляете CLI вручную - person Green; 07.11.2017
comment
@Green , Run, $pm2 startup После этого вы увидите, что pm2 просит вручную запустить команду, скопировать и запустить ее. Затем $pm2 save Теперь ваш app.js переживет перезагрузку системы. - person yajnesh; 12.01.2018

Для этого вам нужно создать сценарий оболочки в папке /etc/init.d. Это довольно сложно, если вы никогда этого не делали, но в Интернете есть много информации о сценариях init.d.

Вот пример скрипта, который я создал для вечной работы сайта CoffeeScript:

#!/bin/bash
#
# initd-example      Node init.d 
#
# chkconfig: 345 
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid 
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#


# Source function library.
. /lib/lsb/init-functions


pidFile=/var/run/forever-initd-hectorcorrea.pid 
logFile=/var/run/forever-initd-hectorcorrea.log 

sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile


start() {
    echo "Starting $scriptId"

    # This is found in the library referenced at the top of the script
    start_daemon

    # Start our CoffeeScript app through forever
    # Notice that we change the PATH because on reboot
    # the PATH does not include the path to node.
    # Launching forever or coffee with a full path
    # does not work unless we set the PATH.
    cd $sourceDir
    PATH=/usr/local/bin:$PATH
    NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile

    RETVAL=$?
}

restart() {
    echo -n "Restarting $scriptId"
    /usr/local/bin/forever restart $scriptId
    RETVAL=$?
}

stop() {
    echo -n "Shutting down $scriptId"
    /usr/local/bin/forever stop $scriptId
    RETVAL=$?
}

status() {
    echo -n "Status $scriptId"
    /usr/local/bin/forever list
    RETVAL=$?
}


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

Я должен был убедиться, что папка и PATH были явно установлены или доступны для пользователя root, поскольку сценарии init.d запускаются от имени пользователя root.

person Hector Correa    schedule 14.11.2012
comment
Если у вас есть какие-либо зависимости, которые также запускаются с помощью init.d, у вас могут возникнуть проблемы с порядком загрузки. - person UpTheCreek; 21.05.2013
comment
@alexandru.topliceanu Я исправил ссылку. - person Hector Correa; 04.12.2013

Используйте PM2.

Какой вариант лучше всего подходит для запуска серверного производственного сервера

Каковы преимущества запуска вашего приложения таким образом?

  • PM2 автоматически перезапустит ваше приложение, если оно выйдет из строя.

  • PM2 будет вести журнал необработанных исключений — в данном случае в файле по адресу /home/safeuser/.pm2/logs/app-err.log.

  • С помощью одной команды PM2 может гарантировать, что все приложения, которыми он управляет, перезапускаются при перезагрузке сервера. По сути, ваше приложение узла запустится как служба.

ссылка: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

person Vishnu Mishra    schedule 08.06.2016

Forever не создавался для того, чтобы приложения-узлы работали как сервисы. Правильный подход — либо создать запись /etc/inittab (старые системы Linux), либо выскочку (более новые системы Linux).

Вот некоторая документация о том, как настроить это как выскочку: https://github.com/cvee/node-upstart

person snez    schedule 15.11.2012
comment
Upstart подвел меня на CentOS, и я читал, что он исчезнет. Создание записи init.d на самом деле не самый удобный способ, но я полагаю, что это Linux :) - person Jorre; 23.03.2014

crontab у меня не работает на CentOS x86 6.5. @reboot не работает.

Наконец я получил это решение:

Изменить: /etc/rc.local

sudo vi /etc/rc.local

Добавьте эту строку в конец файла. Измените USER_NAME и PATH_TO_PROJECT на свои. NODE_ENV=production означает, что приложение работает в рабочем режиме. Вы можете добавить больше строк, если вам нужно запустить более одного приложения node.js.

su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"

Не устанавливайте NODE_ENV в отдельной строке, ваше приложение все равно будет работать в режиме разработки, потому что навсегда не получает NODE_ENV.

# WRONG!
su - USER_NAME -c "export NODE_ENV=production"

Сохраните и закройте vi (нажмите ESC : w q return). Вы можете попробовать перезагрузить сервер. После перезагрузки сервера ваше приложение node.js должно запускаться автоматически, даже если вы не входите в какую-либо учетную запись удаленно через ssh.

Вам лучше установить среду NODE_ENV в вашей оболочке. NODE_ENV будет установлено автоматически, когда ваша учетная запись USER_NAME войдет в систему.

echo export NODE_ENV=production >> ~/.bash_profile

Таким образом, вы можете запускать такие команды, как навсегда остановить/запустить /PATH_TO_PROJECT/app.js через ssh, не устанавливая снова NODE_ENV.

person Vince Yuan    schedule 04.03.2014
comment
такая же проблема на дебиан 7.6. Это исправлено для меня. Большое спасибо. - person Daniele Vrut; 09.09.2014
comment
На всякий случай, если вы не хотите использовать «навсегда», вы можете изменить строку на «su - USER_NAME -c NODE_ENV=production node /PATH_TO_PROJECT/bin/www». - person yaobin; 03.10.2015

Я написал скрипт, который делает именно это:

https://github.com/chovy/node-startup

Я не пробовал с навсегда, но вы можете настроить команду, которую она запускает, поэтому она должна быть прямой:

/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
person chovy    schedule 14.11.2012

Проблема с rc.local заключается в том, что доступ к командам осуществляется с правами root, что отличается от входа в систему как пользователя и использования sudo.

Я решил эту проблему, добавив сценарий .sh с командами запуска, которые я хочу, в etc/profile.d. Любой файл .sh в profile.d будет загружаться автоматически, и любая команда будет обрабатываться так, как если бы вы использовали обычный sudo.

Единственным недостатком этого является то, что указанный пользователь должен войти в систему, чтобы все началось, что в моей ситуации всегда было так.

person Moe Elsharif    schedule 08.03.2017

Я пробовал много приведенных выше ответов. Ни один из них не работал у меня. Мое приложение установлено в /home и как пользователь, а не как root. Вероятно, это означает, что когда запускаются вышеупомянутые сценарии запуска, /home еще не смонтирован, поэтому приложение не запускается.

Затем я нашел эти инструкции от Digital Ocean:

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

Использование PM2, как объяснялось, было очень простым и работает отлично: с тех пор у моих виртуальных серверов было два физических сбоя - время простоя составляло всего около минуты.

person Alex    schedule 22.06.2015
comment
PM2 имеет гораздо больше звезд (в 2 раза) на github, чем когда-либо, и у него также больше возможностей. Я думаю, что большинство ответов здесь устарели. - person inf3rno; 21.02.2016

полный пример crontab (находится в /etc/crontab) ..

#!/bin/bash

# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l

# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

# * * * * * echo "executes once every minute" > /root/deleteme

@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;
person danday74    schedule 17.01.2017

Вы можете использовать следующую команду в своей оболочке, чтобы запустить свой узел навсегда:

forever app.js //my node script

Вы должны помнить, что сервер, на котором работает ваше приложение, всегда должен оставаться включенным.

person Gaurav Singh    schedule 14.08.2014