Як розгорнути базовий додаток на Rails 8 на OVH за допомогою Kamal

У цьому підручнику я поясню, як розгорнути додаток на 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-ключ.

pic

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)

Leave a Reply

Your email address will not be published. Required fields are marked *