Создание платного веб‑архива позволяет пользователям сохранять важные онлайн‑ресурсы, а владельцу сервиса получать доход․ Ниже описан процесс построения такого решения на основе открытого инструмента ArchiveBox и интеграции платёжных систем․
Выбор и подготовка технологической базы
- ArchiveBox – открытый self‑hosted веб‑архиватор, поддерживающий CLI, веб‑интерфейс и простой формат хранения на диске․
- Сервер (VPS или выделенный) с ОС Linux (Ubuntu 22․04 LTS рекомендуется)․
- База данных SQLite (по умолчанию) либо PostgreSQL для больших нагрузок․
- Объектное хранилище для больших файлов (например, AWS S3, Wasabi или локальный
/var/archivebox)․ - Платёжный шлюз – Stripe, PayPal или ЮMoney (для российского рынка)․
- Веб‑фреймворк для личного кабинета (можно использовать простой Flask/Django или готовый панель‑админ ArchiveBox)․
Установка ArchiveBox
# Обновляем систему
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv git curl
git clone https://github․com/ArchiveBox/ArchiveBox․git
cd ArchiveBox
python3 -m venv venv
source venv/bin/activate
pip install -r requirements․txt
archivebox init --setup
После инициализации в каталоге появится файл archivebox․conf – его можно отредактировать, указав путь к хранилищу и включив режим SINGLE_USER_MODE=false для многопользовательского доступа․
Организация доступа и аутентификации
Для платного сервиса необходима регистрация пользователей и проверка оплаты․ Самый простой путь – использовать встроенную поддержку Django admin (ArchiveBox основан на Django)․
- Запустите миграции:
archivebox manage migrate - Создайте суперпользователя:
archivebox manage createsuperuser - В админ‑панели (
/admin) добавьте группы free и premium․ - Настройте middleware, который будет проверять статус подписки перед допуском к функции
archivebox add․
Интеграция платёжного шлюза
Ниже пример интеграции Stripe через простой веб‑хук․
Установка библиотеки Stripe
pip install stripe
Создание эндпоинта для создания сеанса оплаты
# views․py (добавьте в ваш Django‑проект ArchiveBox)
import stripe, json
from django․conf import settings
from django․http import JsonResponse
from django․views․decorators․csrf import csrf_exempt
stripe․api_key = settings․STRIPE_SECRET_KEY
@csrf_exempt
def create_checkout_session(request):
if request․method == 'POST':
data = json․loads(request․body)
plan = data․get('plan') # например, 'monthly' или 'yearly'
price_id = settings․STRIPE_PRICES․get(plan)
session = stripe․checkout․Session․create(
payment_method_types=['card'],
line_items=[{'price': price_id, 'quantity': 1}],
mode='subscription',
success_url='https://yourdomain․com/success?session_id={CHECKOUT_SESSION_ID}',
cancel_url='https://yourdomain․com/cancel',
) return JsonResponse({'id': session․id})
Обработка веб‑хука Stripe
@csrf_exempt
def stripe_webhook(request):
payload = request․body
sig_header = request․META['HTTP_STRIPE_SIGNATURE']
event = None
try:
event = stripe․Webhook․construct_event(
payload, sig_header, settings․STRIPE_WEBHOOK_SECRET
)
except ValueError as e:
return HttpResponse(status=400)
except stripe․error․SignatureVerificationError as e:
return HttpResponse(status=400)
# Обработка события успешной оплаты
if event['type'] == 'checkout․session․completed':
session = event['data']['object']
user_id = session['metadata']['user_id']
plan = session['metadata']['plan']
# Здесь обновляем статус пользователя в БД (премиум на месяц/год)
# Например: User․objects․filter(id=user_id)․update(is_premium=True, plan=plan, expires_at=․․․)
return HttpResponse(status=200)
Не забудьте добавить URL‑маршруты для create_checkout_session и stripe_webhook в urls․py и указать переменные окружения STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET и словарь STRIPE_PRICES с ID цен из вашего Stripe‑дашборда․
Автоматизация архивации по запросу пользователя
После успешной оплаты пользователь может отправлять URL для архивации через веб‑форму или API․
Простая форма добавления
<form id="archive-form">
<label>URL для архивации:</label><br>
<input type="url" name="url" required><br>
<button type="submit">Архивировать</button>
</form>
<script>
document․getElementById('archive-form')․addEventListener('submit', function(e){
e․preventDefault;
const url = this․elements․url․value;
fetch('/api/archive/', {
method: 'POST',
headers: {'Content-Type': 'application/json', 'X-CSRFToken': getCookie('csrftoken')},
body: JSON․stringify({url: url})
})․then(r => r․json)․then(data => {
alert('Архивация запущена: ' + data․task_id);
});
});
</script>
API‑эндпоинт, вызывающий ArchiveBox
# views․py
from django․http import JsonResponse
from django․views․decorators․http import require_POST
from django․contrib․auth․decorators import login_required
import subprocess, json, os
@login_required
@require_POST
def api_archive(request):
data = json․loads(request․body)
url = data․get('url')
if not url:
return JsonResponse({'error': 'URL required'}, status=400)
# Проверяем подписку
if not request․user․is_premium:
return JsonResponse({'error': 'Subscription required'}, status=403)
# Запускаем archivebox add в фоне
cmd = ['archivebox', 'add', url, '--depth', '0']
subprocess․Popen(cmd, cwd=settings․ARCHIVEBOX_DIR)
return JsonResponse({'task_id': os․path․getmtime(settings․ARCHIVEBOX_DIR)})
Для продакшена лучше использовать очередь задач (Celery + Redis/RabbitMQ), чтобы не блокировать веб‑процесс․
Хранение и резервное копирование
- Архивы хранятся в каталоге
ARCHIVEBOX_DIR(по умолчанию~/ArchiveBox)․ - Настройте синхронизацию с объектным хранилищем (например,
rclone sync ~/ArchiveBox s3://my-archive-bucket) ежедневно через cron․ - Включите версионирование в бакете S3, чтобы защититься от случайного удаления․
- Регулярно делайте дамп базы данных:
pg_dump archivebox > archivebox_$(date +%F)․sql․
Ценообразование и монетизация
Примерная модель:
- Бесплатный тариф – 5 URL в месяц, ограниченная глубина архивации (0‑1 уровень)․
- Премиум – месячный – $4․99 за неограниченное количество URL, глубина до 3 уровней, доступ к PDF‑ и медиа‑файлам․
- Премиум – годовой – $49;99 (экономия ~17 %)․
- Дополнительные услуги: индивидуальное S3‑хранилище (+$0․023/ГБ/мес), API‑доступ (+$9․99/мес)․
Расчёт стоимости за байт можно выполнить, зная средний размер архивированной страницы (≈ 150 КБ) и ежемесячный трафик․ При 10 000 страниц/мес → ~1,5 ГБ данных․ Стоимость хранения в S3 ≈ $0․023/ГБ → ~$0․035/мес, что делает основную часть дохода формирующейся от подписки, а не от хранения․
Юридические аспекты
- Убедитесь, что у вас есть право архивировать указанные URL (соблюдайте robots․txt и условия использования сайтов)․
- Включите в пользовательское соглашение пункт о запрете архивирования контента, защищённого авторским правом без разрешения правообладателя․
- При работе с персональными данными (например, архивация форм с ПИД) соблюдайте GDPR/ФЗ‑152․
- Храните логи платежей и доступа минимум 6 месяцев для возможных аудитов․
Тестирование и запуск
- Запустите ArchiveBox в режиме отладки:
archivebox server --debug --bind 0․0․0․0:8000․ - Проверьте регистрацию, оплату через тестовый режим Stripe (
sk_test_…)․ - Загрузите несколько тестовых URL, убедитесь, что архивы появляются в каталоге и доступны через веб‑интерфейс․
- Переведите продакшен‑ключи, включите HTTPS (Let’s Encrypt) и настройте автоматический перезапуск через systemd или Docker․
Создание платного веб‑архива на базе ArchiveBox, реализуемая задача, которая сочетает открытый архиватор, гибкую систему подписок и надёжное хранение данных․ Следуя представленным шагам, вы получите сервис, позволяющий пользователям сохранять важные онлайн‑ресурсы, а вам — стабильный источник дохода․
Удачной реализации!