Articles



Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 2\3

Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 2\3
Эта учебная статья, из нескольких частей (часть 2\3), предполагает что вы уже умеет входить на сервер через SSH, поэтому в местах про "заходим/выходим/перезаходим на...
Show full article

Первая часть про настройки сервера. Перейдём ко второй части.

Установим нужные пакеты

sudo apt-get install -y 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-9.3 python-software-properties libsqlite3-dev libgmp-dev

Добавим репозиторий 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

Теперь создадим пользователя от имени которого мы будем запускать наше 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 и 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

Выходим с пользователя 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
Show preview
Leave a comment




Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 2\3

Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 2\3
Эта учебная статья, из нескольких частей (часть 2\3), предполагает что вы уже умеет входить на сервер через SSH, поэтому в местах про "заходим/выходим/перезаходим на...
Show full article

Первая часть про настройки сервера. Перейдём ко второй части.

Установим нужные пакеты

sudo apt-get install -y 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-9.3 python-software-properties libsqlite3-dev libgmp-dev

Добавим репозиторий 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

Теперь создадим пользователя от имени которого мы будем запускать наше 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 и 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

Выходим с пользователя 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
Show preview
Leave a comment




Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 1\3

Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 1\3
Эта учебная статья, из нескольких частей (часть 1\3), предполагает что вы уже умеет входить на сервер через SSH, поэтому в местах про "заходим/выходим/перезаходим на...
Show full article

Эта учебная статья, из нескольких частей (Часть 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

 

Жмите комбинацию клавиш CTRL+x для выхода из редактора, он спросить про сохранение файла и мы конечно же сохраняем нажимая клавишу "Y", редактор требует подтверждения - жмём ENTER

Теперь обязательно перезайти на сервер!

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

Перезагрузите сервер в случаи если какие либо новые установки этого требуют.

sudo 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
Show preview
Leave a comment




Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 1\3

Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 1\3
Эта учебная статья, из нескольких частей (часть 1\3), предполагает что вы уже умеет входить на сервер через SSH, поэтому в местах про "заходим/выходим/перезаходим на...
Show full article

Эта учебная статья, из нескольких частей (Часть 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

 

Жмите комбинацию клавиш CTRL+x для выхода из редактора, он спросить про сохранение файла и мы конечно же сохраняем нажимая клавишу "Y", редактор требует подтверждения - жмём ENTER

Теперь обязательно перезайти на сервер!

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

Перезагрузите сервер в случаи если какие либо новые установки этого требуют.

sudo 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
Show preview
Leave a comment