-
Notifications
You must be signed in to change notification settings - Fork 0
FAQ EN
中文 · English
Troubleshooting notes, grouped by topic.
- 1. Installation & Deployment Troubleshooting
- 2. Credentials, Cookies & Security
- 3. Download Pipeline & Concurrency
- 4. Library Management, Deduplication & Updates
- 5. Reader, Tags & Client Ecosystem
1. Behind a reverse proxy or across subnets, write operations fail with "Cross-origin request rejected"?
This is GalleryVault's built-in CSRF protection verifying client origin against the host header. When deploying behind external proxies (Nginx, Caddy, Cloudflare), forward the incoming host header and do not strip Origin (e.g. proxy_set_header Host $http_host;). Origin: null (file://, sandboxed iframes) or a cookied API mutation with no Origin and no CSRF token is rejected with 403. Also configure TRUSTED_PROXIES in docker-compose.yml with your proxy CIDR range. See Deployment Guide → Security Hardening.
Adjust the external port mapping for galleryvault-frontend in docker-compose.yml (e.g. "8888:80"). For custom domain names and HTTPS certificates, terminating TLS at an external Nginx or Caddy proxy is recommended.
The official PostgreSQL image relies strictly on container UID 999 (postgres). Never run a blanket chown on ./db-data for normal host users. If accidentally modified, restore ownership on the host: chown -R 999:999 ./db-data.
It does not unpack the whole archive into the library. Scans index image members only. Opening a page decompresses that one file in memory (solid archives are still per-page; earlier members do not count toward the cap). Uncompressed page size is capped at 128MB; oversize pages are refused (404). Non-image files stay packed. .cbr / .rar also need host unrar or libarchive, or the scan fails.
Official postgres:18-alpine stores data under a versioned subdirectory of /var/lib/postgresql. The shipped docker-compose.yml bind-mounts host ./db-data to /var/lib/postgresql. Do not set PGDATA, and do not keep the old mount /var/lib/postgresql/data (a non-empty data directory check will exit the container). Fresh installs just need docker compose up -d. See Deployment → Storage topology.
Yes. This is an intentional security design: changing the password immediately revokes all persisted session credentials across all devices, requiring re-authentication.
Database encryption uses mathematically irreversible AES-256-GCM. A lost key cannot be recovered. Refer to Encryption at Rest → Recovering from a Lost Key for emergency reset procedures.
System probes run at startup and every 30 minutes:
- Cookie expired (red): The session has ended. Go to Settings → ExHentai, supply fresh cookies, and click Test login.
-
No ExHentai access (red): Account lacks required privileges or
igneousis missing. You can switch toe-hentai.org. -
IP banned (red): The site reported an IP ban or temporary block — not a missing
igneous. Change egress or wait. - Probe failed (orange): Network or site error; the Cookie may still be valid. Red-banner states pause cloud sync to prevent local data corruption.
The PostgreSQL database serves as the single source of truth (SSOT) for application settings. Hardcoding secrets in environment files risks silent discrepancies; settings should be maintained in the Web UI, where they are automatically encrypted at rest when ENCRYPTION_KEY is configured.
This occurs when the upstream service applies temporary anti-scraping rate limits. GalleryVault automatically suspends the queue to protect your account. Background probes check every 10 minutes (configurable via GV_CHALLENGE_PROBE_INTERVAL), and the queue resumes automatically once the restriction is lifted.
Never. When an archive download starts, the assigned download URL is cached in local task metadata. Range resumes or error retries reuse this exact URL and never charge GP again.
This indicates transient upstream connectivity issues, slow H@H nodes, or proxy drops. The system automatically retries with exponential backoff (30s up to 6h). Inspect logs using:
docker logs galleryvault-backend --since 6h | grep -E "download task failed|page download failed"-
ReadTimeout: An upstream H@H node stalled; the watchdog drops it. If the page has no node key, HTML is parsed for a replacement node. -
ConnectTimeout/RemoteProtocolError: Proxy link instability. Check proxy node quality or lowerpage_concurrencyin Settings.
Clicking Pause stops claiming new pages or tasks from the pool. Images currently mid-transfer finish their byte stream safely to prevent corrupt files on disk.
No. Removing a path simply excludes it from subsequent scanning sweeps. Already ingested metadata and gallery records remain intact in the database.
- If deleted without checking "Delete files from disk", the gallery moves to the Recycle Bin and can be restored with a single click.
- If disk purge is checked: the row is staged in the Recycle Bin first and removed from the index only after every on-disk copy is gone. A failed disk delete leaves the gallery in the Recycle Bin (the record is not dropped while files remain). If any copy sits outside the scan-root whitelist, the whole gallery is skipped and no sibling files are deleted.
- Read-only mounts keep the DB row and surface a toast plus a log line.
Once the newly assigned GID is fully downloaded into the library, clicking Scan now deletes the obsolete local archive and dismisses the update record. If marked as "Ignored", it remains unchanged.
Different translation groups or quality variants of the same artwork often carry distinct GIDs online. Cross-GID deduplication clusters these works together locally, allowing you to easily identify duplicates, select the best version, and purge redundant copies.
-
Root Cause: Linux ext4 and most modern filesystems impose a strict 255-byte limit per filename component. Multi-byte CJK characters consume 3 bytes each in UTF-8. Legacy character-based truncation often overflowed 255 bytes when saving long titles or appending temporary suffixes like
.cbz.partial, triggering operating system[Errno 36] File name too longexceptions. -
Current Standard: GalleryVault enforces a 243-byte truncation standard on base filenames (leaving 12 bytes for the
.cbz.partialstaging suffix, ensuring the total length never exceeds 255 bytes). Directory names are clamped to 247 bytes. -
Fixing existing archives:
scripts/repair_cbz_filenames.pylives in the git repo root and is not copied into the backend image. On a host with a full clone:Inside the container, usepython scripts/repair_cbz_filenames.py --target-dir /path/to/archive --dry-run python scripts/repair_cbz_filenames.py --target-dir /path/to/archive
repair_cold_archives.py(next item) for sidecar/GID cleanup.
-
Cause: Exports from third-party tools or repeated multi-hop migrations can introduce redundant leading GID prefixes into directory names or cold archive CBZ files (e.g.
[12345] 12345-Titleor12345-12345-Title), causing malformed title indexing or polluted archive indices. -
Remediation: The repository provides an offline batch repair tool
backend/galleryvault/scripts/repair_cold_archives.py. Supporting a--dry-runsafety flag, it strips redundant leading GIDs from directory and CBZ names, cleans up nested GID patterns, and queries the upstream GData API in batch chunks to re-verify and sanitize metadata (see Backup & Restore → Offline Full Repair & Metadata Sanitization Tools).
-
Configuration: In Settings → Library → Cold archive roots, enter multiple mount paths (one path per line, e.g.,
/archive1and/archive2). -
Dynamic Load Balancing: When cold archiving is triggered, the backend checks free space on every configured root via
statvfsand writes the new CBZ to the volume with the most free space (and enough headroom). A volume is capped at 500 pages and 2GiB; larger galleries become a cold directory.
- Open Manage → Integrity (
#/integrity) and click Scan missing pages & corrupt images. - The scan checks image magic headers (JPEG / PNG / GIF / WebP) and 4/8-digit zero-padded names; it does not unpack whole archives into the library.
- Review the red list, then Repair or Select all and repair. Only missing or corrupt pages are re-downloaded, keeping the original quality tier.
Tag translations come from EhTagTranslation/Database. Unknown tags stay in the original language. Click Update now under Settings → Tags. Progress shows on Logs; the button is not on the Logs page.
Yes. The reader preserves search filter contexts. Navigating through pages and returning to the library retains all active multi-tag filters, sorting criteria, and scroll positions.
GalleryVault provides a standard OPDS catalog endpoint at GET /api/opds. Add the OPDS feed in your reader client using HTTP Basic authentication (username: galleryvault, password: your administrator web password).
No. The PWA caches the web interface shell and static assets only to deliver app-like responsiveness. Galleries and images stream on demand to avoid filling mobile storage.
Fill in the token / chat ID / allowed user IDs under Settings → Telegram. Startup then registers the client command menu. Paste a gallery URL in chat to enqueue; /queue uses InlineKeyboard; /status /storage /quota /cookie probe the system; /search /info /random query the local library (covers included). Full command table: Settings → Telegram bot control commands.