Add export database button to settings

This commit is contained in:
Joakim Hellsén 2026-07-18 07:34:35 +02:00
commit f40773e013
Signed by: Joakim Hellsén
SSH key fingerprint: SHA256:/9h/CsExpFp+PRhsfA0xznFx2CGfTT5R/kpuFfUgEQk
2 changed files with 41 additions and 0 deletions

View file

@ -4,6 +4,7 @@ import json
import logging import logging
import logging.config import logging.config
import re import re
import tempfile
import typing import typing
import urllib.parse import urllib.parse
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
@ -42,6 +43,7 @@ from reader import Reader
from reader import ReaderError from reader import ReaderError
from reader import TagNotFoundError from reader import TagNotFoundError
from starlette.responses import RedirectResponse from starlette.responses import RedirectResponse
from starlette.responses import Response as StarletteResponse
from discord_rss_bot.custom_filters import entry_is_blacklisted from discord_rss_bot.custom_filters import entry_is_blacklisted
from discord_rss_bot.custom_filters import entry_is_whitelisted from discord_rss_bot.custom_filters import entry_is_whitelisted
@ -2391,6 +2393,33 @@ async def update_feed(
return RedirectResponse(url="/feed?feed_url=" + urllib.parse.quote(feed_url), status_code=303) return RedirectResponse(url="/feed?feed_url=" + urllib.parse.quote(feed_url), status_code=303)
@app.get("/export")
def export_database(
reader: Annotated[Reader, Depends(get_reader_dependency)],
) -> StarletteResponse:
"""Export the entire database as a compressed SQLite file.
Args:
reader: The Reader instance.
Returns:
StarletteResponse: The exported database file for download.
"""
with tempfile.TemporaryDirectory() as tmpdir:
export_path: Path = reader._storage.export(tmpdir, "discord-rss-bot-export") # ruff:ignore[private-member-access]
filename: str = export_path.name
file_bytes: bytes = export_path.read_bytes()
return StarletteResponse(
content=file_bytes,
status_code=200,
headers={
"Content-Type": "application/gzip",
"Content-Disposition": f'attachment; filename="{filename}"',
},
)
@app.post("/backup") @app.post("/backup")
async def manual_backup( async def manual_backup(
request: Request, request: Request,

View file

@ -109,6 +109,18 @@
</div> </div>
</form> </form>
</section> </section>
<section class="mt-5">
<div class="text-light">
<div class="d-flex flex-wrap justify-content-between align-items-center gap-2">
<h2 class="mb-0">Export Database</h2>
</div>
<p class="text-muted mt-2 mb-4">
Download a copy of the entire database for backup or migration.
The file is a compressed SQLite dump containing all feeds, entries, and settings.
</p>
<a href="/export" class="btn btn-primary px-4" role="button">Download Export</a>
</div>
</section>
<section class="mt-5"> <section class="mt-5">
<div class="text-light"> <div class="text-light">
<div class="d-flex flex-wrap justify-content-between align-items-center gap-2"> <div class="d-flex flex-wrap justify-content-between align-items-center gap-2">