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:
38
.github/workflows/build-and-publish.yml
vendored
38
.github/workflows/build-and-publish.yml
vendored
@@ -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
138
README.md
@@ -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.
|
||||||
|
|
||||||
 [](https://ko-fi.com/alio01) 
|
 [](https://ko-fi.com/alio01) 
|
||||||
[](https://github.com/sponsors/alam00000)
|
[](https://github.com/sponsors/alam00000)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
[](https://discord.gg/Bgq3Ay3f2w)
|
[](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
|
||||||
|
|
||||||
[](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
|
||||||
|
|||||||
@@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
114
SIMPLE_MODE.md
114
SIMPLE_MODE.md
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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!
|
||||||
|
|||||||
@@ -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}`
|
||||||
|
|||||||
@@ -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
|
<Overview>Uploaded on behalf of creator: alam00000
|
||||||
BentoPDF is a privacy first PDF Toolkit
|
BentoPDF is a privacy first PDF Toolkit
|
||||||
|
|
||||||
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/>
|
||||||
|
|||||||
Reference in New Issue
Block a user