
Build a persistent private media server, verify it locally, then make selected Fireshare links reachable over the internet
Fireshare is a self-hosted video and image library that gives each media file a shareable URL. In this guide, we install it with Docker, configure persistent storage and administrator credentials, verify the server at its documented local address, and cover the operational checks needed before remote exposure. Once the local application works, we connect it to a Localtonet HTTP tunnel so viewers can reach it without inbound router port forwarding, firewall changes, VPN setup, or a public IP address.
๐ What's in this guide
How the Fireshare and Localtonet setup works
Fireshare runs as a containerized web application on hardware you control. It scans mounted video and image directories, presents the media through a browser interface, and creates unique links that can be used to share individual files. Its documented features include public and private feeds, link-only private media, password-protected videos, folder sharing, uploads, tags, search, view counts, mobile support, optional transcoding, TOTP two-factor authentication, login IP whitelisting, LDAP support, RSS feeds, and webhook-compatible notifications.
Docker publishes the container's internal HTTP listener on a port belonging to the host. The documented configuration maps host port 8080 to container port 80, producing the local endpoint http://localhost:8080. This local endpoint should be tested before any tunnel is created. Separating installation from remote access makes troubleshooting much easier because it establishes whether a failure belongs to Fireshare, Docker, the host filesystem, or the remote connectivity layer.
After Fireshare responds locally, the Localtonet client on the same machine, or on another device that can reach that machine, establishes an outbound connection to one of our relay servers. An HTTP tunnel then points to the Fireshare host and port. The tunnel provides a public HTTPS address while it is running and while the selected Localtonet device remains connected.
A tunnel does not repair an unhealthy container, incorrect mount, or filesystem permission problem. Complete the local installation and confirm that http://localhost:8080 works before configuring remote access.
Prerequisites for self-hosting Fireshare
Begin with a machine that can remain online whenever the library needs to be available. Fireshare's intended installation method is Docker. For the Compose workflow, the machine also needs a functioning Docker Compose command compatible with the documented docker-compose up -d invocation. The exact way to install Docker varies by operating system and distribution, so use the installation package or repository maintained for your host rather than copying an unrelated platform command.
You also need host storage for four distinct purposes: the internal database, generated metadata, source videos, and source images. The account represented by the configured PUID and PGID must be able to read and write the mounted locations. Storage requirements depend on the size of the source library and whether transcoding is enabled. Generated lower-quality copies and poster or metadata files consume additional space.
Prepare the following before creating the container:
- A working Docker installation.
- Docker Compose if using the recommended Compose workflow.
- A directory for Fireshare's persistent
/datacontent. - A directory for generated
/processedcontent. - Existing or newly created source directories for
/videosand/images. - A unique administrator username and a strong administrator password.
- A random, private value for
SECRET_KEYwhen using the documented Compose configuration. - The numeric user ID and group ID that should own files written through the mounts.
- The Localtonet client for the later remote-access stage.
On a Linux host, the Fireshare documentation instructs users to run id to find the current account's UID and GID. Use values that match the owner of the host directories rather than blindly retaining the example values. PUID and PGID affect which user and group own files written into the mounted volumes.
id
Confirm that the intended host port is available. The documented configuration uses port 8080. If another process already owns that port, Docker cannot publish the mapping as written. Fireshare documents that the host-side mapping is the normal place to change the externally accessible port. The internal FIRESHARE_PORT setting defaults to 80 and should normally be left alone unless host networking is deliberately being used.
Replace every credential placeholder before starting Fireshare. Do not use values such as admin, your-admin-password, or replace_with_random_string_can_be_anything literally. Keep the administrator password, Fireshare secret key, Localtonet device token, and any private share passwords out of screenshots, repositories, chat messages, and public configuration examples.
Plan Fireshare's persistent storage

Container filesystems are disposable. Fireshare therefore requires four host-mounted directories so application state and media remain available when a container is recreated. Treat these mounts separately because each serves a different role.
| Container path | Purpose | Operational consideration |
|---|---|---|
/data |
Internal database | Persistent application state belongs here. Protect and back up this directory according to your own recovery requirements. |
/processed |
Generated posters and metadata files | Allow enough capacity for generated content, particularly when the media library is large. |
/videos |
Source video directory to scan | The selected PUID and PGID need the permissions required for the operations you enable. |
/images |
Source image directory to scan | Use a real host path and verify that Docker can access it. |
Bind mounts connect a real host directory to a fixed path inside the container. For example, a host directory such as /srv/fireshare/data can be mounted at /data. Fireshare only sees the container path, while the administrator manages persistence and permissions through the host path.
The examples below intentionally retain descriptive path placeholders. Replace every /path/to/... value with an absolute path appropriate for your machine. Avoid selecting temporary directories or locations that may be removed by routine cleanup. If your videos and images are already organized elsewhere, mount those existing directories rather than duplicating the media solely for the container.
The documented examples use read-write mounts. That supports Fireshare features that may write to mounted storage, including optional uploads. If you change a mount's access mode, evaluate the consequences for scanning, uploads, cropping, generated content, and any other operation that needs to modify files. The available evidence does not establish a universal read-only configuration for every Fireshare feature, so test any hardening change against the exact operations you plan to allow.
Install Fireshare with Docker
Docker Compose is the clearer long-term approach because the service definition, volume mappings, credentials, image selection, and port mapping remain in one declarative file. Docker Run is also documented and is useful when a single command better fits the host's management workflow. Choose one installation method rather than starting duplicate containers with both.
Option 1: Docker Compose with the Lite image
The documented Compose example uses shaneisrael/fireshare:latest-lite. The Lite image uses the system-provided FFmpeg instead of the CUDA-enabled build included in the standard image. It is smaller and is a good fit for users who do not require NVIDIA GPU transcoding. CPU transcoding remains supported.
Create a working directory for the deployment, then place a Compose file in that directory using the following structure. Replace all host paths, credentials, the secret key, and identity values before starting it.
services:
fireshare:
container_name: fireshare
image: shaneisrael/fireshare:latest-lite
ports:
- "8080:80"
volumes:
- /path/to/data:/data
- /path/to/processed:/processed
- /path/to/videos:/videos
- /path/to/images:/images
environment:
- ADMIN_USERNAME=your-admin-username
- ADMIN_PASSWORD=your-admin-password
- SECRET_KEY=replace-with-a-private-random-value
- DOMAIN=
- PUID=1000
- PGID=1000
The example values 1000 for PUID and PGID are not universal. Replace them with the IDs that match the owner of your host directories. Also replace the administrator placeholders and secret key. Leaving DOMAIN empty allows you to finish local verification first. The setting should later represent the domain where the instance is hosted because Fireshare requires it for Open Graph metadata to work correctly on shared links.
From the directory containing the Compose file, run the documented startup command:
docker-compose up -d
Detached mode returns control to the terminal while the container continues running. Docker may need to download the selected image before the application becomes available.
Option 2: Docker Run with the standard image
The documented Docker Run example uses the standard shaneisrael/fireshare:latest image. Run the following from the parent location where you want the relative fireshare/data and fireshare/processed directories to reside. Replace the video and image paths, administrator credentials, PUID, and PGID.
docker run --name fireshare \
-v $(pwd)/fireshare/data:/data:rw \
-v $(pwd)/fireshare/processed:/processed:rw \
-v /path/to/my/videos:/videos:rw \
-v /path/to/my/images:/images:rw \
-p 8080:80 \
-e ADMIN_USERNAME=your-admin-username \
-e ADMIN_PASSWORD=your-admin-password \
-e PUID=user-id-with-read-write-permissions \
-e PGID=group-id-with-read-write-permissions \
-d shaneisrael/fireshare:latest
This command creates a container named fireshare, mounts the four required storage locations, maps host port 8080 to container port 80, sets the initial administrator identity, and runs the standard image in detached mode.
The standard image supports CPU transcoding and NVIDIA NVENC GPU transcoding. The Lite image supports CPU transcoding but does not support GPU transcoding. Setting TRANSCODE_GPU=true has no effect in the Lite image because GPU transcoding is permanently disabled there.
Choose the appropriate Fireshare image
| Image | CPU transcoding | NVIDIA GPU transcoding | Best fit |
|---|---|---|---|
shaneisrael/fireshare:latest-lite |
Supported | Not available | Most installations that do not need GPU transcoding |
shaneisrael/fireshare:latest |
Supported | Supported on compatible NVIDIA hardware | Installations requiring the CUDA-enabled build |
| Standard image with CPU mode | Supported | Not used when GPU mode is disabled | Operators who want the standard image without enabling GPU processing |
Transcoding is disabled by default. When enabled, Fireshare creates lower-quality versions of supported original videos for adaptive playback. It does not modify the original file, and the original is still served directly to viewers. Because of that behavior, the source file itself must use a supported container and encoding.
Documented video containers are MP4 with .mp4, Apple MP4 with .m4v, QuickTime with .mov, and WebM with .webm. Documented encodings include H.264, H.265, AV1, and VP9. Browser playback capabilities still matter, which is one reason optional lower-quality transcoded versions can be useful.
To enable CPU transcoding, add the documented environment setting to the selected container configuration:
ENABLE_TRANSCODING=true
The standard image can also use GPU mode with:
ENABLE_TRANSCODING=true
TRANSCODE_GPU=true
GPU mode requires an NVIDIA GPU with NVENC support. Fireshare automatically selects an available encoder and can fall back to CPU processing if GPU encoding fails. Hardware capabilities differ, so verify support for the intended codec on the actual GPU rather than assuming every NVIDIA model can encode every format.
Verify Fireshare before remote exposure

Open the documented local address on the Docker host:
http://localhost:8080
If the browser is running on a different device on the same LAN, localhost refers to that other device, not the Docker host. In that case, use the Docker host's LAN address with port 8080, provided the host networking and local policy allow it. The exact LAN address depends on your environment and should not be guessed.
Use the administrator username and password configured for the container. Confirm that the interface loads, authentication succeeds, and the expected mounted media can be discovered. Test with a supported media file and verify that its page and playback behavior work locally.
Confirm that the container is running
Use Docker's container listing to verify that the container named fireshare is running rather than repeatedly restarting or exiting.
Open the local HTTP endpoint
Visit http://localhost:8080 from the Docker host. A successful response confirms that the host-to-container port mapping is functioning.
Authenticate with the configured administrator account
Sign in using the credentials supplied through the container environment. If authentication fails, verify the configured values without exposing them in logs or support messages.
Verify all mounted directories
Confirm that Fireshare can access the video and image sources and can write its database and generated metadata. Permission errors should be corrected before continuing.
Test an actual media page
Open a supported file, play it in the browser, and check any share or privacy behavior that will be used remotely. This validates more than the application home page alone.
Useful generic Docker checks include listing containers and reading the Fireshare container logs:
docker ps -a
docker logs fireshare
Look for clear startup, binding, database, scanning, and permission errors. Do not publish complete logs without reviewing them for usernames, internal paths, addresses, or other sensitive information.
Configure Fireshare for practical sharing
A successful home page is only the beginning. Before making the service public, decide how media should be organized, who may sign in, whether uploads are allowed, and which items should be public, link-only, or password-protected.
Understand public, private, and password-protected media
Fireshare supports public and private feeds. Private media is link-only, meaning it is intended to be reached through its direct link rather than displayed in the public feed. A secret-looking URL is not equivalent to strong authentication because anyone who receives or discovers the URL may be able to pass it onward. Use Fireshare's password protection when an individual video needs an additional access check.
Test the chosen visibility mode in a private browser window before distributing a link. This reveals whether an unauthenticated viewer sees the intended result. Also test the behavior from a mobile browser if mobile viewing matters to the audience.
Set the public domain for rich previews
Fireshare documents the DOMAIN environment setting as the domain where the instance is hosted and states that it is required for Open Graph metadata to work correctly for shared links. Open Graph metadata is what allows compatible chat and social applications to build a rich preview instead of showing only a raw URL.
Complete the Localtonet HTTP tunnel first so you know the actual assigned public HTTPS address. Then set DOMAIN to the public host used for the Fireshare instance and recreate or restart the container through your established Docker management workflow. The supplied Fireshare evidence does not define whether this value should include a scheme in every release, so confirm the expected formatting in the current Fireshare environment-variable documentation before committing the production value.
Enable optional account protections
Fireshare supports TOTP two-factor authentication using authenticator applications. It also supports login IP whitelisting with individual addresses or CIDR ranges. These controls protect login attempts, but they require careful planning when traffic arrives through a reverse proxy or tunnel. The application may observe a proxy-related address depending on how request information is conveyed and interpreted.
Do not enable a restrictive login whitelist and assume it will behave identically for local and tunneled requests. Establish remote access, inspect the behavior safely, and retain a recovery path before enforcing an allowlist. The available evidence does not establish the exact client-IP interpretation for every Fireshare and Localtonet deployment.
Expose the working Fireshare server with Localtonet

Once http://localhost:8080 works, Fireshare is an appropriate HTTP tunnel target. With Localtonet, the client device establishes an outbound connection to our relay infrastructure. This avoids opening an inbound router port or requiring a public IP address.
Install and run the Localtonet client on the Docker host or on another device that can reach the Fireshare host. If the client runs on the same host, the target can use the local service address and port. If it runs elsewhere, use an address that is reachable from that client device. Do not use localhost on a different machine because it would refer back to the Localtonet client machine itself.
The currently available authentication tokens, relay servers, regions, and process types must be selected from the current Localtonet dashboard. We do not hardcode those values because availability can vary by plan, client version, region, and deployment.
Install and run the Localtonet client
Run our client on the device that can reach the verified Fireshare HTTP service. Keep the device online whenever remote access is required.
Authenticate or select the client device
Use the device-specific authentication token through the supported client and dashboard workflow. Never place the token in an article, public command history, screenshot, or shared configuration file.
Select an available relay server
Choose from the server or region values currently offered in your Localtonet dashboard. Do not copy a server code from an old tutorial because available values can change.
Create an HTTP tunnel for Fireshare
Configure the local target as the IP address reachable from the Localtonet client and port 8080 when using the documented Docker mapping. Select the appropriate HTTP process type from the current dashboard.
Start the tunnel
Creating a tunnel does not start it. Use the Start button, then wait for the tunnel and selected client device to show their connected state.
Test the assigned public HTTPS address
Open the assigned public URL from a different network or private browser session. Test the Fireshare page, login policy, media playback, and a representative share link.
HTTP and File Server tunnels can use a generated subdomain, a selected subdomain where supported, or a custom domain. For this Fireshare workflow, all HTTP process types serve the configured local content through a public HTTPS address. Exact custom-domain DNS instructions are intentionally not included because they must be checked against the current Localtonet documentation and dashboard.
For the current interface and supported options, consult the Localtonet HTTP tunnel documentation .
The public address is available only while the tunnel is running and the selected Localtonet client device is connected. Fireshare and its Docker host must also remain operational. A stopped container, sleeping host, disconnected client, or stopped tunnel interrupts access.
Routine operation and troubleshooting
Starting and stopping the container
If the container was created by Docker Run and retained under the documented name, Docker can start and stop it by name:
docker stop fireshare
docker start fireshare
For Compose deployments, perform lifecycle operations from the directory containing the Compose file using the Compose tooling installed on the host. Keep a protected copy of the deployment definition so the same mounts, identity values, credentials, image choice, and port mapping can be reproduced.
Before changing images or recreating containers, back up the persistent data required by your recovery plan. A container image is replaceable, but the database and your media library may not be. The evidence supplied for this guide does not define an application-specific backup and restore command, so do not assume that copying live files without considering consistency is sufficient for every deployment.
Fireshare does not open at localhost:8080
First check whether the container is running. If it exited, inspect its logs. Common categories include an unavailable host port, an invalid mount path, a missing directory, or inadequate permissions. Verify that the port mapping is exactly the one intended and that another process is not already using host port 8080.
If you changed the host-side port mapping, the browser URL and Localtonet target must use the new host port. Leave the container-side listener at its documented default unless you have a specific host-networking reason to change FIRESHARE_PORT.
The interface opens, but media is missing
Confirm that the host source directories are mounted to /videos and /images, not accidentally reversed or mounted to unrelated paths. Verify that the selected PUID and PGID can traverse the parent directories and read the files. Also confirm that the files use documented formats and encodings.
Fireshare scans its library, so newly added content may not appear at precisely the same instant it is copied. Current Fireshare releases also support on-demand scanning from the administration interface. A documented setting of MINUTES_BETWEEN_VIDEO_SCANS=0 disables automatic scans, so check that setting if content appears only after a manual scan.
Fireshare works locally but not through Localtonet
Confirm that the Localtonet client is connected and that the HTTP tunnel has been started. Then verify the local target from the client device itself. If Localtonet runs on the Docker host, test the same local endpoint used by the tunnel. If it runs on another machine, verify that machine can reach the Docker host's LAN address and selected host port.
A target of 127.0.0.1:8080 or localhost:8080 is correct only when the Localtonet client and Fireshare service are reachable through the same machine's loopback interface. It is incorrect when the client runs on another device.
The page loads remotely, but video playback fails
Test the same file locally. If local playback also fails, investigate the file container, encoding, permissions, and Fireshare logs before changing the tunnel. Fireshare serves original files directly, even when transcoding is enabled, while lower-quality generated versions supplement the original. Browser codec support and the viewer's connection can therefore affect playback.
If local playback works, test the public URL in a clean browser session and compare multiple supported files. Check whether the problem affects the player page, only a particular rendition, or only a rich preview. These distinctions separate media compatibility from public-domain metadata configuration.
Shared links produce incorrect previews
Verify the DOMAIN setting against the public address actually used by viewers. A local hostname or obsolete tunnel address cannot generate correct public links. Preview providers may also cache prior metadata, so a corrected configuration may not immediately replace an old preview everywhere.
Security checklist before sharing the public URL
Remote access changes the audience that can send requests to Fireshare. Review the application and host as an internet-reachable service, even if most individual items are intended to be private.
A private Fireshare item can be reachable through its direct URL, and recipients can potentially forward that URL. Use password protection and account-level controls for sensitive content, distribute links only to intended viewers, and remove or change access when sharing is no longer appropriate.
Keep Docker, the host operating system, Fireshare, and the Localtonet client maintained. Review release notes before upgrades, particularly when authentication, LDAP, environment parsing, or database behavior changes. Test significant changes locally before depending on the public tunnel.
Frequently asked questions
What port does Fireshare use in this Docker setup?
The documented Docker configuration maps host port 8080 to container port 80. That makes the local service available at http://localhost:8080 on the Docker host. If you deliberately change the host-side mapping, use the changed host port for both local verification and the Localtonet target.
Should I use the standard or Lite Fireshare image?
Use the Lite image when you want a smaller image and do not need NVIDIA GPU transcoding. It supports CPU transcoding. Use the standard image when compatible NVIDIA NVENC GPU transcoding is required. The Lite image cannot enable GPU transcoding even if TRANSCODE_GPU=true is set.
Does Localtonet require router port forwarding for Fireshare?
No. Our client establishes an outbound connection to a Localtonet relay server. This workflow exposes the local HTTP service without inbound router port forwarding, firewall changes, VPN setup, or a public IP address.
Does creating a Localtonet tunnel make it active immediately?
No. Creating the tunnel saves its configuration, but the tunnel must also be started with the Start button. It remains available only while the tunnel is running and the selected Localtonet client device is connected.
Why does Fireshare need four volume mounts?
Fireshare separates its internal database at /data, generated metadata at /processed, source videos at /videos, and source images at /images. Mounting real host directories at these paths keeps the data outside the disposable container filesystem.
Can the Localtonet client run on a different machine from Fireshare?
Yes, provided that the client device can reach the Fireshare host and port. In that arrangement, configure the tunnel with the Fireshare machine's reachable network address. Do not use localhost, because it would refer to the separate Localtonet client machine.
Does Fireshare modify original videos when transcoding is enabled?
No. Fireshare generates additional lower-quality versions for adaptive streaming and leaves the original file unchanged. The original is still served directly, so it must use a supported container and encoding.
Is a private Fireshare link safe to publish publicly?
A private item is link-only and does not appear in the public feed, but possession of the direct URL may still provide access. Do not treat URL secrecy as strong authorization. Use password protection and other available account controls for content that requires stronger restrictions.
Share your verified Fireshare server with Localtonet
Once Fireshare works locally on port 8080, connect that HTTP endpoint to our platform, start the tunnel, and test the assigned public address from outside your local network.
Get Started Free โ