3 заметки с тегом

rails

Ruby gem для сохранения UTM меток

Привет!

Когда я только начал свою карьеру Ruby разработчика, у меня была мечта запилить что-нибудь в open source. Внести, так сказать, свой вклад в сообщество. Проще всего внести вклад в ruby-сообщество, сделав свой собственный gem (библиотеку).

Но до сих пор у меня не было идеи того, что я хочу сделать, а пилить гем ради гема — такое себе удовольствие.

Проблема

Я периодически тестирую разные идеи Rails приложений, где есть только лендинг (что-то вроде «продающей» страницы) и регистрация пользователя (через email и соц. сети). Затем я настраиваю рекламу и запускаю трафик, чтобы проверить потом в Яндекс.Метрике в какую стоимость будет выходить лид.

Получается такое быстрое MVC для валидации идей.

Засада в том, что лид в Метрике считается не совсем корректно (а настраиваемые цели часто косячат), плюс не всегда понятно, откуда и по каким ключевым словам приходят эти лиды.

Чтобы сделать этот процесс понятным, мне нужно было сохранить зарегистрированному на сайте пользователю UTM метки, c которыми он пришёл на сайт. А дальше уже делать выгрузку этих данных из базы и понимать какая реклама работает лучше всего и где лид выходит дешевле.

Проблема в том, что я не нашёл для себя подходящий гем, который бы делал эту операцию, в итоге решил написать свой)

UTM Tracker — гем для сохранения UTM меток

UTM Tracker позволяет сохранять UTM метки прямо в базу данных, чтобы хранить в таблице пользователей эту информацию.

Особенность его в том, что подключив гем и определив точки входа вашего трафика, по всем перешедшим посетителям, UTM метки будут храниться в сессии пользователя. А в момент его регистрации на сайте, вы сохраните эти данные в базу.

Документация находится здесь

P.S. Если вы программист и у вас есть аккаунт на Github, поставьте, пожалуйста, звездочку. Мне будет очень приятно.

2021   rails   ruby   веб-разработка

Настройка и деплой Sidekiq 6.0.0 при помощи Capistrano

Сначала думал дополнить предыдущую статью по деплою ассетов, но в итоге решил вынести этот пункт отдельно.

Дело в том, что помимо компиляции ассетов я столкнулся с проблемой деплоя Sidekiq для фоновых задач в с своём рельсовом приложении.

Проблема capistrano/sidekiq

Для капистрано есть гем, который запускает весь процесс из коробки (capistrano/sidekiq), но у него поломана совместимость с sidekiq версии 6. Он работает только для версии 5, а тот пулл-реквест, который фиксит баг до сих пор не принят. Есть отдельный форк этого гема (который вроде как решает проблему), но видимо я слишком туп, чтобы он у меня заработал.

Изучая документацию Sidekiq в части деплоя, я выяснил, что можно воспользоваться системной утилитой управления сервисами: systemd

И для меня это был выход, потому что Redis (который работает в связке с Sidekiq и уже должен быть установлен у вас на сервере) запускается / останавливается / рестартуеся при помощи этой утилиты (и я хочу сказать, что это очень удобно).

Ниже я описал, что нужно сделать, чтобы и на вашем сервере работал Sidekiq тоже.

Настройка systemd

Для начала вам нужно настроить конфиг для работы Sidekiq на вашем сервере.

  1. Заходим на сервер и создаем файл конфига:
sudo nano /lib/systemd/system/sidekiq.service

Вот ссылка на конфиг: https://gist.github.com/mkhuda/132787f9d54890a183d665eb4560f196

Несмотря на то, что он написан для Ubuntu 16, он прекрасно работает и на Ubuntu 18.04. Но его конечно нужно будет немного поправить.

Помещаем данные конфига в файл sidekiq.service и кое-что редактируем.

  1. Заменяем эти данные на свои:
User=deploy # Название пользователя, под которым вы заходите на сервер для деплоя
Group=deploy # Дублируем его же

WorkingDirectory=/home/deploy/my_app/current # Сюда вводим путь, где лежит текущая версия вашего приложения

ExecStart=/home/deploy/.rbenv/shims/bundle exec sidekiq -e production # Запускаем sidekiq используя rbenv

-C config/sidekiq.yml # Добавить к последней команде, чтобы подтянуть настройки
  1. Перезагружаем systemctl, чтобы новые настройки успешно подхватили:
sudo systemctl daemon-reload
  1. Включаем sidekiq:
sudo systemctl enable sidekiq
  1. Теперь мы можем его стартовать/останавливать/рестартовать/проверять текущий статус:
sudo systemctl start|stop|restart|status sidekiq

Таск для Capistrano

  1. В config/deploy нужно добавить следующую таску, которая каждый раз после деплоя будет рестартовать sidekiq:
after :deploy, "deploy:sidekiq_restart"

namespace :deploy do
  desc 'Sidekiq restart'
  task :sidekiq_restart do
    on roles(:app) do
      execute :sudo, :systemctl, :restart, :sidekiq
    end
  end
end
  1. Чтобы наша таска корректно отработала, нужно дать ей доступ на сервере:
sudo visudo # Находясь на сервере, введите эту команду

%deploy ALL=NOPASSWD:/bin/systemctl restart sidekiq # Введите в самому внизу файла, это команду, сохраните изменения
  1. Всё. Комитим изменения, пушим в репозиторий и запускаем деплой:
cap production deploy

После чего заходим на сервер и проверяем работоспособность сайдика:

sudo systemctl status sidekiq

Status должен быть «active». Обратите внимание на время, когда был совершен последний запуск:

Active: active (running) since Wed 2020-03-11 19:19:07 UTC; 6s ago

Как видите всё работает. Теперь можете гонять свои фоновые задачи в хвост и в гриву)

Особенности деплоя assets в Rails (5.2, 6+) при помощи Capistrano

Всем привет!

Сегодня попробую опубликовать свою первую техническую мини-статью на тему деплоя рельсовых приложений при помощи Capistrano. Пишу её в том числе и для себя, так как неоднократно сталкиваюсь с подобными проблемами при деплое своих проектов. Я убил несколько дней, собрал все возможные ошибки и точно знаю, что самая частая из них — это проблема компиляции ассетов.

На эту тему есть достаточно много гайдов и туториалов:

Один из таких туториалов, который я настоятельно рекомендую для новичков:
https://gorails.com/deploy/ubuntu/18.04

Но даже если вы будете ему следовать, с высокой долей вероятности у вас будут возникать ошибки, которые никем не документированы.

На одну из таких ошибок напоролся и я, когда настраивал капистрано для шестых рельс (А впервые я столкнулся с этой особенностью на рельсах 5.2. На версии 5.1, деплой проходит без проблем).

Проблема с компиляцией ассетов

Я столкнулся с тем, что у меня постоянно падал таск прекомпиляции ассетов: assets:precompile

Проблема заключалась в том, что капистрано падал с ошибкой: Status error code: 1, а в самом сообщении ничего отображалось (Nothing written). То есть капистрано просто отказывался работать дальше, но причину своего отказа не сообщал.

Как оказалось, эта проблема может быть вызвана одной из двух причин:

  1. Отсутствие необходимых библиотек и пакетов на сервере.
  2. Недостаточно ресурсов у VPS, в особенности оперативной памяти.

А вот теперь подробнее о каждой причине и что нужно сделать.

Отсутствие необходимых библиотек и пакетов на сервере.

Для компиляции ассетов на сервере, вам необходимо убедиться, что у вас установлен NodeJS, а начиная с версии 5.2 (и если у вас установлен gem ’webpacker’), то и Yarn

Проверить, что у вас установлены оба пакета на сервере:

node -v
yarn -v

Рекомендую ставить nodejs не ниже v8.16.0 (а ещё лучше 12 и выше). Если не знаете, какую версию чего ставить, посмотрите, какие версии пакетов у вас установлены локально.

Чтобы установить оба пакета, введите следующие команды на сервере:

Сначала NodeJS

curl -sL https://deb.nodesource.com/setup_12.x -o nodesource_setup.sh

nano nodesource_setup.sh

sudo bash nodesource_setup.sh

sudo apt install nodejs

Затем 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 update && sudo apt install yarn

sudo apt update && sudo apt install --no-install-recommends yarn

После установки также проверьте версии пакетов, что всё установлено корректно.

Обратите внимание на другие гемы и библиотеки, с которыми вы работаете. Некоторые из них требуют свои зависимости. Например: в одном из моих проектов есть гем ’mini_magick’, для корректной работы которого требуется установка библиотеки ImageMagick.

По идее этого должно хватить для корректной компиляции ассетов, но в процессе работы я собрал ещё парочку ошибок, о которых также хочу упомянуть)

Если видите, что капистрано ругается на nodejs или yarn, скорее всего, вам нужно обновить текущую версию одного или обоих пакетов и затем снова перезапустить деплой, командой: cap production deploy.

Другая ошибка связана с ExecJS Runtime. Это ошибка интересней и связана с тем, что у JavaScript есть разные стандарты. Чтобы их корректно различать, вам нужно подключить интерпретатор. Чтобы починить этот баг, вам нужно добавить в Gemfile и сделать bundle следующий гем:

gem "therubyracer"

Недостаточно ресурсов у VPS, в особенности оперативной памяти

А вот эта причина уже интереснее! И когда я на неё наткнулся в версии рельс 5.2, то убил целый день на поиск решения проблемы.

Оказывается мои ассеты не компилировались из-за малого количества ресурсов.

Дело в том, что все свои приложения я размещаю на каплях (droplets) DigitalOcean и беру самый дешевый тариф с 1Гб оперативной памяти.

При компиляции ассетов «отжирается» практически вся память, из-за чего капистрано валится с неизвестной ошибкой.

Чтобы починить это, у вас есть два варианта: купить VPS с большим количеством ресурсов, либо создать файл подкачки (swap).

Суть файла подкачки в том, что в случае если ресурсы оперативной памяти заканчиваются, текущий процесс мог бы использовать мощности жесткого диска. Да, он не такой быстрый как оперативка, но для нашей цели подходит.

Однако, по-умолчанию, на сервере от DigitalOcean, эта возможность отсутствует. Файл подкачки нужно создать.

Создаем файл-подкачки (SWAP) на сервере

Я не буду расписывать то, что и так можно найти в интернете, просто дам ссылку на digital ocean, где достаточно подробно и на русском языке описан весь этот процесс: https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-18-04-ru

Для решения проблемы с ассетами, вам нужно пройти с 1 по 5 шаг.

Надеюсь после этой статьи вы закроете проблему с компиляцией ассетов раз и навсегда)

Для себя, кстати, я решил, что следующий проект буду деплоить при помощи CI, используя Docker. Я несколько дней потратил на то, чтобы подружить весь свой технический «зверинец» друг с другом и заставить их работать вместе. И, честно сказать, задолбался.

PS Поменьше вам ошибок и по-больше счастья при деплое ваших приложений! Аминь.