Гид по технологиям

Развёртывание веб‑приложения на Clojure в Ubuntu 20.04

• 5 min read • DevOps • Обновлено 22 Nov 2025
Развёртывание Clojure на Ubuntu 20.04
Развёртывание Clojure на Ubuntu 20.04

Иллюстрация Clojure: логотип или схема

Clojure — современный динамичный язык программирования для платформы Java. Он базируется на LISP и имеет компиляторы, позволяющие запускать код на JVM (и в некоторых случаях на .NET). Clojure позволяет строить системы, не правя Java‑код напрямую. Язык используется в крупных компаниях и в продакшене для серверных приложений и микросервисов.

В этом руководстве показано, как развернуть простое веб‑приложение на Clojure на сервере с Ubuntu 20.04, используя Nginx как обратный прокси и Supervisor для управления процессом.

Что нужно заранее

  • Сервер с Ubuntu 20.04 с правами root или sudo.
  • Домен, указывающий на IP сервера (например, clojure.example.com).
  • Базовые знания командной строки Linux.

Шаг 1 — Обновление системы и установка Java

Сначала обновите пакеты до последних версий:

apt-get update -y

Установите Git, curl и Java (OpenJDK):

apt-get install git curl default-jdk -y

Проверьте установленную версию Java:

java -version

Ожидаемый пример вывода (у вас может быть другая версия):

openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

Если Java установлена и команда работает — переходим дальше.

Шаг 2 — Установка Nginx и Supervisor

Nginx будет выполнять роль обратного прокси и статического сервера. Supervisor будет запускать и перезапускать Java‑процесс приложения.

apt-get install nginx supervisor -y

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

systemctl status nginx
systemctl status supervisor

Шаг 3 — Скачивание и сборка Clojure‑приложения

Клонируйте репозиторий примера:

git clone https://github.com/do-community/do-clojure-web.git

Установите Leiningen — инструмент сборки для Clojure:

curl https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein -o /usr/bin/lein
chmod 755 /usr/bin/lein

Перейдите в папку с проектом и соберите standalone JAR:

cd do-clojure-web
lein uberjar

В результате в target/ появится файл вида do-clojure-web-0.1.0-standalone.jar.

Пример вывода сборки (с загрузкой зависимостей и созданием JAR):

Created /root/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar

Если сборка прошла успешно — идём дальше.

Шаг 4 — Размещение приложения в файловой структуре

Создайте нужную директорую под приложение:

mkdir -p /var/www/html/do-clojure-web/app/db

Скопируйте собранный JAR и базу данных (если есть) в эту папку:

cp /root/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar /var/www/html/do-clojure-web/app/
cp /root/do-clojure-web/db/do-clojure-web.h2.db /var/www/html/do-clojure-web/app/db/

Настройте владельца и права:

chown -R www-data:www-data /var/www/html/do-clojure-web/
chmod -R 775 /var/www/html/do-clojure-web/

Создайте символьную ссылку для удобного запуска:

cd /var/www/html/do-clojure-web/app/
ln -s do-clojure-web-0.1.0-standalone.jar do-clojure-web.jar

Проверьте запуск приложения вручную (для отладки):

java -jar do-clojure-web.jar

Ожидаемый лог запуска (Jetty слушает порт 5000):

2020-11-25 10:19:51.456:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2020-11-25 10:19:51.497:INFO:oejs.AbstractConnector:Started [email protected]:5000

Если приложение запускается — мы готовы оформить его как сервис.

Шаг 5 — Настройка Supervisor для управления приложением

Создайте конфиг Supervisor:

nano /etc/supervisor/conf.d/do-clojure-web.conf

Вставьте:

[program:do-clojure-web]
command=/usr/bin/java -jar do-clojure-web.jar
directory=/var/www/html/do-clojure-web/app
user=www-data
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/do-clojure-web.app.log

Сохраните и перезапустите Supervisor:

systemctl restart supervisor
systemctl enable supervisor
systemctl status supervisor

Проверьте, что Java‑процесс запущен под Supervisor и слушает локально порт 5000:

ss -antpl | grep 5000

Ожидаемый результат — строка LISTEN с процессом java.

Важно: по умолчанию supervisord может запускаться с root‑привилегиями. Для продакшена проверьте безопасность конфигурации и доступ к unix_http_server.

Шаг 6 — Настройка Nginx как обратного прокси

Создайте виртуальный хост:

nano /etc/nginx/sites-available/clojure.conf

Добавьте конфигурацию:

upstream http_backend {
    server 127.0.0.1:5000;
    keepalive 32;
}
server {
        listen 80;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name clojure.example.com;

    location / {
        proxy_pass http://http_backend;

        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;

        access_log /var/log/do-clojure-web.access.log;
        error_log /var/log/do-clojure-web.error.log;
    }
}

Включите сайт и проверьте синтаксис:

ln -s /etc/nginx/sites-available/clojure.conf /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginx

После этого приложение будет доступно по HTTP на вашем домене.

Рекомендуется далее настроить HTTPS (см. раздел по безопасности ниже).

Шаг 7 — Доступ к приложению и примеры UI

Откройте в браузере: http://clojure.example.com — должно появиться веб‑приложение.

Доступ к приложению: главный экран

Нажмите «Add a Location» (Добавить локацию). Откроется форма:

Форма добавления локации

Заполните поля и нажмите Submit. Результат должен отображаться в списке:

Просмотр всех локаций: результат

Список добавленных локаций

Когда что‑то идёт не так — быстрые шаги для отладки

  • Сервис Supervisor не запускается: проверьте /var/log/syslog и /var/log/do-clojure-web.app.log; запустите процесс вручную, чтобы увидеть ошибки.
  • Приложение слушает не на 127.0.0.1:5000: проверьте конфигурацию Jetty в проекте и аргументы запуска.
  • Nginx возвращает 502 Bad Gateway: убедитесь, что приложение запущено и доступно по адресу из upstream.
  • Права доступа к файлам: www-data должен иметь доступ к JAR и DB; проверьте владельца и chmod.
  • Проблемы с зависимостями при сборке: запустите lein deps и lein uberjar локально, проверьте network/proxy.

Альтернативные подходы и когда их использовать

  • systemd вместо Supervisor: если вы предпочитаете единый менеджер сервисов и юниты systemd, можно создать unit‑файл для java‑процесса. systemd даёт более строгую интеграцию с логами (journal) и рестартами.
  • Docker: упакуйте приложение в контейнер, тогда деплой на разных серверах станет единообразным. Подходит, если у вас CI/CD и оркестрация.
  • Использование process manager в JVM (например, jsvc) — для запуска от имени определённого пользователя и управления stdout/stderr.

Краткая подсказка: для простых хостингов — Supervisor удобен. Для корпоративных окружений — systemd или контейнеры.

Безопасность и эксплуатация (рекомендации)

  • Настройте UFW: откройте 80/443, закройте все лишние порты. Пример:
ufw allow OpenSSH
ufw allow 80
ufw allow 443
ufw enable
  • HTTPS: используйте Certbot для автоматического получения и продления сертификатов Let’s Encrypt.
  • Логи: настройте ротацию логов (logrotate) для /var/log/do-clojure-web.*.
  • База данных: если приложение использует встраиваемую H2, подумайте о переносе на управляемую СУБД в проде.
  • Права: не запускайте приложение от root; используйте непривилегированного пользователя (www-data или специально созданного).

Роль‑ориентированный контрольный список

Для администратора сервера:

  • Обновить систему и установить пакеты.
  • Настроить UFW и SSL.
  • Настроить мониторинг (nagios/prometheus) и ротацию логов.

Для разработчика:

  • Убедиться, что проект собирается через lein uberjar.
  • Покрыть критические сценарии тестами (CRUD операции).
  • Документировать конфигурацию порта и параметры запуска.

Для DevOps:

  • Автоматизировать сборку и деплой (CI/CD).
  • Решить стратегию логирования и мониторинга.
  • Подготовить план отката и тестовый стенд.

Критерии приёмки

  • Приложение корректно собирается командой lein uberjar.
  • Процесс Java работает под Supervisor или systemd и перезапускается при падении.
  • Nginx корректно проксирует запросы на приложение и возвращает 200 на главной странице.
  • HTTPS настроен и корректно обслуживает домен.
  • Логи доступны и настроена ротация.

Небольшая методология развёртывания (шаги на 30–60 минут)

  1. Подготовка сервера: обновление и установка Java, Nginx, Supervisor.
  2. Сборка приложения локально или на сервере (lein uberjar).
  3. Размещение JAR и данных в /var/www/html/.
  4. Настройка Supervisor/systemd и тестовый запуск.
  5. Настройка Nginx, проверка proxy и логов.
  6. Переключение доменного имени и настройка HTTPS.

Тестовые сценарии (несложные)

  • Перезагрузка сервера: приложение автоматически стартует.
  • Удаление процесса: Supervisor перезапускает.
  • Создание записи через UI: данные сохраняются и выводятся в списке.
  • Проверка доступности через Nginx и напрямую на 127.0.0.1:5000.

Заключение

Поздравляем — вы развернули пример Clojure‑приложения на Ubuntu 20.04 с Nginx в роли обратного прокси и Supervisor для управления процессом. Дальше можно улучшить устойчивость, добавить HTTPS, переносить БД в отдельный сервис и автоматизировать деплой.

Важно: для продакшена рассмотрите контейнеризацию, аудитацию доступа и регулярные бэкапы базы данных.

Summary — ключевые шаги:

  • Установить Java, Nginx, Supervisor.
  • Собрать JAR через Leiningen.
  • Разместить файлы в /var/www/html/.
  • Настроить Supervisor и Nginx.
  • Включить HTTPS и мониторинг.

Important: проверьте права доступа и не запускайте сервисы от root.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро