chore: migrate Docker Hub to bentopdfteam, add Podman/Quadlet support

- Migrate Docker Hub account from bentopdf to bentopdfteam
- Make GHCR the recommended container registry
- Add Podman and Podman Compose support
- Add Podman Quadlet (systemd) documentation
- Add Table of Contents to README
This commit is contained in:
alam00000
2026-01-26 13:34:50 +05:30
parent 21b9b58610
commit b059ac6ada
9 changed files with 448 additions and 132 deletions

View File

@@ -109,7 +109,7 @@ jobs:
build-args: | build-args: |
SIMPLE_MODE=${{ matrix.mode.simple_mode }} SIMPLE_MODE=${{ matrix.mode.simple_mode }}
tags: | tags: |
bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64
ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64
platforms: linux/amd64 platforms: linux/amd64
cache-from: type=gha,scope=amd64-${{ matrix.mode.name }} cache-from: type=gha,scope=amd64-${{ matrix.mode.name }}
@@ -123,7 +123,7 @@ jobs:
build-args: | build-args: |
SIMPLE_MODE=${{ matrix.mode.simple_mode }} SIMPLE_MODE=${{ matrix.mode.simple_mode }}
tags: | tags: |
bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-amd64 bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-amd64
ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge-amd64 ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge-amd64
platforms: linux/amd64 platforms: linux/amd64
cache-from: type=gha,scope=amd64-${{ matrix.mode.name }} cache-from: type=gha,scope=amd64-${{ matrix.mode.name }}
@@ -186,7 +186,7 @@ jobs:
build-args: | build-args: |
SIMPLE_MODE=${{ matrix.mode.simple_mode }} SIMPLE_MODE=${{ matrix.mode.simple_mode }}
tags: | tags: |
bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
platforms: linux/arm64 platforms: linux/arm64
cache-from: type=gha,scope=arm64-${{ matrix.mode.name }} cache-from: type=gha,scope=arm64-${{ matrix.mode.name }}
@@ -200,7 +200,7 @@ jobs:
build-args: | build-args: |
SIMPLE_MODE=${{ matrix.mode.simple_mode }} SIMPLE_MODE=${{ matrix.mode.simple_mode }}
tags: | tags: |
bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-arm64 bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-arm64
ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge-arm64 ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge-arm64
platforms: linux/arm64 platforms: linux/arm64
cache-from: type=gha,scope=arm64-${{ matrix.mode.name }} cache-from: type=gha,scope=arm64-${{ matrix.mode.name }}
@@ -253,17 +253,17 @@ jobs:
if: steps.version.outputs.is_release == 'true' if: steps.version.outputs.is_release == 'true'
run: | run: |
# DockerHub manifests # DockerHub manifests
docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:latest \ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:latest \
bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \
bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }} \ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }} \
bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \
bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version_without_v }} \ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version_without_v }} \
bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \
bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
# GHCR manifests # GHCR manifests
docker buildx imagetools create -t ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:latest \ docker buildx imagetools create -t ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:latest \
@@ -282,13 +282,13 @@ jobs:
if: steps.version.outputs.is_release == 'false' if: steps.version.outputs.is_release == 'false'
run: | run: |
# DockerHub manifests # DockerHub manifests
docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:edge \ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge \
bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \
bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-arm64 bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-arm64
docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:sha-${{ steps.version.outputs.short_sha }} \ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:sha-${{ steps.version.outputs.short_sha }} \
bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \
bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-arm64 bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-arm64
# GHCR manifests # GHCR manifests
docker buildx imagetools create -t ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge \ docker buildx imagetools create -t ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge \

138
README.md
View File

@@ -3,13 +3,47 @@
**BentoPDF** is a powerful, privacy-first, client-side PDF toolkit that is self hostable and allows you to manipulate, edit, merge, and process PDF files directly in your browser. No server-side processing is required, ensuring your files remain secure and private. **BentoPDF** is a powerful, privacy-first, client-side PDF toolkit that is self hostable and allows you to manipulate, edit, merge, and process PDF files directly in your browser. No server-side processing is required, ensuring your files remain secure and private.
![Docker Pulls](https://img.shields.io/docker/pulls/bentopdf/bentopdf) [![Ko-fi](https://img.shields.io/badge/Buy%20me%20a%20Coffee-yellow?logo=kofi&style=flat-square)](https://ko-fi.com/alio01) ![GitHub Stars](https://img.shields.io/github/stars/alam00000/bentopdf?style=social) ![Docker Pulls](https://img.shields.io/docker/pulls/bentopdfteam/bentopdf) [![Ko-fi](https://img.shields.io/badge/Buy%20me%20a%20Coffee-yellow?logo=kofi&style=flat-square)](https://ko-fi.com/alio01) ![GitHub Stars](https://img.shields.io/github/stars/alam00000/bentopdf?style=social)
[![Sponsor me on GitHub](https://img.shields.io/badge/Sponsor-%E2%9D%A4-ff69b4)](https://github.com/sponsors/alam00000) [![Sponsor me on GitHub](https://img.shields.io/badge/Sponsor-%E2%9D%A4-ff69b4)](https://github.com/sponsors/alam00000)
![BentoPDF Tools](public/images/bentopdf-tools.png) ![BentoPDF Tools](public/images/bentopdf-tools.png)
--- ---
## Table of Contents
- [Join Us on Discord](#-join-us-on-discord)
- [Documentation](#-documentation)
- [Licensing](#-licensing)
- [Stargazers over time](#-stargazers-over-time)
- [Thank You to Our Sponsors](#-thank-you-to-our-sponsors)
- [Why BentoPDF?](#-why-bentopdf)
- [Features / Tools Supported](#-features--tools-supported)
- [Organize & Manage PDFs](#organize--manage-pdfs)
- [Edit & Modify PDFs](#edit--modify-pdfs)
- [Convert to PDF](#convert-to-pdf)
- [Convert from PDF](#convert-from-pdf)
- [Secure & Optimize PDFs](#secure--optimize-pdfs)
- [Translations](#-translations)
- [Getting Started](#-getting-started)
- [Prerequisites](#prerequisites)
- [Quick Start](#-quick-start)
- [Static Hosting](#static-hosting-using-netlify-vercel-and-github-pages)
- [Self-Hosting Locally](#-self-hosting-locally)
- [Docker Compose / Podman Compose](#-run-with-docker-compose--podman-compose-recommended)
- [Podman Quadlet](#-podman-quadlet-systemd-integration)
- [Simple Mode](#-simple-mode-for-internal-use)
- [Security Features](#-security-features)
- [Digital Signature CORS Proxy](#digital-signature-cors-proxy-required)
- [Version Management](#-version-management)
- [Development Setup](#-development-setup)
- [Tech Stack & Background](#-tech-stack--background)
- [Roadmap](#-roadmap)
- [Contributing](#-contributing)
- [Special Thanks](#special-thanks)
---
## 📢 Join Us on Discord ## 📢 Join Us on Discord
[![Discord](https://img.shields.io/badge/Discord-Join%20Server-7289da?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/Bgq3Ay3f2w) [![Discord](https://img.shields.io/badge/Discord-Join%20Server-7289da?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/Bgq3Ay3f2w)
@@ -247,22 +281,9 @@ You can run BentoPDF locally for development or personal use.
- [npm](https://www.npmjs.com/) (or yarn/pnpm) - [npm](https://www.npmjs.com/) (or yarn/pnpm)
- [Docker](https://www.docker.com/) & [Docker Compose](https://docs.docker.com/compose/install/) (for containerized setup) - [Docker](https://www.docker.com/) & [Docker Compose](https://docs.docker.com/compose/install/) (for containerized setup)
### 🚀 Quick Start with Docker ### 🚀 Quick Start
[![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/K4AU2B) Run BentoPDF instantly from GitHub Container Registry (Recommended):
You can run BentoPDF directly from Docker Hub or GitHub Container Registry without cloning the repository:
You can also watch the video on how to set it up 👉
[BentoPDF Docker Setup](https://drive.google.com/file/d/1C4eJ2nqeaH__1Tlad-xuBHaF2Ha4fSBf/view?usp=drive_link)
**Using Docker Hub:**
```bash
docker run -p 3000:8080 bentopdf/bentopdf:latest
```
**Using GitHub Container Registry:**
```bash ```bash
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
@@ -270,11 +291,34 @@ docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
Open your browser at: http://localhost:3000 Open your browser at: http://localhost:3000
This is the fastest way to try BentoPDF without setting up a development environment. <details>
<summary><b>Alternative: Using Docker Hub or Podman</b></summary>
**Docker Hub:**
```bash
docker run -p 3000:8080 bentopdfteam/bentopdf:latest
```
**Podman (GHCR):**
```bash
podman run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
```
**Podman (Docker Hub):**
```bash
podman run -p 3000:8080 docker.io/bentopdfteam/bentopdf:latest
```
> **Note:** All `docker` commands in this documentation work with Podman by replacing `docker` with `podman`.
</details>
### Static Hosting using Netlify, Vercel, and GitHub Pages ### Static Hosting using Netlify, Vercel, and GitHub Pages
It is very straightforward to host your own instance of BentoPDF using a static web page hosting service. Plus, services such as Netlify, Vercel, and GitHub Pages all offer a free tier for getting started. See [Static Hosting](https://github.com/alam00000/bentopdf/blob/main/STATIC-HOSTING.md)) for details. It is very straightforward to host your own instance of BentoPDF using a static web page hosting service. Plus, services such as Netlify, Vercel, and GitHub Pages all offer a free tier for getting started. See [Static Hosting](https://github.com/alam00000/bentopdf/blob/main/STATIC-HOSTING.md) for details.
### 🏠 Self-Hosting Locally ### 🏠 Self-Hosting Locally
@@ -431,7 +475,7 @@ docker run -p 3000:8080 bentopdf-simple
> - Always include trailing slashes in `BASE_URL` (e.g., `/bentopdf/` not `/bentopdf`) > - Always include trailing slashes in `BASE_URL` (e.g., `/bentopdf/` not `/bentopdf`)
> - The default value is `/` for root deployment > - The default value is `/` for root deployment
### 🚀 Run with Docker Compose (Recommended) ### 🚀 Run with Docker Compose / Podman Compose (Recommended)
For a more robust setup with auto-restart capabilities: For a more robust setup with auto-restart capabilities:
@@ -440,7 +484,8 @@ For a more robust setup with auto-restart capabilities:
```yaml ```yaml
services: services:
bentopdf: bentopdf:
image: bentopdf/bentopdf:latest image: ghcr.io/alam00000/bentopdf:latest # Recommended
# image: bentopdfteam/bentopdf:latest # Alternative: Docker Hub
container_name: bentopdf container_name: bentopdf
ports: ports:
- '3000:8080' - '3000:8080'
@@ -450,11 +495,48 @@ services:
2. **Start the application**: 2. **Start the application**:
```bash ```bash
# Docker Compose
docker-compose up -d docker-compose up -d
# Podman Compose
podman-compose up -d
``` ```
The application will be available at `http://localhost:3000`. The application will be available at `http://localhost:3000`.
### 🐧 Podman Quadlet (Systemd Integration)
For Linux production deployments, you can run BentoPDF as a systemd service using [Podman Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html).
Create `~/.config/containers/systemd/bentopdf.container`:
```ini
[Unit]
Description=BentoPDF - Privacy-first PDF toolkit
After=network-online.target
[Container]
Image=ghcr.io/alam00000/bentopdf:latest
ContainerName=bentopdf
PublishPort=3000:8080
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.target
```
Then enable and start:
```bash
systemctl --user daemon-reload
systemctl --user enable --now bentopdf
```
For detailed Quadlet configuration, see [Self-Hosting Docker Guide](https://bentopdf.com/docs/self-hosting/docker).
### 🏢 Simple Mode for Internal Use ### 🏢 Simple Mode for Internal Use
For organizations that want a clean, distraction-free interface focused solely on PDF tools, BentoPDF supports a **Simple Mode** that hides all branding and marketing content. For organizations that want a clean, distraction-free interface focused solely on PDF tools, BentoPDF supports a **Simple Mode** that hides all branding and marketing content.
@@ -574,20 +656,20 @@ VITE_CORS_PROXY_SECRET=your-secret npm run build
### 📦 Version Management ### 📦 Version Management
BentoPDF supports semantic versioning with multiple Docker tags available on both Docker Hub and GitHub Container Registry: BentoPDF supports semantic versioning with multiple container tags available:
**Docker Hub:** **GitHub Container Registry (Recommended):**
- **Latest**: `bentopdf/bentopdf:latest`
- **Specific Version**: `bentopdf/bentopdf:1.0.0`
- **Version with Prefix**: `bentopdf/bentopdf:v1.0.0`
**GitHub Container Registry:**
- **Latest**: `ghcr.io/alam00000/bentopdf:latest` - **Latest**: `ghcr.io/alam00000/bentopdf:latest`
- **Specific Version**: `ghcr.io/alam00000/bentopdf:1.0.0` - **Specific Version**: `ghcr.io/alam00000/bentopdf:1.0.0`
- **Version with Prefix**: `ghcr.io/alam00000/bentopdf:v1.0.0` - **Version with Prefix**: `ghcr.io/alam00000/bentopdf:v1.0.0`
**Docker Hub:**
- **Latest**: `bentopdfteam/bentopdf:latest`
- **Specific Version**: `bentopdfteam/bentopdf:1.0.0`
- **Version with Prefix**: `bentopdfteam/bentopdf:v1.0.0`
#### Quick Release #### Quick Release
```bash ```bash

View File

@@ -215,16 +215,16 @@ git reset --hard HEAD~1
1. **GitHub Actions Triggered**: Workflow starts building Docker image 1. **GitHub Actions Triggered**: Workflow starts building Docker image
2. **Docker Build**: Multi-architecture image created 2. **Docker Build**: Multi-architecture image created
3. **Docker Push**: Images pushed to Docker Hub with tags: 3. **Docker Push**: Images pushed to Docker Hub with tags:
- `bentopdf/bentopdf:latest` - `bentopdfteam/bentopdf:latest`
- `bentopdf/bentopdf:1.0.1` - `bentopdfteam/bentopdf:1.0.1`
- `bentopdf/bentopdf:v1.0.1` - `bentopdfteam/bentopdf:v1.0.1`
### **End Result:** ### **End Result:**
Users can immediately pull your new version: Users can immediately pull your new version:
```bash ```bash
docker pull bentopdf/bentopdf:1.0.1 docker pull bentopdfteam/bentopdf:1.0.1
``` ```
--- ---

View File

@@ -23,27 +23,35 @@ When enabled, Simple Mode will:
Use the pre-built Simple Mode image directly: Use the pre-built Simple Mode image directly:
**Using GitHub Container Registry (Recommended):**
```bash
# Docker
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
# Podman
podman run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
```
**Using Docker Hub:** **Using Docker Hub:**
```bash ```bash
docker run -p 3000:8080 bentopdf/bentopdf-simple:latest # Docker
docker run -p 3000:8080 bentopdfteam/bentopdf-simple:latest
# Podman
podman run -p 3000:8080 docker.io/bentopdfteam/bentopdf-simple:latest
``` ```
**Using GitHub Container Registry:** Or with Docker Compose / Podman Compose:
```bash
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
```
Or with Docker Compose:
```yaml ```yaml
services: services:
bentopdf: bentopdf:
# Using Docker Hub # Using GitHub Container Registry (Recommended)
image: bentopdf/bentopdf-simple:latest image: ghcr.io/alam00000/bentopdf-simple:latest
# Or using GitHub Container Registry # Or using Docker Hub
# image: ghcr.io/alam00000/bentopdf-simple:latest # image: bentopdfteam/bentopdf-simple:latest
container_name: bentopdf container_name: bentopdf
restart: unless-stopped restart: unless-stopped
ports: ports:
@@ -105,9 +113,13 @@ This automatically builds and serves Simple Mode on `http://localhost:3000`.
### Method 2: Using Pre-built Image (Easiest for Production) ### Method 2: Using Pre-built Image (Easiest for Production)
```bash ```bash
# Pull and run the Simple Mode image # Docker - Pull and run the Simple Mode image
docker pull bentopdf/bentopdf-simple:latest docker pull ghcr.io/alam00000/bentopdf-simple:latest
docker run -p 3000:8080 bentopdf/bentopdf-simple:latest docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
# Podman
podman pull ghcr.io/alam00000/bentopdf-simple:latest
podman run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
``` ```
Open `http://localhost:3000` in your browser. Open `http://localhost:3000` in your browser.
@@ -127,11 +139,13 @@ Open `http://localhost:3000` in your browser.
### Method 4: Compare Both Modes ### Method 4: Compare Both Modes
```bash ```bash
# Test Normal Mode # Test Normal Mode (Docker)
docker run -p 3000:8080 bentopdf/bentopdf:latest docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
# Test Simple Mode # Test Simple Mode (Docker)
docker run -p 3001:8080 bentopdf/bentopdf-simple:latest docker run -p 3001:8080 ghcr.io/alam00000/bentopdf-simple:latest
# Podman users: replace 'docker' with 'podman'
``` ```
- Normal Mode: `http://localhost:3000` - Normal Mode: `http://localhost:3000`
@@ -149,52 +163,82 @@ When Simple Mode is working correctly, you should see:
- ❌ No hero section with "The PDF Toolkit built for privacy" - ❌ No hero section with "The PDF Toolkit built for privacy"
- ❌ No features, FAQ, testimonials, or footer sections - ❌ No features, FAQ, testimonials, or footer sections
## 📦 Available Docker Images ## 📦 Available Container Images
### Normal Mode (Full Branding) ### Normal Mode (Full Branding)
**Docker Hub:** **GitHub Container Registry (Recommended):**
- `bentopdf/bentopdf:latest`
- `bentopdf/bentopdf:v1.0.0` (versioned)
**GitHub Container Registry:**
- `ghcr.io/alam00000/bentopdf:latest` - `ghcr.io/alam00000/bentopdf:latest`
- `ghcr.io/alam00000/bentopdf:v1.0.0` (versioned) - `ghcr.io/alam00000/bentopdf:v1.0.0` (versioned)
### Simple Mode (Clean Interface)
**Docker Hub:** **Docker Hub:**
- `bentopdf/bentopdf-simple:latest` - `bentopdfteam/bentopdf:latest`
- `bentopdf/bentopdf-simple:v1.0.0` (versioned) - `bentopdfteam/bentopdf:v1.0.0` (versioned)
**GitHub Container Registry:** ### Simple Mode (Clean Interface)
**GitHub Container Registry (Recommended):**
- `ghcr.io/alam00000/bentopdf-simple:latest` - `ghcr.io/alam00000/bentopdf-simple:latest`
- `ghcr.io/alam00000/bentopdf-simple:v1.0.0` (versioned) - `ghcr.io/alam00000/bentopdf-simple:v1.0.0` (versioned)
**Docker Hub:**
- `bentopdfteam/bentopdf-simple:latest`
- `bentopdfteam/bentopdf-simple:v1.0.0` (versioned)
## 🚀 Production Deployment Examples ## 🚀 Production Deployment Examples
### Internal Company Tool ### Docker Compose / Podman Compose
```yaml ```yaml
services: services:
bentopdf: bentopdf:
image: bentopdf/bentopdf-simple:latest image: ghcr.io/alam00000/bentopdf-simple:latest # Recommended
# image: bentopdfteam/bentopdf-simple:latest # Alternative: Docker Hub
container_name: bentopdf container_name: bentopdf
restart: unless-stopped restart: unless-stopped
ports: ports:
- '80:80' - '80:8080'
environment: environment:
- PUID=1000 - PUID=1000
- PGID=1000 - PGID=1000
``` ```
### Podman Quadlet (Linux Systemd)
Create `~/.config/containers/systemd/bentopdf-simple.container`:
```ini
[Unit]
Description=BentoPDF Simple Mode
After=network-online.target
[Container]
Image=ghcr.io/alam00000/bentopdf-simple:latest
ContainerName=bentopdf-simple
PublishPort=80:8080
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.target
```
Enable and start:
```bash
systemctl --user daemon-reload
systemctl --user enable --now bentopdf-simple
```
## ⚠️ Important Notes ## ⚠️ Important Notes
- **Pre-built images**: Use `bentopdf/bentopdf-simple:latest` for Simple Mode - **Pre-built images**: Use `ghcr.io/alam00000/bentopdf-simple:latest` for Simple Mode (recommended)
- **Environment variables**: `SIMPLE_MODE=true` only works during build, not runtime - **Environment variables**: `SIMPLE_MODE=true` only works during build, not runtime
- **Build-time optimization**: Simple Mode uses dead code elimination for smaller bundles - **Build-time optimization**: Simple Mode uses dead code elimination for smaller bundles
- **Same functionality**: All PDF tools work identically in both modes - **Same functionality**: All PDF tools work identically in both modes

View File

@@ -1,8 +1,12 @@
services: services:
bentopdf: bentopdf:
# simple mode - bentopdf/bentopdf-simple:latest # GitHub Container Registry (Recommended)
# default mode - bentopdf/bentopdf:latest # simple mode - ghcr.io/alam00000/bentopdf-simple:latest
image: bentopdf/bentopdf-simple:latest # default mode - ghcr.io/alam00000/bentopdf:latest
# Docker Hub (Alternative)
# simple mode - bentopdfteam/bentopdf-simple:latest
# default mode - bentopdfteam/bentopdf:latest
image: ghcr.io/alam00000/bentopdf-simple:latest
container_name: bentopdf container_name: bentopdf
restart: unless-stopped restart: unless-stopped
ports: ports:

View File

@@ -1,4 +1,4 @@
# Deploy with Docker # Deploy with Docker / Podman
The easiest way to self-host BentoPDF in a production environment. The easiest way to self-host BentoPDF in a production environment.
@@ -6,22 +6,33 @@ The easiest way to self-host BentoPDF in a production environment.
> **Required Headers for Office File Conversion** > **Required Headers for Office File Conversion**
> >
> LibreOffice-based tools (Word, Excel, PowerPoint conversion) require these HTTP headers for `SharedArrayBuffer` support: > LibreOffice-based tools (Word, Excel, PowerPoint conversion) require these HTTP headers for `SharedArrayBuffer` support:
>
> - `Cross-Origin-Opener-Policy: same-origin` > - `Cross-Origin-Opener-Policy: same-origin`
> - `Cross-Origin-Embedder-Policy: require-corp` > - `Cross-Origin-Embedder-Policy: require-corp`
> >
> The official Docker images include these headers. If using a reverse proxy (Traefik, Caddy, etc.), ensure these headers are preserved or added. > The official container images include these headers. If using a reverse proxy (Traefik, Caddy, etc.), ensure these headers are preserved or added.
> [!TIP]
> **Podman Users:** All `docker` commands work with Podman by replacing `docker` with `podman` and `docker-compose` with `podman-compose`.
## Quick Start ## Quick Start
```bash ```bash
# Docker
docker run -d \ docker run -d \
--name bentopdf \ --name bentopdf \
-p 3000:8080 \ -p 3000:8080 \
--restart unless-stopped \ --restart unless-stopped \
ghcr.io/alam00000/bentopdf:latest ghcr.io/alam00000/bentopdf:latest
# Podman
podman run -d \
--name bentopdf \
-p 3000:8080 \
ghcr.io/alam00000/bentopdf:latest
``` ```
## Docker Compose ## Docker Compose / Podman Compose
Create `docker-compose.yml`: Create `docker-compose.yml`:
@@ -31,10 +42,10 @@ services:
image: ghcr.io/alam00000/bentopdf:latest image: ghcr.io/alam00000/bentopdf:latest
container_name: bentopdf container_name: bentopdf
ports: ports:
- "3000:8080" - '3000:8080'
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"] test: ['CMD', 'curl', '-f', 'http://localhost:8080']
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
@@ -43,7 +54,11 @@ services:
Run: Run:
```bash ```bash
# Docker Compose
docker compose up -d docker compose up -d
# Podman Compose
podman-compose up -d
``` ```
## Build Your Own Image ## Build Your Own Image
@@ -73,10 +88,10 @@ docker run -d -p 3000:8080 bentopdf:custom
## Environment Variables ## Environment Variables
| Variable | Description | Default | | Variable | Description | Default |
|----------|-------------|---------| | ------------- | ------------------------------- | ------- |
| `SIMPLE_MODE` | Build without LibreOffice tools | `false` | | `SIMPLE_MODE` | Build without LibreOffice tools | `false` |
| `BASE_URL` | Deploy to subdirectory | `/` | | `BASE_URL` | Deploy to subdirectory | `/` |
Example: Example:
@@ -94,15 +109,15 @@ services:
traefik: traefik:
image: traefik:v2.10 image: traefik:v2.10
command: command:
- "--providers.docker=true" - '--providers.docker=true'
- "--entrypoints.web.address=:80" - '--entrypoints.web.address=:80'
- "--entrypoints.websecure.address=:443" - '--entrypoints.websecure.address=:443'
- "--certificatesresolvers.letsencrypt.acme.email=you@example.com" - '--certificatesresolvers.letsencrypt.acme.email=you@example.com'
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json'
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web'
ports: ports:
- "80:80" - '80:80'
- "443:443" - '443:443'
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt - ./letsencrypt:/letsencrypt
@@ -110,15 +125,15 @@ services:
bentopdf: bentopdf:
image: ghcr.io/alam00000/bentopdf:latest image: ghcr.io/alam00000/bentopdf:latest
labels: labels:
- "traefik.enable=true" - 'traefik.enable=true'
- "traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)" - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)'
- "traefik.http.routers.bentopdf.entrypoints=websecure" - 'traefik.http.routers.bentopdf.entrypoints=websecure'
- "traefik.http.routers.bentopdf.tls.certresolver=letsencrypt" - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt'
- "traefik.http.services.bentopdf.loadbalancer.server.port=8080" - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080'
# Required headers for SharedArrayBuffer (LibreOffice WASM) # Required headers for SharedArrayBuffer (LibreOffice WASM)
- "traefik.http.routers.bentopdf.middlewares=bentopdf-headers" - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers'
- "traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin" - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin'
- "traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp" - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp'
restart: unless-stopped restart: unless-stopped
``` ```
@@ -129,8 +144,8 @@ services:
caddy: caddy:
image: caddy:2 image: caddy:2
ports: ports:
- "80:80" - '80:80'
- "443:443" - '443:443'
volumes: volumes:
- ./Caddyfile:/etc/caddy/Caddyfile - ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data - caddy_data:/data
@@ -169,6 +184,141 @@ services:
memory: 128M memory: 128M
``` ```
## Podman Quadlet (Systemd Integration)
[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) allows you to run Podman containers as systemd services. This is ideal for production deployments on Linux systems.
### Basic Quadlet Setup
Create a container unit file at `~/.config/containers/systemd/bentopdf.container` (user) or `/etc/containers/systemd/bentopdf.container` (system):
```ini
[Unit]
Description=BentoPDF - Privacy-first PDF toolkit
After=network-online.target
Wants=network-online.target
[Container]
Image=ghcr.io/alam00000/bentopdf:latest
ContainerName=bentopdf
PublishPort=3000:8080
AutoUpdate=registry
[Service]
Restart=always
TimeoutStartSec=300
[Install]
WantedBy=default.target
```
### Enable and Start
```bash
# Reload systemd to detect new unit
systemctl --user daemon-reload
# Start the service
systemctl --user start bentopdf
# Enable on boot
systemctl --user enable bentopdf
# Check status
systemctl --user status bentopdf
# View logs
journalctl --user -u bentopdf -f
```
> [!TIP]
> For system-wide deployment, use `systemctl` without `--user` flag and place the file in `/etc/containers/systemd/`.
### Simple Mode Quadlet
For Simple Mode deployment, create `bentopdf-simple.container`:
```ini
[Unit]
Description=BentoPDF Simple Mode - Clean PDF toolkit
After=network-online.target
Wants=network-online.target
[Container]
Image=ghcr.io/alam00000/bentopdf-simple:latest
ContainerName=bentopdf-simple
PublishPort=3000:8080
AutoUpdate=registry
[Service]
Restart=always
TimeoutStartSec=300
[Install]
WantedBy=default.target
```
### Quadlet with Health Check
```ini
[Unit]
Description=BentoPDF with health monitoring
After=network-online.target
Wants=network-online.target
[Container]
Image=ghcr.io/alam00000/bentopdf:latest
ContainerName=bentopdf
PublishPort=3000:8080
AutoUpdate=registry
HealthCmd=curl -f http://localhost:8080 || exit 1
HealthInterval=30s
HealthTimeout=10s
HealthRetries=3
[Service]
Restart=always
TimeoutStartSec=300
[Install]
WantedBy=default.target
```
### Auto-Update with Quadlet
Podman can automatically update containers when new images are available:
```bash
# Enable auto-update timer
systemctl --user enable --now podman-auto-update.timer
# Check for updates manually
podman auto-update
# Dry run (check without updating)
podman auto-update --dry-run
```
### Quadlet Network Configuration
For custom network configuration, create a network file `bentopdf.network`:
```ini
[Network]
Subnet=10.89.0.0/24
Gateway=10.89.0.1
```
Then reference it in your container file:
```ini
[Container]
Image=ghcr.io/alam00000/bentopdf:latest
ContainerName=bentopdf
PublishPort=3000:8080
Network=bentopdf.network
```
## Updating ## Updating
```bash ```bash

View File

@@ -2,15 +2,19 @@
BentoPDF can be self-hosted on your own infrastructure. This guide covers various deployment options. BentoPDF can be self-hosted on your own infrastructure. This guide covers various deployment options.
## Quick Start with Docker ## Quick Start with Docker / Podman
The fastest way to self-host BentoPDF: The fastest way to self-host BentoPDF:
```bash ```bash
# Docker
docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf:latest docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
# Podman
podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
``` ```
Or with Docker Compose: Or with Docker Compose / Podman Compose:
```yaml ```yaml
# docker-compose.yml # docker-compose.yml
@@ -18,14 +22,43 @@ services:
bentopdf: bentopdf:
image: ghcr.io/alam00000/bentopdf:latest image: ghcr.io/alam00000/bentopdf:latest
ports: ports:
- "3000:8080" - '3000:8080'
restart: unless-stopped restart: unless-stopped
``` ```
```bash ```bash
# Docker Compose
docker compose up -d docker compose up -d
# Podman Compose
podman-compose up -d
``` ```
## Podman Quadlet (Linux Systemd)
Run BentoPDF as a systemd service. Create `~/.config/containers/systemd/bentopdf.container`:
```ini
[Container]
Image=ghcr.io/alam00000/bentopdf:latest
ContainerName=bentopdf
PublishPort=3000:8080
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.target
```
```bash
systemctl --user daemon-reload
systemctl --user enable --now bentopdf
```
See [Docker deployment guide](/self-hosting/docker) for full Quadlet documentation.
## Building from Source ## Building from Source
```bash ```bash
@@ -45,6 +78,7 @@ npm run build
Simple Mode is designed for internal organizational use where you want to hide all branding and marketing content, showing only the essential PDF tools. Simple Mode is designed for internal organizational use where you want to hide all branding and marketing content, showing only the essential PDF tools.
**What Simple Mode hides:** **What Simple Mode hides:**
- Navigation bar - Navigation bar
- Hero section with marketing content - Hero section with marketing content
- Features, FAQ, testimonials sections - Features, FAQ, testimonials sections
@@ -56,7 +90,7 @@ Simple Mode is designed for internal organizational use where you want to hide a
SIMPLE_MODE=true npm run build SIMPLE_MODE=true npm run build
# Or use the pre-built Docker image # Or use the pre-built Docker image
docker run -p 3000:8080 bentopdf/bentopdf-simple:latest docker run -p 3000:8080 bentopdfteam/bentopdf-simple:latest
``` ```
See [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) for full details. See [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) for full details.
@@ -85,11 +119,11 @@ Choose your platform:
## System Requirements ## System Requirements
| Requirement | Minimum | | Requirement | Minimum |
|-------------|---------| | ----------- | ------------------------------- |
| Storage | ~500 MB (with all WASM modules) | | Storage | ~500 MB (with all WASM modules) |
| RAM | 512 MB | | RAM | 512 MB |
| CPU | Any modern processor | | CPU | Any modern processor |
::: tip ::: tip
BentoPDF is a static site—there's no database or backend server required! BentoPDF is a static site—there's no database or backend server required!

View File

@@ -80,7 +80,9 @@ function main() {
execSync('npm run update-version', { stdio: 'inherit' }); execSync('npm run update-version', { stdio: 'inherit' });
// 3. Add and commit changes // 3. Add and commit changes
execSync('git add package.json *.html src/pages/*.html', { stdio: 'inherit' }); execSync('git add package.json *.html src/pages/*.html', {
stdio: 'inherit',
});
execSync(`git commit -m "Release v${newVersion}"`, { stdio: 'inherit' }); execSync(`git commit -m "Release v${newVersion}"`, { stdio: 'inherit' });
console.log(`💾 Committed version change`); console.log(`💾 Committed version change`);
@@ -98,7 +100,7 @@ function main() {
execSync(`git push origin ${tagName}`, { stdio: 'inherit' }); execSync(`git push origin ${tagName}`, { stdio: 'inherit' });
console.log(`🎉 Release v${newVersion} complete!`); console.log(`🎉 Release v${newVersion} complete!`);
console.log(`📦 Docker image: bentopdf/bentopdf:${newVersion}`); console.log(`📦 Docker image: bentopdfteam/bentopdf:${newVersion}`);
console.log(`📦 Distribution: dist-${newVersion}.zip`); console.log(`📦 Distribution: dist-${newVersion}.zip`);
console.log( console.log(
`🏷️ GitHub release: https://github.com/alam00000/bentopdf/releases/tag/${tagName}` `🏷️ GitHub release: https://github.com/alam00000/bentopdf/releases/tag/${tagName}`

View File

@@ -1,8 +1,8 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<Container version="2"> <Container version="2">
<Name>bentopdf</Name> <Name>bentopdf</Name>
<Repository>bentopdf/bentopdf</Repository> <Repository>bentopdfteam/bentopdf</Repository>
<Registry>https://hub.docker.com/r/bentopdf/bentopdf/</Registry> <Registry>https://hub.docker.com/r/bentopdfteam/bentopdf/</Registry>
<Network>bridge</Network> <Network>bridge</Network>
<MyIP/> <MyIP/>
<Shell>sh</Shell> <Shell>sh</Shell>
@@ -12,7 +12,7 @@
<Overview>Uploaded on behalf of creator: alam00000&#13; <Overview>Uploaded on behalf of creator: alam00000&#13;
BentoPDF is a privacy first PDF Toolkit&#13; BentoPDF is a privacy first PDF Toolkit&#13;
&#13; &#13;
https://hub.docker.com/r/bentopdf/bentopdf/</Overview> https://hub.docker.com/r/bentopdfteam/bentopdf/</Overview>
<Category>Tools:</Category> <Category>Tools:</Category>
<WebUI>http://[IP]:[PORT:8080]/</WebUI> <WebUI>http://[IP]:[PORT:8080]/</WebUI>
<TemplateURL/> <TemplateURL/>