ConvertX — a self-hosted file converter supporting 1000+ formats (images, documents, audio, video, and more) with a simple web UI. Deployed as a single host-networked Nomad service.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 19.1k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "convertx"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The ConvertX container image. Pin a tag in production.
image = "ghcr.io/c4illin/convertx:latest"
# Host port for the ConvertX web UI.
port = 3000
# Named volume mounted at /app/data (SQLite database + converted files).
data_volume = "convertx_data"
# Secret used to sign session tokens (JWT_SECRET). CHANGE THIS. Generate with: openssl rand -base64 36.
jwt_secret = "change-me-openssl-rand-base64-36"
# User ID that owns the files (PUID).
puid = 1000
# Group ID that owns the files (PGID).
pgid = 1000
# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# The task resources.
resources = {
cpu = 300
memory = 256
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "convertx" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "ghcr.io/c4illin/convertx:latest" | The ConvertX container image. Pin a tag in production. |
| port | number | 3000 | Host port for the ConvertX web UI. |
| data_volume | string | "convertx_data" | Named volume mounted at /app/data (SQLite database + converted files). |
| jwt_secret set me | string | "change-me-openssl-rand-base64-36" | Secret used to sign session tokens (JWT_SECRET). CHANGE THIS. Generate with: openssl rand -base64 36. |
| puid | number | 1000 | User ID that owns the files (PUID). |
| pgid | number | 1000 | Group ID that owns the files (PGID). |
| constraints | list | [] | Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 300
memory = 256
} | The task resources. |
No variables match.
This pack stores data in one Docker named volume:
convertx_data
restic
# Run on the node hosting this pack. Point restic at your repo first: # export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>" # export RESTIC_PASSWORD="<repo-password>" # export AWS_ACCESS_KEY_ID=<key> AWS_SECRET_ACCESS_KEY=<secret> restic backup \ /var/lib/docker/volumes/convertx_data/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/convertx_data/_data backup:<bucket>/convertx_data
Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.
ConvertX — a self-hosted file converter with a clean web UI. It supports 1000+ formats across images, documents, audio, video, ebooks and more (backed by tools like FFmpeg, ImageMagick, Pandoc, Calibre and libvips), converts multiple files at once, and keeps everything on your own server.
Single host-networked Nomad service with a persistent data volume.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run convertx --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
3000 |
Web UI port. |
jwt_secret |
change-me-… |
Change this. Signs session tokens. openssl rand -base64 36. |
image |
ghcr.io/c4illin/convertx:latest |
Container image. Pin a tag in production. |
data_volume |
convertx_data |
/app/data — SQLite database and converted files. |
puid / pgid |
1000 / 1000 |
User/group that owns the files (PUID/PGID). |
resources |
{ cpu = 300, memory = 256 } |
Task resources. Bump for large video conversions. |
First run: the first account you create becomes the admin; registration is then closed by default. A prestart init task chowns the data volume to
PUID:PGID. Pin the job to the node holding the volume withconstraints.