TGViewer
Записки IT специалиста Записки IT специалиста @interface31 · 8.99K subscribers
Post #6213 2.78K
TinyFileManager – простой и эффективный файловый веб-менеджер
 
В современных условиях часто встает вопрос удобного предоставления доступа к файлам самых разнообразных пользователей, в том числе мобильных и удаленных. Протокол 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

 
И переходим в браузере по указанному адресу.
  • 👍 30
More from @interface31
  1. Sep 27, 2026Post #6797
  2. Sep 26, 2026Популярные мифы про Docker Встречался третьего дня с одним коллегой, у того серьезная голо…
  3. Sep 26, 2026Про РКН и MikroTik Новость эту не обсуждает только ленивый. Причем, как водится, многие пе…
  4. Sep 26, 2026Post #6794
  5. Sep 25, 2026Десктопный стриптиз Очень часто во многих технических сообществах возникают флешмобы – а д…
  6. Sep 25, 2026Не застревайте в прошлом — учитесь новым навыкам и ИИ Чтобы успевать за требованиями рынка…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →