Если Вам интересно, как настроить сервер для хостинга JVM приложения, то предлагаю вашему вниманию следующую инструкцию. Предположим, вы только что получили доступ к чистому VPS серверу, на котором крутится Ubuntu и вы хотите на нём развернуть полноценное JVM приложение, основанное на Spring. Для полноты картины мы настроим также локальный postgres и доступ извне по http.
Прежде всего обновляем индекс менеджера пакетов apt. У вас должно быть достаточно прав для выполнения sudo, а также ваш сервер должен иметь доступ в Интернет.
sudo apt update
Установка и настройка Java
Для работы нашего jvm-приложения сначала требуется установить виртуальную машину Java. Ставим последнюю LTS (long-term support – длительная поддержка) версию. На данный момент это Java 17.
# если планируем компилировать на сервере, то ставим JDK
sudo apt-get install openjdk- 17 -jdk
# если будем запускать уже скомпилированное приложение, то JRE
sudo apt-get install openjdk- 17 -jre
Как установить программу на сервер ?
# затем проверяем, что по умолчанию установилась нужная версия
java -version
JDK – это Java Development Kit, т.е. версия Java для разработчиков. Включает в себя компилятор. JRE – это Java Runtime Environment, т.е. среда исполнения. Причём JDK включает в себя JRE. На сервере чаще всего достаточно поставить именно JRE.
Опционально можно вручную настроить переменную окружения JAVA_HOME в файле /etc/environment. Добавляем в конце файла на новой строке:
JAVA_HOME= «/usr/bin/java»
Установка и настройка postgres
sudo apt install postgres
# заходим в систему под пользователем postgres
sudo -i -u postgres
# создаём базу данных с нужным именем
createdb имя_базы
# создаём пользователя для этой БД
createuser имя_пользователя —interactive
При создании пользователя вам будет задан только один вопрос. Создать его как суперпользователя? То есть наделить его всей полнотой полномочий для работы с БД. Выбираем yes.
Что касается имени пользователя и базы, то называйте их как-то похожим образом. Например, mydb и mydb_user.
Теперь заходим в сам postgres, выполнив команду psql. По сути psql – это консольный вариант клиента БД, который позволяет выполнять любые sql команды при наличии прав.
Установим для только что созданного пользователя хороший пароль (не забывайте точку с запятой в конце):
alter user имя_пользователя with encrypted password ‘pa$$w0rd’ ;
Кстати, генератор паролей доступен на данном сайте в разделе «Утилиты».
Выходим из psql командой q.
Теперь в конце файла /etc/postgresql/номер_версии/main/pg_hba.conf добавляем:
host база пользователь all password
Не забудьте заменить на свои имена базы и пользователя. Так мы указываем, что авторизация данного пользователя происходит именно по паролю, который мы задали выше.
Теперь если нам требуется подключаться к данной БД снаружи, а не только из самого приложения, работающего на этом же хосте, находим в файле /etc/postgresql/номер_версии/main/postgresql.conf
Как установить программу на сервер? Круглосуточная работа программ на серверах vds/vps.
следующую закомментированную строку и раскомментируем её:
# listen_addresses = ‘*’;
Так мы разрешаем подключаться к БД снаружи с любого ip-адреса. При необходимости вы можете задать специальную маску, ограничив до нужной подсети.
Чтобы все изменения вступили в силу, перезапускаем postgres:
sudo service postgresql restart
Запускаем приложение как linux-сервис
Для начала нам нужно, чтобы имя jar-файла, которое получается в результате компиляции нашего Spring-приложения, не менялось от версии к версии. Задать его в явном виде в gradle можно так:
// файл build.gradle.kts
tasks bootJar archiveFileName.set( «ИМЯ.jar» )
>
>
Если вы используете maven, то используйте следующую настройку:
org.springframework.boot
spring-boot-maven-plugin
ИМЯ
Предположим, у нас уже есть скомпилированное jvm-приложение, которое умеет слушать порт 8080. Чтобы это приложение всё время работало на сервере и автоматически запускалось при старте сервера, нужно зарегистрировать его как linux-сервис.
Для этого с помощью scp копируем jar-файл (если их несколько, копируем тот, который больше) на сервер. Например, в папку /var/имя_приложения/имя_приложения.jar
Затем в папке /etc/systemd/system/ создаём файл имя_приложения.service со следующим содержимым:
[Unit]
Description=описание
After=syslog.target
[Service]
User=имя_пользователя
Environment= «КЛЮЧ=ЗНАЧЕНИЕ»
Environment= «LOGGING_FILE_PATH=/var/log/имя_приложения/»
Environment= «TZ=Europe/Moscow»
ExecStart=/usr/bin/java -jar /var/имя_приложения/имя_приложения.jar
Тут в параметре User указывайте, под каким пользователем системы следует запускать сервис. Разумеется, у него должны быть права на это.
В параметрах Environment вы можете задавать различные переменные окружения в формате «ключ=значение». В данном примере уже задан часовой пояс (TZ) и путь до папки с логами (LOGGING_FILE_PATH). Именно здесь вы можете указать профиль приложения test или prod.
В ExecStart указыватся команда для запуска приложения. Здесь просто подставьте ваши значения.
Сохраняем файл, после чего активируем сервис и запускаем его:
# активация
sudo systemctl enable имя_сервиса.service
# первичный запуск
sudo service имя_сервиса start
Теперь наш сервис будет запускаться автоматически даже при перезагрузке сервера.
Если будете менять какие-то настройки в service-файле, не забывайте выполнять команду systemctl daemon-reload, чтобы изменения вступали в силу.
Настройка Nginx
Поскольку наш сервис слушает порт 8080, вы уже можете обращаться к нему снаружи, указав имя хоста или ip-адрес и порт 8080. Но как сделать так, чтобы порт не нужно было указывать в явном виде? В этом нам поможет Nginx, который будет проксировать все запросы с дефолтного порта 80 на порт нашего приложения 8080.
# ставим Nginx
sudo apt install nginx
Теперь открываем конфигурацию /etc/nginx/nginx.conf и находим там секцию http. Внутри неё нужно разместить секцию server:
http <
…
server <
listen 80;
server_name домен;
listen 80 указывает, что мы хотим слушать порт 80. Секция «location /» говорит о том, что все запросы с корня url мы перенаправляем на localhost на порт 8080 (параметр proxy_pass).
# проверяем, что не ошиблись в синтаксисе конфигурации
sudo nginx -t
# перечитываем конфиг
sudo nginx -s reload
# удаляем дефолтную страницу-заглушку — она нам больше не нужна
sudo rm /etc/nginx/sites-enabled/default
Теперь в урле при обращении к нашему сервису порт указывать не нужно.
Настройка брандмауэера
Напоследок было бы неплохо настроить хоть какую-то защиту нашего сервера. Воспользуемся стандартным брандмауэром UFW (Uncomplicated Firewall). По умолчанию он разрешает все подключения изнутри наружу и запрещает все подключения снаружи к серверу. Установка и настройка его предельно проста.
# установка
sudo apt install ufw
# Важно! Разрешаем ssh-подключения!
sudo ufw allow ssh
Команда вида «ufw allow протокол» позволяет разрешить подключения на определённый порт извне. Прежде всего, не забудьте разрешить ssh-подключение. Если вы забудете это сделать, то после активации ufw вы потеряете доступ к серверу.
Разрешим ещё несколько протоколов:
# разрешаем http и https протоколы (порты 80 и 443)
sudo ufw allow http
sudo ufw allow https
# разрешаем postgres на порту 5432
sudo ufw allow postgres
# включаем брандмауэр
sudo ufw enable
После активации брандмауэра все запрещённые порты окажутся недоступны!
Рецепты. Как установить ПО на серверы используя VMmanager и DCImanager
Согласитесь, приятно получить сервер уже готовый к выполнению задач. Установленный ISPmanager позволит сразу приступить к размещению сайта. Teamspeak – организовать тренировку по WoT без траты времени на инсталляцию.
Провайдеры за счет этого повышают доход. Сегодня они предлагают не просто машины с чистой ОС, а бухгалтерские, торговые, игровые серверы. «Предпродажная подготовка» повышает лояльность клиентов и уменьшает нагрузку на техподдержку.
- Если устанавливаемое программное обеспечение поддерживает несколько операционных систем, для каждой придётся сделать свой шаблон. Рецепт же может быть один на несколько ОС.
- Если речь идёт про KVM или выделенный сервер, то чтобы установить дополнительные пакеты нужно внести изменения в install.cfg (файл ответов). Если про OpenVZ, то нужно пересобрать весь контейнер, добавив в него нужные файлы. А в случае рецепта достаточно открыть через браузер меню в VMmanager или DCImanager и вставить код в поле ввода.
Писать рецепт можно на любом языке, надо только, чтобы в ОС был необходимый интерпретатор. После окончания установки операционной системы и перезагрузки сервера, этот файл копируется по SSH во временную директорию и запускается с правами root.
В рецепте должен быть блок метаданных в начале тела.
Выглядит это примерно так
#!/bin/sh # # metadata_begin /*Метка начала блока*/ # recipe: Hello! /*Внутреннее имя рецепта. Отображается в списках*/ # tags: centos7,debian8,ubuntu1404,ubuntu1604 /*Набор тэгов. Необходим для контроля совместимости рецепта и операционной системы. Рецепт считается совместимым с ОС, если совпадает хотя бы один тэг в шаблоне ОС и в рецепте*/ # revision: 1 /*Номер версии рецепта*/ # description_ru: Пример рецепта. Приветствие миру, которое будет выводиться при каждом входе в shell. # description_en: Example of recipe. Greetings to world, that will be shown after every login to shell. # /*Выше — описания на соответствующих языках. Отображаются при выборе рецепта в меню установки ОС на выделенном или виртуальном сервере*/ # metadata_end /*Метка конца блока*/ # echo «Hello World!» > /etc/motd
- “Настройки кластера” → “Рецепты” в VMmanager.
- “Настройки” → “Рецепты” в DCImanager.
Настройка обработчика услуг
Для создания обработчика нужно зайти под администратором в меню “Интеграция” → “Обработчики услуг” и нажать кнопку “Создать”.
Затем на этапе настройки интеграции установить или снять флажок.
И при создании тарифа выбрать желаемый обработчик.
Как закрыть доступ к рецепту
Выполняем авторизацию в панели под пользователем с правами администратора. Переходим в меню «Настройки кластера» → «Рецепты», выбираем нужный рецепт и нажимаем «Свойства».
Выбираем нужный уровень доступа из выпадающего списка и нажимаем “Ok”.
На случай если клиент часто устанавливает ПО, которое пользуется малой популярностью, и хочет автоматизации процесса, в наших продуктах есть возможность дать конечным пользователям права на создание своих, локальных, рецептов. Для этого нужно зайти /usr/local/mgr5/etc и добавить в файл vmmgr.conf или dcimgr.conf строку Option UserRecipes, после чего перезапустить панель командой /usr/local/mgr5/sbin/mgrctl -m vmmgr exit или /usr/local/mgr5/sbin/mgrctl -m dcimgr exit соответственно.
На уровне пользователя в панели появится пункт меню «Управление” → “Рецепты», а значит возможность создавать собственные рецепты и использовать их при переустановке ОС виртуального или выделенного сервера.
Руководство
Теперь попробуем на практике написать рецепт и дать к нему доступ конечным пользователям. Для примера возьмём развёртывание на VDS продукта BigBlueButton 1.0, платформы для проведения вебинаров. Под спойлером описание процесса со скриншотами.
Создание рецепта
Выполняем авторизацию в панели VMmanager под пользователем с правами администратора, заходим “Настройки кластера”→”Рецепты”.
Нажимаем кнопку “Создать”.
Указываем имя файла, в котором будет находиться рецепт, пишем/вставляем в поле ввода скрипт, заполняем блок метаданных и нажимаем “Ок”.
Созданный рецепт появляется в списке.
Результат — при заказе услуги клиент хостинг-провайдера видит ещё один вариант предустановленного ПО.
Интересующихся исходным кодом приглашаем ещё под один спойлер.
Исходный код рецепта
#!/bin/bash # # metadata_begin # recipe: BigBlueButton # tags: ubuntu1404 # revision: 1 # description_ru: BigBlueButton, платформа для проведения вебинаров. # description_en: BigBlueButton, webinar platform. # metadata_end # # Запускаем логирование. RNAME=BigBlueButton set -x LOG_PIPE=/tmp/log.pipe.$$ mkfifo $ LOG_FILE=/root/$.log touch $ chmod 600 $ tee < $$ $ exec 2> $ killjobs() < jops=»$(jobs -p)» test -n «$» kill $ || : > trap killjobs INT TERM EXIT echo echo «=== Recipe $ started at $(date) ===» echo #Обновляем пакеты, а затем дистрибутив ОС. apt-get update apt-get -y dist-upgrade #Добавляем репозиторий LibreOffice 4.4.
LibreOffice используется для конвертации презентаций в формат PDF. apt-get -y install software-properties-common add-apt-repository -y ppa:libreoffice/libreoffice-4-4 add-apt-repository -y ppa:ondrej/php # Добавляем ключ доступа к репозиторию BigBlueButton и сам репозиторий. wget http://ubuntu.bigbluebutton.org/bigbluebutton.asc -O- | apt-key add — echo «deb http://ubuntu.bigbluebutton.org/trusty-1-0/ bigbluebutton-trusty main» | tee /etc/apt/sources.list.d/bigbluebutton.list # Обновляем список пакетов. apt-get update # Ставим кодеки ffmpeg. apt-get -y install build-essential git-core checkinstall yasm texi2html libvorbis-dev libx11-dev libvpx-dev libxfixes-dev zlib1g-dev pkg-config netcat libncurses5-dev FFMPEG_VERSION=2.3.3 cd /usr/local/src if [ ! -d «/usr/local/src/ffmpeg-$» ]; then wget «http://ffmpeg.org/releases/ffmpeg-$.tar.bz2» tar -xjf «ffmpeg-$.tar.bz2» fi cd «ffmpeg-$» ./configure —enable-version3 —enable-postproc —enable-libvorbis —enable-libvpx make checkinstall —pkgname=ffmpeg —pkgversion=»5:$» —backup=no —deldoc=yes —default # Заранее принимаем с лицензионное соглашение пакета ttf-mscorefonts-installer чтобы во время установки BigBlueButton не появлялось окно и не требовалось участие пользователя. echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections # Ставим сам BigBlueButton. apt-get -y install bigbluebutton # Ставим штатный (по задумке разработчиков BBB, тестовый) пакет для проведения конференций. apt-get -y install bbb-demo # Ставим пакет для тестирования совместимости клиентского браузера с BBB. apt-get -y install bbb-check # Выполняем чистый перезапуск сервера BigBlueButton. bbb-conf —clean
Итак, новый рецепт доступен для клиентов. Теперь если кому-то надо, например, провести срочный вебинар или совещание, он может в сжатые сроки организовать площадку для встречи. Как видите, ничего сложного.
Желающим воспользоваться нашими продуктами и рецептами в частности, напоминаем ссылки на VMmanager и DCImanager, а также на документацию по рецептам.
Довольных вам клиентов!
P.S. В статье использована иллюстрация Антона Курятникова.
Ссылка на источник
- vmmanager
- dcimanager
- programming
- bash scripting
- программное обеспечение
Источник: habr.com
Деплой Python-приложения на сервер
Деплой ( deploy ) – это процесс публикации (развёртывания) вашего приложения на сервере для того, чтобы оно было доступно в интернете или другой сети.
В этой статье мы рассмотрим туториалы по развертыванию Flask- и Django -приложений на сервере от Timeweb Cloud и облачной платформе PythonAnywhere.
В качестве примера мы будем использовать простейшее приложение, которое выводит на экран приветствие “Hello, world!”
Деплой приложения на сервере
Когда вы разворачиваете приложения на облачном сервере , кроме непосредственного запуска контейнера может потребоваться настройка реверс-прокси ( например nginx) и SSL. Docker — инструмент, который упрощает создание, развертывание и запуск приложений с использованием контейнеров.
Контейнер docker — это набор зависимостей и кода, организованный в виде программного обеспечения, которое позволяет приложениям быстро и эффективно работать в различных вычислительных средах.
В первую очередь мы устаналиваем Docker с официального сайта.
Приложение Flask
Опубликуем приложение Flask .
Настройка Dockerfile
Создаём файл и называем его Dockerfile. Добавим в него код:
# Docker позволяет наследовать существующие образы, поэтому в качестве базового образа устанавливаем образ Python.
FROM python:3.8-slim-buster
# Меняем рабочую директорию внутри контейнера. Все оставшиеся операции будут запускаться внутри /app контейнера.
WORKDIR /app
# Устанавливаем все зависимости из файла requirements.txt внутри контейнера.
RUN pip install -r requirements.txt
# Копируем все остальные файлы из текущей директории (та, в которой находится файл Dockerfile) в директорию /app внутри образа.
COPY . /app
# Запускаем интерпретатор python
ENTRYPOINT [ «python» ]
# Добавляем список параметров к ENTRYPOINT. для выполнения команды, которая запускает приложение. Это похоже на то, как вы бы запустили его Python на своем терминале, используя команду python name_.py
CMD [«name_app.py» ]
Создание образа контейнера
Создадим образ для только что созданного контейнера:
docker build -t flask-docker .
Запуск контейнера
Для запуска контейнера выполняем код :
docker run -d -p 5000:5000 flask-docker
-d – для запуска контейнера в автономном режиме
-p – для указания порта, который будет открыт
Запустив localhost:5000 в браузере, увидим приложение.
Приложение Django
Деплой Django-приложения на Docker мало чем отличается от деплоя Flask-приложения.
Создадим виртуальное окружение и Dockerfile, в который добавим код:
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . /app
CMD [«python3», «manage.py», «runserver», «0.0.0.0:5000»]
venv
Создадим образ контейнера и запустим контейнер, используя команды build и run:
docker build —tag django-docker .
docker run —publish 8000:8000 django-docker
Запустив в браузере http://localhost:5000/, увидим приложение.
Деплой на облачной платформе PythonAnywhere
При использовании облачных сервисов, таких как PythonAnywhere или Heroku , вы сможете писать проекты прямо в браузере. Но для такой работы вам понадобится установка и подготовка Git-репозитория.
Установка Git и создание Git-репозитория
Вначале необходимо подготовить проект для Github. В своей учетной записи Github создайте новый репозиторий во вкладке Repositories. Назовите его по своему усмотрению и нажмите Create repository.
Дальше вам нужно подключить проект к Github с помощью Git. Установить Git можно с официального сайта git-scm.com .
Создадим локальный репозиторий на нашем компьютере. Внутри рабочего каталога вашего проекта (там, где находится manage.py) в консоли запускаем команду:
git init
Она инициализирует новый репозиторий git для вашего проекта.
Создание файла .gitignore
Необходимо создать файл в корневом каталоге проекта с именем .gitignore , который используется для указания git, какие файлы и папки игнорировать. Откройте редактор и внесите:
*.log
*.pot
*.pyc
__pycache__/
db.sqlite3
db.sqlite3-journal
media
static