В современных условиях часто встает вопрос удобного предоставления доступа к файлам самых разнообразных пользователей, в том числе мобильных и удаленных. Протокол SMB для этой задачи не самая лучшая идея, а создавать дублирующие хранилища наподобие Nextcloud избыточно.
Для такого случая может пригодиться TinyFileManager – простой файловый веб-менеджер в виде единственного PHP-файла. Но разработчик, судя по всему, сосредоточился именно на развитии самого скрипта, а подходы к созданию Docker-образа мягко скажем сомнительны. Поэтому образ мы будем собирать самостоятельно.
Общая структура проекта:
/opt/tinyfm/
├── Caddyfile
├── config.php
├── php-session.ini
├── docker-compose.yml
├── Dockerfile
└── data/
Dockerfile
FROM php:8.3-fpm-alpine
WORKDIR /var/www/html
RUN apk add --no-cache \
libzip-dev \
libpng-dev \
libjpeg-turbo-dev \
freetype-dev \
oniguruma-dev \
bzip2-dev \
curl \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install zip gd mbstring bz2
RUN curl -L -o index.php https://raw.githubusercontent.com/prasathmani/tinyfilemanager/master/tinyfilemanager.php \
&& chown -R www-data:www-data /var/www/html
docker-compose.yml
services:
tinyfilemanager:
build: .
container_name: tinyfilemanager
restart: unless-stopped
user: "82:82"
volumes:
- app_code:/var/www/html
- ./data:/var/www/html/data
- ./config.php:/var/www/html/config.php:ro
- ./php-session.ini:/usr/local/etc/php/conf.d/session.ini:ro
tmpfs:
- /tmp:uid=82,gid=82,mode=1777
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
caddy:
image: caddy:2-alpine
container_name: tinyfm-caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- app_code:/var/www/html:ro
- ./data:/var/www/html/data:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- tinyfilemanager
volumes:
app_code:
caddy_data:
caddy_config:
Caddyfile
files.example.com {
#tls internal
encode gzip zstd
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options nosniff
X-Frame-Options DENY
Referrer-Policy no-referrer
}
root * /var/www/html
php_fastcgi tinyfilemanager:9000
file_server
}php-session.ini
session.gc_maxlifetime = 300
session.cookie_lifetime = 300
session.use_strict_mode = 1
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = Lax
session.save_path = "/tmp"
config.php
<?php
$root_path = '/var/www/html/data';
$root_url = 'data';
$http_host = $_SERVER['HTTP_HOST'];
$use_auth = true;
$auth_users = array(
'admin' => '$2y$10$/K.hjNr84lLNDt8fTXjoI.DBp6PpeyoJ.mGwrrLuCZfAwfSAGqhOW', //admin@123
'user' => '$2y$10$Fg6Dz8oH9fPoZ2jJan5tZuv6Z4Kp7avtQ9bDfrdRntXtPeiMAZyGO', //12345
'guest' => '$2y$10$a.DMI5sRjAnvhb.8rFAXY.XPSEO/eatVb4qCMmTc2YcxTDKp9xMyC' //guest
);
$readonly_users = array(
'guest'
);
$exclude_items = array(
'.htaccess',
'.env',
'docker-compose.yml',
'Caddyfile',
'php-session.ini',
'config.php',
'.git',
'.DS_Store',
'..',
'.'
);
$online_viewer = false;
$default_timezone = 'Europe/Moscow';
После чего создаем директорию для хранения файлов и устанавливаем на нее нужные права:
mkdir -p /opt/tinyfm/data
chown -R 82:82 /opt/tinyfm/data
И сгенерируем хеши паролей реальным пользователям:
docker run --rm php:8.3-alpine php -r "echo password_hash('мой_пароль', PASSWORD_BCRYPT) . PHP_EOL;"Обратите внимание, пользователи бывают двух типов, с правами загружать файлы и правами только на чтение.
Запускаем проект:
docker compose up -d -–build
И переходим в браузере по указанному адресу.



