Продолжение "Простейший способ ускорить изучение мира программирования. Арендуем копеечный сервер..."
В прошлой статье я рассказал о таком понятии как VPS (Virtual Private Station).
Проще говоря, это виртуальный компьютер внутри обычного сервера (Dedicated Server). Настроим инфраструктуру, необходимую для создания промышленных приложений. Познакомимся с тем как работать с linux серверами.
Не буду рекомендовать какой то конкретный курс. Можно зайти на ютуб и вбить "Linux для начинающих" или найти книги просто загуглив "линукс начинающим pdf".
Для начала работы с линуксом нужно знать:
В какой папке вы находитесь и как сменить папку (pwd, cd)
Как создавать папки, файлы и как их читать и писать в них, как искать нужные файлы (mkdir, touch, vim, find)
Понимать самые основы прав и пользователей, как их создавать и пользоваться ими (chown, chmod, id, su)
Как устанавливать и запускать приложения (apt-get update/install/remove)
Как писать простейшие скрипты и запускать (bash scripts)
Уметь проверять состояние сервера - загрузка CPU/RAM/HDD (top, free, df)
Уметь проверять процессы и останавливать их (ps, kill)
Уметь проверить, закрыть порт (netstat и еще парочка)
К этому списку можно обавить пару команд но для начала работы этого будет достаточно. На изучение базовых операций может уйти месяц - другой, в зависимости от предыдущего опыта.
Устанавливаем на сервер необходимую для разработки инфраструктуру.
Раньше большинство инфраструктуры ставили прямо на сам сервер.
Сейчас используют разные решения виртуализации и её оркестрации, например: Docker, Kubernetes и множество других (но часть инфраструктуры продолжают ставить прямо на сервер).
Виртуализация, вроде Docker, значительно уменьшает головную боль для установки сотен решений от баз данных и очередей до чего то более сложного, вроде игровых серверов. Поэтому перед началом разработки я настоятельно рекомендую познакомиться с докером
Минимум, который нужно знать про Docker:
Понимать разницу между образом и контейнером (контейнер по сути экземпляр образа)
Уметь запускать и останавливать контейнер (docker run, stop, start)
Уметь подключаться к контейнеру (docker attach / docker exec)
Уметь проверять работу контейнера (docker ps, docker logs)
Для чего это нужно?
Изучение основ Linux и Docker - процесс не из самых легких. Все это стоит того, чтобы научиться поднимать инфраструктуру в несколько минут.
Ниже я приведу примеры классических контейнеров, которые пригодятся при изучении промышленной разработки.
Классический минимум
Рассмотрим пример архитектуры классического промышленного Java приложения:
Подобная инфраструктура вряд ли вместится в самую дешевую VPSку. Ниже я расскажу какие есть недорогие варианты.
Этот вариант архитектуры является классическим решением большинства веб проектов. Я привел его в качестве примера, который подойдет для новичка.
Используем докер для поднятия данной архитектуры.
Redis (один из многих вариантов кэшей)
Кэш позволяет временно хранить наиболее используемые данные, тем самым снижая нагрузку на систему в целом и повышая производительность.
Для простейшего варианта авторизации по паролю достаточно запустить команду:
docker run -d -p 6379:6379 --name myredis redis redis-server --requirepass <password>
Для удобства (необязательно) можно внутри докера стартовать веб интерфейс для просмотра redis сервера вот такой командой:
docker run -d --name myrediscommander -p 8081:8081 --link myredis:redis rediscommander/redis-commander
После старта админки можно зайти в браузер по адресу ВАШ_IP:8081 и затем подключиться к вашему серверу, чтобы просматривать/удалять/добавлять данные:
RabbitMQ (Очередь, которая получает сообщения и оповещает подписчиков).
Rabbit позволяет получать и оповещать клиентов, подписавшихся на сообщения.
Для запуска очереди достаточно запустить:
docker run -d --name my-rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=myuser -e RABBITMQ_DEFAULT_PASS=mypassword rabbitmq:3-management
Через пару минут можете зайти в админку очереди, вбив в браузере IP_вашего_сервера:15672 и увидеть что то вроде:
Реляционная база данных MYSQL.
Реляционные базы данных являются неотъемлемой частью большинства решений. В нашем примере мы запустим одну из самых популярных MySQL:
docker run -d --name mysql-container -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql:latest --default-authentication-plugin=mysql_native_password
Через пару минут сервер стартанет. К нему можно будет подключиться через какой - нибудь MySQL клиент, например Heidi SQL.
С помощью клиента можно легко писать запросы и проверять содержание базы данных. Выглядеть он может примерно так:
Минимальные требования к подобной инфраструктуре.
Если вы хотите пользоваться докером в арендованном сервере вам желательно иметь 2 процессора и 2 Гб оперативки. Система запустится, но будет работать на минималках. Этого достаточно, чтобы изучить данные технологии.
Какие есть недорогие варианты поднятия инфраструктуры без больших затрат?
Запуск на локальной машине с тунелированием данных. В таком случае все запросы на VPS будут перенаправлены на домашний компьютер. В следующих статьях я покажу как это сделать.
Почасовая аренда VPS. Если вы хотите проверить какие - нибудь решения и вы знаете, что это займет несколько часов, есть смысл аренды VPS с почасовой оплатой. В среднем 8 ядерный VPS с 8gb RAM будет стоить порядка 5-12 рублей в час. Конкретного провайдера рекламировать не буду, я пользовался тремя и в такой диапазон цен укладывался.
Использование облаков. Данный метод я не рекомендую, за исключением тех решений, которые не тарифицируют трафик или что нибудь еще. С облаками вроде AWS можно влететь на большие деньги и новичкам я советую избегать их в начале пути.
Как еще можно использовать арендованный сервер?
Кроме разработки, сервер может подарить вам ряд бесплатных, либо условно бесплатных сервисов, которые могут вам пригодиться для работы или игр. Приведу пару примеров.
Запускаем чат сервер MatterMost
Допустим, вам надо создать чат - платформу для группы в университете или на работе с каналами, обменом приватными сообщениями с тектом и картинками. Вместо платных платформ можно запустить MatterMost сервер. К нему можно будет подключиться с компьютера или мобилки. Все это можно скачать и установить бесплатно.
Запустить сервер можно командой ниже:
docker run --name matt -d --publish 8065:8065 --add-host dockeermost/mattermost-preview
После нескольких минут к серверу можно подключиться, вот как выглядит клиент чата:
Хостим MineCraft
Для старта сервера MineCraft понадобится:
Cкачать или скопировать вручную вот такой docker-compose.yml файл: https://pastebin.com/raw/uEP58DRB сделать это можно командой
curl -o docker-compose.yml https://pastebin.com/raw/uEP58DRB
Затем, находясь в той же директории, надо запустить
docker compose up
После старта сервера нужно подождать какое то время. Затем, можно подключиться к миру, используя Minicraft клиент, указав IP вашего сервера:
Вот как выглядел мир в моем примере:
Я перечислил часть возможных решений в качестве примера.
Приведенные команды далеки от идеала и желательно их подправить, например, улучшить безопасность. Для целей ознакомления, думаю, пойдет.
Сама разработка на Java.
В следующей части я покажу как писать простейшие приложения и использовать созданную инфраструктуру.
Больше о Java и смежных технологиях можете узнать тут.
DevOps без реального опыта в программировании
Существуют ли такие DevOps инженеры, которые не имеют реального опыта работы программиста?
т.е. сразу из теории и обучения, которое сейчас существует сразу в эту профессию или это обязательно надо эволюционировать из программиста, став при этом сначала крепким middle?
Ставим WSL 2 на Windows и работаем с комфортом)
Привет!
Я программирую на Python и последние пару лет работаю дома на своём домашнем ПК. И так уж сложилось, что последние 20 лет я в качестве ОС использую исключительно Windows. Но поскольку мне для работы нужен Linux, я поставил себе программу VMware, которая позволяет создавать виртуальные ПК, на один из которых я и накатил Ubuntu и более-менее удобно, настроил рабочее место, так чтобы почти не испытывать боли от использования виртуалки.
Но это решение раз за разом, вынуждало меня выполнять какие-то действия на ней, будь то очистка индекса GIT после выполнения предыдущей задачи или скачивание каких-то файлов с винды на виртуалку, проброс портов и так далее.
Но недавно я наконец сподобился настроить себе WSL 2 - это подсистема Linux интегрированная в Windows, наверно вы про неё как минимум слышали.
Иии это просто прекрасно (по крайней мере пока), вот запилил гайд как её установить, настроить по минимуму и поставить на неё Docker, что делается не так уж и очевидно)
ПыСы микрофон меня опять обыграл, так что навалите звука)
Посоветуйте пожалуйста литературу
Доброго времени суток!
Посоветуйте пожалуйста годную литературу по темам виртуализации и контейнирезации в Linux (Kubernetes, Docker, KVM). Или, может быть, есть какие видео уроки на этот счет.
Заранее спасибо!
Пост без рейтинга.
Простая установка WordPress с HTTPS (SSL) на Ubuntu с помощью Docker Compose и LinuxServer SWAG. (Пример на Always Free VPS от Oracle)
В этом посте будет описана простая установка WordPress на Ubuntu.
Операционная система на базе ядра Linux может быть и любая другая, например Debian.
А в качестве сервера может выступать любая «домашняя железяка», например неттоп или старый ноутбук/ПК. Wordpress по этой статье можно установить и на UBUNTU на бесплатном VPS сервере от Oracle (мой пост на Пикабу по регистрации Always Free VPS от Oracle был здесь).
И если вдруг «страшные рассказы» о том, как Oracle нарушает условия Always Free и всех «банит» через 30 дней использования сервиса, написанные в комментариях под тем постом, коснуться и меня, то запилю пост об этом. Пока у меня всё работает, как часы )))
Включая мой блог на этой VPS.
Предпосылкой написания этой статьи стало то, что некоторое время назад я начал серию публикация на Pikabu посвящённую тематике умного дома. Со временем некоторые статьи стали содержать код (команды Linux, YML-файлы…), который в публикациях не имеет нужной разметки и особенно важной в yaml-файлах — табуляции. Поэтому решил себе завести блог для таких публикаций - HUNY Blog. Ну, а в этой статье поделюсь, как это можно сделать легко и непринуждённо на своём примере. )))
Почему я просто не завёл блог на WordPress.com, а решил установить WordPress на Ubuntu на своём бесплатном сервере:
- нельзя использовать свои темы (шаблоны) для сайтов без тарифа Bussines (1 499 рублей в месяц);
- дизайн бесплатных шаблонов сильно ограничен, а в Personal и Premium (250 и 550 рублей в месяц) очень убогие шаблоны, без возможности гибкой настройки;
- в бесплатной версии не нашёл возможность использовать сервисы аналитики Гугл и Яндекс, а так же инструменты SEO;
- плагины (даже простые) в бесплатной версии не подключить;
Перечислять можно и дальше, но суть проста — практически за каждую простую услугу там нужно платить.
Традиционно для самостоятельной установки WordPress (и развёртывания других веб-приложений и динамических сайтов) используются популярные наборы компонентов LAMP (Linux, Apache HTTP Server, MySQL, PHP) и его вариация LEMP. (в которой веб-сервер Apache заменяется на Nginx). В LEMP Apache заменяется легким, но мощным Nginx, который может обеспечить более предсказуемую производительность при высоких нагрузках. Но я выбрал альтернативный и по моему мнению наиболее простой способ установки, немного отличающийся от традиционных — установка WordPress с помощью Docker Compose и LinuxServer SWAG.
SWAG — Secure Web Application Gateway (ранее известный как letsencrypt, не имеющий отношения к Let’s Encrypt ™) настраивает веб-сервер Nginx и обратный прокси-сервер с поддержкой php и встроенным клиентом certbot, который автоматизирует процессы генерации и обновления бесплатных сертификатов SSL-сервера (Let’s Encrypt и ZeroSSL). Он также содержит fail2ban для предотвращения вторжений.
Преимущества данного способа для меня были очевидны и состоят из нескольких ключевых пунктов:
- Простота. Фактически мы разворачиваем готовый контейнер «в пару кликов» и сайт на WordPress у нас готов,. Перед этим буквально небольшая подготовка системы Lunux (Ubuntu) в плане установки Docker, Docker Compose и Portainer
- Установка WordPress на Ubuntu с HTTPS. Здесь у нас готовый автоматический процесс генерации и обновления бесплатных сертификатов SSL-сервера.
- Бесплатный бэкап WordPress. Можно использовать для этого плагины WordPress, но в Jetpack от WordPress — эта функция платная. «UpdraftPlus — Backup/Restore» в бесплатной версии позволяет делать это только вручную. Есть ещё много разных плагинов для бэкапа, например BackupBuddy…, но я в дальнейшем автоматизирую этот процесс средствами Linux, docker — rsync и/или rclone.
- Возможна установка двух, трёх…. WordPress сайтов в один контейнер на одном сервере.
Итак, у вас должна быть предварительно подготовлено:
- Установлена операционная система Linux (Ubuntu, Debian или другая);
- Установлен Docker, Docker Compose и Portainer;
- Опционально есть доменное имя для вашего блога. Если ещё нет, то в качестве альтернативы для теста можете бесплатно создать домен на duckdns.org. Нам это нужно будет для того, что бы входить на сайт не по IP адресу, и получить сертификат для HTTPS.
В дальнейшем вы сможете зарегистрировать и привязать свой полноценный домен второго уровня для своего сайта или блога в сервисе регистрации доменов, например у российского регистратора доменных имен — REG.RU (Мой промо-код ECA7-B285-57FC-20C2 даст скидку 5% на заказ домена). :-)
Далее будем использовать docker-compose для создания и запуска своих образов и контейнеров, а именно LinuxServer / SWAG и WordPress. Вот содержание docker-compose.yml для этого:
version: '3.3'
services:
swag:
image: linuxserver/swag
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Samara
- URL=ВашДомен.duckdns.org # change for your domain
- VALIDATION=http
- EMAIL=mail@mail.ru # optional
- EXTRA_DOMAINS=ВашДомен.duckdns.org # change for your domain
volumes:
- ./config:/config
ports:
- 443:443
- 80:80
restart: unless-stopped
db_pikabu: # change name for every new site wordpress
image: mysql:5.7
container_name: db_pikabu # change name for every new site wordpress
restart: always
ports:
- 3315:3306 # change port for every new site wordpress
volumes:
- ./config/www/pikabu/mysql:/var/lib/mysql # change directory for every new site wordpress
environment:
MYSQL_DATABASE: wordpress
MYSQL_ROOT_PASSWORD: Pikabu1234 # change this password for you
wordpress_pikabu: # change name for every new site wordpress
image: wordpress:latest
container_name: wordpress_pikabu # change name for every new site wordpress
restart: always
ports:
- 7000:80 # change port for every new site wordpress
volumes:
- ./config/www/pikabu/config/php.conf.uploads.ini:/usr/local/etc/php/conf.d/uploads.ini # change directory for every new site wordpress
- ./config/www/pikabu/wordpress:/var/www/html # change directory for every new site wordpress
environment:
WORDPRESS_DB_HOST: db_pikabu # change optional
WORDPRESS_DB_NAME: wordpress # change optional
WORDPRESS_DB_USER: root # change optional
WORDPRESS_DB_PASSWORD: Pikabu1234 # change this password for you
depends_on:
- db_pikabu # change name for every new site wordpress
ВАЖНО СОБЛЮДАТЬ ТАБУЛЯЦИЮ (ОТСТУПЫ)!!! При создании docker-compose.yml, но Пикабу не поддерживает «форматирование текста с отступами». Для удобного копирования форматированного текста, когда приступите непосредственно к установке WopdPress можете перейти на эту страницу, где код отформатирован с отступами.
Где стоит хэштег «# change ….» — укажите свои данные !
Итак, создаём файл docker-compose.yml в удобном для вас месте и удобным для вас способом. Я покажу пример для Ubuntu 20.04 на VPS Oracle (конечно же это полная аналогия и для других вариантов).
Создам его по пути /home/ubuntu
# echo "version: '3.3'
services:" >/home/ubuntu/docker-compose.yml
Вы можете командой echo сразу отправить весь текст (содержание файла выше), либо открыть файл командой nano и вставить содержимое:
# sudo nano /home/ubuntu/docker-compose.yml
После этого сохраняем и закрываем файл, нажав CTRL + X, Y, а затем ENTER.
Либо, всё то же самое можно сделать через WinSCP
Для создания и редактирования таких файлов рекомендую использовать Notepad++ вместо «блокнота»:
После создания и сохранения файла, переходим в терминале в папку, где у нас лежит docker-compose.yml командой # cd (в Ubuntu 20.04 на VPS Oracle мы по умолчанию находимся в ней) и запускаем контейнеры:
# docker-compose up -d
Если вы ставили Ubuntu 20.04 на бесплатный VPS сервер от Oracle, то необходимо открыть порт 80 и 443 в Oracle. Как это сделать написано в конце этого поста.
Для «домашней» Ubuntu или Debian на сервере или десктопе тоже нужно открыть порты 80 и 443 для Let’s Encrypt, пробросив их на вашу машину в роутере (см. инструкцию к нему)
После этого проверяем в Portainer, что контейнеры swag, wordpress_pikabu и db_pikabu успешно запустились:
Открываем (для редактирования, удобным вам способом) файл с настройками Nginx — default.
(В папке, где у вас был файл docker-compose.yml — появилась папка config)
В моём примере файл default расположен по пути /home/ubuntu/config/nginx/site-confs
# sudo nano /home/ubuntu/config/nginx/site-confs/default
ALT+T — очищаем всё содержимое файла default, и вставляем следующее:
# redirect all traffic to https
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri;
}
# main server block for site 1
server {
listen 443 ssl;
#listen [::]:443 ssl;
root /config/www/pikabu/wordpress; # change directory for every new site
index index.html index.htm index.php;
server_name ВашДомен.duckdns.org; # change for your domain
# enable subfolder method reverse proxy confs
include /config/nginx/proxy-confs/*.subfolder.conf;
# all ssl related config moved to ssl.conf
include /config/nginx/ssl.conf;
client_max_body_size 128m; # change opcional, default 0
location / {
try_files $uri $uri/ /index.html /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
}
После этого сохраняем и закрываем файл, нажав CTRL + X, Y, а затем ENTER.
Где стоит хэштег «# change ….» — укажите свои данные !
ВашДомен.duckdns.org и директорию /config/www/pikabu/wordpress, где вместо pikabu указываете папку в которой создали wordpress на предыдущем этапе.
Перезапускаем в Portainer контейнер swag
После этого заходим в браузере на свой почти созданный сайт по адресу HTTPS://ВашДомен, где у вас должно появится окно «пятиминутной установки WordPress». Выбираем язык:
Заполняем поля для своего сайта:
Если появится такая ошибка, то просто перезапустите в Portainer контейнеры wordpress и db
У С Ё готово! )))
Входим со своими учётными данными и настаиваем свой сайт на wordpress как вам угодно… А пока на главной странице сайта вас встретит вот такая страничка, с вашим названием сайта конечно же)))
Я же по прежнему буду вести тему «умного дома» в своём профиле на Пикабу, а вот если нужно будет показать какой-либо форматированный код (команды Linux, YML-файлы…), буду публиковать его уже на своём блоге — https://huny.blog )))
Всем пока и Бобра ;-)
Когда не можешь позволить себе SSD
Немного о Docker.
Думаю, многие неофиты мира GNU/Linux слышали модное нынче словцо - Docker.
Опять же, постараюсь кратко и доходчиво объяснить, что это, с чем его едят и для чего это может быть нужно неспециалисту вроде меня. И да, это не руководство для новичка, ибо их полно.
Для начала немного о контейнерной виртуализации. В ядре Linux есть технология разделения ресурсов под названием cgroups. Она может управлять доступом приложения к ресурсам - памяти, процессору, дискам. Несколько контор и просто неравнодушных ребят собрались и запилили LXC - систему управления контейнерами. Так же как в случае с chroot, это лишь виртуальное окружение - но без ядра. Сама по себе система LXC - мощная вещь, но и того оказалось мало.
Но это все присказка. На основе этого добра ребята из Docker Inc сделали сделали свой продукт.
Только вот сам по себе Docker - это не система виртуализации, как многие считают, а система объектно-ориентированной доставки софта. Т.е. изначально оно ориентированно на то, чтобы "поднять настроенный апач одной строкой в терминале".
А теперь простой пример. Скачаем образ Ubuntu Bionic (это бетка) и запустим его.
username$: sudo docker pull ubuntu:bionic
bionic: Pulling from library/ubuntu
c5cc0d8681c1: Pull complete
25992ae88689: Pull complete
92b293e28b63: Pull complete
5e97fb8c1b1b: Pull complete
e89d6de98e44: Pull complete
Digest: sha256:4decfd6e336e1cf246127151753d2a24a3185b5f667b91b925e8b38e7ea903a0
Status: Downloaded newer image for ubuntu:bionic
Образ выкачался. Проверим.
username$: sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu bionic 02f9d6707661 5 weeks ago 88.3 MB
Ну так как-то. Форматирование текста с консоли тут едет, так что немного не наглядно.
Сказать сразу - образов в репозитории море, но об этом позже.
А теперь самое интересное - стартанем его:
username$: sudo docker run -it --rm --name temp_ubuntu -v /home/user/test1:/home/ ubuntu:bionic /bin/bash
И нас выплюнет в консольку контейнера с этой убунтой.
Отсюда поподробнее: -it - это интерактивный(i) терминал(t), --rm - удалить контейнер после останова, -v - проброс "внутрь" папки с хоста.
Можно что-то протестировать, собрать, а потом тормознуть контейнер через Control-D - и все чисто как в аптеке.
Но вообще, откровенно говоря, Docker нужен не для этого.
Так вот, о чем я - Docker позволяет "упаковать" какой либо сервак со всеми потрахами внутрь готового образа, и переносимость от хоста к хосту будет почти стопроцентная. Можно push-нуть уже готовый образ в репозиторий, и потом его так-же играючи обратно залить.
В результате в репозиториях уже можно найти огромное количество универсальных рецептов.
Но есть и более специализированный вариант - сборка образа с помощью Dockerfile.
Если просто - это такой сценарий, что нужно сделать и что запустить. Есть у меня один, которым я иногда пользуюсь - это Jupyter (сервер с IPython, блекджеком и шлюхами для научных расчетов). Так выглядит Dockerfile:
FROM debian:sid
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y python3 python3-pip python3-fann2
RUN pip3 install --upgrade pip && pip3 install jupyter sympy numpy scipy matplotlib pandas networkx
EXPOSE 8888
CMD jupyter notebook --allow-root --ip 0.0.0.0 --no-browser --notebook-dir=/home
Что он, чьорт побьери, делает?
Ну Debian Sid - это понятно, надеюсь.
ENV DEBIAN_FRONTEND noninteractive - переменная, чтобы apt не спрашивал да/нет у бездушной машины.
Далее идут команды установки всего и вся через RUN. Да, их следует делать поменьше раз, поэтому команды длинные.
EXPOSE "выпячивает" порт наружу.
Ну и CMD - конечная команда запуска.
Также стоит отметить, что обычно лучше юзать ENTRYPOINT, но это вам гуглить самим.
Теперь собираем образок:
username$: sudo docker build -f /path/to/dockerfile -t name_of_image
Этот образ можно переносить с машины на машину, а можно просто отправить dockerfile через вконтактик))
Еще какие бонусы?
Так как Docker использует OverlayFS (ранее был aufs) - а это про copy-on-write - он не создает контейнеры с нуля, а только послойно записывает разницу между контейнером и изначальным образом. Так что таких контейнеров можно поднять с десяток при сравнительно небольших накладных затратах.
В общем, писать про это можно очень много и долго, но надобности за обилием написанных мануалов нет. Если интересно - просто попробуйте.