Linux
October 18, 2020

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

Теперь установим curl:

$ 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"

Устанавливаем сам docker:

$ 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.

Перезапускаем Raspberry:

$ sudo reboot

И смотрим через команду 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 внутри и всё проксирование будет идти снаружи.