Встановлення Tiny Tiny RSS на VPS: Docker, Nginx, PostgreSQL та автооновлення
TL;DR
У цьому детальному посібнику ми покроково налаштуємо Tiny Tiny RSS (TTRSS) — потужний та гнучкий RSS-агрегатор з відкритим вихідним кодом — на вашому віртуальному сервері (VPS). Ми використовуватимемо сучасний підхід з Docker та Docker Compose для ізоляції та легкого керування сервісами, Nginx як зворотний проксі та для забезпечення HTTPS, а також PostgreSQL як надійну базу даних. В результаті ви отримаєте повністю функціональний, безпечний та автоматично оновлюваний TTRSS-сервер, готовий до збору та організації ваших новинних стрічок.
- TTRSS буде розгорнуто у контейнерах Docker для простоти керування та масштабування.
- Nginx налаштований як зворотний проксі для TTRSS, забезпечуючи доступ до сервісу через доменне ім'я та HTTPS.
- Автоматичне отримання та продовження SSL-сертифікатів Let's Encrypt за допомогою Certbot.
- База даних PostgreSQL працюватиме в окремому контейнері, гарантуючи надійне зберігання даних.
- Налаштування автоматичних оновлень та резервного копіювання для безперебійної роботи та збереження даних.
- Посібник включає команди для Debian/Ubuntu, актуальні на 2026 рік.
Що ми налаштовуємо і навіщо
Ми встановлюватимемо Tiny Tiny RSS (TTRSS) — це потужний, повністю відкритий (AGPLv3) веб-орієнтований агрегатор RSS/Atom-стрічок. У світі, де багато комерційних RSS-сервісів приходять і йдуть, або починають показувати рекламу та обмежувати функціонал, TTRSS пропонує повну свободу та контроль над вашими новинними потоками. Ви зможете збирати, читати та організовувати тисячі стрічок з найрізноманітніших джерел, будь то блоги, новинні сайти, подкасти або канали YouTube (за допомогою спеціальних плагінів).
У підсумку читач отримає власний, приватний та повністю контрольований RSS-сервер, доступний з будь-якої точки світу через веб-інтерфейс та мобільні додатки (що підтримують API TTRSS). Це ідеальне рішення для тих, хто цінує конфіденційність, хоче уникнути нав'язливої реклами та мати повний контроль над своїм інформаційним простором.
Існують альтернативи, такі як хмарні сервіси (Inoreader, Feedly) або інші самохостингові рішення (FreshRSS, Nextcloud News). Хмарні сервіси зручні, але позбавляють вас контролю над даними та часто мають платні тарифи з розширеним функціоналом. Самохостингові рішення, такі як TTRSS, вимагають початкового налаштування, але в довгостроковій перспективі пропонують незрівнянну гнучкість, безпеку та економічну вигоду, особливо коли ви розгортаєте їх на власному VPS. Ви володієте своїми даними, можете встановлювати будь-які плагіни та налаштовувати сервіс під свої потреби без обмежень.
Який VPS-конфіг потрібен для цього завдання
Для розгортання Tiny Tiny RSS з Docker, Nginx та PostgreSQL на одному VPS потрібні відносно скромні ресурси, але з невеликим запасом для комфортної роботи та можливості розширення.
Мінімальні вимоги (для 1-5 користувачів, до 1000 стрічок):
- CPU: 1 ядро (наприклад, Intel Xeon E3/E5 або AMD EPYC).
- RAM: 1 ГБ. Цього достатньо для Docker-контейнерів TTRSS, PostgreSQL та Nginx, але без великого запасу.
- Диск: 20 ГБ SSD. TTRSS не споживає багато місця для самої установки, але база даних та кеш зображень можуть з часом зростати. SSD значно прискорює роботу з БД.
- Мережа: 100 Мбіт/с. Для RSS-агрегатора швидкість мережі не є критичною, оскільки трафік в основному складається з невеликих HTTP-запитів.
Рекомендований VPS-план (для 5-20 користувачів, до 5000+ стрічок, із запасом на майбутнє):
- CPU: 2 ядра. Забезпечить кращу продуктивність при оновленні великої кількості стрічок та одночасній роботі кількох користувачів.
- RAM: 2-4 ГБ. Дозволить PostgreSQL ефективніше кешувати дані, а TTRSS обробляти більше фонових завдань.
- Диск: 50-100 ГБ SSD. Дасть достатньо місця для зростання бази даних, зберігання кешу, а також для резервних копій.
- Мережа: 1 Гбіт/с. Стандартна швидкість, що забезпечує швидке завантаження веб-інтерфейсу.
Для такого сценарію можна взяти VPS із зазначеними характеристиками. Вибирайте провайдера, що пропонує гнучкі тарифи та можливість масштабування.
Коли потрібен dedicated, а не VPS
Виділений сервер (dedicated server) для Tiny Tiny RSS зазвичай не потрібен, якщо тільки ви не плануєте обслуговувати сотні чи тисячі користувачів, агрегувати десятки тисяч стрічок з дуже високою частотою оновлення, або якщо TTRSS є лише однією з безлічі вимогливих служб, що працюють на цьому ж сервері. Dedicated сервери пропонують повну ізоляцію ресурсів та часто вищу продуктивність введення/виведення, але для TTRSS на кілька десятків користувачів VPS середнього рівня буде більш ніж достатньо та значно економічніше.
Локація: на що впливає
Вибір локації VPS впливає на:
- Затримку (latency): Чим ближче сервер до вас та ваших користувачів, тим швидше завантажуватиметься веб-інтерфейс TTRSS.
- Законодавство: Деякі користувачі віддають перевагу розміщенню своїх даних у юрисдикціях з більш суворими законами про конфіденційність.
- Швидкість агрегації: Якщо більшість ваших RSS-стрічок походить з певного географічного регіону, розміщення VPS там же може трохи прискорити процес оновлення стрічок, але це рідко є критичним фактором.
У більшості випадків вибирайте локацію, яка знаходиться географічно близько до вас або до основної маси ваших користувачів.
Підготовка сервера
Після отримання доступу до вашого нового VPS перше, що потрібно зробити — це провести базове налаштування безпеки та встановити необхідні утиліти. Ми використовуватимемо дистрибутив на базі Debian/Ubuntu, який є одним з найпопулярніших та добре документованих.
1. Підключення по SSH та створення нового користувача
Підключіться до сервера як користувач root (або той, якого надав провайдер):
ssh root@ВАШ_IP_АДРЕС
Створіть нового користувача з правами sudo для повсякденної роботи. Замініть ваш_пользователь на бажане ім'я користувача:
adduser ваш_пользователь # Створюємо нового користувача
usermod -aG sudo ваш_пользователь # Додаємо його до групи sudo
Встановіть надійний пароль для нового користувача, коли система запитає.
2. Налаштування автентифікації за SSH-ключами (рекомендується)
Це значно підвищує безпеку. Скопіюйте ваш публічний SSH-ключ на сервер:
# На вашій локальній машині:
ssh-copy-id ваш_пользователь@ВАШ_IP_АДРЕС
Потім вимкніть автентифікацію за паролем для SSH (тільки після того, як переконаєтеся, що можете увійти за ключем). Відредагуйте файл /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Знайдіть рядки та змініть їх значення:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no # Іноді корисно вимкнути, якщо у вас проблеми з логіном
PermitRootLogin no # Вимикаємо вхід для root
Перезапустіть SSH-сервіс:
sudo systemctl restart sshd
Тепер вийдіть з root-сесії та увійдіть як новий користувач:
exit
ssh ваш_пользователь@ВАШ_IP_АДРЕС
3. Оновлення системи та встановлення базових утиліт
Оновіть список пакетів та встановіть усі доступні оновлення:
sudo apt update && sudo apt upgrade -y
Встановіть необхідні утиліти, які знадобляться в процесі налаштування:
sudo apt install -y curl wget git nano htop unzip
4. Налаштування файрволу (UFW)
Увімкніть UFW та дозвольте лише необхідні порти (SSH, HTTP, HTTPS):
sudo apt install -y ufw # Встановлюємо UFW, якщо ще не встановлений
sudo ufw allow OpenSSH # Дозволяємо SSH (порт 22 за замовчуванням)
sudo ufw allow http # Дозволяємо HTTP (порт 80)
sudo ufw allow https # Дозволяємо HTTPS (порт 443)
sudo ufw enable # Вмикаємо файрвол
sudo ufw status # Перевіряємо статус файрволу
Підтвердіть увімкнення файрволу, натиснувши y.
5. Встановлення Fail2Ban
Fail2Ban допомагає захистити сервер від атак методом підбору паролів, блокуючи IP-адреси, з яких надходять численні невдалі спроби входу.
sudo apt install -y fail2ban # Встановлюємо Fail2Ban
sudo systemctl enable fail2ban # Вмикаємо автозапуск сервісу
sudo systemctl start fail2ban # Запускаємо сервіс
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Копіюємо конфіг для редагування
Відредагуйте /etc/fail2ban/jail.local, якщо хочете змінити параметри (наприклад, bantime або maxretry). Для більшості випадків налаштування за замовчуванням для SSH достатні.
sudo nano /etc/fail2ban/jail.local
Переконайтеся, що секція [sshd] активна (enabled = true).
Встановлення ПЗ — покроково
Для розгортання Tiny Tiny RSS ми використовуватимемо Docker та Docker Compose. Це дозволить ізолювати TTRSS, PostgreSQL та Nginx, спростить керування залежностями та забезпечить легкі оновлення.
1. Встановлення Docker Engine (актуально на 2026 рік)
Додамо офіційний репозиторій Docker, щоб завжди отримувати найсвіжіші версії.
# Оновлюємо список пакетів
sudo apt update
# Встановлюємо необхідні пакети для роботи з HTTPS-репозиторіями
sudo apt install -y ca-certificates curl gnupg
# Додаємо офіційний GPG ключ Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Додаємо репозиторій Docker до APT sources
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Оновлюємо список пакетів з урахуванням нового репозиторію
sudo apt update
# Встановлюємо Docker Engine, Docker CLI та containerd
# Актуальні версії на 2026 рік можуть бути Docker Engine 25.x/26.x
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Перевіримо, що Docker встановлено та він працює:
sudo docker run hello-world # Запускаємо тестовий контейнер
Додамо вашого користувача до групи docker, щоб не використовувати sudo для кожної команди Docker:
sudo usermod -aG docker ваш_користувач # Додаємо користувача до групи docker
newgrp docker # Застосовуємо зміни до поточної сесії (або перепідключіться по SSH)
2. Встановлення Docker Compose (плагін)
Docker Compose тепер постачається як плагін Docker CLI, тому він вже має бути встановлений з docker-compose-plugin. Перевіримо його версію:
docker compose version # Перевіряємо версію Docker Compose (очікуємо 2.24.x або вище на 2026 рік)
3. Встановлення Nginx
Nginx працюватиме як зворотний проксі на хост-машині, перенаправляючи запити до нашого Docker-контейнера TTRSS.
sudo apt install -y nginx # Встановлюємо Nginx
sudo systemctl enable nginx # Вмикаємо автозапуск Nginx
sudo systemctl start nginx # Запускаємо Nginx
Перевіримо статус Nginx:
sudo systemctl status nginx # Переконуємося, що Nginx працює
4. Встановлення Certbot для Let's Encrypt
Certbot використовуватиметься для автоматичного отримання та поновлення SSL/TLS-сертифікатів від Let's Encrypt.
sudo apt install -y certbot python3-certbot-nginx # Встановлюємо Certbot та плагін для Nginx
5. Створення робочого каталогу для TTRSS
Створимо каталог, де зберігатимуться всі файли конфігурації Docker Compose та дані TTRSS.
mkdir ~/ttrss # Створюємо каталог у домашній директорії користувача
cd ~/ttrss # Переходимо до створеного каталогу
Конфігурація
Тепер, коли все необхідне ПЗ встановлено, ми перейдемо до налаштування Tiny Tiny RSS, бази даних PostgreSQL та Nginx.
1. Створення файлу docker-compose.yml
Цей файл описує наші сервіси (TTRSS, PostgreSQL) та їхні взаємозв'язки. Створіть файл docker-compose.yml у каталозі ~/ttrss:
nano docker-compose.yml
Вставте наступний вміст. Замініть ВАШ_ДОМЕН на ваш реальний домен, наприклад ttrss.example.com. Також придумайте надійні паролі для POSTGRES_PASSWORD та TTRSS_DB_PASS.
version: '3.8'
services:
db:
image: postgres:17-alpine # Актуальна версія PostgreSQL на 2026 рік
restart: always
environment:
POSTGRES_USER: ttrss_user
POSTGRES_PASSWORD: ваш_очень_надежный_пароль_для_бд # Змініть на свій
POSTGRES_DB: ttrss_db
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ttrss_user -d ttrss_db"]
interval: 10s
timeout: 5s
retries: 5
app:
image: ghcr.io/henrywhitaker3/ttrss:latest # Офіційний Docker образ Tiny Tiny RSS
restart: always
depends_on:
db:
condition: service_healthy
environment:
TTRSS_DB_TYPE: pgsql
TTRSS_DB_HOST: db
TTRSS_DB_NAME: ttrss_db
TTRSS_DB_USER: ttrss_user
TTRSS_DB_PASS: ваш_очень_надежный_пароль_для_бд # Повинен збігатися з POSTGRES_PASSWORD
TTRSS_SELF_URL_PATH: https://ВАШ_ДОМЕН/ # Замініть на ваш домен
TTRSS_FEED_UPDATE_INTERVAL: 15 # Інтервал оновлення стрічок у хвилинах
TTRSS_PLUGINS: auth_internal,bookmarklets,embed_original,fever,force_refresh,mark_read_on_scroll,note,nsfw,open_in_new_window,toggle_sidebar,updater,view_original,youtube
TTRSS_PHP_TZ: Europe/Moscow # Встановіть свій часовий пояс
TTRSS_NO_SMTP_HOSTNAME: "true" # Якщо не використовуєте SMTP для надсилання пошти
TTRSS_LOG_DESTINATION: "stdout"
TTRSS_DEFAULT_UPDATE_DAEMON: "true" # Вмикаємо вбудований демон оновлення
volumes:
- ttrss_data:/var/www/html/feed-icons # Для іконок фідів
- ./config.php:/var/www/html/config.php # Якщо потрібна кастомна конфігурація, але краще через ENV
ports:
- "127.0.0.1:8080:80" # TTRSS буде доступний на хості через порт 8080
volumes:
db_data:
ttrss_data:
Налаштування TTRSS_SELF_URL_PATH, TTRSS_FEED_UPDATE_INTERVAL, TTRSS_PLUGINS та TTRSS_PHP_TZ можна адаптувати під свої потреби.
Збережіть та закрийте файл (Ctrl+O, Enter, Ctrl+X).
2. Запуск сервісів Docker Compose
У каталозі ~/ttrss виконайте:
docker compose up -d # Запускаємо контейнери у фоновому режимі
Перевірте статус контейнерів:
docker compose ps # Перевіряємо, що всі сервіси запущені та здорові (healthy)
3. Налаштування Nginx як зворотного проксі
Створіть новий файл конфігурації Nginx для вашого домену. Замініть ВАШ_ДОМЕН на ваш домен.
sudo nano /etc/nginx/sites-available/ВАШ_ДОМЕН.conf
Вставте наступний вміст:
server {
listen 80;
listen [::]:80;
server_name ВАШ_ДОМЕН; # Замініть на ваш домен
location / {
return 301 https://$host$request_uri; # Перенаправляємо HTTP на HTTPS
}
}
# Цей блок буде налаштований Certbot'ом автоматично після отримання SSL
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name ВАШ_ДОМЕН;
#
# ssl_certificate /etc/letsencrypt/live/ВАШ_ДОМЕН/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/ВАШ_ДОМЕН/privkey.pem;
# ssl_trusted_certificate /etc/letsencrypt/live/ВАШ_ДОМЕН/chain.pem;
#
# # Інші SSL-налаштування для безпеки
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_prefer_server_ciphers off;
# 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_session_cache shared:SSL:10m;
# ssl_session_timeout 1h;
# ssl_session_tickets off;
# ssl_stapling on;
# ssl_stapling_verify on;
# resolver 8.8.8.8 8.8.4.4 valid=300s;
# resolver_timeout 5s;
#
# add_header X-Frame-Options "SAMEORIGIN" always;
# add_header X-Content-Type-Options "nosniff" always;
# add_header X-XSS-Protection "1; mode=block" always;
# add_header Referrer-Policy "no-referrer-when-downgrade" always;
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
#
# location / {
# proxy_pass http://127.0.0.1:8080; # Перенаправляємо на TTRSS контейнер
# proxy_set_header Host $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 $scheme;
# proxy_buffering off;
# proxy_request_buffering off;
# }
#
# # Заборона доступу до прихованих файлів
# location ~ /\.ht {
# deny all;
# }
# }
Створіть символічне посилання на цей файл у sites-enabled та перевірте конфігурацію Nginx:
sudo ln -s /etc/nginx/sites-available/ВАШ_ДОМЕН.conf /etc/nginx/sites-enabled/
sudo nginx -t # Перевіряємо синтаксис конфігу Nginx
Якщо помилок немає, перезапустіть Nginx:
sudo systemctl restart nginx
4. Отримання SSL-сертифіката з Certbot
Тепер отримаємо SSL-сертифікат для вашого домену за допомогою Certbot. Переконайтеся, що ваш домен вже вказує на IP-адресу вашого VPS.
sudo certbot --nginx -d ВАШ_ДОМЕН # Замініть на ваш домен
Дотримуйтесь інструкцій Certbot. Він запитає ваш email для сповіщень та згоду з умовами. Після успішного виконання Certbot автоматично змінить ваш файл конфігурації Nginx, додавши блок server для HTTPS та налаштувавши SSL.
Перевірте, що автоматичне поновлення сертифікатів працює:
sudo certbot renew --dry-run # Тестовий запуск поновлення
Якщо тестовий запуск пройшов успішно, Certbot налаштував cron-завдання для автоматичного поновлення сертифікатів.
5. Перевірка працездатності
Відкрийте у браузері https://ВАШ_ДОМЕН. Ви маєте побачити сторінку входу Tiny Tiny RSS. Логін за замовчуванням: admin, пароль: password. Обов'язково змініть пароль одразу після першого входу!
Всередині TTRSS перейдіть до "Preferences" -> "Feeds" та спробуйте додати кілька RSS-стрічок, щоб переконатися, що вони оновлюються.
Ви також можете перевірити доступність сервісу за допомогою curl з сервера:
curl -I https://127.0.0.1:8080 # Перевіряємо доступ до TTRSS через внутрішній порт
Або, якщо ви хочете перевірити через Nginx (з хоста):
curl -I https://ВАШ_ДОМЕН # Перевіряємо доступ через Nginx та HTTPS
Переконайтеся, що заголовки відповіді показують успішне з'єднання (наприклад, HTTP/2 200).
Резервне копіювання та обслуговування
Регулярне резервне копіювання — критично важлива частина будь-якого продакшн-сервісу. Для Tiny Tiny RSS необхідно створювати резервні копії бази даних та користувацьких даних.
1. Що резервувати
- База даних PostgreSQL: Містить усі ваші стрічки, статті, налаштування, користувачів. Це найважливіша частина.
- Конфігураційні файли TTRSS: Хоча ми використовуємо змінні середовища, якщо ви вносили зміни до
config.phpабо інших файлів, їх потрібно резервувати. - Дані користувачів (feed-icons): Каталог
ttrss_data, куди монтуються іконки стрічок. - Конфігурація Nginx та Certbot: Файли
/etc/nginx/sites-available/ВАШ_ДОМЕН.confта/etc/letsencrypt/.
2. Простий скрипт авторезервування
Створимо простий скрипт, який буде створювати резервні копії бази даних PostgreSQL та важливих файлів.
nano ~/ttrss/backup_ttrss.sh
Вставте наступний вміст, замінивши ВАШ_ДОМЕН на ваш домен та ваш_очень_надежный_пароль_для_бд на пароль від вашої БД:
#!/bin/bash
# --- НАЛАШТУВАННЯ ---
BACKUP_DIR="/var/backups/ttrss"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
DB_CONTAINER="ttrss-db-1" # Ім'я контейнера бази даних (можна переглянути через 'docker ps')
DB_USER="ttrss_user"
DB_NAME="ttrss_db"
DB_PASSWORD="ваш_очень_надежный_пароль_для_бд" # Пароль від БД
# Каталог з даними TTRSS
TTRSS_DATA_DIR="/var/lib/docker/volumes/ttrss_ttrss_data/_data" # Шлях до volume ttrss_data
# Каталог з конфігурацією Nginx та Certbot
NGINX_CONF_DIR="/etc/nginx/sites-available"
LETSENCRYPT_DIR="/etc/letsencrypt"
COMPOSE_FILE_PATH="/home/ваш_пользователь/ttrss/docker-compose.yml" # Шлях до docker-compose.yml
# --- СТВОРЕННЯ КАТАЛОГУ ДЛЯ РЕЗЕРВНИХ КОПІЙ ---
mkdir -p "$BACKUP_DIR"
# --- РЕЗЕРВНЕ КОПІЮВАННЯ БАЗИ ДАНИХ ---
echo "[$TIMESTAMP] Створення резервної копії бази даних PostgreSQL..."
docker exec -e PGPASSWORD="$DB_PASSWORD" "$DB_CONTAINER" pg_dump -U "$DB_USER" -d "$DB_NAME" -Fc > "$BACKUP_DIR/ttrss_db_$TIMESTAMP.dump"
if [ $? -eq 0 ]; then
echo "[$TIMESTAMP] Резервна копія бази даних успішно створена: $BACKUP_DIR/ttrss_db_$TIMESTAMP.dump"
else
echo "[$TIMESTAMP] ПОМИЛКА: Не вдалося створити резервну копію бази даних."
fi
# --- РЕЗЕРВНЕ КОПІЮВАННЯ ДАНИХ TTRSS (feed-icons) ---
echo "[$TIMESTAMP] Копіювання даних TTRSS (feed-icons)..."
tar -czf "$BACKUP_DIR/ttrss_data_$TIMESTAMP.tar.gz" -C "$TTRSS_DATA_DIR" .
if [ $? -eq 0 ]; then
echo "[$TIMESTAMP] Резервна копія даних TTRSS успішно створена: $BACKUP_DIR/ttrss_data_$TIMESTAMP.tar.gz"
else
echo "[$TIMESTAMP] ПОМИЛКА: Не вдалося створити резервну копію даних TTRSS."
fi
# --- РЕЗЕРВНЕ КОПІЮВАННЯ КОНФІГУРАЦІЇ NGINX та Certbot ---
echo "[$TIMESTAMP] Копіювання конфігурації Nginx..."
cp "$NGINX_CONF_DIR/ВАШ_ДОМЕН.conf" "$BACKUP_DIR/nginx_ВАШ_ДОМЕН_conf_$TIMESTAMP"
if [ $? -eq 0 ]; then
echo "[$TIMESTAMP] Резервна копія Nginx успішно створена."
else
echo "[$TIMESTAMP] ПОМИЛКА: Не вдалося створити резервну копію Nginx."
fi
echo "[$TIMESTAMP] Копіювання конфігурації Certbot..."
tar -czf "$BACKUP_DIR/letsencrypt_conf_$TIMESTAMP.tar.gz" -C "$LETSENCRYPT_DIR" .
if [ $? -eq 0 ]; then
echo "[$TIMESTAMP] Резервна копія Certbot успішно створена."
else
echo "[$TIMESTAMP] ПОМИЛКА: Не вдалося створити резервну копію Certbot."
fi
echo "[$TIMESTAMP] Копіювання docker-compose.yml..."
cp "$COMPOSE_FILE_PATH" "$BACKUP_DIR/docker-compose_$TIMESTAMP.yml"
if [ $? -eq 0 ]; then
echo "[$TIMESTAMP] Резервна копія docker-compose.yml успішно створена."
else
echo "[$TIMESTAMP] ПОМИЛКА: Не вдалося створити резервну копію docker-compose.yml."
fi
# --- ОЧИЩЕННЯ СТАРИХ РЕЗЕРВНИХ КОПІЙ (зберігаємо останні 7 днів) ---
echo "[$TIMESTAMP] Видалення старих резервних копій (старших за 7 днів)..."
find "$BACKUP_DIR" -type f -name "*.dump" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name "*.yml" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name "*_conf_*" -mtime +7 -delete
echo "[$TIMESTAMP] Очищення завершено."
echo "[$TIMESTAMP] Процес резервного копіювання завершено."
Зробіть скрипт виконуваним:
chmod +x ~/ttrss/backup_ttrss.sh
3. Налаштування Cron для автоматичного резервного копіювання
Додайте скрипт до розкладу Cron для щоденного виконання:
crontab -e
Додайте наступний рядок в кінець файлу (наприклад, для запуску о 03:00 ночі щодня):
0 3 * * * /home/ваш_пользователь/ttrss/backup_ttrss.sh >> /var/log/ttrss_backup.log 2>&1
Збережіть та закрийте файл. Тепер резервні копії будуть створюватися автоматично.
4. Куди зберігати резервні копії (зовнішнє сховище)
Зберігати резервні копії на тому ж сервері, що й основний сервіс, небезпечно. У разі виходу з ладу сервера ви втратите і сервіс, і резервні копії. Рекомендується використовувати зовнішні сховища:
- S3-сумісне сховище: Хмарні сервіси, такі як AWS S3, Backblaze B2, DigitalOcean Spaces, пропонують надійне та недороге зберігання. Для їх використання можна інтегрувати скрипт з утилітами на кшталт
awscliабоrclone. - Окремий VPS: Ви можете мати невеликий, дешевий VPS, куди за допомогою
rsyncабоscpбудуть копіюватися резервні копії. - Локальний NAS/ПК: Якщо ви хочете зберігати резервні копії вдома, можна налаштувати
rsyncабоscpдля копіювання їх на ваш домашній сервер.
Приклад відправлення резервних копій на інший сервер через rsync (додайте до скрипту після створення архівів):
# --- ВІДПРАВЛЕННЯ РЕЗЕРВНИХ КОПІЙ НА ВІДДАЛЕНИЙ СЕРВЕР ---
REMOTE_USER="backup_user"
REMOTE_HOST="ваш_удаленный_сервер_ip"
REMOTE_PATH="/mnt/backups/ttrss/"
echo "[$TIMESTAMP] Відправлення резервних копій на віддалений сервер $REMOTE_HOST..."
rsync -avz "$BACKUP_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
if [ $? -eq 0 ]; then
echo "[$TIMESTAMP] Резервні копії успішно відправлені на віддалений сервер."
else
echo "[$TIMESTAMP] ПОМИЛКА: Не вдалося відправити резервні копії на віддалений сервер."
fi
Переконайтеся, що на віддаленому сервері налаштована автентифікація за SSH-ключами для користувача backup_user.
5. Оновлення: rolling vs maintenance window
- Оновлення Docker-образів (rolling): Для TTRSS та PostgreSQL, оскільки вони працюють у Docker, оновлення відносно просте. Ви можете виконати
docker compose pullдля завантаження нових образів, а потімdocker compose up -dдля їх розгортання. Це можна робити без значного простою, оскільки Docker вміє gracefully перезапускати контейнери. Рекомендується перевіряти логи після оновлення. - Оновлення системи (maintenance window): Оновлення самої операційної системи (
sudo apt update && sudo apt upgrade -y) краще проводити у заздалегідь визначене "вікно обслуговування", коли навантаження на сервер мінімальне. Це може вимагати перезавантаження сервера, що призведе до короткочасного простою TTRSS.
Для автоматизації оновлення Docker-образів можна використовувати утиліти типу Watchtower, яка відстежує нові версії образів та автоматично оновлює запущені контейнери. Однак, для критично важливих сервісів краще контролювати оновлення вручну або через CI/CD пайплайни.
Вирішення проблем + FAQ
Який VPS-конфіг мінімально підійде?
Для Tiny Tiny RSS на одного-двох користувачів з помірною кількістю стрічок (до 1000) мінімально підійде VPS з 1 ядром CPU, 1 ГБ оперативної пам'яті та 20 ГБ SSD. Цього достатньо для роботи Docker-контейнерів TTRSS, PostgreSQL та Nginx, але без великого запасу. При збільшенні кількості користувачів або стрічок, рекомендується збільшити RAM та дисковий простір.
Що вибрати — VPS чи dedicated для цього завдання?
У переважній більшості випадків для Tiny Tiny RSS на кілька десятків користувачів достатньо VPS. Виділений сервер (dedicated) має сенс лише для дуже великих інсталяцій, що обслуговують сотні або тисячі користувачів, або якщо на сервері працюють інші ресурсоємні сервіси. VPS пропонує кращу гнучкість та економічність для більшості сценаріїв використання TTRSS.
TTRSS недоступний після встановлення, що робити?
Перевірте наступні кроки:
- Переконайтеся, що Docker-контейнери запущені:
docker compose ps. Усі сервіси повинні бути в статусіrunning (healthy). - Перевірте, що Nginx працює:
sudo systemctl status nginx. - Перевірте конфігурацію Nginx:
sudo nginx -t. Переконайтеся, що немає синтаксичних помилок. - Перевірте, що доменне ім'я вказує на ваш VPS: використовуйте
ping ВАШ_ДОМЕНабо онлайн-інструменти DNS-lookup. - Перевірте правила файрволу:
sudo ufw status. Порти 80 та 443 повинні бути дозволені. - Спробуйте отримати доступ до TTRSS безпосередньо через внутрішній порт:
curl -I http://127.0.0.1:8080з сервера. Якщо це працює, проблема в Nginx або Certbot.
Мій SSL-сертифікат закінчився або не був виданий, що робити?
Сертифікати Let's Encrypt діють 90 днів. Certbot повинен автоматично їх продовжувати. Якщо сертифікат закінчився або не був виданий:
- Переконайтеся, що ваш домен коректно вказує на IP-адресу VPS.
- Перевірте конфігурацію Nginx:
sudo nginx -t. Переконайтеся, що Nginx працює на порту 80 і може відповідати на запити Certbot. - Спробуйте оновити сертифікати вручну:
sudo certbot renew --force-renewal. - Перевірте логи Certbot:
sudo tail -f /var/log/letsencrypt/letsencrypt.logна наявність помилок.
Стрічки не оновлюються автоматично, хоча TTRSS працює.
Це може бути пов'язано з тим, що демон оновлення TTRSS не запущений або не має доступу до інтернету:
- Перевірте, що в
docker-compose.ymlвстановлена зміннаTTRSS_DEFAULT_UPDATE_DAEMON: "true". - Переконайтеся, що контейнер TTRSS може отримати доступ до зовнішніх ресурсів. Перевірте логи контейнера:
docker compose logs app. - Всередині TTRSS перейдіть до "Preferences" -> "Feeds" і спробуйте примусово оновити кілька стрічок.
- Перевірте системний час VPS:
date. Неправильний час може викликати проблеми з планувальником.
Docker Compose видає помилки при запуску.
Уважно прочитайте повідомлення про помилку. Часті причини:
- Помилки синтаксису YAML: Переконайтеся, що відступи та структура файлу
docker-compose.ymlкоректні. Використовуйте онлайн-валідатори YAML. - Проблеми з портами: Якщо порт 8080 вже зайнятий на хост-машині іншим сервісом, Docker не зможе його використовувати. Перевірте
sudo lsof -i :8080. - Недостатньо ресурсів: Якщо у вас дуже мало оперативної пам'яті, контейнери можуть не запуститися. Перевірте
docker compose logsдля відповідного сервісу. - Неправильні змінні середовища: Переконайтеся, що паролі та доменні імена в
docker-compose.ymlвказані вірно.
Висновки та наступні кроки
Вітаємо! Ви успішно розгорнули та налаштували свій власний Tiny Tiny RSS сервер на VPS, використовуючи Docker, Nginx та PostgreSQL. Тепер у вас є потужний, приватний та повністю контрольований інструмент для агрегації та читання новинних стрічок. Ви освоїли сучасні підходи до розгортання веб-додатків, включаючи контейнеризацію, безпечне з'єднання через HTTPS та автоматичне резервне копіювання.
Куди рухатися далі?
- Налаштування плагінів: Вивчіть багату екосистему плагінів TTRSS для розширення функціоналу, наприклад, для інтеграції з іншими сервісами, покращення парсингу або додавання нових тем.
- Мобільний доступ: Встановіть один з мобільних додатків, що підтримують TTRSS API (наприклад, FeedMe для Android або TTRSS Reader для iOS), щоб читати стрічки з мобільних пристроїв.
- Моніторинг ресурсів: Встановіть систему моніторингу (наприклад, Prometheus + Grafana або Netdata) для відстеження використання ресурсів вашого VPS та продуктивності TTRSS, щоб бути готовим до масштабування.