Добавить в корзинуПозвонить
Найти в Дзене

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-

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

 

И переходим в браузере по указанному адресу.

-2
-3
-4