Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save iamdeuterium/42f15f21ffcfd52bf0d0273eee7c5c83 to your computer and use it in GitHub Desktop.
Save iamdeuterium/42f15f21ffcfd52bf0d0273eee7c5c83 to your computer and use it in GitHub Desktop.
Настраиваем площадку под Ruby on Rails / Sinatra на базе Ubuntu 18.04
# !!!Все что ниже делаем от имени пользователя root!!!
# Проверяем что раскомментировано в файле /etc/locale.gen
# Раскомментируем или добавляем локаль ru_RU.UTF-8 UTF-8 и выполняем команду
locale-gen
# Открываем ручками /etc/hosts и добавляем туда имя нашего сервера, его же дублируем в /etc/hostname
# Выполняем для очистки кэша пакетов, апдейтим источники, обновляем все что можно, чистим мусор
apt-get clean
apt-get update
apt-get -y upgrade
apt-get -y dist-upgrade
apt-get -y autoremove
# Узнать что у нас с памятью можно командой
free -m
# Узнать подключенные файлы подкачки можно так
cat /proc/swaps
# Создадим руками файл подкачки из блоков по 1Мб в количестве равном размеру физической памяти в Мб, пример для 512Мб
dd if=/dev/zero of=/swapfile bs=1M count=512
# Зададим права и подключим файл подкачки
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# Автоматизируем поднятие файла подкачки при каждой загрузке системы
echo "/swapfile none swap defaults 0 0" >> /etc/fstab
# Укажем при какой загруженности физической памяти будет подхватываться запись в файл подкачки
echo "vm.swappiness=15" >> /etc/sysctl.conf
# Для проверки работоспособности файла подкачки лучше всего перезагрузить контейнер и проверить работу файла
reboot
cat /proc/swaps
# Опционально устанаваливаем ssh, sudo и curl
apt-get -y install ssh sudo curl
# Проверяем есть ли пользователь deploy
id -u deploy
# И если его нет то добавляем его, но для начала добавляем группу, затем самого пользователя с его окружением и даем ему права sudo
groupadd -f deploy
useradd -m -g deploy -s /bin/bash deploy
chmod +w /etc/sudoers
echo "deploy ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
chmod -w /etc/sudoers
# Если папки .ssh нет то создаем ее, присвоив соответствующие права
mkdir /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chown deploy /home/deploy/.ssh
chgrp deploy /home/deploy/.ssh
# Генерируем деплой-ключ для сервера, причем лучше вместо yourservername указать реальное имя сервера или домен
ssh-keygen -b 2048 -t rsa -C "deploy@yourservername" -f /home/deploy/.ssh/id_rsa -q -N ""
# Ужесточаем права
chmod -R 600 /home/deploy/.ssh/*
chown -R deploy /home/deploy/.ssh/*
chgrp -R deploy /home/deploy/.ssh/*
# Дублируем файл authorized_keys от рута для пользователя deploy с соответствующими правами
cp /root/.ssh/authorized_keys /home/deploy/.ssh/
chmod 600 /home/deploy/.ssh/authorized_keys
chown deploy /home/deploy/.ssh/authorized_keys
chgrp deploy /home/deploy/.ssh/authorized_keys
# !!!ОПАСНО!!!
# Отключаем авторизацию по паролю для сервера и рестартим демона ssh
sed -i "s/.*PasswordAuthentication yes.*/PasswordAuthentication no/g" "/etc/ssh/sshd_config"
service ssh restart
# Волшебный набор пакетов на все случаи жизни, опять же не забываем про sudo
apt-get install -y debconf lsb-core git git-core gcc make imagemagick libmagickwand-dev libcurl4-openssl-dev autoconf bison build-essential libssl-dev libyaml-dev libxml2-dev libxslt1-dev libreadline-dev zlib1g zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
# Готовимся к установке MySQL
# В качестве пароля используем слово 'toor'
debconf-set-selections <<< "mysql-server mysql-server/root_password password toor"
debconf-set-selections <<< "mysql-server mysql-server/root_password_again password toor"
apt-get -y install mysql-server mysql-client libmysqlclient-dev
# Задаем максимальное тело запроса на 64 Мб
# max_allowed_packet = 64M
# смотрим куда из файла
# /etc/mysql/my.cnf
# например задано может быть в /etc/mysql/mysql.conf.d/mysqld.cnf
# Рестартим
service mysql restart
# !!!Уточните $SERVER_NAME!!!
# Конфигурируем и устанавливаем postfix, указываем вместо $SERVER_NAME то что писали в /etc/hostname
echo $SERVER_NAME > "/etc/mailname"
debconf-set-selections <<< "postfix postfix/mailname string $SERVER_NAME"
debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'"
apt-get install -y postfix
# Для отправки почты из командной строки не забывае поmailutils
apt-get install -y mailutils
# Для проверки мыла можно отправить например
echo "Hello form your new server" | mail -s "Hello from server" yourmail@yourserver.ru
# В качестве js-рантайма ставим nodejs
apt-get install -y nodejs
# !!!Все что ниже делаем от имени пользователя deploy!!!
# От лица пользователя deploy из его корневой папки по-умолчанию ставим rbenv при помощи rbenv-installer'а (БЕЗ sudo)
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash
# Добавляем rbenv в пути пользователя
echo 'export RBENV_ROOT="/home/deploy/.rbenv"' >> /home/deploy/.profile
# Если в переменной окружение у нас не определился RBENV_ROOT, то скриптом по-умолчанию при инициализации профиля пользователя, мы его пробрасыааем
printf '
if [ -d "${RBENV_ROOT}" ]; then
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
fi
' >> /home/deploy/.profile
# Чтобы реинициализировать окружение, можно в терминале выполнить
source /home/deploy/.profile
# Устанавливаем на сервер нужную нам версию руби, например 2.5.1 (если нужен полный вывод то указываем флаг verbose через два дефиса)
rbenv install 2.5.1
# Указываем установленную версию руби в качестве глобальной
rbenv global 2.5.1
# Проверяем при помощи
ruby -v
# Отключаем генерацию документации для гемов
echo "gem: --no-ri --no-rdoc --no-document --suggestions" >> ~/.gemrc
# Обновляем пакетный менеджер гемов и ставим бандлер
gem update --system
gem install bundler
# Ставим NGINX со всеми возможными модулями
sudo apt-get install -y nginx-full
# Обновляем что можно
sudo apt-get update --fix-missing
sudo apt-get upgrade
sudo apt-get -y autoremove
# Конфигурируем NGINX
sudo sed -i "s|www-data;|deploy;|g" /etc/nginx/nginx.conf
sudo sed -i "s|# server_tokens off.*|client_max_body_size 20M;|" /etc/nginx/nginx.conf
# Ставим пассажира, в зависимости от ОС, варианты могут отличаться, сомтреть тут: https://www.phusionpassenger.com/library/install/nginx/install/oss/bionic/
# Ставим ключи и соответствующие модули поддержки для APT
sudo apt-get install -y dirmngr gnupg
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
sudo apt-get install -y apt-transport-https ca-certificates
# Добавляем соответствующий репозиторий и обновляемся
sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list'
sudo apt-get update
# Устанавливаем модуль расширения пассажира который подтянет все остальное
sudo apt-get install -y libnginx-mod-http-passenger
# Убедимся что файл конфигурации на месте
if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi
sudo ls /etc/nginx/conf.d/mod-http-passenger.conf
# Конфигурируем пассажира в файле /etc/nginx/conf.d/mod-http-passenger.conf
sudo sed -i "s|passenger_ruby.*|passenger_ruby /home/deploy/\.rbenv/shims/ruby;|" /etc/nginx/conf.d/mod-http-passenger.conf
sudo su - root -c "echo 'passenger_max_pool_size 2;' >> /etc/nginx/conf.d/mod-http-passenger.conf"
# Проверяем работает ли конфиг nginx
sudo nginx -t
# Рестартим NGINX
sudo service nginx restart
# Проверить установку пассажира после этого можно командами ниже, причем процессы NGINX и Passenger должны быть запущены параллельно
sudo /usr/bin/passenger-config validate-install
sudo /usr/sbin/passenger-memory-stats
# В очередной раз обновляемся
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get update --fix-missing
# Для Rails > 5.1 может потребоваться установить Yarn
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn
# Готовим папку для проетков от лица пользователя deploy
mkdir -p /home/deploy/projects/
### ДАЛЕЕ ИДЕТ ПОДГОТОВКА ПЛОЩАДКИ ПОД ПРОЕКТ ###
# Пусть у нас будет проект projectname на домене domain.name
# Создадим
mkdir -p /home/deploy/projects/projectname/shared/config/
# Создаем БД, нового пользователя и передаем ему права
mysql_username="projectname_user"
mysql_dbname="projectname_db"
mysql_dbpass="PaSsWoRd"
Q1="CREATE DATABASE IF NOT EXISTS $mysql_dbname CHARACTER SET utf8;"
Q2="GRANT ALL ON $mysql_dbname.* TO '$mysql_username'@'localhost' IDENTIFIED BY '$mysql_dbpass';"
Q3="FLUSH PRIVILEGES;"
Q4="SELECT User,Host FROM mysql.user;"
Q5="SHOW DATABASES;"
SQL="${Q1}${Q2}${Q3}${Q4}${Q5}"
# Не забываем что здесь потребуется ввести пароль root для MySQL
mysql -uroot -p -e "$SQL"
# Не забываем для Rails-проекта создать файлы конфига БД, для нашего примера они могут быть примерно такими
DB_CONFIG="
production:
adapter: mysql2
encoding: utf8
host: localhost
reconnect: true
database: $mysql_dbname
pool: 5
username: $mysql_username
password: $mysql_dbpass
"
printf "$DB_CONFIG" > /home/deploy/projects/projectname/shared/config/database.yml
# Настраиваем бесплатные SSL-сертификаты
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx
sudo certbot --nginx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment