Дано
У нас есть машинка с установленным на ней 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 и теперь уже по-настоящему гордимся собой!