Я люблю начинать разные сторонние проекты, считаю, что это один из лучших способов узнавать что-то новое и по-настоящему стоящее. И у меня есть один серьезный недостаток — я почти никогда не довожу дела до конца. Речь, конечно же, не идет о проектах по учебе, за которые мне поставят оценку или задачам, поставленным работодателем. Я про собственные идеи, которыми загораюсь вне постоянной работы или учебы. Каждый раз, когда я осваиваю какой-нибудь совершенно новый навык, который считаю востребованным и не вижу перспективы еще что-нибудь такое изучить — я забиваю на проект совсем. Но в этот раз решил исправиться — начать проект, завершить его и поведать о пути, который я прошел. У меня профильное образование, бакалавриат на математическом факультете, магистратура в IT. На удивление, довольно много чего, что я освоил в универе, мне пригодилось, особенно магистратура. Во всяком случае, мне удалось настроить мозги в нужную сторону, чтобы продуктивно впитывать нужную информацию, хорошо себя показать в этой сфере, найти работу, продвигаться в карьере.

Пока учился, я был фанат C++ и гейм-дева. Разработал тогда самописный движок и писал на нем игры, пытался. Диплом у меня был на Си и связан с использованием графических процессоров в вычислениях. Потом заинтересовался Java и разработкой под Android. Выполнил на этом языке несколько учебных проектов, а затем в рамках студенческого проекта, при поддержке одной международной корпорации, писал консольную утилиту для анализа производительности программ. Все это, затем, выросло в приложение под Android с возможностью протестировать свой телефон с точки зрения производительности и сравниться с другими.

На горизонте меня ждал мир python. Неожиданным образом, с подачи моего доброго друга, заинтересовался Data science и python, это было больше четырех лет назад. Так совпало, что мне пришлось поменять работу и мои навыки оценили подходящими, чтобы начать заниматься бэкендами для внутренних аналитических сервисов. Так, через анализ данных я пришел к веб-разработке на этом языке.

По долгу службы приходилось быть и fullstack-разработчиком, когда настоящие frontend-разработчики были чрезвычайно заняты или когда стандарты качества UI не на первом месте. Это описание пути, который пришлось пройти для создания собственного полноценного веб-приложения без полноценного погружения в технические детали. По ходу будут скидываться ссылки на коммиты из моего репозитория. Коротко об этапах этого путешествия: Получилось полноценное веб-приложение на платформе AWS. Кому все еще интересно, прошу за мной. Выбор тематики приложения — отдельная история, окончательный выбор пал на отслеживание привычек. На главной странице должен был располагаться набор кнопок с отслеживаемыми привычками. Сделали действие — нажали на кнопку — и так каждый день. Данные должны сохраняться и на отдельной странице отображаться в виде таблицы, привычки в строках, а календарные дни в столбцах, закрашенная ячейка говорит о том, что требуемое действие в этот день было выполнено. Как в простейшем бумажном трекере привычек. После недолгого приведения кода и мелких деталей логики в порядок мне надо было начать формировать production-конфигурацию. Для этого вдохновился все той же книгой [1]. Файлы django-конфигурации, python-зависимости я разбил на 3 части (ссылка на коммит Github): Далее надо было задуматься над тем, как это все будет запускаться.

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

В книге [1] не придерживались концепции «1 процесс — 1 контейнер», вот и я не стал, воспользовался тем, что там уже было. В качестве базового образа я выбрал phusion/baseimage, который представляет собой видоизмененный образ Ubuntu, в котором правильно запускаются нужные службы и можно безопасно стартовать несколько процессов.

Наконец, это заработало локально, я поднял локально базу данных postgres, достаточно мучительно настроил в нее доступ с контейнера и после всего поднял контейнер. Ура (ссылка на коммит Github). Я никогда не работал с публичными облаками, но я прочитал книгу [1], в которой приводилось описание развертывания приложения в AWS, до этого я даже много раз слышал об этом. Для меня это был страшный темный лес, какие-то сервисы. Действия, которые я тогда совершал, совершались бездумно, просто копипаста команд в надежде, что потом осознание придет. А еще неведомый Free Tier, который позволял пользоваться сервисами бесплатно, который мне был очень сильно нужен, но как он работает? Все это предстояло узнать.

Оказывается, такая большая экосистема AWS разбита на множество довольно-таки небольших сервисов, которые могут весьма слаженно работать. Но не нужно знать их все, достаточно выделить для себя главные и приступить к их освоению. Мое приложение задействует некоторые из них, и я начал с ECS. EC2 — сервис для создания виртуальных машин в облаке. Free Tier позволяет использовать 750 часов работы этих машин в месяц. Этого с лихвой хватает, чтобы одна, пусть и довольно-таки слабая, виртуальная машина работала круглые сутки.

В книге [1] описывается работа docker-machine, через который можно создавать виртуальные машины от разных поставщиков. Например, для него есть драйвер EC2. После создания машины она записывается в окружение терминала и все операции docker будут выполняться на удаленной машине.

Таким образом, с помощью команды dockre-machine create… мы создаем экземпляр EC2. А docker-compose up -d позволяет запустить контейнер на этом экземпляре. Остается не забыть разрешить входящие подключения к порту 80 с любого адреса. С этого момента, если зайти по адресу указанном в поле «Public DNS» экземпляра контейнера, то можно было попадать на сайт. База данных тоже живет на серверах AWS и задействует сервис RDS. По сути это управляемый сервер базы данных. Его достаточно создать, указав тип базы данных (у меня postgres) и то, что собираюсь использовать Free Tier, при этом можно почти не трогать больше никакие настройки. А затем использовать имя хоста, пользователя, пароль и имя базы данных для выполнения подключений.

  Сама разработка еще не закончена и много чего придется доработать, чтобы пустить туда настоящий трафик. Например, хотя бы, вывести SES аккаунт из песочницы, чтобы получать письма мог любой. Однако, сделать этого мне не дали. Я послал заявку, расписал, что это сервис, условно, для своих, но мне ответили, что то, как я собираюсь использовать сервис, может плохо повлиять на функционирование сервиса и создать риск прерывания в обслуживании для других клиентов. Ну ладно, буду развивать сервис, потом получится. Что еще: В качестве итога — я довел проект до завершения, хотя добился образовательных целей гораздо раньше, чем можно было говорить о завершенности. Я изучил React и даже сумел подхватить пару срочных тасочек на основной работе, я познакомился и стал глубже понимать AWS, благодаря этому осознал важность мониторингов, например, а также стал лучше понимать реальную инфраструктуру нашего рабочего проекта.

Но главное осознание — один в поле совсем не воин. Я работал над этим проектом больше двух месяцев помногу часов в свободное от работы время… И знаете что? Я так страшно еще не зашивался. Становится заметно, что чем старше становишься, тем меньше желания учить что-то «просто так», меньше желания много работать над какими-то вещами, которые «просто интересны». Но при этом замечаешь, что появляется больше доступных возможностей делать что-то во благо, на пользу. Начинаешь ценить сфокусированные усилия, работу в команде, а также отдых, время, проведенное с близким окружением. Код на Github. Software Developer