Выберите способ установки#
Способов два.
- 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: пароли и хранилище#
- Откройте .env в текстовом редакторе. Задайте POSTGRES_PASSWORD и впишите тот же пароль в DATABASE_URL. Удобнее всего пароль из случайных шестнадцатеричных символов: его не нужно кодировать в адресе подключения.
- Сгенерируйте JWT_SECRET первой командой ниже, SETTINGS_ENCRYPTION_KEY — второй, и вставьте результаты в .env. Ключ шифрования должен быть длиной ровно 32 байта — вторая команда выдаёт как раз 32 символа.
- В BASE_DOMAIN укажите имя облака без https:// и без пути. STORAGE_ROOT=/data оставьте как есть: в стандартном Compose туда подключается папка data рядом с файлом Compose.
- Чтобы адрес открывался без номера порта, задайте NGINX_HTTPS_PORT=443. По умолчанию стоит 8443, и тогда порт придётся дописывать к адресу.
- Для первого запуска поставьте XACCEL_ENABLED=false — файлы будет отдавать сервер DiscoDrive, а не nginx. Отдачу через nginx можно включить позже, когда дадите ему право читать хранилище.
- Укажите часовой пояс в TZ. Если лимиты места и сроки хранения по умолчанию не подходят, поменяйте их по справочнику ниже.
- Сохраните .env и закройте к нему доступ командой chmod ниже.
openssl rand -base64 48
openssl rand -hex 16
chmod 600 .envСохраните ключи в надёжном месте и не меняйте их при перезапусках: без прежнего ключа шифрования сохранённые секретные настройки не прочитать.
К оглавлению ↑Docker: сертификат и запуск#
- Положите сертификат в папку deploy/nginx/certs (создайте её, если её нет): полную цепочку — под именем dev.pem, закрытый ключ — под именем dev-key.pem. Стандартная конфигурация nginx ждёт именно эти имена.
- Закрытый ключ не публикуйте и не добавляйте в Git. У контейнера nginx должно быть право его читать. При продлении сертификата замените файлы и перезагрузите nginx.
- На Linux дайте приложению право записи в папку data. Сначала узнайте, от какого пользователя работает контейнер: первый блок команд ниже покажет его и сохранит список пользователей образа с их UID и GID. Эти числа подставьте во второй блок вместо APP_UID и APP_GID. Если хранилище уже существует, сначала посмотрите его текущие права.
- Соберите и запустите контейнеры третьим блоком команд. Первый запуск дольше обычного: собирается приложение.
- Проверьте, что работают все три контейнера: 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, нужны идентификаторы пользователя на хосте — они отличаются от тех, что внутри контейнера.
К оглавлению ↑Первый запуск: создать администратора#
- На сервере, в папке проекта, прочитайте одноразовый код командой ниже. При установке без Docker код лежит в файле .bootstrap/setup-token внутри папки хранилища.
- Откройте адрес облака по HTTPS. Если порт остался стандартный, допишите к адресу :8443; если выбрали 443, порт не нужен.
- Введите код, почту и пароль администратора. После настройки файл с кодом удалится сам.
- Войдите, загрузите небольшой файл и скачайте его обратно — так вы убедитесь, что всё работает.
sudo cat data/.bootstrap/setup-tokenДля повседневной работы заведите обычную учётную запись, а администраторскую оставьте для управления.
Если доступ к облаку потерян, владельцу сервера помогут резервная копия или процедура восстановления доступа из README.

Без Docker: сборка#
Для сборки нужны Go 1.25 или новее и Node.js 22 или новее, для работы — PostgreSQL 16 или новее.
- Скачайте исходники сервера, как в разделе «Docker: скачать сервер», и перейдите в папку discodrive.
- Соберите сначала веб-интерфейс, потом сервер — командами ниже. Получится один исполняемый файл discodrive, веб-интерфейс уже внутри.
cd web
npm install
npm run generate
cd ..
CGO_ENABLED=0 go build -trimpath -o discodrive ./cmd/serverЗапускайте сервер от отдельной системной учётной записи, у которой есть доступ только к его файлам и хранилищу.
К оглавлению ↑Без Docker: база, настройки и HTTPS#
- Под администратором PostgreSQL выполните первый блок команд. Придумайте пароль для пользователя disco — он понадобится в строке подключения.
- Создайте папку для файлов и дайте учётной записи DiscoDrive право записи в неё.
- Сохраните настройки по образцу второго блока в отдельный файл с закрытым доступом, подставив свои значения вместо угловых скобок. Если в пароле базы есть спецсимволы URL, закодируйте их. Ключи создайте теми же командами, что в разделе «Docker: пароли и хранилище».
- Если HTTPS-прокси работает на этой же машине, оставьте APP_HOST=127.0.0.1 и направьте прокси на 127.0.0.1:8080. Прокси должен передавать X-Forwarded-Proto со значением https и сохранять заголовок Host. Пример — в следующем разделе.
- Если прокси стоит на другой машине, укажите её адрес или подсеть в TRUSTED_PROXY_CIDRS и закройте доступ к DiscoDrive для всех остальных.
- Чтобы сервер запускался сам, настройте автозапуск по разделу ниже. Для разового запуска экспортируйте настройки в окружение и выполните ./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, контейнеры уже запускаются сами; переходите к обновлениям и резервным копиям.
- Выполните первый блок команд. Он создаст системного пользователя discodrive, скопирует программу в /usr/local/bin, создаст папку /var/lib/discodrive/data и закроет доступ к файлу /etc/discodrive.env для всех, кроме root. Если пути у вас другие, поправьте их здесь, в файле службы и в настройках.
- Проверьте, что в /etc/discodrive.env настройки записаны по одной в строке, в виде KEY=value и без export.
- Создайте файл /etc/systemd/system/discodrive.service с содержимым второго блока.
- Включите службу командами третьего блока и проверьте её состояние и журнал.
Подготовка в терминале 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 | Предельный размер файла, который сервер скачивает по ссылке, в МБ. |