С юмором и шармом, математик Эдуардо де Саенс Cabezón отвечает на вопрос, который терзает мозг скучающих студентов по всему миру: Для чего нужна математика? Он показывает красоту математики в качестве основы науки - и показывает, что теоремы, а не бриллианты, вечны
Отличное видео про машинное обучение. Небольшой комментарий очень хорошо описал манеру подачи информации.
Тот редкий случай в подобной тематике, когда лектору не за девяносто лет, он вещает на русском языке, жонглируя не только научными словечками и не страдает дефектами речи.
Для просмотра видео на youtube перейдите по ссылке. Докладчик Дмитрий Петрович Ветров.
Также очень понравилось высказывание:
Случайность - мера нашего незнания.
Первая часть и вторая часть про настройки сервера. Перейдём к третьей части.
Произведём некоторые настройки на нашей ЛОКАЛЬНОЙ машине(на вашем компютере где вы разработали ваше приложение)
Создайте в корне приложения файл .ruby-version (с точкой в начале) и впишите в неё версию руби
2.2.2
Внесите изменения в Gemfile
ruby '2.2.2' gem 'unicorn' gem 'capistrano-rails', group: :development
Запустите bundler и установите гемы
bundle install
Установите заглушки (binstubs) для Capistrano
bundle binstubs capistrano
Инициализируем capistrano
bin/cap install
В файл Capfile, в корне вашего приложения, сразу после require 'capistrano/deploy' добавьте следующую строчку
require 'capistrano/rails'
Добавьте / Замените конфигурации в config/deploy.rb
set :application, 'myrailsapp' set :repo_url, 'https://github.com/BadAllOff/myrailsapp.git' set :deploy_to, '/opt/www/myrailsapp' set :user, 'deploy' set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets} #файлы ниже надо будет создать на сервере append :linked_files, 'config/master.key', 'config/database.yml' namespace :deploy do %w[start stop restart].each do |command| desc 'Manage Unicorn' task command do on roles(:app), in: :sequence, wait: 1 do execute "/etc/init.d/unicorn_#{fetch(:application)} #{command}" end end end after :publishing, :restart end
У меня бывал глюк с подключением по SSH, решилось заменой на HTTPS адрес
set :repo_url, 'https://github.com/BadAllOff/myrailsapp.git'Если же надо подключиться к приватному репозиторию, можно сделать следующим образом:
set :repo_url, "https://#{ENV['GITHUB_USERNAME']}:#{ENV['GITHUB_PASSWORD']}@github.com/BadAllOff/myrailsapp.git"ENV['GITHUB_USERNAME'] и ENV['GITHUB_PASSWORD'] можно указать в переменных окружения, Capistrano это обычный руби код и все правила руби в нём работают. Переменные окружения можно глянутьв консоли рельсов 'rails c'
Изменим конфигурацию в /config/deploy/production.rb на ip вашего сервера или доменное имя. Тут мы как бы ролям app web и db дали полномочия пользователя deploy на сервере
role :app, %w{deploy@0.0.0.0} role :web, %w{deploy@0.0.0.0} # Управляет asset pipeline role :db, %w{deploy@0.0.0.0} # Работает с БД
Создадим config/unicorn.rb файл с таким контентом (незабываем изменять myrailsapp если у вас свои названия для папок и прочее):
root = "/opt/www/myrailsapp/current" working_directory root pid "#{root}/tmp/pids/unicorn.pid" stderr_path "#{root}/log/unicorn.log" # логи ошибок stdout_path "#{root}/log/unicorn.log" # логи сервака listen "/tmp/unicorn.myrailsapp.sock" worker_processes 1 timeout 30
Закомментируем username и password в config/database.yml. На сервере наше приложение будет использовать имя пользователя под которым запущенно приложение (т.е. deploy) как название РОЛИ для базы данных. А мы помним что специально для этого мы ранее и создали роль deploy в posтgres-е. Поэтому переопределение имени пользователя нам только помешает подключиться.
default: &default adapter: postgresql encoding: unicode pool: 5 production: <<: *default database: myrailsapp_production host: '' username: deploy
Но конечно ничто вам не мешает создать в postgres ещё одну роль под именем “myrailsapp”, дать ей права на определённую бд, и записать её пароль в переменную окружения на сервере. Это уже на ваше усмотрение, как вам удобно. Внизу я покажу куда можно записать пароль если вы решите следовать таким путём.
Внесём изменения в наш репозиторий на git
git add . git commit -m 'Added settings to deploy app' git push
Создадим секретный ключ для использования на сервере
bin/rake secret
НА СЕРВЕРЕ! Заходим на сервер под пользователем username.
Установим переменные окружения:
sudo nano /home/deploy/.bashr
c
Сразу после строчек
export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"
впишите следующее:
export SECRET_KEY_BASE=
ВАШСГЕНЕРИРОВАННЫЙСЕКРЕТНЫЙКЛЮЧЬ
В Rails 5.2 еще используеться файл secrets.yml но он обявлен устаревшим. Теперь всё данны храняться в защифрованном виде в файле credentials.yml.enc
(редактировать который можно командой: EDITOR=nano bin/rails secrets:edit
). Нужно также ввести новую переменную окружения для расшифровки файла. Там же, в файле .bashrc, вводим новую переменную (название рекомендовано самими рельсами), значение для переменной берем из файла /config/master.key
:
export RAILS_MASTER_KEY=STRINGFROMMASTERKEYFILE
Если вы решили всё таки использовать другу роль для подключения к бд, cюда же вы можете вписать и пароль от вашего БД
export MYRAILSAPP_DATABASE_PASSWORD=ВАШПАРОЛЬОТДБ
ПРИМЕЧАНИЕ! Если вы УЖЕ используете гем Devise в вашем приложении, то добавьте строку в /config/initializers/devise.rb
config.secret_key = ENV['DEVICE_CONFIG_SECRET_KEY']и добавить в окружение переменную
export DEVICE_CONFIG_SECRET_KEY='секретныйключьможетесгенерироватьегосами'
Сохраним, дадим башу перегрузить переменные
. ~/.bashrc
и перезапускаем nginx
sudo service nginx restart
НА ВАШЕМ КОМПЮТЕРЕ запустим некоторую предварительную проверку
bin/cap production git:check
если появится ошибка:
DEBUG [4618dd23] Warning: Permanently added 'github.com,192.30.252.129' (RSA) to the list of known hosts. DEBUG [4618dd23] Permission denied (publickey). DEBUG [4618dd23] fatal: Could not read from remote repository. DEBUG [4618dd23] DEBUG [4618dd23] Please make sure you have the correct access rights DEBUG [4618dd23] and the repository exists.
Попробуйте изменить строку set :repo_url в config/deploy.rb на https :
set :repo_url, 'https://github.com/RebelioUS/myrailsapp.git'
ещё одна проверка (должна пройти без запинки):
bin/cap production deploy:check
И вот! Торжественный момент развёртывания Вашего приложения!
bin/cap production deploy
Зайдём на наш домен и ...
ВУАЛЯ! Работает!
Теперь после каждого коммита на гитхаб Вы можете перезапустить сервер с обновлённым приложением одной командой
bin/cap production deploy
Для полной уверенности перегрузите сервер
sudo reboot
Поздравляю Вас с запуском вашего приложения! Оставьте отзыв если это Вам помогло или возникнут какие либо проблемы. Постараюсь помочь Вам в решении, да и сам опыта наберусь (так как представляется мне, что хоть я и учёл самые важные ошибки, их может быть гораздо больше). Спасибо!
Первая часть про настройки сервера. Перейдём ко второй части.
Установим нужные пакеты.
ВНИМАНИЕ! По умолчанию в репозитории Убунту наличивствует старая версия Postgresql (9.3 помоему). Она отлично работает и все с ней ок, НО! В новой версии есть очень интересные фичи, и Rails их использует для улучшения производительности. Очень рекомендую установить 10-ю версию. И вот как это делаеться для Убунту 16.04 (Xenial Xerus):
Добавим GPG ключь для PostgreSQL пакетов:
wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -
Добавим репозиторий в нашу систему:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
Установим нужные пакеты вместе с PostgreSQL 10:
sudo apt-get -y install git-core curl build-essential zlib1g-dev libssl-dev libreadline-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev nodejs libpq-dev postgresql postgresql-server-dev-10 python-software-properties libsqlite3-dev
Теперь нам доступны следующие команды для управления postgres сервером:
sudo systemctl stop postgresql.service sudo systemctl start postgresql.service sudo systemctl enable postgresql.service sudo systemctl status postgresql.service
По названиям думаю понятно что они делают.
Для доступа к самой базе можно подключиться к ней используя системного пользователя potgres:
sudo su -l postgres
Можно изменить пароль к примеру:
sudo passwd postgres
Добавим репозиторий nginx и установим его
sudo add-apt-repository ppa:nginx/stable
Жмём ENTER
sudo apt-get update && sudo apt-get -y install nginx
ПРИМЕЧАНИЕ
Скорее всего ваш сайт будет обрабатывать изображения (те же аватарки, фото), использовать такие гемы как Paperclip или carrierwave. Для обработки изображения они используют библиотеку rmagic. Предвидя это:
Fetching: rmagick-2.13.2.gem (100%) # Building native extensions. This could take a while... # ERROR: Error installing rmagick: # ERROR: Failed to build gem native extension.сразу же рекомендую установить ещё один пакет чтоб вы потом не гадали почему “фотки не грузятся”
sudo apt-get install libmagick++-devА если используете ActiveStorage то:
sudo apt-get install imagemagick --fix-missing
Теперь создадим пользователя от имени которого мы будем запускать наше rails приложение.
sudo adduser deploy --disabled-password
Теперь надо дать юзеру deploy публичный ключь ssh который у username-а, да бы иметь возможность и права на изменение файлов и прочее + удалённый доступ .
Создадим директорию .ssh для установки публичного ключа, изменим владельца директории на deploy, изменим разрешение на запись (только владелец)
sudo mkdir /home/deploy/.ssh sudo chown -R deploy /home/deploy/.ssh sudo chgrp -R deploy /home/deploy/.ssh sudo chmod -R 700 /home/deploy/.ssh
Опционально: можете добавить вашему пользователю username группу deploy
sudo usermod -a -G deploy username
это позволит легко менять файлы пользователя deploy.
Скопируем публичный ssh от username(от имени которого мы всё ещё в системе) к пользователю deploy
sudo cp ~/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys sudo chown deploy /home/deploy/.ssh/authorized_keys sudo chgrp deploy /home/deploy/.ssh/authorized_keys
Создадим директории для развёртывания нашего приложения.
Вместо myrailsapp — можете вставить ваше название
sudo mkdir -p /opt/www/myrailsapp sudo chown -R deploy /opt/www/myrailsapp sudo chgrp -R deploy /opt/www/myrailsapp sudo chmod -R 775 /opt/www/myrailsapp
Перейдём к пользователю deploy
sudo su - deploy
Для контроля версий руби и гемов будем использовать rbenv или rvm(ниже).
Не заморачиваясь на rvm и rbenv могу сказать что разницы в производительности вы не почувствуете. Разве что с rvm придётся немного дольше настраивать Capistrano. А если нет разницы, вам это надо?
Установим rbenv
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
сконфигурируем файл .bashrc
nano ~/.bashrc
добавьте В САМОЕ НАЧАЛО ФАЙЛА (это имеет значение) следующий код
export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"
Сохраним файл уже известным нам способом
CTRL+X, Y, ENTER
Перезапустим shell
exec $SHELL
Установим ruby-build и не будем марать ручки))
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
Выберем версию руби для установки.
ОЧЕНЬ рекомендую устанавливать версию последнюю стабильную.
К примеру в версии 2.2.1 был найден неприятный баг с TCL, не «секюрно» короче.
Я установлю версию 2.2.2, вы выбирайте ту на которой велась разработка вашего продукта ну или последнюю стабильную на свой страх и риск.
Следующая команда покажет все доступные к установке версии
rbenv install -l
Установим. Это может занять некоторое время поэтому пойдите пока и заварите себе чайку или кофе. Дождитесь окончания установки. Может занять >10 минут
rbenv install 2.2.2
Установим эту версию как глобальную
rbenv global 2.2.2 rbenv rehash
Проверим версию руби
ruby -v
Установим гем bundler (без документации, это долго и к тому же зачем она на сервере?)
gem install bundler --no-ri --no-rdoc rbenv rehash
Установка RVM:
sudo apt-get install libgdbm-dev libncurses5-dev automake libtool bison libffi-dev
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
curl -sSL https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
rvm install 2.5.1
rvm use 2.5.1 --default
ruby -v
Установим bundler без документации
gem install bundler --no-ri --no-rdoc
Выходим с пользователя deploy
exit
Настроим базу данных PostgreSQL
Мы её уже устанавливали, во время установки был создан специальный пользователь, перейдём на него
sudo su - postgres
подключаемся к postgres
psql
В PostgreSQL нет “пользователей”, в ней существуют “роли”. Создадим новую роль, укажем имя так что бы оно совпадало с именем пользователя, от имени которого будет запускаться приложение (простите за каламбур)) . В нашем случае это deploy.
НЕЗАБЫВАЙТЕ точку с запятой в конце.
create user deploy;
Создадим новую базу данных и дадим роли deploy права на неё. Таким образом deploy будет иметь все права НО только на эту базу данных (если вдруг вы решите создать параллельно другую базу данных). Другие ДБ он затронуть не сможет.
create database myrailsapp_production owner deploy;
Выходим из консоли psql и от пользователя Postgres
\q exit
Проверим работает ли бд
sudo su deploy
psql -d myrailsapp_production
Если подключилось, всё ок, выходим.
\q exit
Мы используем Рейлс приложение всего одно на этом сервере поэтому нам больше не нужны остальные конфигурации.
Удалите страницу по умолчанию и создайте новую
sudo rm /etc/nginx/sites-enabled/default && sudo nano /etc/nginx/sites-available/myrailsapp
Записываем следующее в файл для myrailsapp , не забываем ввести соответствующие изменения в него
upstream unicorn_myrailsapp { server unix:/tmp/unicorn.myrailsapp.sock fail_timeout=0; # сокет для запросов } server { listen 80 default deferred; server_name mydomain.com; # имя сервера root /opt/www/myrailsapp/current/public; location ~ ^/assets/ { # для asset pipline настройки gzip_static on; expires max; add_header Cache-Control public; } try_files $uri/index.html $uri @unicorn; location @unicorn { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_pass http://unicorn_myrailsapp; # прокси на сокет выше } error_page 500 502 503 504 /500.html; client_max_body_size 4G; keepalive_timeout 10; }
создадим симлинк на место расположение сайта
sudo ln -s /etc/nginx/sites-available/myrailsapp /etc/nginx/sites-enabled/myrailsapp
Перезапустим nginx
sudo service nginx restart
Настройки Unicorn.
Настроим инициализационный скрипт для unicorn
sudo nano /etc/init.d/unicorn_myrailsapp
Скопируйте в него следующее:
#!/bin/sh
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Manage unicorn server
# Description: Start, stop, restart unicorn server for a specific application.
### END INIT INFO
set -e
# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/opt/www/myrailsapp/current # настройка расположения приложения current это от capistrano
PID=$APP_ROOT/tmp/pids/unicorn.pid # определение процесса Юникорна
CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production" # команды для запуска в корне проекта сервера юникорна
AS_USER=deploy # от имени какого пользователя будет запушен сервер
set -u
OLD_PIN="$PID.oldbin"
sig () {
test -s "$PID" && kill -$1 `cat $PID`
}
oldsig () {
test -s $OLD_PIN && kill -$1 `cat $OLD_PIN`
}
run () {
if [ "$(id -un)" = "$AS_USER" ]; then
eval $1
else
su -c "$1" - $AS_USER
fi
}
case "$1" in
start)
sig 0 && echo >&2 "Already running" && exit 0
run "$CMD"
;;
stop)
sig QUIT && exit 0
echo >&2 "Not running"
;;
force-stop)
sig TERM && exit 0
echo >&2 "Not running"
;;
restart|reload)
sig HUP && echo reloaded OK && exit 0
echo >&2 "Couldn't reload, starting '$CMD' instead"
run "$CMD"
;;
upgrade)
if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
then
n=$TIMEOUT
while test -s $OLD_PIN && test $n -ge 0
do
printf '.' && sleep 1 && n=$(( $n - 1 ))
done
echo
if test $n -lt 0 && test -s $OLD_PIN
then
echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"
exit 1
fi
exit 0
fi
echo >&2 "Couldn't upgrade, starting '$CMD' instead"
run "$CMD"
;;
reopen-logs)
sig USR1
;;
*)
echo >&2 "Usage: $0 "
exit 1
;;
esac
Установите разрешение для init.d скрипта
sudo chmod 755 /etc/init.d/unicorn_myrailsapp
Назначить старт скрипту init.d при каждом запуске сервера
sudo update-rc.d unicorn_myrailsapp defaults
Перезапустите сервер
sudo reboot
Эта учебная статья, из нескольких частей (Часть 1\3), предполагает что вы уже умеет входить на сервер через SSH, поэтому в местах про "заходим/выходим/перезаходим на сервер" говориться именно про вход через SSH. Мы будем проделывать все манипуляции на сервере от DigitalOcean.com за 5$, таким образом все смогут протестировать и убедиться в пользе данной статьи.
И так мы запустили сервер на ubuntu 14.04
Теперь, пока всё свежо - освежим всё до идеала!))
apt-get update apt-get upgrade apt-get autoremove
Когда попросить подтверждения для продолжения жмём на "Y", затем ENTER. (Хотя в целом должно работать на любом из ubuntu 11 и больше) И первым делом надо настроить файл локали и времени.
У DigitalOcean есть причуда настраивать локали по вашей стране. Ну к примеру я сидя в Азербайджане, поглядывая на первые европейские олимпийские игры, и запуская новый сервер могу получить в локалях вот такие параметры.
# Created by cloud-init v. 0.7.5 on Mon, 15 Jun 2015 07:30:59 +0000 LANG="en_US.UTF-8"
И если их не изменить (на дефолтные английские) то в будующем при установке базы
данных PostgreSQL может появиться небольшой неприятный глюк о котором может
потом расскажу. Выглядеть глюк в терминале мог бы примерно так:
perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = "en_US:en", LC_ALL = (unset), LC_CTYPE = "UTF-8", LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C").
Что бы этого избежать, делаем следующее.
> /etc/default/locale
">" - очищает файл полностью (не волнуйтесь, в самом начале работы сервера это неопасно).
Откроем файл locale следующей командой
nano /etc/default/locale
Копируйте следующие данные в этот файл:
LANGUAGE=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 LANG=en_US.UTF-8 LC_NUMERIC=en_US.UTF-8 LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=en_US.UTF-8 LC_ADDRESS=en_US.UTF-8 LC_TELEPHONE=en_US.UTF-8 LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=en_US.UTF-8
Теперь обязательно перезайти на сервер!
reboot
Проверяем текущий часовой пояс, установленный на машине. Для этого выполняем команду date. На экране появится что-то типа:
Tue Jun 16 00:38:33 EDT 2015
В данном случае EDT и есть наш текущий часовой пояс.
Если вы хотите изменить время на сервере:
1. Зайдя в директорию /usr/share/zoneinfo мы увидим список регионов, из которых можно выбрать наиболее подходящий для нас. Допустим, мы хотим переключиться на часовой пояс Баку. Для этого нам нужно использовать файл Baku, находящийся в поддиректории Asia.
2. На всякий случай делаем резервную копию файла с текущими настройками:
mv /etc/localtime /etc/localtime-old
3. Создаем символическую ссылку на нужный нам timezone:
ln -sf /usr/share/zoneinfo/Asia/Baku /etc/localtime
4. Устанавливаем аппаратные часы, выполнив команду:
/sbin/hwclock --systohc
Аппаратные часы - это те часы, которые работают на вашем компьютере даже тогда, как питание компьютера отключено. Это возможно благодаря наличию в современных компьютерах литиевой батареи или батареи другого типа в более старых компьютерах.
Мы можем увидеть различие между аппаратными и системными часами
hwclock --show
Вы увидите что-то вроде следующего:
Tue 16 Jun 2015 08:10:31 AM AZST -0.224429 seconds
Теперь добавим нового пользователя на наш сервер, сидеть под root пользователем крайне опасно.
adduser username
Запросит новый пароль для пользователя, введите и запомните его. Он попросит дополнительную информацию для пользовательского профиля, но она не существенна поэтому можете пропустить все остальные пункты просто нажимая ENTER
Вместо username можете использовать любое удобное вам имя НО, оно должно сответствовать следующему регулярному выражению
^[a-z][-a-z0-9]*$
Не пугайтесь, сейчас всё объясню. По стандартам международным, Вам дозволено вписать любое имя включающее в себя следующие символы
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -
Но вот по стандартам(рекомендациям) UBUNTU, к которым я рекомендую прислушаться, Вам дозволены следующие символы
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 -
и первый символ обязательно буква в нижнем регистре.
Если подумать это не большие жертвы.
Добавим этому пользователю некоторые права что бы мы могли использовать команду sudo
usermod -a -G sudo username
Перезагрузите сервер в случаи если какие либо новые установки этого требуют.
reboot
Как создать публичный ключ SSH. (Эту статью я ещё не написал, но скоро))) вы можете и загуглить.
Если вы уже создавали публичный ключь SSH.
Откройте новое окно терминала на вашем компютере.
С ВАШЕГО КОМПА на сервер скопируйте публичный SSH ключ к пользователю username(любое ваше имя пользователя что вы поставили) следующей командой
ssh-copy-id -i ssh_key.pub username@0.0.0.0
вместо username имя пользователя которого вы создали, вместо нулей впишите ip сервера. Вас попросят ввести пароль.
Теперь мы можем подключиться к серверу через ssh без ввода пароля!
Отредактируем конфигурационный файл sshd_config
sudo nano /etc/ssh/sshd_config
Ctrl+w это поиск по файлу
PermitRootLogin no - запрет для входа под root пользователем
PasswordAuthentication no - чтоб не входили только лишь по паролю (незабывайте убрать # в начале строки)
X11Forwarding no - отключаем возможность перенаправлять вывод содержимого окна в другое место
AllowUsers username deploy – Если не найдёте эту строчку просто впишите её в конец файла.
Вместо 'deploy' можно любое имя, мы будем использовать этого пользователя для запуска нашего rails приложения. Мы создадим его чуть позже.
Закроем и сохраним файл
CTRL+X
Y
ENTER
Прежде чем пойдём дальше, проведём быстрый тест на верное заполнение файла, если в редактируемом нами файле обнаружиться ошибка мы просто не сможем войти обратно и придётся использовать консольный доступ к серверу (на digitalocean.com он существует) и поправлять ошибки, а это отнимает время.
Следующая команда выведет нам конфигурации в окно терминала
sudo sshd -T
Найдите там следующие строки (примерно 10-12 строчки с конца)
allowusers username
allowusers deploy
Если они есть всё ок. Произведём перезапуск демона чтоб подобрал новые конфигурации
sudo service ssh restart
Теперь настроем firewall-а. UFW - Uncomplicated FireWall
sudo ufw logging on && sudo ufw allow ssh && sudo ufw allow www && sudo ufw allow https
запускаем firewall
sudo ufw enable
Жмём Y и ENTER
проверить статус допущенных портов если интересно
sudo ufw status
Бонус!
Можно добавить swap-память (это как запасной объем оперативной если сервер уж слишком слаб. При генерировании JavaScript файлов лишняя оперативка не помешает). Как это сделать на Убунту 16.04 (и других версий) можно найти тут