Установка и обслуживание сервера

От подготовки сервера до первого входа. Docker Compose, ручная сборка, HTTPS, автозапуск и резервные копии.

Выберите способ установки#

Способов два.

  • Docker Compose — самый простой. Сервер, база данных и nginx запускаются вместе. Нужны Git, Docker и Docker Compose.
  • Без Docker — если вы сами обслуживаете PostgreSQL и веб-сервер. DiscoDrive придётся собрать из исходников.
К оглавлению ↑

Подготовка: сервер, адрес и HTTPS#

Перед установкой понадобятся три вещи.

  • Компьютер или сервер, который всегда включён, с местом под файлы и доступом к командной строке. Резервные копии лучше хранить на другом устройстве.
  • Адрес. Для публичного имени настройте DNS: запись A — на IPv4-адрес сервера, AAAA — на IPv6, если он есть. Если сервер стоит дома, доступ снаружи зависит от роутера и провайдера.
  • Сертификат на это имя — у хостинг-провайдера или в сервисе выпуска сертификатов. Настройте автоматическое продление, иначе облако перестанет открываться, когда срок истечёт.

DiscoDrive работает только по HTTPS, включая первую настройку. Снаружи должен быть открыт только HTTPS-порт веб-сервера. Порт базы данных и внутренний HTTP-порт DiscoDrive не открывайте.

К оглавлению ↑

Docker: скачать сервер#

Нужны установленные Git, Docker и Docker Compose.

Выполните команды ниже на сервере. Они скачают исходники и создадут файл настроек .env из образца. Все следующие команды docker compose запускайте из этой же папки.

git clone https://github.com/discodrive-cloud/discodrive.git
cd discodrive
cp .env.example .env
К оглавлению ↑

Docker: пароли и хранилище#

  1. Откройте .env в текстовом редакторе. Задайте POSTGRES_PASSWORD и впишите тот же пароль в DATABASE_URL. Удобнее всего пароль из случайных шестнадцатеричных символов: его не нужно кодировать в адресе подключения.
  2. Сгенерируйте JWT_SECRET первой командой ниже, SETTINGS_ENCRYPTION_KEY — второй, и вставьте результаты в .env. Ключ шифрования должен быть длиной ровно 32 байта — вторая команда выдаёт как раз 32 символа.
  3. В BASE_DOMAIN укажите имя облака без https:// и без пути. STORAGE_ROOT=/data оставьте как есть: в стандартном Compose туда подключается папка data рядом с файлом Compose.
  4. Чтобы адрес открывался без номера порта, задайте NGINX_HTTPS_PORT=443. По умолчанию стоит 8443, и тогда порт придётся дописывать к адресу.
  5. Для первого запуска поставьте XACCEL_ENABLED=false — файлы будет отдавать сервер DiscoDrive, а не nginx. Отдачу через nginx можно включить позже, когда дадите ему право читать хранилище.
  6. Укажите часовой пояс в TZ. Если лимиты места и сроки хранения по умолчанию не подходят, поменяйте их по справочнику ниже.
  7. Сохраните .env и закройте к нему доступ командой chmod ниже.
openssl rand -base64 48
openssl rand -hex 16
chmod 600 .env

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

К оглавлению ↑

Docker: сертификат и запуск#

  1. Положите сертификат в папку deploy/nginx/certs (создайте её, если её нет): полную цепочку — под именем dev.pem, закрытый ключ — под именем dev-key.pem. Стандартная конфигурация nginx ждёт именно эти имена.
  2. Закрытый ключ не публикуйте и не добавляйте в Git. У контейнера nginx должно быть право его читать. При продлении сертификата замените файлы и перезагрузите nginx.
  3. На Linux дайте приложению право записи в папку data. Сначала узнайте, от какого пользователя работает контейнер: первый блок команд ниже покажет его и сохранит список пользователей образа с их UID и GID. Эти числа подставьте во второй блок вместо APP_UID и APP_GID. Если хранилище уже существует, сначала посмотрите его текущие права.
  4. Соберите и запустите контейнеры третьим блоком команд. Первый запуск дольше обычного: собирается приложение.
  5. Проверьте, что работают все три контейнера: app, postgres и nginx. Если какой-то останавливается, посмотрите его журнал. Чаще всего причина — незаполненные ключи, неверный пароль базы или отсутствующий сертификат.

Проверить пользователя контейнера

docker compose build app
docker compose create app
docker inspect --format '{{.Config.User}}' "$(docker compose ps -aq app)"
docker compose cp app:/etc/passwd ./container-passwd.txt

Шаблон для новой папки: подставьте UID и GID

mkdir -p data
sudo chown APP_UID:APP_GID data
sudo chmod 750 data

Запуск и проверка

docker compose up -d --build
docker compose ps
docker compose logs --tail=100 app nginx postgres

Второй блок рассчитан на обычный Docker. Если включён rootless-режим или userns-remap, нужны идентификаторы пользователя на хосте — они отличаются от тех, что внутри контейнера.

К оглавлению ↑

Первый запуск: создать администратора#

  1. На сервере, в папке проекта, прочитайте одноразовый код командой ниже. При установке без Docker код лежит в файле .bootstrap/setup-token внутри папки хранилища.
  2. Откройте адрес облака по HTTPS. Если порт остался стандартный, допишите к адресу :8443; если выбрали 443, порт не нужен.
  3. Введите код, почту и пароль администратора. После настройки файл с кодом удалится сам.
  4. Войдите, загрузите небольшой файл и скачайте его обратно — так вы убедитесь, что всё работает.
sudo cat data/.bootstrap/setup-token

Для повседневной работы заведите обычную учётную запись, а администраторскую оставьте для управления.

Если доступ к облаку потерян, владельцу сервера помогут резервная копия или процедура восстановления доступа из README.

Список пользователей в панели администратора: почта, роль, занятое место и квота каждого.
Панель администратора: здесь заводятся пользователи и задаются квоты.
К оглавлению ↑

Без Docker: сборка#

Для сборки нужны Go 1.25 или новее и Node.js 22 или новее, для работы — PostgreSQL 16 или новее.

  1. Скачайте исходники сервера, как в разделе «Docker: скачать сервер», и перейдите в папку discodrive.
  2. Соберите сначала веб-интерфейс, потом сервер — командами ниже. Получится один исполняемый файл discodrive, веб-интерфейс уже внутри.
cd web
npm install
npm run generate
cd ..
CGO_ENABLED=0 go build -trimpath -o discodrive ./cmd/server

Запускайте сервер от отдельной системной учётной записи, у которой есть доступ только к его файлам и хранилищу.

К оглавлению ↑

Без Docker: база, настройки и HTTPS#

  1. Под администратором PostgreSQL выполните первый блок команд. Придумайте пароль для пользователя disco — он понадобится в строке подключения.
  2. Создайте папку для файлов и дайте учётной записи DiscoDrive право записи в неё.
  3. Сохраните настройки по образцу второго блока в отдельный файл с закрытым доступом, подставив свои значения вместо угловых скобок. Если в пароле базы есть спецсимволы URL, закодируйте их. Ключи создайте теми же командами, что в разделе «Docker: пароли и хранилище».
  4. Если HTTPS-прокси работает на этой же машине, оставьте APP_HOST=127.0.0.1 и направьте прокси на 127.0.0.1:8080. Прокси должен передавать X-Forwarded-Proto со значением https и сохранять заголовок Host. Пример — в следующем разделе.
  5. Если прокси стоит на другой машине, укажите её адрес или подсеть в TRUSTED_PROXY_CIDRS и закройте доступ к DiscoDrive для всех остальных.
  6. Чтобы сервер запускался сам, настройте автозапуск по разделу ниже. Для разового запуска экспортируйте настройки в окружение и выполните ./discodrive. Затем пройдите первичную настройку по HTTPS.

В терминале PostgreSQL

createuser disco --pwprompt
createdb discodrive --owner disco

Файл настроек: /etc/discodrive.env

DATABASE_URL=postgres://disco:<PASSWORD>@localhost:5432/discodrive?sslmode=disable
JWT_SECRET=<GENERATED_JWT_SECRET>
SETTINGS_ENCRYPTION_KEY=<GENERATED_32_BYTE_KEY>
BASE_DOMAIN=cloud.example.com
APP_HOST=127.0.0.1
APP_PORT=8080
STORAGE_ROOT=/var/lib/discodrive/data
XACCEL_ENABLED=false
К оглавлению ↑

Без Docker: пример HTTPS-прокси#

Пример для nginx на той же машине, что и DiscoDrive. Замените имя сайта и пути к сертификату, добавьте блок в конфигурацию nginx, проверьте её командой nginx -t и перезагрузите nginx. Закрытый ключ должен быть доступен только тем системным процессам, которым он нужен.

В этом примере файлы отдаёт сервер DiscoDrive, а не nginx, поэтому XACCEL_ENABLED=false.

server {
    listen 443 ssl;
    server_name cloud.example.com;
    ssl_certificate /etc/ssl/discodrive/fullchain.pem;
    ssl_certificate_key /etc/ssl/discodrive/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    client_max_body_size 0;
    access_log off;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_http_version 1.1;
        proxy_request_buffering off;
        proxy_buffering off;
        proxy_read_timeout 3600s;
    }
}
К оглавлению ↑

Автозапуск на Linux#

Этот раздел — для установки без Docker. Если вы ставили через Docker, контейнеры уже запускаются сами; переходите к обновлениям и резервным копиям.

  1. Выполните первый блок команд. Он создаст системного пользователя discodrive, скопирует программу в /usr/local/bin, создаст папку /var/lib/discodrive/data и закроет доступ к файлу /etc/discodrive.env для всех, кроме root. Если пути у вас другие, поправьте их здесь, в файле службы и в настройках.
  2. Проверьте, что в /etc/discodrive.env настройки записаны по одной в строке, в виде KEY=value и без export.
  3. Создайте файл /etc/systemd/system/discodrive.service с содержимым второго блока.
  4. Включите службу командами третьего блока и проверьте её состояние и журнал.

Подготовка в терминале Linux

sudo useradd --system --user-group --home-dir /var/lib/discodrive --shell /usr/sbin/nologin discodrive
sudo install -m 755 discodrive /usr/local/bin/discodrive
sudo install -d -o discodrive -g discodrive -m 750 /var/lib/discodrive/data
sudo chown root:root /etc/discodrive.env
sudo chmod 600 /etc/discodrive.env

Файл /etc/systemd/system/discodrive.service

[Unit]
Description=DiscoDrive
After=network.target postgresql.service

[Service]
User=discodrive
ExecStart=/usr/local/bin/discodrive
EnvironmentFile=/etc/discodrive.env
Restart=on-failure

[Install]
WantedBy=multi-user.target

Включить службу и проверить запуск

sudo systemctl daemon-reload
sudo systemctl enable --now discodrive
sudo systemctl status discodrive
sudo journalctl -u discodrive -n 100

Служба запускается при включении сервера и перезапускается после сбоя. Чтобы обновить программу, остановите службу, замените файл и запустите её снова.

К оглавлению ↑

Обновление и резервные копии#

Резервная копия — это копия базы PostgreSQL и папки хранилища вместе со скрытыми служебными файлами. Чтобы копия была согласованной, проще всего на время остановить app и nginx, а базу оставить работать.

Настройки и ключи храните отдельно, причём ключ шифрования настроек — не рядом с копией базы. Время от времени проверяйте на отдельной установке, что из копии действительно можно восстановиться. Синхронизация устройств резервную копию не заменяет.

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

  • Docker: в папке проекта выполните git pull, затем docker compose up -d --build. Проверьте контейнеры, вход и скачивание файла.
  • Без Docker: соберите новую версию, остановите службу, замените программу и запустите снова.

Команда docker compose down останавливает установку и сохраняет данные базы. Не добавляйте к ней --volumes или -v: с ними база будет удалена.

К оглавлению ↑

Если установка не работает#

  • Не запускается app. Посмотрите журнал, проверьте, доступен ли PostgreSQL, строку подключения и длину ключей. Если просите помощи, не выкладывайте .env целиком.
  • Не запускается nginx. Проверьте, что сертификат и ключ лежат под нужными именами и читаются, а выбранный HTTPS-порт свободен.
  • Браузер предупреждает о сертификате. Проверьте имя сайта, срок действия и полноту цепочки. Исправьте сертификат, а не отключайте проверку.
  • Файлы видны, но не скачиваются. При XACCEL_ENABLED=true nginx должен уметь читать хранилище. Дайте ему доступ через отдельную группу или ACL с учётом пользователя контейнера, а не открывайте хранилище всем пользователям машины.
  • Изменили .env — пересоздайте контейнеры командой docker compose up -d. Заменили сертификат — перезагрузите nginx.

Прежде чем публиковать журнал, уберите из него пароли, токены и внутренние адреса.

К оглавлению ↑

Справочник настроек

Параметры задаются в .env для Docker или в окружении процесса при ручной установке. Полный образец поставляется с исходниками.

Переменные окружения
ПеременнаяЧто задаёт
DATABASE_URLСтрока подключения к PostgreSQL.
JWT_SECRETКлюч для подписи сессий.
SETTINGS_ENCRYPTION_KEYКлюч для шифрования хранимых настроек.
BASE_DOMAINИмя, по которому доступно ваше облако, без https:// и пути.
APP_HOSTАдрес, который слушает сервис.
APP_PORTПорт, который слушает сервис.
STORAGE_ROOTПапка хранилища. Файлы в ней лежат под теми же именами, что в интерфейсе.
STORAGE_TOTAL_GBОбщий лимит хранилища в ГБ. Когда он исчерпан, запись останавливается.
DEFAULT_USER_QUOTA_GBКвота нового пользователя в ГБ. Потом её можно поменять в панели администратора.
TRASH_DAYSСколько дней файлы лежат в корзине.
VERSION_KEEPСколько версий файла хранить. Ноль — не хранить.
RESCAN_SECONDSКак часто, в секундах, проверять изменения, сделанные прямо в папке хранилища.
XACCEL_ENABLEDОтдавать файлы через nginx. Права проверяет DiscoDrive, файл отдаёт nginx.
SAVED_MAX_DOWNLOAD_MBПредельный размер файла, который сервер скачивает по ссылке, в МБ.

.env.example · README сервера