Установка Rocket.Chat на Rocky Linux — подробный пошаговый гид
Введение

Rocket.Chat — это сервер чата с открытым исходным кодом, написанный на JavaScript с использованием фреймворка Meteor.js. Он обеспечивает защищённую, мгновенную связь между устройствами и даёт возможность организациям развернуть собственный внутренний мессенджер с интеграциями в внешние сервисы: боты, социальные сети, системы управления задачами и CI/CD (Jira, GitLab, Bitbucket, Confluence и т. д.). Поддерживаются настольные и мобильные платформы. Существенные преимущества — контроль данных, приватность и гибкость развёртывания: локально, в приватном облаке или в гибридной модели.
В этом руководстве мы установим бесплатную Community-версию Rocket.Chat на сервер с Rocky Linux 8.
Important: если вы планируете использовать Rocket.Chat в продакшене, внимательно отнеситесь к безопасности, резервному копированию и мониторингу. Разделы «Рекомендации по безопасности» и «План восстановления» ниже помогут в этом.
Что вы получите в результате
- Рабочий инстанс Rocket.Chat за N минут (в зависимости от инфраструктуры).
- Настройку Docker + Docker Compose для запуска Rocket.Chat и MongoDB в контейнерах.
- Настроенный Nginx с SSL (Let’s Encrypt) и автообновлением сертификатов.
- Шаблоны резервного копирования, восстановления и обновления.
Предпосылки
- Сервер с Rocky Linux (рекомендуется 8.x). Минимально — 1 ГБ RAM для ~200 пользователей с пиковыми 50 одновременных соединений; для боевых нагрузок используйте ≥2 ГБ и разделённые ресурсы для MongoDB.
- Домен, указывающий на сервер (в примерах — rocketchat.example.com).
- Непривилегированный пользователь с правами sudo.
- SELinux отключён или корректно настроен для Docker/Nginx (в руководстве предполагается отключение).
- Система обновлена.
Обновление системы:
$ sudo dnf updateУстановка базовых утилит (если они отсутствуют):
$ sudo dnf install wget curl nano unzip yum-utils -yПримечание: в тексте ниже сохраняются блоки команд, которые можно выполнять на сервере.
H2: Порты и компоненты — что куда смотрит
Краткий обзор сетевых требований и портов (ментальная модель):
- Rocket.Chat (в контейнере) слушает на 3000/tcp по умолчанию.
- MongoDB слушает на 27017/tcp внутри сети Docker.
- Nginx будет принимать 80/443 трафик извне и проксировать на 3000 локально.
- Let’s Encrypt использует HTTP (80) для проверки домена при валидации по HTTP challenge.
Важно: не открывайте MongoDB в публичный интернет — доступ должен быть только из доверенной сети (локальная сеть Docker или VPN).
Шаг 1 — настройка firewall (firewalld)
Rocky Linux по умолчанию использует firewalld. Проверим статус:
$ sudo firewall-cmd --state
runningПосмотрим активные сервисы в текущей зоне (обычно public):
$ sudo firewall-cmd --permanent --list-servicesЕсли вывод соответствует стандартному состоянию, добавим HTTP/HTTPS для прохождения проверок Let’s Encrypt и доступа пользователей:
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent
$ sudo firewall-cmd --reloadNote: если вы используете нестандартные порты или дополнительные сервисы, откройте их явно. При использовании облачных провайдеров не забудьте проверить правила сети/ACL на уровне облака.
Шаг 2 — установка Docker и базовая конфигурация
Rocky Linux может поставляться с «устаревшим» пакетом Docker. Рекомендуется использовать официальный репозиторий Docker.
Добавим официальный репозиторий Docker (CentOS-совместимая линия):
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repoУстановим Docker:
$ sudo dnf install docker-ce docker-ce-cli containerd.ioВключим и запустим службу Docker:
$ sudo systemctl enable docker --nowПроверим, что служба активна (пример вывода):
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2022-08-20 22:35:19 UTC; 1s ago
Docs: https://docs.docker.com
Main PID: 82575 (dockerd)
Tasks: 7
Memory: 31.1M
CGroup: /system.slice/docker.service
??82575 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
...Чтобы не вводить sudo при каждой команде docker, добавьте пользователя в группу docker:
$ sudo usermod -aG docker $(whoami)Затем выйдите и войдите снова в сессию (или выполните su - ${USER}) и проверьте группы:
$ groups
navjot wheel dockerSecurity note: добавление в группу docker эквивалентно предоставлению root-доступа для команд docker. Применяйте с осторожностью.
Шаг 3 — установка Docker Compose (плагин)
Современные версии Docker используют Compose как плагин. Узнайте актуальную версию на странице релизов Docker Compose. В примере используется v2.10.0 — при копировании замените номер версии на актуальный.
Создаём директорию плагинов:
$ mkdir ~/.docker/cli-plugins -pСкачиваем бинарник Docker Compose в папку плагинов:
$ curl -SL https://github.com/docker/compose/releases/download/v2.10.0/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-composeДелаем плагин исполняемым:
$ chmod +x ~/.docker/cli-plugins/docker-composeПроверяем установку:
$ docker compose versionОжидаемый результат:
Docker Compose version v2.10.0Если вы используете другой пользовательский путь для Docker CLI, убедитесь, что Docker способен обнаружить плагин.
Шаг 4 — развёртывание Rocket.Chat и MongoDB через Docker Compose
Создаём рабочую папку для проекта и переходим в неё:
$ mkdir ~/rocketchat
$ cd ~/rocketchatОткройте редактор и создайте файл docker-compose.yml:
$ nano docker-compose.ymlВставьте содержимое ниже именно как указано (включая volume и services). Этот compose запустит Rocket.Chat 5.0.4 и MongoDB (Bitnami 4.4) с простыми настройками реплики и healthcheck. Проверьте теги образов и при необходимости обновите версии.
volumes:
mongodb_data:
rocketchat-uploads:
services:
rocketchat:
image: registry.rocket.chat/rocketchat/rocket.chat:5.0.4
restart: on-failure
volumes:
- rocketchat-uploads:/app/uploads
environment:
MONGO_URL: mongodb://mongodb:27017/rocketchat?replicaSet=rs0
MONGO_OPLOG_URL: mongodb://mongodb:27017/local?replicaSet=rs0
ROOT_URL: https://rocketchat.example.com
PORT: 3000
DEPLOY_METHOD: docker
Accounts_UseDNSDomainCheck: 'false'
MAIL_URL: 'smtps://AmazonSESuser:[email protected]:587'
depends_on:
- mongodb
expose:
- 3000
ports:
- 3000:3000
healthcheck:
test: >
/usr/local/bin/node -e '
const http = require("http");
const options = {
host: "localhost",
port: 3000,
path: "/api/info",
timeout: 2000
};
const healthCheck = http.request(options, (res) => {
console.log(`HEALTHCHECK STATUS: $${res.statusCode}`);
if (res.statusCode == 200) {
process.exit(0);
} else {
process.exit(1);
}
});
healthCheck.on("error", function (err) {
console.error("ERROR");
process.exit(1);
});
healthCheck.end();'
interval: 10s
timeout: 5s
retries: 3
start_period: 60s
mongodb:
image: bitnami/mongodb:4.4
restart: on-failure
volumes:
- mongodb_data:/bitnami/mongodb
environment:
MONGODB_REPLICA_SET_MODE: primary
MONGODB_REPLICA_SET_NAME: rs0
MONGODB_PORT_NUMBER: 27017
MONGODB_INITIAL_PRIMARY_HOST: mongodb
MONGODB_INITIAL_PRIMARY_PORT_NUMBER: 27017
MONGODB_ADVERTISED_HOSTNAME: mongodb
MONGODB_ENABLE_JOURNAL: 'true'
ALLOW_EMPTY_PASSWORD: 'yes'
healthcheck:
test: echo 'db.runCommand("ping").ok' | mongo mongodb:27017/test --quiet
interval: 10s
timeout: 5s
retries: 3
start_period: 60sСохраните файл (Ctrl+X, Y).
Запустите контейнеры в фоне:
$ docker compose up -dПроверим статус контейнеров:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59cd748e684f registry.rocket.chat/rocketchat/rocket.chat:5.0.4 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp rocketchat-rocketchat-1
1fdabedf8681 bitnami/mongodb:4.4 "/opt/bitnami/script…" 2 minutes ago Up 2 minutes (healthy) 27017/tcp rocketchat-mongodb-1Или используйте docker compose ps:
$ docker compose ps
NAME COMMAND SERVICE STATUS PORTS
rocketchat-mongodb-1 "/opt/bitnami/script…" mongodb running (healthy) 27017/tcp
rocketchat-rocketchat-1 "docker-entrypoint.s…" rocketchat running (healthy) 0.0.0.0:3000->3000/tcp, :::3000->3000/tcpТеперь в браузере можно открыть http://rocketchat.example.com:3000 или http://
Important: проверьте переменную ROOT_URL — она определяет, по какому URL Rocket.Chat ожидает запросы и формирует ссылки в почтовых уведомлениях.
Шаг 5 — установка SSL через Let’s Encrypt (Certbot)
Для получения сертификата используем Certbot. Сначала установим EPEL репозиторий (если ещё не установлен):
$ sudo dnf install epel-releaseУстанавливаем certbot:
$ sudo dnf install certbotПолучаем сертификат (используя standalone режим — certbot поднимет временный HTTP-сервер на 80 порту):
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d rocketchat.example.comСертификат появится в /etc/letsencrypt/live/rocketchat.example.com.
Генерируем параметр Diffie-Hellman для повышения безопасности TLS:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096Создаём веб-рут для challenge (используется при renew с webroot):
$ sudo mkdir -p /var/lib/letsencryptСоздаём ежедневный cron job для обновления сертификатов и перезагрузки nginx после обновления. Создайте файл /etc/cron.daily/certbot-renew:
$ sudo nano /etc/cron.daily/certbot-renewВставьте:
#!/bin/sh
certbot renew --cert-name rocketchat.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"Сделайте скрипт исполняемым:
$ sudo chmod +x /etc/cron.daily/certbot-renewNote: при использовании standalone режима certbot должен иметь доступ к порту 80; если nginx уже слушает 80, используйте webroot или временно остановите nginx на момент валидации.
Шаг 6 — установка и настройка Nginx как обратного прокси
Добавим официальный репозиторий nginx (stable):
$ sudo nano /etc/yum.repos.d/nginx.repoВставьте:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=trueУстанавливаем nginx:
$ sudo dnf install nginxПроверяем версию:
$ nginx -v
nginx version: nginx/1.22.0Включаем и запускаем nginx:
$ sudo systemctl enable nginx --nowСоздаём конфигурацию прокси /etc/nginx/conf.d/rocket.conf и вставляем нижеуказанный конфиг. Этот конфиг перенаправляет HTTP на HTTPS и проксирует трафик на Rocket.Chat, добавляя нужные заголовки для WebSocket и реального IP.
# Redirect all non-encrypted to encrypted
server {
listen 80;
listen [::]:80;
server_name rocketchat.example.com;
return 301 https://$host$request_uri;
}
# HTTPS Server
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name rocketchat.example.com;
access_log /var/log/nginx/rocketchat_access.log main;
error_log /var/log/nginx/rocketchat_error.log;
ssl_certificate /etc/letsencrypt/live/rocketchat.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/rocketchat.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/rocketchat.example.com/chain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:20m;
ssl_session_tickets off;
ssl_session_timeout 180m;
ssl_stapling on;
ssl_stapling_verify on;
location / {
proxy_pass http://rocketchat.example.com:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
}
}В файл /etc/nginx/nginx.conf добавьте перед include /etc/nginx/conf.d/*.conf;:
server_names_hash_bucket_size 64;Проверим конфигурацию и перезапустим nginx:
$ sudo nginx -t
$ sudo systemctl restart nginxПроверка: откройте https://rocketchat.example.com — должен загрузиться интерфейс Rocket.Chat с валидным сертификатом.
Note: в proxy_pass можно использовать http://127.0.0.1:3000/ или http://localhost:3000/. Использование rocketchat.example.com в proxy_pass работает, но важно, чтобы DNS имя резолвилось локально; предпочтительнее явно указывать localhost.
Шаг 7 — первоначальная настройка через веб-интерфейс
Откройте https://rocketchat.example.com в браузере — вы увидите экран первоначальной установки.

Заполните администратора и организацию, далее можно зарегистрироваться в Rocket.Chat Cloud или продолжить автономно.


Если вы выбрали Cloud, подтвердите почту по ссылке.

После подтверждения вы попадёте в панель управления Rocket.Chat.

Настройка SMTP (отправка почты)
Откройте меню профиля (верхний левый угол) → Administration → Settings. Введите «Email» в поиске и откройте раздел Email, затем — вкладку SMTP.




Пример настройки для Amazon SES (порт 587, STARTTLS):
- SMTP host: email-smtp.us-east-1.amazonaws.com
- Port: 587
- Username: ваш Amazon SES SMTP user
- Password: ваш пароль
- Use TLS: включено (TLS)
После сохранения нажмите «Send a test mail to my user» — при успехе вы увидите тестовое письмо.

Important: некоторые интерфейсы отмечают опцию «Ignore TLS» некорректно (в исходном тексте об этом предупреждение). Нельзя отключать TLS в продуктиве.
Шаг 8 — вход в Rocket.Chat Cloud и установка приложений
Из меню Administration → Connectivity Services вы можете выполнить вход в Rocket.Chat Cloud для доступа к маркетплейсу приложений.

Нажмите Login to Rocket.Chat Cloud, получите ссылку на почту, пройдите авторизацию и вернитесь в панель — теперь доступны Cloud apps.

Вы можете устанавливать приложения, например GIPHY, и настраивать их через интерфейс Apps.


Команда для использования в чате:
/giphy <поисковый запрос>
Шаг 9 — резервное копирование и восстановление
Для корректного бэкапа необходимо сохранять данные MongoDB и файлы загрузок (uploads).
Остановим контейнеры:
$ docker compose downПолучим список контейнеров, чтобы узнать имя MongoDB контейнера:
$ docker ps -aВ примере имя контейнера — rocketchat_mongo_1. Экспортируем дамп:
$ docker exec rocketchat_mongo_1 sh -c 'mongodump --archive' > db.dumpФайлы uploads можно сохранить из тома:
$ docker run --rm -v rocketchat_rocketchat-uploads:/from -v $(pwd)/backup:/to alpine ash -c "cd /from && tar -czf /to/uploads.tar.gz ."Восстановление MongoDB из архива:
$ docker exec -i sh -c 'mongorestore --archive' < db.dump Восстановление файлов uploads:
$ docker run --rm -v rocketchat_rocketchat-uploads:/to -v $(pwd)/backup:/from alpine ash -c "cd /to && tar -xzf /from/uploads.tar.gz"Backup runbook (короткая пошаговая инструкция):
- Остановить приложение:
docker compose down. - Сделать mongodump в архив:
docker exec.sh -c 'mongodump --archive' > db.dump - Сохранить том uploads в tar.
- Перенести резервные копии в безопасное хранилище (S3, удалённый сервер).
- Запустить контейнеры:
docker compose up -d.
Критерии приёмки: резервная копия успешно восстанавливается в тестовом окружении, а восстановленный сервис отвечает на /api/info.
Шаг 10 — обновление Rocket.Chat (rolling upgrade)
При обновлении данных контейнеров данные хранятся в томах и не должны теряться. Общая последовательность:
$ docker pull registry.rocket.chat/rocketchat/rocket.chat:latest
$ docker compose stop rocketchat
$ docker compose rm rocketchat
$ docker compose up -d rocketchatРекомендации перед обновлением:
- Сделайте полный бэкап MongoDB и uploads.
- Прочитайте release notes для новой версии Rocket.Chat (обратить внимание на breaking changes и миграции базы).
- Тестируйте обновление на стейджинге.
Rollback: если новая версия не работает, остановите контейнер, верните образ на предыдущую версию (docker pull с нужным тегом) и разверните.
Рекомендации по безопасности и эксплуатации
Security hardening — основные шаги:
- Ограничьте доступ к SSH с помощью ключей и firewall/ACL.
- Не открывайте MongoDB наружу. Для межконтейнерного соединения используйте Docker network или privnet.
- Используйте сильные пароли для административных учётных записей.
- Настройте регулярные обновления ОС и контейнеров в тестовом цикле перед продакшеном.
- Логи: собирайте логи контейнеров и nginx в централизованное хранилище (ELK, Grafana Loki, Graylog).
- Регулярно проверяйте expiry сертификатов и тестируйте процесс автообновления.
Дополнительные меры:
- Включите двухфакторную аутентификацию для админов.
- Ограничьте возможность регистрации в публичных каналах и внешние интеграции по умолчанию.
- Используйте WAF/IDS на уровне сети при необходимости.
Privacy / GDPR notes:
- Если вы храните персональные данные граждан ЕС, ознакомьтесь с требованиями GDPR: обеспечьте право на удаление/экспорт данных пользователей.
- Логи и медиа-файлы могут содержать персональные данные — продумайте политику хранения и удаления.
- Документируйте обработку данных и настройте retention policy.
Модели зрелости и масштабирование
Ниже — простая шкала зрелости развёртывания Rocket.Chat (heuristic maturity levels):
- Уровень 0 (PoC): один сервер, Docker Compose, базовый Nginx, простой бэкап.
- Уровень 1 (Малый продакшен): выделенные тома для данных, регулярные бэкапы, SSL, мониторинг процессов.
- Уровень 2 (Средний продакшен): отдельный MongoDB кластер или managed MongoDB, репликация, LB для веб-слоя, TLS во всех соединениях.
- Уровень 3 (Критичный продакшен): распределённый кластер Rocket.Chat, отдельные сервисы (авторизация, интеграции), SSO, HIPAA/GDPR соответствие, DR план, SLA и мониторинг SLO/SLI.
Ментальная модель: растите от простого к сложному — сначала надёжный бэкап и мониторинг, затем — разделение ресурсов и HA.
Полезные сценарии и сниппеты (cheat sheet)
- Просмотр логов Rocket.Chat:
$ docker compose logs -f rocketchat- Просмотр логов MongoDB:
$ docker compose logs -f mongodb- Проверка healthcheck контейнеров:
$ docker ps --format "table {{.Names}} {{.Status}}"- Пересоздание контейнеров после изменения переменных окружения:
$ docker compose down
$ docker compose up -d --force-recreateЧеклисты ролей
Администратор (System Admin) — перед запуском в продакшн:
- Проверить обновления ОС и зависимостей.
- Настроить firewall и DNS.
- Получить SSL и проверить HTTPS доступ.
- Настроить SMTP и тестовое письмо.
- Настроить бэкап и проверить восстановление.
- Настроить мониторинг и оповещения.
DevOps — при развёртывании и поддержке:
- Автоматизировать сбор логов и метрик.
- Настроить CI/CD для создания и тестирования контейнеров.
- Убедиться, что тома данных монтируются на надёжное хранилище.
- Планировать обновления и релизные процессы.
Security Officer — перед сдачей в эксплуатацию:
- Провести аудит конфигурации TLS/SSL.
- Проверить доступы к MongoDB.
- Включить двухфакторную аутентификацию.
- Подготовить политику retention для логов и медиаконтента.
План инцидента и отката (runbook)
Пример быстрого плана на случай, если сервис перестал отвечать после обновления:
- Проверить статус контейнеров:
docker compose ps. - Просмотреть логи:
docker compose logs rocketchatиdocker compose logs mongodb. - Если ошибка связана с новой версией, выполнить rollback: остановить контейнер, пересоздать с предыдущим тегом образа.
- Восстановить данные из последней рабочей резервной копии (при необходимости).
- Проверить целостность базы командой
/api/info. - Сообщить пользователям о статусе и времени восстановления.
Совместимость и миграция
- Перед обновлением проверьте release notes Rocket.Chat на предмет несовместимых изменений в API и schema migration.
- При миграции с других мессенджеров используйте доступные импортеры и плагины, внимательно тестируйте на тестовой среде.
- Если вы планируете вертикальное масштабирование MongoDB, рассмотрите переход на управляемую MongoDB (например, MongoDB Atlas) для упрощения операций.
Decision tree (когда выбирать что)
flowchart TD
A{Цель: быстрая установка на один сервер?} -->|Да| B[Use Docker Compose]
A -->|Нет, нужно HA| C[Use Kubernetes or multiple hosts]
B --> D{Нужен SSL?}
D -->|Да| E[Configure Nginx + Certbot]
D -->|Нет| F[Serve on HTTP 'test only']
C --> G[Deploy MongoDB replica set and scale Rocket.Chat instances]
G --> H[Configure load balancer and shared storage for uploads]Частые проблемы и устранение неполадок
- Ошибка WebSocket при подключении: убедитесь, что Nginx передаёт заголовок Upgrade и Connection: upgrade.
- Невалидный сертификат: проверьте, что Certbot поместил сертификаты в /etc/letsencrypt/live/
и что nginx использует именно их. - Почта не отправляется: проверьте MAIL_URL в переменных окружения Rocket.Chat и настройки SMTP в интерфейсе.
- MongoDB не стартует: проверьте, что томы доступны и что контейнер Mongo имеет достаточные права на запись.
Заключение
Вы развернули Rocket.Chat Community на Rocky Linux: установили Docker, Docker Compose, MongoDB и Rocket.Chat, настроили Nginx с SSL от Let’s Encrypt, выполнили первоначальную настройку через веб-интерфейс, настроили SMTP, научились делать бэкапы и обновления. Встроенные чеклисты, рекомендации по безопасности и runbook помогут вам перейти от PoC к стабильному продакшену.
Краткое резюме шагов: подготовка сервера → установка Docker → установка Docker Compose → создание docker-compose.yml → запуск контейнеров → настройка SSL и nginx → первоначальная веб-настройка → настройка SMTP → резервное копирование и обновление.
Если у вас возникли вопросы или нужны примеры для конкретной архитектуры (Kubernetes, managed MongoDB, high-availability), опишите ваш сценарий — я подскажу оптимальные шаги и конфигурации.
Краткая заметка для безопасности: всегда тестируйте важные операции (обновления, восстановление) в тестовом окружении до выполнения в продакшене.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента