24

Домашний сервер с Nextcloud - мой путь

На очередную годовщину решил подарить жене новый смартфон. Счастливые распаковали и начали переход к новому от старого смартфона. И тут оказалось, что бесплатное облачное дисковое пространство, предоставленное Google’ом, жена давно исчерпала, все фотографии хранились только в памяти телефона. Бесценные чаты WhatsApp тоже не бэкапились. Попытки увеличить размер облака Google’а не увенчались успехом, так как оплатить подписку из России простыми способами оказалось невозможно.

И тут я задумался о домашнем облачном хранилище. Под рукой оказались материнская плата Asus B75M-A с установленными 2-х ядерным процессором Intel Celeron, 8 Гб памяти и 5 HDD по 1 Тб каждый. Поверхностно посчитав экономику, решил, что домашний сервер с таким объемом дискового пространства окажется немного дешевле, чем арендованные у сервисов облачного хранилища. Хотя, не факт)  Еще один плюс в пользу домашнего сервера для меня был в том, что он будет доступен по lan и я смогу переполненный диск моего ноутбука освободить на расшаренный диск.

Сначала приведу мои траты:

- аренда VPS-сервера: 75 руб./мес

- регистрация доменного имени: 250 руб./год

- расходы на электроэнергию: около 600 руб./месяц.

- железо: у меня все уже было, если покупать можно уместиться в ~30 тыс.руб.

Далее – мой опыт установки программного обеспечения и его настройки. Я не специалист в этой области, не утверждаю, что делаю все правильно. В описании моих действий могут быть неточности в каких-то понятиях и названиях. Это - не инструкция, а скорее, описание всего, что я натворил, если забуду. Если кто-то решит повторить за мной – на свой страх и риск.

Каков план:

  1. Установить на имеющееся железо Proxmox VE.

  2. Поднять виртуальную машину на Ubuntu.

  3. Установить на ВМ необходимое ПО.

  4. Арендовать VPS-сервер, установить необходимое ПО.

  5. Связать по VPN-сети VPS-сервер и нашу виртуальную машину.

  6. Зарегистрировать домен и настроить на направление на IP-адрес VPS-сервера.

Зачем тут VPS-сервер? Мой провайдер не предоставляет возможности получить публичный IP-адрес, так что для меня это был единственный вариант достучаться до моего сервера из вне.

Что я хочу получить в итоге:

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

  2. Файл-сервер с доступом по Samba, FTP и web-морде для хранения других данных (рабочие проекты, фильмы, музыка, программы и др.). Данные хранятся на том же Raid-массиве.

1. Как установить Proxmox?

ВАЖНО: для установки операционной системы я взял отдельный диск, на котором не будут храниться пользовательские данные. На момент установки был подключен только этот диск.

«Proxmox Virtual Environment — это платформа с открытым исходным кодом для корпоративной виртуализации. Благодаря встроенному веб-интерфейсу вы можете легко управлять виртуальными машинами и контейнерами, программно-определяемым хранилищем и сетями, кластеризацией высокой доступности и несколькими готовыми инструментами с помощью одного решения» - говорит нам официальный сайт данного продукта. Переходим туда по адресу https://www.proxmox.com/en/downloads, скачиваем Proxmox VE 8.3 ISO Installer (или другую доступную версию) и с помощью Rufus записываем образ на флешку.

Далее, как и при установке любой другой операционной системы, грузимся с флешки.

Выбираем Install Proxmox VE, далее принимаем Лицензионное соглашение.

Выбираем Install Proxmox VE, далее принимаем Лицензионное соглашение.

Здесь выбираем диск, на который будет установлен Proxmox. Я ничего не менял, оставил все как есть

Здесь выбираем диск, на который будет установлен Proxmox. Я ничего не менял, оставил все как есть

Выбираем страну, часовой пояс

Выбираем страну, часовой пояс

Вводим пароль, который будет использован для доступа к Proxmox

Вводим пароль, который будет использован для доступа к Proxmox

Далее вводим данные сети и IP-адрес нашего сервера.

Далее вводим данные сети и IP-адрес нашего сервера.

Далее ждем установки и перезагрузки компьютера. После этого можем отключить монитор от нашего сервера и убрать сервер в его законное место. Садимся за наш компьютер или ноутбук с любимой и понятной Windows и переходим в браузере по адресу https://<IP-адрес>:8006, где IP-адрес тот, который вводили при установке Proxmox. В открывшемся окне вводим имя пользователя: root, и пароль тот, который указывали при установке. После предупреждения о том, что у вас нет подписки нас встречает нас такое окно:

Далее нам нужно поменять коммерческие репозитории на бесплатные. Для этого либо подключаемся к нашему серверу по SSH (скачиваем приложение Putty, в поле Host name вводим IP-адрес нашего сервер жмем Open, в открывшемся окне вводим root и наш пароль), либо на странице управления Proxmox жмем на нашу ноду (название нашего сервера под Datacenter), справа выбираем Shell. Далее вводим

nano /etc/apt/sources.list.d/pve-enterprise.list

Приводим содержимое файла в такой вид:

#deb https://enterprise.proxmox.com/debian/pve bookworm enterprise

deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription

Открываем следующий файл командой:

nano /etc/apt/sources.list.d/ceph.list

и приводим в такой вид:

#deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise

deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription

После обновляем пакеты:

apt update && apt upgrade -y

Закончим дела с железом. Здесь я подключил все свои HDD к серверу, собрав из говна и палок такой стенд:

Кулера подключил к разъему корпусных кулеров на материнской плате.

После подключения HDD к серверу создаем ZFS Raid1 из наших HDD. Почему ZFS? Потому что сам Proxmox рекомендует использовать эту систему. По поводу разницы между Raid1, Raid2, Raid3...: индекс 1, 2, 3 говорит о том, при отказе скольких дисков работоспособность массива и целостность данных не будет нарушена. При этом общий объем дискового пространства будет равна на: Объем Raid-массива = (Объем одного диска * количество дисков) - (Объем одного диска * индекс Raid). Т.е., я взял 5 HDD объемом 1 Тб каждая, создал ZFS Raid1, получил объем дискового пространства равный 3,87 Тб. При этом при выходе из строя одного из HDD я смогу его поменять без потери данных. Создаем Raid-массив. Для этого жмем на нашу ноду (название нашего сервера под Datacenter), справа выбираем раздел Disks. Увидим все диски, подключенные к серверу:

Здесь у меня уже создан Raid-массив, разделы на дисках размечены. Если вы используете б/у диски, у вас так же могут быть размечены разделы. Чтобы очистить диск выбираем его и жмем вверху Wipe. Очищаем все диски, из которых мы хотим создать Raid-массив. Далее в разделе Disks переходим в подраздел ZFS и жмем вверху Create ZFS.

Здесь ввел название массива, выбрал диски, из которых необходимо создать Raid-массив, Raid Level я выбрал RAIDZ, остальное оставил как есть. Жмем Create. Все, наш Raid-массив создан.

2. Ставим Ubuntu, MariaDB, NGINX, Nextcloud.

Теперь создадим первую виртуальную машину. Переходим по адресу: https://ubuntu.com/download/server и скачиваем Ubuntu Server 24.04. После скачивания в панели управления Proxmox переходим в хранилище local (для этого раскрываем ноду (название нашего сервера под Datacenter)), где переходим ISO Images -> Upload -> выбираем скачанную Ubuntu -> Upload. После того, как образ загрузился на наш сервер в правом верхнем углу в панели управления жмем Create VM.

Вкладка General

Вкладка General

Node - единственная нода, которая у нас есть

VM ID - ID виртуальной машины, ставится автоматом

Name - название виртуальной машины, на наше усмотрение

Вкладка OS

Вкладка OS

ISO image - выбираем скачанный образ Ubuntu 24.04

Во вкладке System я оставляю все как есть.

Вкладка Disks

Вкладка Disks

Storage - выбираю local-lvm

Disk size - 10 GiB мне на этой машине хватает.

Вкладка CPU

Вкладка CPU

Type - выбираю kvm64. Далее.

Во вкладке Memory ставлю не менее 2048 MiB памяти.

Во вкладке Network ничего не меняю, во вкладке Confirm жму Finish. Виртуальная машина создана. Теперь в моем ноде появилась виртуальная машина. Выбираю его и жму старт в правом верхнем углу. После этого подключаюсь к виртуальной машине по VNC - для этого жмем кнопку Console (рядом с кнопкой Start).

При установке Ubuntu 24.04 я никаких манипуляций, кроме как нажатия кнопок "Готово" и "Продолжить", не совершал. Разве что отметил, что необходимо установить OpenSSH-сервер.

После установки и перезагрузки виртуальной машины ввожу имя пользователя и пароль, который я указывал при установке Ubuntu и вижу IP-адрес, который мне выдал DHCP:

По указанному IP подключаюсь к виртуальной машину по SSH с помощью Putty.

Актуализирую списки пакетов в репозиториях:

sudo apt update

И обновляю пакеты:

sudo apt upgrade

Устанавливаю chrony

sudo apt install chrony

Выставляю часовой пояс:

sudo timedatectl set-timezone Europe/Moscow

Разрешаю автозапуск:

sudo systemctl enable chrony

Устанавливаю сервер базы данных:

sudo apt install mariadb-server

Разрешаю автозапуск и запускаю сервис:

sudo systemctl enable mariadb

sudo systemctl start mariadb

Задаю пароль root-пользователя:

sudo mysqladmin -u root password

Подключаюсь к MariaDB, создаю базу данных и пользователя:

sudo mysql -uroot -p

> CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

> GRANT ALL PRIVILEGES ON nextcloud.* TO nextcloud@localhost IDENTIFIED BY 'nextcloud';

> \q

Далее необходимо установить PHP и необходимые пакеты к нему. Последняя версия Nextcloud работает на PHP версии не ниже 8.3

Создаем переменную с номером версии PHP:

export PHP_VER=8.3

Добавляю необходимые репозитории:

sudo add-apt-repository ppa:ondrej/php

Обновляю список пакетов:

sudo apt update

Устанавливаю PHP 8.3 и расширения:

sudo apt install php${PHP_VER}-fpm php${PHP_VER}-common php${PHP_VER}-zip php${PHP_VER}-xml php${PHP_VER}-intl php${PHP_VER}-gd php${PHP_VER}-mysql php${PHP_VER}-mbstring php${PHP_VER}-curl php${PHP_VER}-imagick php${PHP_VER}-gmp php${PHP_VER}-bcmath libmagickcore-6.q16-6-extra

После завершения установки немного изменяю конфигурацию PHP. Открываем файл:

sudo nano /etc/php/8.3/fpm/pool.d/www.conf

Нахожу строку:

env[PATH] = /usr/local/bin:/usr/bin:/bin

и раскомментирую ее. Быстро найти строку в nano редакторе можно путем нажатия Ctrl+W и вставив туда эту строку. Сохраняю, выхожу из редактора. Редактирую PHP.ini:

sudo nano /etc/php/8.3/fpm/php.ini

Редактирую следующие строки:

opcache.enable_cli=1
opcache.interned_strings_buffer=32
opcache.revalidate_freq=1

Разрешаю автозапуск php-fpm и перезапускаю его:

sudo systemctl enable php8.3-fpm

sudo systemctl restart php8.3-fpm

Далее установлю web-сервер Nginx.

sudo apt install nginx

После установки можно в браузере можно перейти по IP-адресу виртуальной машины, должна открыться приветственная страница nginx.

Теперь скачаю Nextcloud. Для этого создаю каталог для скачивания:

sudo mkdir /dwnld

и перейду туда:

cd /dwnld

Скачиваю последнюю версию Nextcloud с официального сайта:

sudo wget https://download.nextcloud.com/server/releases/latest.zip

Устанавливаю unzip для распаковки архива:

sudo apt install unzip

Распаковываю архив Nextcloud:

sudo unzip latest.zip

Перемещаю папку с Nextcloud в папку web-сервера:

sudo mv nextcloud /var/www

Задаю права доступа:

sudo chown -R www-data:www-data /var/www/nextcloud

Создаю виртуальный домен:

sudo nano /etc/nginx/sites-enabled/nextcloud.conf

Вставляю следующую конфигурацию:

server {

listen 80;

server_name nextcloud.local;

proxy_connect_timeout 600;

proxy_send_timeout 600;

proxy_read_timeout 600;

send_timeout 600;

root /var/www/nextcloud;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomai>

client_max_body_size 10G;

fastcgi_buffers 64 4K;

rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;

rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;

rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

index index.php;

error_page 403 = /core/templates/403.php;

error_page 404 = /core/templates/404.php;

location = /robots.txt {

allow all;

log_not_found off;

access_log off;

}

location ~ ^/(data|config|\.ht|db_structure\.xml|README) {

deny all;

}

location ^~ /.well-known {

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

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

location = /.well-known/webfinger { return 301 /index.php/.wel>

location = /.well-known/nodeinfo { return 301 /index.php/.well>

location ^~ /.well-known{ return 301 /index.php/$uri; }

try_files $uri $uri/ =404;

}

location / {

rewrite ^/.well-known/host-meta /public.php?service=host-meta l>

rewrite ^/.well-known/host-meta.json /public.php?service=host-m>

rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

try_files $uri $uri/ index.php;

}

location ~ ^(.+?\.php)(/.*)?$ {

try_files $1 = 404;

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$1;

fastcgi_param PATH_INFO $2;

fastcgi_param HTTPS on;

fastcgi_pass unix:/run/php/php8.3-fpm.sock;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {

expires modified +30d;

access_log off;

}

}

где nextcloud.local - временный "локальный" URL-адрес Nextcloud-сервера.

Рестартуем nging:

sudo systemctl restart nginx

Для проверки работоспособности Nextcloud вношу в hosts компьютера, из которого я провожу проверку, следующую запись:

Путь к hosts: C:\Windows\System32\drivers\etc\hosts

Запись: 192.168.0.120 nextcloud.local

где 192.168.0.120 - IP-адрес моей виртуальной машины.

Перехожу по адресу http://nextcloud.local и открывается страница:

Страница первоначальной настройки Nextcloud-сервера.

Страница первоначальной настройки Nextcloud-сервера.

Ничего здесь не делаю, просто закрываю страницу.

3. Проброс каталога из хоста в виртуальную машину


Здесь и далее:

Хост - компьютер с установленным Proxmox.

Сервер, виртуальная машина, ВМ - виртуальная машина с Nextcloud.

Массив, Raid-массив - созданный в разделе 1 ZFS ZRAID


Напоминаю, что я создавал Raid-массив объемом 3,8 Тб для хранения пользовательских данных. На данный момент он доступен он только из хоста. Есть простой способ передать этот массив в виртуальную машину - из панели управления Proxmox создать виртуальный диск в этом массиве и подключить его к виртуальной машине. Однако этот способ меня не устроил, так как, если выйдет из строя HDD с установленным Proxmox или иным способом нарушится работоспособность этой операционной системы восстановление данных из виртуального диска будет непростым занятием. Поэтому решил передать в виртуальную машину каталог (файловую систему) в этом массиве.

Для этого прежде создаю файловую систему в нашем массиве (в терминале хоста):

sudo zfs create ZFSDATA/nc-data

где ZFSDATA - название нашего массива (можно посмотреть в панели управления Proxmox в разделе Disks->ZFS), nc-data - название файловой системы. Созданные файловые системы можно просматривать:

ls /ZFSDATA

Далее действую по этой инструкции:

ВЫКЛЮЧАЮ ВИРТУАЛЬНУЮ МАШИНУ!

ДЕСТВИЯ НА ХОСТЕ:

Устанавливаю virtiofsd

apt install virtiofsd

Переходим по пути:

cd /var/lib/vz/snippets

Создаю файл virtiofs_hook.conf

nano virtiofs_hook.conf

со следующим содержимым:

100: /ZFSDATA/nc-data

где: 100 - ID виртуальной машины, в которую необходимо передать каталог

Закрываю этот файл. Создаю второй файл virtiofs_hook.pl

nano virtiofs_hook.pl

Cо следующим содержимым:

#!/usr/bin/perl

use strict;

use warnings;

my $conf_file = '/var/lib/vz/snippets/virtiofs_hook.conf';

my %associations;

open my $cfg, '<', $conf_file or die "Failed to open virtiofs_hook.conf";

while (my $line = <$cfg>) {

chomp $line;

my ($vm_id, $paths_str) = split /:/, $line;

my @path = split /,/, $paths_str;

$associations{$vm_id} = \@path;

}

close $cfg or warn "Close virtiofs_hook.conf failed: $!";

use PVE::QemuServer;

use Template;

my $tt = Template->new;

print "GUEST HOOK: " . join(' ', @ArGV) . "\n";

my $vmid = shift;

my $conf = PVE::QemuConfig->load_config($vmid);

my $vfs_args_file = "/run/$vmid.virtfs";

my $virtiofsd_dir = "/run/virtiofsd/";

my $DEBUG = 1;

my $phase = shift;

my $unit_tpl = "[Unit]

Description=virtiofsd filesystem share at [% share %] for VM %i

StopWhenUnneeded=true

[Service]

Type=simple

RuntimeDirectory=virtiofsd

PIDFile=/run/virtiofsd/.run.virtiofsd.%i-[% share_id %].sock.pid

ExecStart=/usr/libexec/virtiofsd --log-level debug --socket-path /run/virtiofsd/%i-[% share_id %].sock --shared-dir [% share %] --cache=auto --announce-submounts --inode-file-handles=mandatory

[Install]

RequiredBy=%i.scope\n";

if ($phase eq 'pre-start') {

print "$vmid is starting, doing preparations.\n";

my $vfs_args = "-object memory-backend-memfd,id=mem,size=$conf->{memory}M,share=on -numa node,memdev=mem";

my $char_id = 0;

# Create the virtiofsd directory if it doesn't exist

if (not -d $virtiofsd_dir) {

print "Creating directory: $virtiofsd_dir\n";

mkdir $virtiofsd_dir or die "Failed to create $virtiofsd_dir: $!";

}

# TODO: Have removal logic. Probably need to glob the systemd directory for matching files.

for (@{$associations{$vmid}}) {

# my $share_id = $_ =~ s/^\///r =~ s/\//_/gr;

my $share_id = $_ =~ m/.*\/([^\/]+)/ ? $1 : ''; # only last folder from path

my $unit_name = 'virtiofsd-' . $vmid . '-' . $share_id;

my $unit_file = '/etc/systemd/system/' . $unit_name . '@.service';

print "attempting to install unit $unit_name...\n";

if (not -d $virtiofsd_dir) {

print "ERROR: $virtiofsd_dir does not exist!\n";

}

else { print "DIRECTORY DOES EXIST!\n"; }

if (not -e $unit_file) {

$tt->process(\$unit_tpl, { share => $_, share_id => $share_id }, $unit_file)

|| die $tt->error(), "\n";

system("/usr/bin/systemctl daemon-reload");

system("/usr/bin/systemctl enable $unit_name\@$vmid.service");

}

system("/usr/bin/systemctl start $unit_name\@$vmid.service");

$vfs_args .= " -chardev socket,id=char$char_id,path=/run/virtiofsd/$vmid-$share_id.sock";

$vfs_args .= " -device vhost-user-fs-pci,chardev=char$char_id,tag=$vmid-$share_id";

$char_id += 1;

}

open(FH, '>', $vfs_args_file) or die $!;

print FH $vfs_args;

close(FH);

print $vfs_args . "\n";

if (defined($conf->{args}) && not $conf->{args} =~ /$vfs_args/) {

print "Appending virtiofs arguments to VM args.\n";

$conf->{args} .= " $vfs_args";

} else {

print "Setting VM args to generated virtiofs arguments.\n";

print "vfs_args: $vfs_args\n" if $DEBUG;

$conf->{args} = " $vfs_args";

}

PVE::QemuConfig->write_config($vmid, $conf);

}

elsif($phase eq 'post-start') {

print "$vmid started successfully.\n";

my $vfs_args = do {

local $/ = undef;

open my $fh, "<", $vfs_args_file or die $!;

<$fh>;

};

if ($conf->{args} =~ /$vfs_args/) {

print "Removing virtiofs arguments from VM args.\n";

print "conf->args = $conf->{args}\n" if $DEBUG;

print "vfs_args = $vfs_args\n" if $DEBUG;

$conf->{args} =~ s/\ *$vfs_args//g;

print $conf->{args};

$conf->{args} = undef if $conf->{args} =~ /^$/;

print "conf->args = $conf->{args}\n" if $DEBUG;

PVE::QemuConfig->write_config($vmid, $conf) if defined($conf->{args});

}

}

elsif($phase eq 'pre-stop') {

#print "$vmid will be stopped.\n";

}

elsif($phase eq 'post-stop') {

#print "$vmid stopped. Doing cleanup.\n";

} else {

die "got unknown phase '$phase'\n";

}

exit(0);

Сохраняем и закрываем редактор. Делаем только что созданный файл исполяемым:

chmod u+x /var/lib/vz/snippets/virtiofs_hook.pl

Устанавливаем скрипт-подключение:

qm set 100 --hookscript local:snippets/virtiofs_hook.pl

где 100 - ID моей виртуальной машины.

Стартую виртуальную машину из под хоста:

qm start 100

где 100 - ID виртуальной машины

Смотрю файл конфигурации виртуальной машины:

cat /etc/pve/qemu-server/100.conf

где 100 - ID виртуальной машины

Должно выдать что-то подобное:

args: -object memory-backend-memfd,id=mem,size=2048M,share=on -numa node,memdev=mem -chardev socket,id=char0,path=/run/virtiofsd/100-nc-data.sock -device vhost-user-fs-pci,chardev=char0,tag=100-nc-data

...

...

...

Должен быть подобный раздел args. Если этого раздела нет, стоплю виртуальную машину и запуска его снова

qm 100 stop

Жду пока машина остановится...

qm 100 start

Из раздела args меня интересует аргумент tag, у меня он содержит значение "100-nc-data".

ПЕРЕХОЖУ В ТЕРМИНАЛ ВИРТУАЛЬНОЙ МАШИНЫ.

Устанавливаю virtiofsd:

sudo apt install virtiofsd

Создаю папку для монтирования:

sudo mkdir /mnt/nc-data

Пробую монтировать:

sudo mount -t virtiofs 100-nc-data /mnt/nc-data

где: 100-nc-data - значение аргумента tag, который я смотрел на хосте

/mnt/nc-data - созданная мной папка для монтирования.

Смотрю список смонтированных дисков

df -h

Эта команда должна показать смонтированный диск 100-nc-data.

Все, я пробросил файловую систему из хоста в виртуальную машину. Создаю в нем каталог для хранения данных Nextcloud:

sudo mkdir /mnt/nc-data/my

4. Аренда VPS и установка необходимых программ

Процесс аренды VPS я описывать не буду, у каждого поставщика он свой. Я арендовал самый дешевый VPS у Евробайт. VPS за 75 рублей предлагает ФёрстБайт. При заказе услуги в качестве операционной системы я выбрал Ubuntu 22. По данным, который предоставил поставщик услуг, лезу в терминал VPS. Обновляю пакеты:

sudo apt update

sudo apt upgrade

Устанавливаю Docker:

sudo apt-get update

sudo apt-get install ca-certificates curl

sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Устанавливаю Nginx proxy manager

Для этого создаю каталог:

sudo mkdir /npm

Перехожу в эту папку

cd /npm

Создаю файл yaml

sudo nano docker-compose.yml

Вставляю в него следующее содержимое:

services:

app:

image: 'jc21/nginx-proxy-manager:latest'

restart: unless-stopped

ports:

- '80:80'

- '81:81'

- '443:443'

volumes:

- ./data:/data

- ./letsencrypt:/etc/letsencrypt

Здесь интересует ports: дополнительно я открыл 21:21 для FTP, 8006:8006 для доступа к Proxmox удаленно. Если нужно, можно открыть дополнительные порты.

Запускаю docker-compose:

docker-compose up -d

и жду пока все установится. После окончания установки перехожу по адресу: https://<IP-адрес VPS>:81, встречает страница входа в Nginx Proxy Manager (NPM). Вхожу по этим данным:

Email: admin@example.com

Password: changeme

И меняю E-mail и пароль на свои.

Далее устанавливаю NetBird.

NetBird создает Zero Trust сети по протоколу WireGuard. По сути - локальную сеть между удаленными машинами.

Переходу на официальный сайт NetBird, регистрируюсь. Перехожу в личный кабинет, жму кнопку Add peer, появляется инструкция по установке на разные системы. Смотрим Linux, копируем ссылку для быстрой установке:

curl -fsSL https://pkgs.netbird.io/install.sh | sh

и вставляем в терминал VPS. Жду конца установки. После установки ввожу команду:

netbird up

Появляется ссылка для авторизации машины, которая выглядит так:

https://login.netbird.io/activate?user_code=%3CCO-DE%3E

Копирую и вставляю в браузер. После перехода на страницу авторизации жму Confirm.

ДЕЙСТВИЯ ПО УСТАНОВКЕ NetBird НЕОБХОДИМО ПРОДЕЛАТЬ И НА ВИРТУАЛЬНОЙ МАШИНЕ!

5. Регистрация домена

Далее я зарегистрировал домен. В этом деле нет конкретных инструкций, но при регистрации в DNS-записи А необходимо указать IP-адрес VPS-сервера. В панели управления моего регистратора это выглядит так:

6. Последние действия

Когда до DNS-серверов дойдет информация о том, что зарегистрированный домен ссылается на IP-адрес VPS, переходим по адресу: https://<ВашДомен>:81, должна открыться входа в NPM. Захожу Hosts -> Proxy Hosts, жму Add Proxy Host. Вношу следующие данные:

где - nextcloud.MyDomain.ru - [nextcloud] - любой поддомен, [MyDomain.ru] - зарегистрированный нами домен;

Forward Hostname/IP - IP адрес виртуальной машины, выданный NetBird. Посмотреть его можно в личном кабинете NetBird, либо введя в терминале виртуальной машины:

ip a

Смотрим раздел с сетевым интерфейсом wt0:

3: wt0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN group default qlen 1000

link/none

inet 100.127.1.240/16 brd 100.127.255.255 scope global wt0

valid_lft forever preferred_lft forever

Перехожу во вкладку SSL, во вкладке "SSL Sertificate" выбираю "Request a new SSL Certificate", ставлю галочку "I Agree to the Let's Encrypt Terms of Service".

Жму Save.

В терминале виртуальной машины:

Перехожу в терминал виртуальной машины и меняю конфигурацию виртуального домена:

sudo nano /etc/nginx/sites-enabled/nextcloud.conf

Строку с server_name nextcloud.local; на:

server_name nextcloud.MyDomain.ru;

Рестартую nginx:

sudo systemctl restart nginx

Далее в браузере перехожу по адресу: nextcloud.MyDomain.ru и ввожу следующую где ввожу новое имя учетной записи, придумываю пароль.

В поле "Каталог с данными" ввожу:

/mnt/nc-data/my

(создавал в разделе 3)

Учетная запись, пароль, имя базы данных ввожу:

nextcloud

(БД создавал в разделе 2)

Жму УСТАНОВИТЬ.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества