Не смог придумать подходящее название для поста, поэтому кратко опишу, о чем будет идти речь. У большинства из нас есть какие-нибудь мелкие личные поделки, которые не выходят за рамки наших домов. Кто-то хостит их на рабочем компьютере, кто-то — на Heroku, кто-то — на VPS, а у кого-то есть домашний сервер. На реддите даже есть сообщество r/homelab, в котором люди обсуждают разные железки и софт для т.н. домашней лаборатории. Я не настолько увлечен этим вопросом, но у меня дома стоит Intel NUC, который проигрывает музыку с NAS с помощью MPD. Помимо MPD на нем крутятся мои мелкие поделки, которые помогают мне с ним работать: ныне мертвый бот для телеграма, HTTP API на синатре и корявенький фронтенд для него. В посте я без особых подробностей (многих из которых сам не понимаю) опишу процесс установки DNS-сервера для работы с доменными именами для сервисов, схему одновременной работы нескольких сервисов с помощью Docker и установку Gitlab с CI. Ничего нового вы не узнаете, но вдруг кому-нибудь пригодится этот "гайд". К тому же я бы хотел услышать предложения по поводу того, как можно было бы сделать это проще/элегантнее/правильнее. Изначально код моих сервисов лежал на битбакете/гитхабе и после создания докер-образов мне нужно было зайти под SSH и запустить пару скриптов, которые создавали/обновляли контейнеры с сервисами. Поймал себя на мысли, что вижу мелкий раздражающий баг в приложении, который я не исправляю только потому, что мне лень производить всю эту процедуру. Очевидно, что пора было автоматизировать все. Тут-то и пришла мысль установки Gitlab + CI. Все контейнеры создавались с флагом --network=host для простоты — достаточно было использовать разные порты в приложениях. Однако с ростом количества сервисов запоминать, какое приложение какой порт использует. Да и вводить каждый раз IP-адрес с портом в браузере не очень красиво, поэтому прежде чем устанавливать гитлаб я решил разобраться с хостингом нескольких приложений на одном сервере. Идея простая: настраиваем DNS, скармливаем его роутеру, устанавливаем Nginx и с помощью его конфигурации перенаправляем запросы на разные порты в зависимости от домена. Это же позволит не заморачиваться с портами при разработке, т.к. контейнеры начнут использовать --publish вместо --network=host. При установке использовался этот гайд. В нем настройка производится для Ubuntu 16.04, у меня же Debian. Дальнейшие действия производятся от пользователя root. Первым делом устанавливаем bind9 и утилиты: Далее нам нужно настроить доменную зону. Для этого добавляем в файл /etc/bind/named.conf.local следующее: Также в гайде добавляется конфигурация для reverse lookup, но, честно говоря, я не особо понимаю, для чего это нужно, поэтому не стал этого делать. Теперь создаем файл /etc/bind/fwd.nondv.home.db: Далее перезапускаем bind9 и устанавливаем автозапуск: Обратите внимание, что я использовал .home вместо .local. Это было сделано потому, что домен nondv.local не резолвился без поддоменов. Ну, точнее dig распознавал его нормально, но браузеры и curl — нет. Как мне объяснил коллега, это скорее всего связано с разным софтом вроде Bonjour (мой рабочий ноутбук с яблоком на крышке). В общем, с доменом .home подобных проблем быть не должно. Собственно, это все. Я после этого добавил DNS как первичный в роутер и переподключился к нему (чтобы автоматически обновился файл /etc/resolve.conf). Как я уже сказал, чтобы иметь возможность обращаться по HTTP на 80 порт ко всем сервисам одновременно, нам нужно настроить Nginx так, чтобы он проксировал запросы на разные порты в зависимости от домена. Документация по образу nginx доступна на сайте Docker Hub. Подготовим основной файл конфигурации /srv/nginx/nginx.conf: Далее настроим домены. Я покажу только один: Запуск контейнера производится командой: Вот и все, теперь HTTP запросы на 80 порт будут отлавливаться с помощью nginx и перенаправляться на нужный порт. Здесь все просто по официальному руководству: Ждем, когда все настроится (поглядываем в docker logs -f gitlab) и после входим в контейнер (docker exec -it gitlab bash) для доп. настройки: Для надежности можно перезапустить контейнер (docker container restart gitlab). Gitlab CI уже интегрирован, но ему нужен Gitlab Runner (документация). Для этого я написал небольшой скрипт: После создания раннера, нам нужно его зарегистирировать. Для этого заходим в гитлаб (через браузер), идем в Admin area → Overview → Runners. Там описана установка раннеров. Вкратце, вы просто выполняете: и отвечаете на вопросы. Они запускаются по аналогии с гитлабом. Публикуете их на каком-нибудь порте и добавляете конфиг в nginx. Теперь вы можете хостить ваши проекты на домашнем сервере и использовать мощь Gitlab CI для автоматизации сборки и публикации ваших проектов. Удобно ведь делать git push и не беспокоиться о запуске, верно? Еще я бы рекомендовал настроить почту для гитлаба. Лично я использовал почтовый ящик на Яндексе. Документация. Software Engineer