Первое что я сделал это запилил docker image для рельсы, потому что создавать сервис авторизации как видно из картинки я буду на Ruby on Rails.

Рельса в этом плане удобна уже готовыми инструментами.

Особо чем-то этот сервис не отличается по настройке окружения, я тут создал docker-compose с двумя сервисами backend и db. докер по умолчанию создает единую сеть между всеми сервисами, но чтобы при поднятии бэкенда, поднималась еще и база, я использовал depends_on

version: '3.2'

volumes:
  pg_data:

  
services:
  backend:
    build:
      context: ./backend
    ports:
      - "3000:3000"
    volumes:
      - ./backend:/app
    depends_on:
      - db

  db:
    image: postgres:14.5-alpine
    volumes:
      - pg_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: auth
      POSTGRES_PASSWORD: postgres

Отдельно от всего я вынес копирование Gemfile потому что процесс скачивания зависимостей довольно долгий и может занимать какое-то время, а таким образом я его закешировал в слой докера что в будущем когда появиться CI/CD, ему не придется каждый раз собирать зависимости если они не менялись.

 FROM ruby:2.7.6-alpine AS builder
  RUN apk add \
    build-base \
    postgresql-dev
  COPY Gemfile* .
  RUN bundle install

 FROM ruby:2.7.6-alpine AS runner
  RUN apk add \
      tzdata \
      nodejs \
      postgresql-dev
  WORKDIR /app

  COPY --from=builder /usr/local/bundle/ /usr/local/bundle/
  
  COPY . .

  EXPOSE 3000

  CMD ["rails", "server", "-b", "0.0.0.0"]

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

Для создания резистрации и авторизации на рубях я буду использовать gem devise

# ...

gem "devise" <-- Авторизация и регистрация

Как будет работать авторизация

Пользователь логинится в сервисе авторизации и получает JWT, после чего его перекидывает в сервис записей с этим токеном и там он уже работает как авторизованный пользователь. В JWT мы зашьем его публичный id и email, благодарая этому любой другой сервис сможет его распознать. А если по какой-то причине его нет в базе того сервиса в который он пошел, мы всегда сможем по внутреннему API auth сервиса через публичный ID узнать все об этом пользователе и добавить его в систему.

jwt auth

Думаю что стоит добавить еще один функционал для сервиса авторизации

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

2 domains in single service