diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 7d9012d..ee18e97 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -109,7 +109,7 @@ jobs: build-args: | SIMPLE_MODE=${{ matrix.mode.simple_mode }} 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 platforms: linux/amd64 cache-from: type=gha,scope=amd64-${{ matrix.mode.name }} @@ -123,7 +123,7 @@ jobs: build-args: | SIMPLE_MODE=${{ matrix.mode.simple_mode }} 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 platforms: linux/amd64 cache-from: type=gha,scope=amd64-${{ matrix.mode.name }} @@ -186,7 +186,7 @@ jobs: build-args: | SIMPLE_MODE=${{ matrix.mode.simple_mode }} 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 platforms: linux/arm64 cache-from: type=gha,scope=arm64-${{ matrix.mode.name }} @@ -200,7 +200,7 @@ jobs: build-args: | SIMPLE_MODE=${{ matrix.mode.simple_mode }} 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 platforms: linux/arm64 cache-from: type=gha,scope=arm64-${{ matrix.mode.name }} @@ -253,17 +253,17 @@ jobs: if: steps.version.outputs.is_release == 'true' run: | # DockerHub manifests - docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:latest \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 + docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:latest \ + bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \ + bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 - docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }} \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 + docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }} \ + bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \ + 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 }} \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 + docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version_without_v }} \ + bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \ + bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64 # GHCR manifests 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' run: | # DockerHub manifests - docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:edge \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-arm64 + docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge \ + bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \ + bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-arm64 - docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:sha-${{ steps.version.outputs.short_sha }} \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \ - bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-arm64 + docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:sha-${{ steps.version.outputs.short_sha }} \ + bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \ + bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-arm64 # GHCR manifests docker buildx imagetools create -t ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge \ diff --git a/README.md b/README.md index ec8dd7d..192e915 100644 --- a/README.md +++ b/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. -![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) ![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 [![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) - [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) - -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:** +Run BentoPDF instantly from GitHub Container Registry (Recommended): ```bash 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 -This is the fastest way to try BentoPDF without setting up a development environment. +
+Alternative: Using Docker Hub or Podman + +**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`. + +
### 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 @@ -431,7 +475,7 @@ docker run -p 3000:8080 bentopdf-simple > - Always include trailing slashes in `BASE_URL` (e.g., `/bentopdf/` not `/bentopdf`) > - 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: @@ -440,7 +484,8 @@ For a more robust setup with auto-restart capabilities: ```yaml services: bentopdf: - image: bentopdf/bentopdf:latest + image: ghcr.io/alam00000/bentopdf:latest # Recommended + # image: bentopdfteam/bentopdf:latest # Alternative: Docker Hub container_name: bentopdf ports: - '3000:8080' @@ -450,11 +495,48 @@ services: 2. **Start the application**: ```bash +# Docker Compose docker-compose up -d + +# Podman Compose +podman-compose up -d ``` 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 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 -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:** - -- **Latest**: `bentopdf/bentopdf:latest` -- **Specific Version**: `bentopdf/bentopdf:1.0.0` -- **Version with Prefix**: `bentopdf/bentopdf:v1.0.0` - -**GitHub Container Registry:** +**GitHub Container Registry (Recommended):** - **Latest**: `ghcr.io/alam00000/bentopdf:latest` - **Specific Version**: `ghcr.io/alam00000/bentopdf:1.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 ```bash diff --git a/RELEASE.md b/RELEASE.md index 88d0c78..106165b 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -215,16 +215,16 @@ git reset --hard HEAD~1 1. **GitHub Actions Triggered**: Workflow starts building Docker image 2. **Docker Build**: Multi-architecture image created 3. **Docker Push**: Images pushed to Docker Hub with tags: - - `bentopdf/bentopdf:latest` - - `bentopdf/bentopdf:1.0.1` - - `bentopdf/bentopdf:v1.0.1` + - `bentopdfteam/bentopdf:latest` + - `bentopdfteam/bentopdf:1.0.1` + - `bentopdfteam/bentopdf:v1.0.1` ### **End Result:** Users can immediately pull your new version: ```bash -docker pull bentopdf/bentopdf:1.0.1 +docker pull bentopdfteam/bentopdf:1.0.1 ``` --- diff --git a/SIMPLE_MODE.md b/SIMPLE_MODE.md index 996caef..4dd45d6 100644 --- a/SIMPLE_MODE.md +++ b/SIMPLE_MODE.md @@ -23,27 +23,35 @@ When enabled, Simple Mode will: 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:** ```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:** - -```bash -docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest -``` - -Or with Docker Compose: +Or with Docker Compose / Podman Compose: ```yaml services: bentopdf: - # Using Docker Hub - image: bentopdf/bentopdf-simple:latest - # Or using GitHub Container Registry - # image: ghcr.io/alam00000/bentopdf-simple:latest + # Using GitHub Container Registry (Recommended) + image: ghcr.io/alam00000/bentopdf-simple:latest + # Or using Docker Hub + # image: bentopdfteam/bentopdf-simple:latest container_name: bentopdf restart: unless-stopped 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) ```bash -# Pull and run the Simple Mode image -docker pull bentopdf/bentopdf-simple:latest -docker run -p 3000:8080 bentopdf/bentopdf-simple:latest +# Docker - Pull and run the Simple Mode image +docker pull ghcr.io/alam00000/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. @@ -127,11 +139,13 @@ Open `http://localhost:3000` in your browser. ### Method 4: Compare Both Modes ```bash -# Test Normal Mode -docker run -p 3000:8080 bentopdf/bentopdf:latest +# Test Normal Mode (Docker) +docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest -# Test Simple Mode -docker run -p 3001:8080 bentopdf/bentopdf-simple:latest +# Test Simple Mode (Docker) +docker run -p 3001:8080 ghcr.io/alam00000/bentopdf-simple:latest + +# Podman users: replace 'docker' with 'podman' ``` - 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 features, FAQ, testimonials, or footer sections -## πŸ“¦ Available Docker Images +## πŸ“¦ Available Container Images ### Normal Mode (Full Branding) -**Docker Hub:** - -- `bentopdf/bentopdf:latest` -- `bentopdf/bentopdf:v1.0.0` (versioned) - -**GitHub Container Registry:** +**GitHub Container Registry (Recommended):** - `ghcr.io/alam00000/bentopdf:latest` - `ghcr.io/alam00000/bentopdf:v1.0.0` (versioned) -### Simple Mode (Clean Interface) - **Docker Hub:** -- `bentopdf/bentopdf-simple:latest` -- `bentopdf/bentopdf-simple:v1.0.0` (versioned) +- `bentopdfteam/bentopdf:latest` +- `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:v1.0.0` (versioned) +**Docker Hub:** + +- `bentopdfteam/bentopdf-simple:latest` +- `bentopdfteam/bentopdf-simple:v1.0.0` (versioned) + ## πŸš€ Production Deployment Examples -### Internal Company Tool +### Docker Compose / Podman Compose ```yaml services: 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 restart: unless-stopped ports: - - '80:80' + - '80:8080' environment: - PUID=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 -- **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 - **Build-time optimization**: Simple Mode uses dead code elimination for smaller bundles - **Same functionality**: All PDF tools work identically in both modes diff --git a/docker-compose.yml b/docker-compose.yml index 4999418..95dbe02 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,12 @@ services: bentopdf: - # simple mode - bentopdf/bentopdf-simple:latest - # default mode - bentopdf/bentopdf:latest - image: bentopdf/bentopdf-simple:latest + # GitHub Container Registry (Recommended) + # simple mode - ghcr.io/alam00000/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 restart: unless-stopped ports: diff --git a/docs/self-hosting/docker.md b/docs/self-hosting/docker.md index 0130afd..8630da2 100644 --- a/docs/self-hosting/docker.md +++ b/docs/self-hosting/docker.md @@ -1,27 +1,38 @@ -# Deploy with Docker +# Deploy with Docker / Podman The easiest way to self-host BentoPDF in a production environment. > [!IMPORTANT] > **Required Headers for Office File Conversion** -> +> > LibreOffice-based tools (Word, Excel, PowerPoint conversion) require these HTTP headers for `SharedArrayBuffer` support: +> > - `Cross-Origin-Opener-Policy: same-origin` > - `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 ```bash +# Docker docker run -d \ --name bentopdf \ -p 3000:8080 \ --restart unless-stopped \ 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`: @@ -31,10 +42,10 @@ services: image: ghcr.io/alam00000/bentopdf:latest container_name: bentopdf ports: - - "3000:8080" + - '3000:8080' restart: unless-stopped healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080"] + test: ['CMD', 'curl', '-f', 'http://localhost:8080'] interval: 30s timeout: 10s retries: 3 @@ -43,7 +54,11 @@ services: Run: ```bash +# Docker Compose docker compose up -d + +# Podman Compose +podman-compose up -d ``` ## Build Your Own Image @@ -73,10 +88,10 @@ docker run -d -p 3000:8080 bentopdf:custom ## Environment Variables -| Variable | Description | Default | -|----------|-------------|---------| +| Variable | Description | Default | +| ------------- | ------------------------------- | ------- | | `SIMPLE_MODE` | Build without LibreOffice tools | `false` | -| `BASE_URL` | Deploy to subdirectory | `/` | +| `BASE_URL` | Deploy to subdirectory | `/` | Example: @@ -94,15 +109,15 @@ services: traefik: image: traefik:v2.10 command: - - "--providers.docker=true" - - "--entrypoints.web.address=:80" - - "--entrypoints.websecure.address=:443" - - "--certificatesresolvers.letsencrypt.acme.email=you@example.com" - - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" + - '--providers.docker=true' + - '--entrypoints.web.address=:80' + - '--entrypoints.websecure.address=:443' + - '--certificatesresolvers.letsencrypt.acme.email=you@example.com' + - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web' ports: - - "80:80" - - "443:443" + - '80:80' + - '443:443' volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./letsencrypt:/letsencrypt @@ -110,15 +125,15 @@ services: bentopdf: image: ghcr.io/alam00000/bentopdf:latest labels: - - "traefik.enable=true" - - "traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)" - - "traefik.http.routers.bentopdf.entrypoints=websecure" - - "traefik.http.routers.bentopdf.tls.certresolver=letsencrypt" - - "traefik.http.services.bentopdf.loadbalancer.server.port=8080" + - 'traefik.enable=true' + - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)' + - 'traefik.http.routers.bentopdf.entrypoints=websecure' + - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt' + - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080' # Required headers for SharedArrayBuffer (LibreOffice WASM) - - "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-Embedder-Policy=require-corp" + - '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-Embedder-Policy=require-corp' restart: unless-stopped ``` @@ -129,12 +144,12 @@ services: caddy: image: caddy:2 ports: - - "80:80" - - "443:443" + - '80:80' + - '443:443' volumes: - ./Caddyfile:/etc/caddy/Caddyfile - caddy_data:/data - + bentopdf: image: ghcr.io/alam00000/bentopdf:latest restart: unless-stopped @@ -169,6 +184,141 @@ services: 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 ```bash diff --git a/docs/self-hosting/index.md b/docs/self-hosting/index.md index a492ec2..045a2a6 100644 --- a/docs/self-hosting/index.md +++ b/docs/self-hosting/index.md @@ -2,15 +2,19 @@ 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: ```bash +# Docker 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 # docker-compose.yml @@ -18,14 +22,43 @@ services: bentopdf: image: ghcr.io/alam00000/bentopdf:latest ports: - - "3000:8080" + - '3000:8080' restart: unless-stopped ``` ```bash +# Docker Compose 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 ```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. **What Simple Mode hides:** + - Navigation bar - Hero section with marketing content - 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 # 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. @@ -85,11 +119,11 @@ Choose your platform: ## System Requirements -| Requirement | Minimum | -|-------------|---------| -| Storage | ~500 MB (with all WASM modules) | -| RAM | 512 MB | -| CPU | Any modern processor | +| Requirement | Minimum | +| ----------- | ------------------------------- | +| Storage | ~500 MB (with all WASM modules) | +| RAM | 512 MB | +| CPU | Any modern processor | ::: tip BentoPDF is a static siteβ€”there's no database or backend server required! diff --git a/scripts/release.js b/scripts/release.js index 696024a..de257ae 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -80,7 +80,9 @@ function main() { execSync('npm run update-version', { stdio: 'inherit' }); // 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' }); console.log(`πŸ’Ύ Committed version change`); @@ -98,7 +100,7 @@ function main() { execSync(`git push origin ${tagName}`, { stdio: 'inherit' }); 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( `🏷️ GitHub release: https://github.com/alam00000/bentopdf/releases/tag/${tagName}` diff --git a/unraid_bentopdf.xml b/unraid_bentopdf.xml index 9d48d1f..bb716b2 100644 --- a/unraid_bentopdf.xml +++ b/unraid_bentopdf.xml @@ -1,8 +1,8 @@ bentopdf - bentopdf/bentopdf - https://hub.docker.com/r/bentopdf/bentopdf/ + bentopdfteam/bentopdf + https://hub.docker.com/r/bentopdfteam/bentopdf/ bridge sh @@ -12,7 +12,7 @@ Uploaded on behalf of creator: alam00000 BentoPDF is a privacy first PDF Toolkit -https://hub.docker.com/r/bentopdf/bentopdf/ +https://hub.docker.com/r/bentopdfteam/bentopdf/ Tools: http://[IP]:[PORT:8080]/