NextCloud на Raspberry Pi 4 / #1
Привет, думаю, вы в курсе, что совсем недавно я купил себе Raspberry Pi именно для того, чтобы сделать домашний сервер, на котором будет хоститься персональное облако и не только. Мне всегда хотелось иметь свою домашнюю инфраструктуру для подобных вещей, чтобы быть независимым от обстоятельств. Сегодняшнее видео, конечно, рассказывает про установку NextCloud на Raspberry Pi, но все инструкции применимы и к любому серверу, потому что команды не отличаются.
Я рещил установить NextCloud в докер-контейнере, потому что таким образом я получу возможность масштабирования в дальнейшем.
Запись образа и первое включение
Для начала нужно записать образ системы на SD-карту. Мы будем делать это через программу Etcher, потому что она есть для всех ОС, да и она довольно удобная. В качестве ОС для сервера я буду использовать Ubuntu.
Подключение по ssh
Теперь, когда образ успешно записан, нужно добавить возможность ssh доступа к нашей Raspberry Pi, для этого достаточно положить пустой файлик с именем ssh
в директорию ... .
Отлично, теперь с помощью утилиты nmap
найдём нашу Raspberry PI в локальной сети. Для начала, надо выяснить адрес самой сети, делаем это:
$ ip a | grep inet ... inet 192.168.0.102/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp2s0
Копируем адрес 192.168.0.102/24
и делаем поиск с помощью утилиты nmap
:
$ sudo nmap -sn 192.168.0.102/24 Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-17 17:20 MSK Nmap scan report for _gateway (192.168.0.1) Host is up (0.00090s latency). MAC Address: 74:DA:88:B2:9A:CC (Unknown) Nmap scan report for 192.168.0.100 Host is up (0.0023s latency). MAC Address: DC:A6:32:C2:86:65 (Raspberry Pi Trading) Nmap scan report for kantegory (192.168.0.102) Host is up. Nmap done: 256 IP addresses (3 hosts up) scanned in 2.11 seconds
Видим, что нашей Raspberry Pi назначен адрес 192.168..0.100
, его будем использовать для подключения по ssh. Давайте сразу добавим адрес в ~/.ssh/config
с alias'ом pi:
# ~/.ssh/config Host pi Hostname 192.168.0.100
$ ssh kantegory@pi
Настройка сервера
Чтобы с сервером можно было работать необходимо правильно его настроить, сейчас мы этим и займёмся.
Добавление пользователя
Для начала, добавим нового пользователя с правами рута, которым и будем пользоваться.
$ sudo useradd kantegory -m
Ключ -m
нужен для того, чтобы у пользователя сразу появилась домашняя директория.
Добавим пользователя в группу sudo
(чтобы дать ему права рута):
$ sudo usermod -aG sudo kantegory
Теперь назначим новый пароль этому пользователю, чтобы иметь возможность залогиниться под ним:
$ sudo passwd kantegory
Выходим (Ctrl + D
) и попытаемся зайти под только что созданным пользователем:
$ ssh pi
Нас пускает, но спрашивают пароль. Давайте сделаем так, чтобы при входе пароль у нас не спрашивали, для этого нужно скопировать наш публичный ssh-ключ на сервер:
$ ssh-copy-id pi
Пробуем подключиться без пароля:
$ ssh pi
Отлично! Перейдём к установке необходимых пакетов.
Установка необходимых пакетов
Для начала нам нужно обновить систему:
$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install curl
Теперь нужно установить epm, чтобы можно было очень удобно управляться со всеми дальнейшими зависимостями:
$ sudo curl -s https://raw.githubusercontent.com/Etersoft/eepm/master/packed/epm.sh | bash /dev/stdin ei --auto
Установим nginx, он будет нам нужен, чтобы спроксировать докер-контейнер с nextcloud наружу:
$ epmi nginx
Установка и настройка docker
Ещё нам необходимо установить docker:
$ epmi apt-transport-https ca-certificates gnupg-agent software-properties-common
Теперь добавим официальный GPG-ключ:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ epmi docker
И установим docker-compose, чтобы запустить nextcloud сразу с postgresql:
$ epmi docker-compose
И утилиту evz для более удобного управления докер-контейнерами:
$ epm ei evz
Всё отлично! Теперь нужно изменить директорию, в которой docker будет хранить данные. Для этого нужно смонтировать наш внешний HDD.
Монтирование HDD, смена data-root директории docker
Для начала давайте подготовим наш диск.
Выведем список всех дисков, чтобы удостовериться, что наш диск есть:
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk └─sda1 8:1 0 931.5G 0 part mmcblk0 179:0 0 14.4G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot/firmware └─mmcblk0p2 179:2 0 14.2G 0 part /
Теперь давайте создадим новый раздел на этом диске, чтобы потом сделать на нём файловую систему ext4:
$ sudo fdisk /dev/sda Welcome to fdisk (util-linux 2.31.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help):
Вводим d, чтобы удалить существующий раздел.
Затем создаём новую GPT-таблицу, используя команду g. Выбираем все значения по умолчанию.
После добавляем новый раздел, введя команду n. И в конце концов записываем все изменения, введя w.
Теперь создадим новую файловую систему на этом разделе используя утилиту mkfs:
$ sudo mkfs.ext4 /dev/sda1
На всё соглашаемся, ждём, пока файловая система создастся.
Теперь нам нужно получить uuid диска, это можно сделать вот так:
$ sudo ls -lha /dev/disk/by-uuid/ total 0 drwxr-xr-x 2 root root 100 Jan 1 1970 . drwxr-xr-x 7 root root 140 Jan 1 1970 .. lrwxrwxrwx 1 root root 10 Oct 18 08:59 206fc7ae-85d5-4222-839f-9a103cc89499 -> ../../sda1 lrwxrwxrwx 1 root root 15 Oct 17 17:09 8f3b44fc-c6d6-419d-9149-3fe1743fc8b8 -> ../../mmcblk0p2 lrwxrwxrwx 1 root root 15 Oct 17 16:24 96B7-4ABE -> ../../mmcblk0p1
Создадим директорию services в mnt:
$ sudo mkdir /mnt/services
Копируем uuid диска и идём в файлик /etc/fstab, дописываем туда следующую строчку:
UUID=206fc7ae-85d5-4222-839f-9a103cc89499 /mnt/services ext4 nofail,defaults 0 2
Это нужно, чтобы наш диск был смонтирован постоянно, в директорию /mnt/services
.
И смотрим через команду lsblk
, что всё корректно монтируется:
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk └─sda1 8:1 0 931.5G 0 part /mnt/services mmcblk0 179:0 0 14.4G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot/firmware └─mmcblk0p2 179:2 0 14.2G 0 part /
Меняем data-root директорию docker, для этого в строчку ExecStart сервиса docker (/etc/systemd/system/multi-user.target.wants/docker.service):
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/mnt/services
Отлично! Теперь можно переходить к установке nextcloud.
Установка nextcloud
Переходим к самой важной части. К установке NextCloud.
Мы будем следующий использовать docker-compose.yml:
version: '3' volumes: nextcloud: nextclouddb: services: nextclouddb: image: postgres ports: - 5436:5432 restart: always volumes: - ./dbs/postgres-data:/var/lib/postgresql environment: - POSTGRES_USER=nextcloud - POSTGRES_PASSWORD=nextcloudpass - POSTGRES_DB=nextcloud app: image: nextcloud ports: - 8080:80 depends_on: - nextclouddb volumes: - nextcloud:/var/www/html restart: always
Docker-compose нам нужен для того, чтобы можно было запустить одновременно два образа, в нашем случае postgresql и сам nextcloud.
$ docker-compose up -d
Теперь выведем список всех активных контейнеров:
$ sudo evz list $ docker ps --format table {{.ID}} {{.Image}} {{.Status}} {{.Names}} CONTAINER ID IMAGE STATUS NAMES 50a9e1a527f0 nextcloud Up 55 minutes nextcloud_app_1 c9475790eb16 postgres Up 55 minutes nextcloud_nextclouddb_1 See evz ports ID for print ports
И посмотрим, доступен ли наш контейнер снаружи, или запущен только на localhost:
$ sudo netstat -tunlp | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 4577/docker-proxy
Теперь можно перейти по адресу 192.168.0.100:8080 и ввести там необходимые параметры. Поскольку, мы выбирали postgres в качестве БД, заполним данные именно от него. Теперь ждём, пока всё сконфигурируется.
Добавляем проксирование в nginx (редактируем файлик /etc/nginx/sites-available/default):
location / { proxy_pass http://127.0.0.1:8080/; access_log /var/log/nginx/nextcloud-access.log; }
В целом, всё, что нам нужно, это найти секцию location /
и вместо неё написать этот кусочек конфига.
Теперь nextcloud доступен по адресу 192.168.0.100
, но вообще в следующей части, когда будем настраивать VPN для наших сервисов, мы откажемся от nginx внутри и всё проксирование будет идти снаружи.