Nomploy Nomad Packs

← All packs

pingvin-share v0.1.0

Apps

Pingvin Share — a self-hosted file-sharing platform that combines lightness and beauty: upload files, get a shareable link with optional expiry, password, and download limits, and let others upload to you via reverse shares. A slick WeTransfer alternative. Deployed as a host-networked Nomad service using SQLite with persistent volumes.

nomad-pack run pingvin-share --registry nomploy
…or one line (add registry + run)
curl -fsSL https://packs.nomploy.com/install.sh | sh -s -- pingvin-share

Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.

1 task http 3000 2 volumes image stonith404/pingvin-share:latest tracks :latest image bumped today
Variables 9
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run pingvin-share -f values.hcl --registry nomploy
# The name of the Nomad job.
job_name = "pingvin-share"

# The Nomad namespace to deploy into.
namespace = "default"

# The datacenters to deploy to.
datacenters = ["*"]

# The Pingvin Share container image. Pin a tag in production.
image = "stonith404/pingvin-share:latest"

# Host port for the Pingvin Share web UI. The container listens on 3000.
port = 3000

# Named volume for Pingvin Share data (/opt/app/backend/data): the SQLite database and uploaded files.
data_volume = "pingvin_data"

# Named volume for customization images (/opt/app/frontend/public/img: logo, favicon).
images_volume = "pingvin_images"

# Placement constraints. Pin to the node holding the volumes. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []

# Resources for the Pingvin Share task.
resources = {
    cpu    = 500
    memory = 512
  }
NameTypeDefaultDescription
job_name string
"pingvin-share"
The name of the Nomad job.
namespace string
"default"
The Nomad namespace to deploy into.
datacenters list
["*"]
The datacenters to deploy to.
image string
"stonith404/pingvin-share:latest"
The Pingvin Share container image. Pin a tag in production.
port number
3000
Host port for the Pingvin Share web UI. The container listens on 3000.
data_volume string
"pingvin_data"
Named volume for Pingvin Share data (/opt/app/backend/data): the SQLite database and uploaded files.
images_volume string
"pingvin_images"
Named volume for customization images (/opt/app/frontend/public/img: logo, favicon).
constraints list
[]
Placement constraints. Pin to the node holding the volumes. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
resources object
{
    cpu    = 500
    memory = 512
  }
Resources for the Pingvin Share task.
Back up this pack

This pack stores data in 2 Docker named volumes: pingvin_datapingvin_images

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/pingvin_data/_data \
  /var/lib/docker/volumes/pingvin_images/_data

rclone (sync to S3/R2)

rclone sync /var/lib/docker/volumes/pingvin_data/_data backup:<bucket>/pingvin_data
rclone sync /var/lib/docker/volumes/pingvin_images/_data backup:<bucket>/pingvin_images

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.

Readme

pingvin-share

Pingvin Share — a self-hosted file-sharing platform that's light and beautiful. Upload files and get a shareable link with optional expiry, password, and download limits, or set up reverse shares so others can upload to you. A slick, privacy-respecting WeTransfer alternative.

Single host-networked Nomad service using SQLite with persistent volumes.

Deploy

nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run pingvin-share --registry=nomploy

Configure

Variable Default Description
port 3000 Web UI port (PORT). The container listens on 3000.
data_volume pingvin_data /opt/app/backend/data — SQLite database and uploaded files.
images_volume pingvin_images /opt/app/frontend/public/img — custom logo/favicon.
image stonith404/pingvin-share:latest Container image. Pin a tag in production.
resources { cpu = 500, memory = 512 } Task resources.

On first run, open the UI to create the admin account, then set the App URL and share limits in the admin settings so links are correct. Uses named volumes (bind-mounts are known to cause permission issues). Serves plain HTTP — front it with a reverse proxy for TLS. Pin the job to the node holding the volumes with constraints.