You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| 🔄 **Resilio Sync**| A fast, reliable, and simple file sync and share solution. |[Details](services/resilio-sync)|
96
96
| 🗂️ **Stirling-PDF**| A web application for managing and editing PDF files. |[Details](services/stirlingpdf)|
97
+
| 📄 **BentoPDF**| A lightweight, self-hosted web app for viewing and managing PDF documents. |[Details](services/bentopdf)|
97
98
| 🏦 **Subtrackr**| A self-hosted web app to track subscriptions, renewal dates, costs, and payment methods. |[Details](services/subtrackr)|
98
99
| 🗃️ **Vaultwarden**| An unofficial Bitwarden server implementation written in Rust. |[Details](services/vaultwarden)|
99
100
| 💸 **Wallos**| An open-source, self-hostable web app to track and manage your recurring subscriptions and expenses, with multi-currency support, customizable categories, and statistics. |[Details](services/wallos)|
@@ -139,14 +140,14 @@ If you would like to add your own config, you can use the [service-template](tem
This Docker Compose configuration sets up **BentoPDF** with a Tailscale sidecar container, enabling secure access to your self-hosted PDF management interface over your private Tailscale network. With this setup, your BentoPDF instance remains **private and accessible only from authorized devices on your Tailnet**, keeping your documents protected from public exposure.
4
+
5
+
## BentoPDF
6
+
7
+
[**BentoPDF**](https://github.com/alam00000/bentopdf) is an open-source, self-hosted web application for **viewing, organizing, and managing PDF documents**. It provides a clean, modern interface focused on simplicity and performance, making it ideal for personal document libraries, internal teams, or homelab environments that require private document access.
8
+
9
+
## Key Features
10
+
11
+
- 📄 **In-Browser PDF Viewer** – View PDF files directly from a modern web interface.
12
+
- 🗂 **Document Organization** – Browse and manage PDFs stored on your server.
13
+
- 🔍 **Fast & Lightweight** – Minimal overhead with a focus on performance.
14
+
- 🧭 **Clean, Minimal UI** – Simple and distraction-free user experience.
15
+
- 🐳 **Docker-Friendly** – Designed to run easily in containerized environments.
16
+
- 🔐 **Privacy-First** – Your documents stay entirely on your own infrastructure.
17
+
- 📦 **Open Source** – Fully open-source and self-hostable.
18
+
19
+
## Why Self-Host?
20
+
21
+
PDF files often contain sensitive personal or business information. Self-hosting BentoPDF ensures **full control and ownership of your documents**, without relying on third-party cloud storage or services. Combined with Tailscale, BentoPDF becomes a private document portal that is securely accessible from anywhere while remaining invisible to the public internet.
22
+
23
+
## Configuration Overview
24
+
25
+
In this deployment, a **Tailscale sidecar container** (for example `tailscale-bentopdf`) runs the Tailscale client and joins your private Tailscale network. The main `bentopdf` service uses:
26
+
27
+
```plain
28
+
network_mode: service:tailscale-bentopdf
29
+
```
30
+
31
+
This configuration routes all traffic through the Tailscale interface, ensuring that the BentoPDF web UI is accessible **only via your Tailscale network**. This provides a simple and secure way to access your PDF library from all trusted devices.
# Make sure you have updated/checked the .env file with the correct variables.
3
+
# All the ${ xx } need to be defined there.
4
+
# Tailscale Sidecar Configuration
5
+
tailscale:
6
+
image: tailscale/tailscale:latest # Image to be used
7
+
container_name: tailscale-${SERVICE} # Name for local container management
8
+
hostname: ${SERVICE} # Name used within your Tailscale environment
9
+
environment:
10
+
- TS_AUTHKEY=${TS_AUTHKEY}
11
+
- TS_STATE_DIR=/var/lib/tailscale
12
+
- TS_SERVE_CONFIG=/config/serve.json # Tailscale Serve configuration to expose the web interface on your local Tailnet - remove this line if not required
- TS_LOCAL_ADDR_PORT=127.0.0.1:41234 # The <addr>:<port> for the healthz endpoint
16
+
#- TS_ACCEPT_DNS=true # Uncomment when using MagicDNS
17
+
volumes:
18
+
- ./config:/config # Config folder used to store Tailscale files - you may need to change the path
19
+
- ./ts/state:/var/lib/tailscale # Tailscale requirement - you may need to change the path
20
+
devices:
21
+
- /dev/net/tun:/dev/net/tun # Network configuration for Tailscale to work
22
+
cap_add:
23
+
- net_admin # Tailscale requirement
24
+
#ports:
25
+
# - 0.0.0.0:${SERVICEPORT}:${SERVICEPORT} # Binding port ${SERVICE}PORT to the local network - may be removed if only exposure to your Tailnet is required
26
+
# If any DNS issues arise, use your preferred DNS provider by uncommenting the config below
27
+
#dns:
28
+
# - ${DNS_SERVER}
29
+
healthcheck:
30
+
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:41234/healthz"] # Check Tailscale has a Tailnet IP and is operational
31
+
interval: 1m# How often to perform the check
32
+
timeout: 10s# Time to wait for the check to succeed
33
+
retries: 3# Number of retries before marking as unhealthy
34
+
start_period: 10s# Time to wait before starting health checks
35
+
restart: always
36
+
37
+
# ${SERVICE}
38
+
application:
39
+
image: ${IMAGE_URL} # Image to be used
40
+
network_mode: service:tailscale # Sidecar configuration to route ${SERVICE} through Tailscale
41
+
container_name: app-${SERVICE} # Name for local container management
42
+
environment:
43
+
- PUID=1000
44
+
- PGID=1000
45
+
- TZ=Europe/Amsterdam
46
+
volumes:
47
+
- ./${SERVICE}-data/app/config:/config
48
+
depends_on:
49
+
tailscale:
50
+
condition: service_healthy
51
+
healthcheck:
52
+
test: ["CMD", "pgrep", "-f", "${SERVICE}"] # Check if ${SERVICE} process is running
53
+
interval: 1m# How often to perform the check
54
+
timeout: 10s# Time to wait for the check to succeed
55
+
retries: 3# Number of retries before marking as unhealthy
56
+
start_period: 30s# Time to wait before starting health checks
0 commit comments