Найти тему

Своё облако за один вечер

Оглавление

Дано

У нас есть машинка с установленным на ней Ubuntu Server 18.04 и выделенным ip-адресом. Она стоит за каким-то роутером, в котором корректно проброшены порты 22, 80 и 443 до нашего сервера. К серверу мы коннектимся по SSH, а в качестве Web-сервера выступает Apache.
Кроме того, у нас есть зарегистрированное доменное имя и настроены dns-записи для субдомена вида cloud.mydomain.ru.

Задача

На выходе мы хотим получить готовое к эксплуатации облако NextCloud. Попутно мы поднимем базу данных MariaDb (которую в дальнейшем можно будет использовать ещё для чего-нибудь). Всё это добро будет крутиться в Docker-контейнерах, а безопасность веб-морды мы обеспечим с помощью LetsEncrypt.

NB.: Здесь я не объясняю, почему и что именно делаю, лишь привожу готовый рецепт. За теорией - к документации.

Решение

Докер

Мы фанаты контейнеризации и масштабируемости, так что в первую очередь ставим докер. Здесь самое главное - никакой самодеятельности, делаем ровно так, как это рекомендует официальный манул. Никаких snap или apt-get - оно глючит и вообще устаревает. А ещё нам понадобится Docker Compose, инструкции по установке которого указаны так же в официальной документации
Дальше докер нужно немного подкрутить - нам понадобится докер-сеть. Добавим её:

https://gist.github.com/mrlyceist/a23abf6aac228b2a7f438d8d626f93e7

Заодно, имеет смысл создать папку, в которой будем хранить все compose-файлы (для каждого сервиса будет своя подпапка):

https://gist.github.com/mrlyceist/ccc054458430cc0945ee6627b58f421b

И папку, в которую будем подключать вольюмы:

https://gist.github.com/mrlyceist/3ed091fd39a3c03b2b08a7204e711935

База данных

Возьмём официальный образ с хаба и просто его используем. Впрочем, не зря же мы компоуз ставили. Создадим файлик nano /opt/compose/mariadb/docker-compose.yml:

https://gist.github.com/mrlyceist/97817284ac9761dfdd54bca100070049

Теперь запустим всё это:

https://gist.github.com/mrlyceist/b30b1d2516e193089174ce6727ad916f

Докер сам вытянет образ из хаба и вообще умничка, так что если всё прошло успешно - он даже напишет нам имя созданного контейнера.

Теперь нам нужно подготовить собственно базу для облака. Для этого коннектимся к созданному контейнеру:

https://gist.github.com/mrlyceist/9e17c2c3194cdaff46d2d63f15b38661

А дальше нам нужно создать базу данных, пользователя и дать свежесозданному пользователю права на свежсозданную бд.

https://gist.github.com/mrlyceist/b8bca0333d050f2fa464284221d873c0

База есть, выходим из контейнера тупым exit.

NextCloud

В принципе, Readme, приведённый на страничке официального образа на докерхабе - вполне себе удобоваримый для того, чтобы понять, что именно происходит. Как всегда, компоуз-файл nano /opt/compose/nextcloud/docker-compose.yml:

https://gist.github.com/mrlyceist/f55010838337ef88d29d1ff5cd341eea

Поднимаем:

https://gist.github.com/mrlyceist/4ba9af3b68c3df6188b95097ef6753b4

Apache

В принципе, оно уже даже работает, но посмотреть получится только курлом или линксом, а нам же хочется, чтобы оно во вне торчало. Создаём сайт в апаче sudo nano /etc/apache2/sites-available/nextcloud.conf:

<script src="https://gist.github.com/mrlyceist/e62889dc692246aa247f0f28a57f181f.js"></script>

Включаем нужные модули апача, включаем сам сайт, реcтартуем апач:

https://gist.github.com/mrlyceist/3a7f615b5ca71f31e83d0b5053b2b890

Во. Теперь работает. Идём на http://cloud.mydomain.ru и любуемся своим творением. Ну или, точнее, заканчиваем настройку nextcloud'а.
Хотя, честно говоря, гордиться собой нам пока рановато.

Безопасность

Хотим же https, ssl, и вот это вот всё. А раз хотим - надо настраивать.
Процесс, в принципе, максимально автоматизирован, но надо подготовиться:

https://gist.github.com/mrlyceist/74a555e9d4e7b9e585a46b119d8f6ac2

Временно выключаем прокси в апаче (можно просто закомментировать строчки с ProxyPass*), добавляем DocumentRoot. Должны получить что-то следующее:

https://gist.github.com/mrlyceist/ff12a3291e436e7f5a54ba3adb617867

Дальше создадим скриптик nano ~/bin/certbotissue.sh (не забываем менять mydomain на свой домен!):

https://gist.github.com/mrlyceist/cb537b5991cdb66f3b6c76d4b77bdc13

Скриптик этот запускаем и получаем в папке /opt/dockerbindings/certbot/etc/letsencrypt/live/cloud.mydomain.ru четыре *.pem файлика - это и есть наши ключики. ИМХО, их удобнее переместить куда-нибудь поближе, а то такой длинный путь фиг запомнишь:

https://gist.github.com/mrlyceist/04d09db9b25d3460627e8bd65a24b654

Всё, теперь можно окончательно допиливать сайт в апаче до финального состояния:

https://gist.github.com/mrlyceist/e48b8ad0fe835dd2709a044c31d56a8a

И уже вот почти-почти. В nextcloud по какой-то причине не обнаруживается https за прокси, поэтому допишем немного настройки sudo nano /opt/dockerbindings/nextcloud/data/config/config.php:

https://gist.github.com/mrlyceist/8b9fa4d603268b3c131a4ea1813ff6c6

Это можно просто в конец дописать, позиция не имеет значения.

Вот теперь - действительно всё. Идём на https://cloud.mydomain.ru и теперь уже по-настоящему гордимся собой!