Nextcloud-сервер на базе одноплатного ПК BananaPi


Установка, настройка и работа с Nextcloud (бесплатное облачное хранилище)
certbot certonly certbot renew cloud cv fastcgi gita gita-dev.ru install nextcloud nginx server
 
 

* В этом блоге я описываю свою повседневную рабочую практику, поэтому все статьи в блоге написаны лично мной и при копировании их на свой сайт пожалуйста указывайте ссылку на страницу откуда вы скопировали.
* Если какая-то статья вам помогла, то вы можете дать мне немного денег вместо простого спасибо (ссылка на форму поддержки проекта внизу страницы), если вы что-то не поняли или у вас что-то не получается, то вы можете нанять меня и я вам все подробно расскажу (расценки и ссылки в конце статьи).


(последние правки 5 дней, 18 часов)

Представляю вашему вниманию продолжение статьи - Установка облачного хранилища NextCloud в окружение Nginx+PHP-FPM и сегодня я настрою облачное хранилище на домашнем микро-пк на базе ARM-системы Banana PI. Фактически это доработка статьи про настройке Banana PI для платформы x86 под архитектуру ARM.

Я буду рассматривать только особенности реализации хранилища под ARM-платформу которые были выявлены в процессе переноса моего облачного хранилища от хостинг-провайдера себе на домашний микро-сервер и если вас интересует подробное руководство по установке и настройке NextCloud, я рекомендую обратиться к статье "Установка облачного хранилища NextCloud в окружение Nginx+PHP-FPM".

Обноплатный микро-ПК на базе BananaPI

Настройка Let's encrypt в ARM-окружении

Честно говоря ничем не отличается от настройки в x86 окружении, но раз уж в прошлой статье я не рассматривал его, то сейчас самое время рассмотреть настройку на примере домена cloud.gita-dev.ru и начнем мы естественно с установки CertBot который отвечает за управление сертификатами Let's encrypt.

Для Ubuntu Linux версии 16.04 просто выполните следующие команды:

# apt-get update
# apt-get install software-properties-common
# add-apt-repository ppa:certbot/certbot
# apt-get update
# aptitude install python-certbot-nginx

Создаем тестовый конфиг Nginx для нашего домена чтобы осуществить регистрацию и привязку сертификата Let's encrypt. Конфигурационный файл в простейшем виде выглядит следующим образом (/etc/nginx/sites-available/cloud.gita-dev.ru.conf):

server {
        listen 80;
        listen [::]:80;

        server_name cloud.gita-dev.ru;

        root /var/www/cloud.gita-dev.ru;
        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }
}

Используя Let's encrypt получим SSL-сертификат для этого домена и это очень просто, вам достаточно выполнить команду:

# certbot certonly --nginx -d cloud.gita-dev.ru

В идеале получение сертификата пройдет в полностью автоматическом режиме, хотя при первом запуске мастер задаст вам несколько вопросов:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): service@gita-dev.ru
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y
Starting new HTTPS connection (1): supporters.eff.org
Obtaining a new certificate

При первом запуске вам предложат указать адрес электронной почты на который будут отправляться извещения о том, что срок действия сертификата подходит к концу и конечно же требуется согласиться с условиями лицензионного соглашения (как без этого).

Если получение сертификата прошло успешно, то вы получите сообщение:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/cloud.gita-dev.ru/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/cloud.gita-dev.ru/privkey.pem
   Your cert will expire on 2018-07-01. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

Следовательно необходимые нам SSL-сертификаты находятся в каталоге /etc/letsencrypt/live/cloud.gita-dev.ru/, но так как сертификаты выдается лишь на три месяца нам необходимо создать небольшой скрипт автоматического обновления SSL-сертификатов в каталоге /etc/cron.monthly:

#!/bin/sh
certbot renew

Не забудьте сделать скрипт исполняемым:

# chmod +x ./lets-update.sh

Адаптируем скрипт PHP-Nginx окружения

Адаптируем скрипт из предыдущей реализации к работе с сертификатами Let's encrypt.

server {
    listen 80;
    server_name cloud.gita-dev.ru;
    return 301 https://cloud.gita-dev.ru$request_uri;

}

server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/cloud.gita-dev.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/cloud.gita-dev.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    server_name cloud.gita-dev.ru;

    access_log /var/log/nginx/cloud.gita-dev.ru.log;
    error_log /var/log/nginx/cloud.gita-dev.ru-error.log;

    add_header Strict-Transport-Security "max-age=63072000;";
    client_max_body_size 10G;

    location / {

      proxy_pass http://127.0.0.1:8080;
      proxy_read_timeout    6h;
      proxy_connect_timeout 600s;

      proxy_set_header X-Real-IP $remote_addr;

      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;

      proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
      proxy_set_header Host $host:$server_port;
      proxy_set_header X-Forwarded-Proto $scheme;

    }

}

upstream php-handler {
    server unix:/var/run/php/php7.0-fpm.sock;
}

server {
    listen 8080;
    server_name 127.0.0.1;
    root /var/www/vhosts/next-cloud/;

    access_log /var/log/nginx/cloud.gita-dev.ru.log;
    error_log /var/log/nginx/cloud.gita-dev.ru-error.log;

    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json;

    location = /.well-known/carddav {
      return 301 $scheme://$host/remote.php/dav;
    }

    location = /.well-known/caldav {
      return 301 $scheme://$host/remote.php/dav;
    }

    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    gzip off;

    location / {
        rewrite ^ /index.php$uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
        deny all;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_param REMOTE_ADDR $http_x_real_ip;
        fastcgi_param PHP_VALUE "
                opcache.enable=1
                opcache.enable_cli=1
                opcache.interned_strings_buffer=8
                opcache.max_accelerated_files=10000
                opcache.memory_consumption=128
                opcache.save_comments=1
                opcache.revalidate_freq=1";
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri/ =404;
        index index.php;
    }

    location ~* \.(?:css|js|woff|svg|gif)$ {
        try_files $uri /index.php$uri$is_args$args;
        access_log off;
    }

    location ~* \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        access_log off;
    }

}

Конфигурация выглядит немного монстроидально, но именно такая конфигурация используется у меня сейчас в продакшн и именно в этой конфигурации были вычищены все мелкие ошибки выявленные в процессе эксплуатации.

Настройка окружения Nginx - PHP-FPM

Дальнейшая настройка ничем не отличается от установки для платформы x86 и естественно, что визуально NextCloud на платформах x86 и ARM не отличается.

Запуск NextCloud на платформе ARM

Моя официальная страница на FaceBook
Мой микроблог в твиттер

Как вы наверное понимаете, бесплатно сейчас работать никто не будет и если ответ на ваш вопрос потребует больше трех минут времени и вам требуется полноценная консультация, то расценки на мои услуги представленны ниже.


Есть вопросы?
Спрашивайте и я обязательно вам отвечу!

* Поля обязательные для заполнения .