node-file-manager-esm
Version:
A simple file manager, based on Koa and Angular.js. Standalone, Koa-mountable. Import-able as ES6 and Babel module.
196 lines (151 loc) • 8.82 kB
Markdown
# File Manager

File manager web server based on Node.js with Koa, Angular.js and Bootstrap, updated to use a recent Koa and be mount compatible and is rewritten to be an ECMAScript Module (or Babel). Has multi file upload. Reduced dependencies. Usable from cli.
Supported: ESM-importable, standalone, docker
# Usage
## koa app: how to mount
```js
import fm from 'node-file-manager-esm';
// see CLI params below: -d & -f & -mf & -m & -n (only -d is required)
let appFm = fm('/tmp/uploadpath', 'zip|txt|mp4', 'image/*', 300).app;
//mainApp.use(mount('/fm', appFm)); // could be mounted to path on another Koa App
appFm.listen(8080);
```
So we can use it as koa app, mounted within another koa instance.
## as Docker container
see [DockerHub - docker-node-filemanager-esm](https://hub.docker.com/r/bananaacid/docker-node-filemanager-esm)
## Standalone / CLI
Requires Node >= v10.5
We can run node-file-manager in terminal directly. The port add data root dir can be set by `-p` and `-d`, defaults to 5000 and current directory.
Then, we can view http://localhost:5000/ in our browser.
To make it available over the net, see below `Access it over the internet`.
**Instant start**: no installation required (linux, osx, win)
```shell
$ npx node-file-manager-esm --logging --open
```
*What it does: Show log (`--logging`) info the let you know whats going an and open the browser (`--open`) on the UI showing all files from the current folder*
**Instant start**: configure basics - no installation required (linux, osx, win)
```shell
$ npx node-file-manager-esm -p 8080 -d /path/to/show --logging --secure --user me:secret --open
```
**Install globally** and use on a folder
```shell
$ npm install -g node-file-manager-esm
$ node-file-manager-esm -p 8080 -d /path/to/show
```
**Use with port as environment variable** (Heroku, Linux, OSX, IIS: iisnode uses the port-env as well)
```shell
$ PORT=8080 node-file-manager-esm
\> set PORT=8080 && node-file-manager-esm
ps1> $PORT=8080 ; node-file-manager-esm
```
## Standalone on old versions of Node
**Or use ESM + Node >= v4**
Save it to local folder
```shell
$ git clone https://github.com/BananaAcid/node-file-manager-esm.git && cd node-file-manager-esm && npm i && npm i --only=dev
```
and Node > v8.9.0 & < v13
```shell
$ node --experimental-modules ./bin/node-file-manager-esm.mjs [...PARAMS]
```
or Node < v12
```shell
$ node -r esm ./bin/node-file-manager-esm.mjs [...PARAMS]
```
or Node >= v13
```shell
$ node ./bin/node-file-manager-esm.mjs [...PARAMS]
```
# Major changes in this fork
- updated to use a recent Koa
- be koa-mount compatible
- rewritten to be an ECMAScript Module (or Babel), works with both as well as the preferred `esm` module
- has Multi file upload
- reduced dependencies
- added support for big files (v3.2.0)
- upload progress and file updates for all connected clients (v3.2.0)
- max upload filesize (v3.2.0)
- handling of canceled files (v3.2.0)
- full standalone support (v3.2.0)
- relative paths support for `--directory` and `--secure` (v3.2.0)
- file renaming if error named file exists and alike (v3.3.1)
- adding users by commandline/env (v3.3.1)
- fixed env presented to docker to be FM_USER (v3.3.2)
- added compose file (v3.3.2)
- reducing docker image from 1GB to 211MB (v3.3.3)
# Note about ES6: ESM support
The `Michael Jackson Script` or `.mjs` (or` modular JS`) extension is used by NodeJs to detect ECMAScript Modules with the `--experimental-modules` flag in NodeJS prior to v13. Since Babel does have problems `import.meta`, the `esm` npm module is used to transpill the code for older node versions. See the files within the `./bin` folder.
# Standalone / CLI
The app can be started all by itself from the command line. You shoud set the `--directory`/`-d` to use and use the `--secure` option. As well as the `--logging` option.
```sh
npm install -g node-file-manager-esm
#example:
node-file-manager-esm -p 8080 -d /path/to/show --logging --secure /path/to/htpasswd
```
## CLI params
There are some configuration options for the commandline
- `-p` | `--port <int>` -- [5000] The server port to use
- `-d` | `--directory <string>` -- [current path] The path to provide the files from (realative path possible: `./data`)
- `-s` | `--secure <string>` -- [] Is off by default! Use BASIC-AUTH with the htpasswd of the path provided. [using just `-s` or `--secure` tries to use a `./htpasswd` file] (default if using as a module, login is adam:adam) (realative path possible: `./htpasswd`)
- `-u` | `--user <name:pw>` -- [] If `--secure` is used (or `FM_SECURE=true`), users can be added manually. `pw` can be a clear password or a password hash created by `htpasswd` (see below). It will ignore any htpasswd file from `--secure`. Using the commandline, use `--user adam:adam123 --user eve:eve123` Using the environment variable, use `FM_USER="adam:adam123\neve:eve123"`
- `-m` | `--maxsize <int>` -- [300] Set the max file size for uploads in MB
- `-l` | `--logging <string>` -- [] Output logging info [using just `-l` or `--logging` resolves to `--logging "*"` and can be set as environment variable with `DEBUG=fm:*` as well. `-l traffic` will only show `fm:traffic`] To see all possible output, set `DEBUG=*`
- `-f` | `--filter <string|null>` -- ["zip|tar.gz|7z|..."] Important files to filter for. The pattern is seperated by `|`. Example: zip|mp4|txt
- `-mf` | `--mimefilter <string>` -- ["video/*|audio/*|image/*"] Only for file selection upload dialog in the web interface. Example: `video/*|image/*`
- `-n` | `--name` .. ["File Manager"] Overwrite the web ui title
- `-v` | `--version` -- Show server version
- `-o` | `--open` -- Open the website to this service in browser, when the server started (localhost with selected port) - if `--port` ist not a pipe.
**Note**:
- If you got problems selecting any file type for upload, you could set `--filter ""` and `--mimefilter ""` to allow any file.
- For the password and especially a password hash, be aware of chars that have to be escaped on commandline (yes: windows, mac, linux need it)
## Environment variables
Fallback, if no param was used
- `FM_PORT` -- like `--port` -- if no port param was given, tries `FM_PORT` then `PORT`
- `FM_DIRECTORY` -- like `--directory`
- `FM_SECURE` -- like `--secure` -- to use `FM_USER` or `--user`, set `FM_SECURE=true`
- `FM_USER` -- like `--user` -- but multiple users seperated by `\n`
- `FM_MAXSIZE` -- like `--maxsize`
- `FM_LOGGING` -- like `--logging`
- `FM_FILTER` -- like `--filter`
- `FM_MIMEFILTER` -- like `--mimefilter`
- `FM_NAME` -- like `--name`
## HTTP Basic Auth
The app is protected with simple http basic auth, so it's recommended to use it just over TLS (HTTPS). Let's Encrypt is your friend. ;)
### Shortcut
Google for "online htpasswd generator". The more secure way is getting the required tools to generate a htpasswd file.
### Manually install password tool
If you use linux/mac you can simply use `htpasswd` comming with `apache2-utils` (on Debian/Ubuntu)
On Debian/Ubuntu do:
```shell
$ sudo apt-get update
$ sudo apt-get -y install apache2-utils
```
On Mac, it is included natively.
On Windows, it is included in XAMPP.
### Manually add a user
The following command creates a new `htpasswd` file in the current folder with the user `adam`. After creating a new file copy it into a parent folder of your data folder (in case of docker, into the `secure/` folder) or append the content of the new file to the existing one.
```bash
# new file:
htpasswd -c ./htpasswd adam
# add second
htpasswd ./htpasswd john
```
# Access it over the internet
## Quickly tunnel for free
After starting the tools, they provide you with a subdomain you can use in a browser from anywhere to access the server.
- [Localtunnel](https://localtunnel.github.io/www/)
- run `npx localtunnel -p 5000` and you got a temporary subdomain (naming he subdomain is possible as well)
- translates to https with working SSL Certificate
- has a warning first time connecting
- [ngrok.io](https://ngrok.com/)
- run `npx ngrok http 5000`
- has a 2h timelimit, can be paid for
- SSL Certificate is blocked in Chrome showing a bad warning, http tunnel works fine
- ... and others
## Port forwarding / Hosting at home
After setting this up, you are actually hosting the server "Dynamic DNS" style permanently at your device/PC.
- configure your router to forward port 80 from the outside to your device/PC to port 5000
- now it should be available using your internet IP
- you can add a free dynmic subdomain using [free.afraid.com](https://freedns.afraid.org/)
- in case you got a domain, you can add a subdomain and CNAME it to the freedns domain