Forked from phoenixweiss/ubuntu_22_04_server_setup.sh
Last active
June 4, 2020 22:43
-
-
Save iamdeuterium/42f15f21ffcfd52bf0d0273eee7c5c83 to your computer and use it in GitHub Desktop.
Настраиваем площадку под Ruby on Rails / Sinatra на базе Ubuntu 18.04
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# !!!Все что ниже делаем от имени пользователя 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