Browsable web index of a shared folder with Directory Lister and Docker Compose.
Last updated: Oct 2026
Directory Lister turns a folder into a clean, searchable web page with file icons, README rendering and zip downloads. Use it to share ISOs, drivers or software with your household.
Why you'd want it: A read-only download page that is easier than SMB shares for guests and phones.
| Item | Value |
|---|---|
| Stack folder | /opt/stacks/directorylister |
| Category | Documents |
| Main image | directorylister/directorylister:latest |
| Services | 1 |
| Web UI | http://<SERVER_IP>:30005 |
| Official docs | https://docs.directorylister.com/ |
.env/.secret files from Docker Folders and Environment/srv/shareFolder layout:
/opt/stacks/
├── _shared/
│ ├── .env # shared, non-secret settings
│ └── .secret # passwords, tokens and keys (chmod 600, never commit)
└── directorylister/
└── compose.yaml
/opt/appdata/directorylister/ # persistent application data
/opt/stacks/directorylister/compose.yaml:
---
services:
directory-lister:
image: directorylister/directorylister:latest
container_name: directorylister
hostname: directorylister
env_file:
- /opt/stacks/_shared/.env
- /opt/stacks/_shared/.secret
environment:
- APP_LANGUAGE=en
- DISPLAY_READMES=true
- READMES_FIRST=true
- ZIP_DOWNLOADS=true
- SORT_ORDER=type
- REVERSE_SORT=false
- SITE_TITLE=share
- EXCLUDE_FILES=@eaDir
logging:
driver: json-file
options:
max-file: ${DOCKERLOGGING_MAXFILE:-10} # Max number of log files
max-size: ${DOCKERLOGGING_MAXSIZE:-200k} # Max file size
# Refer to Directory Lister's configuration documentation for more environment variables.
ports:
- 30005:80 # Replace <host_port> with the port you want to expose Directory Lister on your host
volumes:
- /etc/localtime:/etc/localtime:ro
- /srv/share:/data
restart: unless-stopped
Compose reads these from the shared files with --env-file. Replace every <PLACEHOLDER> with your own value.
/opt/stacks/_shared/.env:
PUID=1000
PGID=1000
TZ=<TZ>
DOCKERLOGGING_MAXFILE=10
DOCKERLOGGING_MAXSIZE=200k
| Variable | File | Purpose | Example |
|---|---|---|---|
PUID |
.env |
User ID the container runs as (see Docker Folders) | 1000 |
PGID |
.env |
Group ID the container runs as | 1000 |
TZ |
.env |
Time zone in tz database format, e.g. America/New_York | <TZ> |
DOCKERLOGGING_MAXFILE |
.env |
Number of rotated container log files to keep | 10 |
DOCKERLOGGING_MAXSIZE |
.env |
Maximum size of each container log file | 200k |
| Host port | Container port | Protocol | Service | Purpose |
|---|---|---|---|---|
| 30005 | 80 | tcp | directory-lister |
Replace <host_port> with the port you want to expose Directory Lister on your host |
| Host path | Container path | Service | Purpose |
|---|---|---|---|
/etc/localtime |
/etc/localtime |
directory-lister |
Host time zone (read-only) |
/srv/share |
/data |
directory-lister |
Application data |
No limits are set. This app is light, so add deploy.resources.limits only if you need to cap it.
sudo mkdir -p /opt/stacks/directorylister /opt/appdata/directorylister
sudo chown -R $USER: /opt/stacks/directorylister
/opt/stacks/_shared/.env and /opt/stacks/_shared/.secret (chmod 600 .secret)./opt/stacks/directorylister/compose.yaml.cd /opt/stacks/directorylister
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret config --quiet
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret up -d
docker compose logs -f./srv/share and open http://<SERVER_IP>:30005.README.md to any folder to show it above the listing.Tip: create a small wrapper such as
alias dc='docker compose --env-file /opt/stacks/_shared/.env --env-file /opt/stacks/_shared/.secret'so every stack uses the same env files.
cd /opt/stacks/directorylister
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret pull
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret up -d
docker image prune -f
Back up /opt/appdata/directorylister before major upgrades. Watchtower can automate updates for stateless apps.
docker compose ps and docker compose logs --tail=100.@eaDir folders visible: keep EXCLUDE_FILES=@eaDir.:ro) if nobody should change files through it.:?err): run the config command above to see which variable is not set in your env files.Educational example. Review every path, port and credential before you deploy, and never publish your .secret file.