У цьому підручнику я поясню, як розгорнути додаток на Rails 8 на платформі OVH, використовуючи Docker і Kamal. Цей підручник орієнтований на додаток Rails 8, що використовує sqlite як базу даних і обробку завдань (jobs).
Що вам знадобиться?
- Новий додаток на Rails 8 для розгортання. Якщо у вас його немає, тут можна знайти інструкцію зі створення.
- Сервер на OVH, його IP-адреса та налаштоване SSH-з’єднання із цим сервером.
- Ваше ім’я користувача на сервері: на OVH ім’я користувача залежить від операційної системи сервера (наприклад, ubuntu, debian, centos тощо).
- Ваш пароль: під час покупки сервера на OVH ви отримуєте електронний лист із тимчасовим паролем. Підключіться через SSH до вашого сервера, після чого вас попросять негайно змінити пароль.
Збережіть це в безпечному місці 🙂
_server_ip_address
після цього вас попросять ввести ваш пароль. Введіть тимчасовий пароль
або той пароль, який ви встановили замість тимчасового 🙂
- [Docker, встановлений на вашій машині](https://docs.docker.com/get-started/get-docker/)
- Реєстр для ваших Docker images (образів Docker). У цьому прикладі використовується стандартний: [Docker Hub](https://hub.docker.com/). Ви також можете використовувати будь-який інший реєстр: ghcr.io, registry.digitalocean.com.
- Ваш публічний SSH-ключ.
Якщо у вас немає публічного SSH-ключа, ось як його можна створити: [створити SSH-ключ](/@gregoire.renaldo/how-to-create-an-ssh-key-on-linux-macos-or-window-55daa55258af)
## 1. SSH-ключ
### Отримання або створення SSH-ключа
Перегляньте ваші SSH-ключі:
ls -al ~/.ssh
```
та в залежності від формату вашого ключа (rsa або ed25519):
_rsa.pub
або
cat ~/.ssh/id\_ed25519.pub
Додайте ваш SSH-ключ на OVH
На платформі OVH перейдіть до вашої панелі керування, потім у розділ "Мої сервіси", виберіть вкладку "SSH" і додайте ваш публічний SSH-ключ.
KAMAL
Якщо ви вже створили додаток на Rails 8, у вас є все необхідне. В іншому випадку, якщо ви працюєте на Rails 7 або вище:
gem install kamal
kamal init
Налаштуйте ваш файл deploy.yml
:
# Назва вашого застосунку. Використовується для унікальної конфігурації контейнерів_service
# Назва образу контейнера.
image: my\_image
## Розгортання на цих серверах
servers:
web:
- my\_ip # для OVH знайдіть його у вашій панелі керування
# job:
# hosts:
# - 192.168.0.1
# cmd: bin/jobs
## Увімкнення автоматичної сертифікації SSL через Let's Encrypt та підтримка кількох додатків на одному вебсервері
# Видаліть цей розділ, якщо використовуєте кілька вебсерверів, та переконайтеся, що SSL завершується на балансувальнику навантаження.
#
# Примітка: Якщо використовуєте Cloudflare, налаштуйте режим шифрування в налаштуваннях SSL/TLS на "Full", щоб увімкнути шифрування між Cloudflare і додатком.
# proxy:
# ssl: true
# host: app.example.com
## Облікові дані для вашого хосту образів контейнерів (image host)
registry:
# Вкажіть сервер реєстру, якщо ви не використовуєте Docker Hub
# server: registry.digitalocean.com / ghcr.io / ...
username:
- REGISTRY\_USERNAME
# Завжди використовуйте токен доступу, а не реальний пароль, якщо це можливо.
password:
- KAMAL\_REGISTRY\_PASSWORD
## Ін’єкція змінних середовища (ENV) у контейнери (секрети зберігаються в .kamal/secrets).
\<% require "dotenv"; Dotenv.load(".env") %\> # Завантаження файлу .env для секретів
env:
secret:
- RAILS_KEY
clear:
# Запуск Solid Queue Supervisor (супервізора Solid Queue) всередині процесу Puma вебсервера для обробки завдань.
# Якщо ви почнете використовувати кілька серверів, слід виділити обробку завдань на окрему машину.
SOLID\_QUEUE\_IN\_PUMA: true
# Встановіть кількість процесів, виділених для Solid Queue (за замовчуванням: 1)
# JOB\_CONCURRENCY: 3
# Вкажіть кількість ядер, доступних для застосунку на кожному сервері (за замовчуванням: 1).
# WEB\_CONCURRENCY: 2
# Налаштуйте Active Record (бібліотека для роботи з базою даних) для роботи із зовнішнім сервером бази даних
# Використовуйте keep\_it\_simple-db для доступу до бази даних на тому ж сервері через локальну мережу kamal docker.
# DB\_HOST: 192.168.0.2
# Логування всього_LEVEL: debug
# Аліаси (aliases".
Ви можете перевизначати аргументи під час виклику:
# "bin/kamal logs -r job" буде виводити логи з першого сервера в розділі job.
aliases:
console: app exec --interactive --reuse "bin/rails console"
shell: app exec --interactive --reuse "bash"
logs: app logs -f
dbc: app exec --interactive --reuse "bin/rails dbconsole"
## Використання постійного об’єму пам’яті для файлів бази даних sqlite та локальних файлів Active Storage
# Рекомендується змінити це на шлях до змонтованого тому, який резервується поза сервером.
volumes:
- "keep\_it\_simple\_storage:/rails/storage"
## Об’єднання відбитків ресурсів, таких як JS і CSS, між версіями, щоб уникнути
# помилок 404 на запитах, що вже виконуються. Усі файли з нової та старої
# версії об’єднуються всередині asset\_path.
asset\_path: /rails/public/assets
## Налаштування збирача образів (image builder).
builder:
arch: amd64
# # Збірка образу через віддалений сервер (корисно для швидшої збірки amd64 на комп’ютерах arm64)
# remote: ssh://docker@docker-builder-server
#
# # Передача аргументів і секретів до процесу збірки Docker
_VERSION: 3.3.5
# secrets:
# - GITHUB\_TOKEN
# - RAILS\_MASTER\_KEY
## Використання іншого SSH-користувача, а не root
ssh:
# на OVH ім’я користувача залежить від ОС вашого сервера: ubuntu, debian, centos тощо.
user: ubuntu
## Використання допоміжних сервісів (секрети зберігаються в .kamal/secrets).
# accessories:
# db:
# image: mysql:8.0
# host: 192.168.0.2
# # Змініть на 3306, щоб відкрити порт для світу, а не лише для локальної мережі.
# port: "127.0.0.1:3306:3306"
# env:
# clear:
# MYSQL\_ROOT\_HOST: '%'
# secret:
# - MYSQL\_ROOT\_PASSWORD
# files:
# - config/mysql/production.cnf:/etc/mysql/my.cnf
# - db/production.sql:/docker-entrypoint-initdb.d/setup.sql
# directories:
# - data:/var/lib/mysql
# redis:
# image: redis:7.0
# host: 192.168.0.2
# port: 6379
# directories:
# - data:/data
kamal використовує файл секретів у папці kamal, який можна налаштувати таким чином:
# Секрети, визначені тут, доступні для використання в registry/password, env/secret, builder/secrets,
# і accessories/\*/env/secret у config/deploy.yml. Усі секрети повинні бути отримані або з менеджера паролів, ENV, або файлу.
# НЕ ВВОДЬТЕ СИРОВІ ОБЛІКОВІ ДАНІ В ЦЕЙ ФАЙЛ! Цей файл має бути безпечним для зберігання в git.
# Приклад отримання секретів із 1password (або іншого сумісного менеджера паролів)
# SECRETS=$(kamal secrets fetch --adapter 1password --account your-account --from_PASSWORD RAILS\_MASTER\_KEY)
# KAMAL\_REGISTRY\_PASSWORD=$(kamal secrets extract KAMAL\_REGISTRY\_PASSWORD ${SECRE_MASTER\_KEY ${SECRETS})
# Використовуйте GITHUB\_TOKEN, якщо для створення образів потрібні_TOKEN=$(gh config get -h github.com oauth\_token)
# Отримання пароля для реєстру з ENV_PASSWORD=$K_REGISTRY\_PASSWORD
# Покращуйте безпеку, використовуючи менеджер паролів.
Ніколи не додавайте файл config/master.key до git!
RAILS\_MASTER\_KEY=$(cat config/master.key)
REGISTRY\_USERNAME=$REGISTRY\_USERNAME
Створіть файл .env у кореневій директорії вашого проєкту:
KAMAL\_REGISTRY\_PASSWORD=d*\*
RAILS\_MASTER\_KEY*\*\*\*\*\*\*\*\*\**\*\*\*
У файлі deploy.yml можна додати:
\<% require "dotenv"; Dotenv.load(".env") %\>
для завантаження ваших змінних середовища (ENV).
user буде залежати від операційної системи вашого сервера:
- якщо ви обрали ubuntu, це буде user: ubuntu
- якщо ви обрали debian: user: debian
- … і так далі
Коли все готово, запустіть Docker на вашій локальній машині (це необхідно для створення образу), а потім виконайте:
kamal setup
```
І це все!
Перейдіть за вашою IP-адресою, і ваш сайт має бути доступним.
Вирішення проблем
Ви можете зіткнутися з такою помилкою:
“permission denied while trying to connect to the Docker daemon socket at unix”.
Необхідно дозволити вашому користувачу використовувати Docker на сервері. Хорошою практикою є додавання користувачів до групи docker
, щоб вони могли взаємодіяти з Docker, запобігаючи доступу неавторизованих користувачів до управління контейнерами та сервісами.
Підключіться до сервера через ssh:
ssh ubuntu/debian/centos@ip\_of\_my\_server
# приклад: [email protected]
Це відкриє термінал на вашому сервері.
далі:
sudo usermod -aG docker $USER
Закрийте термінал.
Повторіть команду kamal setup
на вашій локальній машині.
Готово! Відкрийте у браузері IP-адресу вашого сервера, і все має працювати.
Що далі?
Тепер вам потрібно додати деякі заходи безпеки для вашого сервера: використовуйте Traefik для SSL і HTTPS, придбайте доменне ім’я.
Ось кілька корисних команд із документації Kamal:
$ kamal proxy
Команди:
kamal proxy boot # Запустити проксі на серверах
kamal proxy boot\_config \ # Налаштувати конфігурацію запуску kamal-proxy
kamal proxy details # Показати деталі проксі-контейнера на серверах
kamal proxy help [COMMAND] # Описати підкоманди або одну конкретну підкоманду
kamal proxy logs # Показати логи проксі на серверах
kamal proxy reboot # Перезавантажити проксі на серверах (зупинити контейнер, видалити контейнер, запустити новий контейнер)
kamal proxy remove # Видалити проксі-контейнер та образ із серверів
kamal proxy restart # Перезапустити існуючий проксі-контейнер на серверах
kamal proxy start # Запустити існуючий проксі-контейнер на серверах
kamal proxy stop # Зупинити існуючий проксі-контейнер на серверах
Перекладено з: [How to deploy a basic rails 8 app on OVH with Kamal](https://medium.com/@gregoire.renaldo/how-to-deploy-a-basic-rails-8-app-on-ovh-with-kamal-a57b32e326a5)