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

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 минут)
- Подготовка сервера: обновление и установка Java, Nginx, Supervisor.
- Сборка приложения локально или на сервере (lein uberjar).
- Размещение JAR и данных в /var/www/html/.
- Настройка Supervisor/systemd и тестовый запуск.
- Настройка Nginx, проверка proxy и логов.
- Переключение доменного имени и настройка 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.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента