В итоге мы получим домашний сервер с фейковым доменом, на поддомене которого мы развернём GitLab и настроим работу gitlab-runner'а для деплоя наших веб-проектов. Я не буду долго разглагольствовать по поводу каждого шага, лишь в крайних случаях буду описывать моменты, с которыми вы можете столкнуться в процессе и пути их решения. В качестве основной системы используется Ubuntu Server. Ставим DNSMasq и NGINX. Узнаём название нашего контроллера с помощью команды (тут - enp1s0): Настраиваем конфиг DNSMasq `/etc/dnsmasq.d/<имя_нашего_конфига>`. В качестве имени, можно использовать название нашего главного домена, чтобы было удобнее.Открываем файл и исправляем наш конфиг по образу и подобию: Перезагружаем DNSMasq service: Теперь вам нужно настроить использование нашего локального DNS на вашем компьютере. Я покажу, как это сделать для Debian 11.Достаточно изменить два файла: `/etc/resolv.conf` и `/etc/NetworkManager/NetworkManager.conf`. Теперь настроим NGINX, чтобы он принимал наш новый домен. Для этого достаточно создать новый файл конфигурации в папке `/etc/nginx/sites-available`, проверить его, переместить в `/etc/nginx/sites-enabled` и перезапустить NGINX. Приступим! Создаём новый файл конфигурации `<ваш_домен>.conf`. Да, весьма простая конфигурация, но нам больше и не нужно. Переносим (создаём symlink на) файл.  Проверяем корректность файла: Перезапускаем NGINX: Теперь, если вы перейдёте в своём браузере по адресу http://<ваш_домен>, вы увидите стартовую страницу NGINX. Добавляем репозиторий в систему: Устанавливаем GitLab: Настраиваем базовую конфигурацию `/`: Скачиваем файл конфигурации GitLab для NGINX. Помещаем его в папку `/etc/nginx/sites-enabled`. В этом файле нужно поправить только строки: Добавляем самые простые строки в базовый конфиг NGINX. (можно и не в него, а в отдельный файл в `/etc/nginx/sites-enabled`). Реконфигурируем GitLab: Обновляем NGINX: Находим первичный root-пароль в файле `/etc/gitlab/initial_root_password`. Заходим на нашу страницу, вводим логин root и пароль, который мы нашли до этого, и настраиваем аккаунт администратора. Для начала нам нужно установить Runner. Добавляем репозиторий. Устанавливаем пакет. Теперь получаем регистрационный токен для нашего runner'а. Заходим в админ-панель GitLab через аккаунт администратора в раздел Overview -> Runners и нажимаем Register an instance runner. Копируем токен. Начинаем процесс регистрации runner'а. Вводим команду: Вводим url-адрес нашего gitlab'a.  Вводим наш токен.  Вводим краткое описание. Вводим тэги. Тут я советую создать два runner'a с разными тэгами: один с тэгом shell, который будет выполнять все операции, связанные с терминальными командами, и второй с тэгом docker, который будет отвечать за наши docker-контейнеры. Остальные тэги можно посмотреть в официальной документации. Проверить наш runner можно на той же странице в админ-панели. Теперь, чтобы runner мог участвовать в развёртывании веб-проектов на NGINX сервер, нужно сделать лишь пару штрихов: дать ему права на вызов NGINX под sudo и выдать доступ к папкам `sites-available` и `sites-enabled`. Права выдаются путём создания дополнительного файла в папке `/etc/sudoers.d`, в ней создадим файл `gitlabrunner` и впишем такую строчку: Выдача прав вызова NGINX под sudo нужна, чтобы делать проверку конфигурации файлов при деплое. Вызов `nginx -t` возможен, но он будет заканчиваться всегда с ошибкой. Далее прописываем команду, чтобы runner имел возможность взаимодействовать с файлами в папках NGINX: Вот и всё. Теперь у нас есть полноценная локальная среда разработки. Вместо заключения скажу лишь, что здесь я попытался описать то, что сделал я, чтобы поднять подобное окружение для своей небольшой команды в закрытой сети для разработки. Текущее решение функционирует уже целый месяц без нареканий и проблем (за исключением GitLab wiki, но как только я решу эту проблему, обязательно дополню статью). Не показываются статьи обычным пользователям. Проект виден, на статью отдельно по урлу тоже можно зайти, однако при переходе в раздел wiki из сайдбара показывается только экран добавления новой статьи. UPD: Оказывается, чтобы GitLab wiki проекта работала корректно, всегда должна присутствовать home страница (а мы начали с красивых заголовков)... Дополнительно могу сделать небольшую статью, как вся эта система работает на примере небольшого проекта на Django, где в качестве WSGI будет использоваться Gunicorn. Здесь нужен симлинк.