Compare commits

..

No commits in common. "ffe01df8423be53aa72e17ae63cc56602205862c" and "857b427155a9b6df463aba45d1e40b6f87980104" have entirely different histories.

17 changed files with 152 additions and 192 deletions

View file

@ -1,28 +0,0 @@
name: Publish Docker rootless image
on:
workflow_dispatch:
push:
branches: [master]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Docker Login
uses: docker/login-action@v1.12.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker rootless image
uses: docker/build-push-action@v2.9.0
with:
context: .
push: true
file: Dockerfile-rootless
tags: mohamnag/nginx-file-browser:latest-rootless

View file

@ -1,27 +0,0 @@
name: Publish Docker image
on:
workflow_dispatch:
push:
branches: [master]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Docker Login
uses: docker/login-action@v1.12.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v2.9.0
with:
context: .
push: true
tags: mohamnag/nginx-file-browser:latest

2
.gitignore vendored
View file

@ -4,7 +4,7 @@
*.iml
## Directory-based project format:
.idea/
#.idea/
# if you remove the above rule, at least ignore the following:
# User-specific stuff:

View file

@ -3,7 +3,6 @@
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/file-browser.iml" filepath="$PROJECT_DIR$/.idea/file-browser.iml" />
<module fileurl="file://$PROJECT_DIR$/nginx-file-browser.iml" filepath="$PROJECT_DIR$/nginx-file-browser.iml" />
</modules>
</component>
</project>

View file

@ -1,6 +1,6 @@
FROM nginx:alpine
FROM nginx
LABEL author="Mohammad Naghavi <mohamnag@gmail.com>"
MAINTAINER Mohammad Naghavi <mohamnag@gmail.com>
ADD default.conf /etc/nginx/conf.d/default.conf
ADD css/ /opt/www/file-browser/css/

View file

@ -1,12 +0,0 @@
FROM nginxinc/nginx-unprivileged:stable-alpine
LABEL author="Mohammad Naghavi <mohamnag@gmail.com>"
ADD default-rootless.conf /etc/nginx/conf.d/default.conf
ADD css/ /opt/www/file-browser/css/
ADD image/ /opt/www/file-browser/image/
ADD js/ /opt/www/file-browser/js/
ADD index.html /opt/www/file-browser/
VOLUME /opt/www/files/
EXPOSE 8080

View file

@ -3,8 +3,7 @@
This web application is a very simple file browser which can be used
effectively together with [nginx's autoindex module](http://nginx.org/en/docs/http/ngx_http_autoindex_module.html).
![nginx file browser in action - light theme](assets/screenshot-light.jpg)
![nginx file browser in action - light theme](assets/screenshot-dark.jpg)
![nginx file browser in action](assets/Screen-Shot-1.jpg)
A sample nginx configuration is also included which mounts **file browser** under root (`/`) and mounts files to be listed under `/files` path. Hence is the `filesBaseUrl` under
@ -12,17 +11,12 @@ A sample nginx configuration is also included which mounts **file browser** unde
Mainly for demonstration purposes a docker image is also available [here](https://hub.docker.com/r/mohamnag/nginx-file-browser/).
In order to use this docker image, the volume which has to be served should
be mounted under `/opt/www/files/` and port `80` (root) or `8080` (rootless)) of container shall be mapped
be mounted under `/opt/www/files/` and port `80` of container shall be mapped
to a proper port on host. A proper run would look like:
root
```
$ docker run -p 8080:80 -v /path/to/my/files/:/opt/www/files/ mohamnag/nginx-file-browser
```
rootless:
```
$ docker run -p 8080:8080 -v /path/to/my/files/:/opt/www/files/ mohamnag/nginx-file-browser
```
With container up and running you can point your browser to IP of docker host with given port to view the files. For example with above run command assuming docker host having IP with `192.168.0.200` we have to navigate to this URL:
@ -46,3 +40,8 @@ shall be changed to
```
And the mounting point is now `/home/myuser/files-to-serve/` instead of `/opt/www/files/`.
## Gruvbox theme
A gruvbox theme is present in the css. You can use it by editing line 12 of the index.html. Simply change the link from `css/main.css` to `css/main-gruvbox.css`
This theme is heavily inspired from iTerm2 color scheme that can be found here: [link](https://github.com/herrbischoff/iterm2-gruvbox)

BIN
assets/Screen-Shot-1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
assets/Screen-Shot-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

124
css/main-gruvbox.css Normal file
View file

@ -0,0 +1,124 @@
body {
background-color: #252525;
}
body > .container:first-child {
margin: 3rem auto 0;
}
h1 {
color: #9dd08e;
}
a {
text-decoration: none;
color: #549699;
}
a.file-name {
color: #ecdbb2;
}
.list-sort {
background: #413e3d;
border-radius: 1rem;
padding: 1.5rem 2rem .5rem;
color: #ecdbb2;
}
input[name="sort"] {
accent-color: #fe6142;
}
.list-sort label {
display: inline-block;
margin: 0 1rem 0 0;
}
.file-list {
list-style: none;
}
.file-list li {
margin: 1rem 0;
}
.file-list .file-name {
line-height: 4rem;
display: inline-block;
position: relative;
padding-left: 4rem;
}
.file-list .file-name::before {
background: no-repeat center center;
background-size: contain;
width: 3rem;
content: "";
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
}
.file-list .directory .file-name::before {
background-image: url(../image/directory.png);
}
.file-list .file .file-name::before {
background-image: url(../image/file.png);
}
.file-list .other .file-name::before {
background-image: url(../image/other.png);
}
.file-list .parent .file-name::before {
background-image: url(../image/parent.png);
}
.file-list .file-link {
}
.file-list .file-date {
padding: .25rem .5rem;
background: #549699;
border-radius: .5rem;
font-size: 70%;
margin: 0 .5rem;
color: #ecdbb2;
}
.file-list .directory .file-date {
}
.file-list .parent .file-date {
display: none;
}
.file-list .file-size {
padding: .25rem .5rem;
background: #79aa7d;
border-radius: .5rem;
font-size: 70%;
margin: 0 .5rem;
color: #ecdbb2;
}
.file-list .other .file-size,
.file-list .parent .file-size,
.file-list .directory .file-size {
display: none;
}
footer {
text-align: center;
}
footer small + small {
margin-left: 2rem;
}

View file

@ -7,19 +7,15 @@ a {
text-decoration: none;
}
.controls {
.list-sort {
background: #ddd;
border-radius: 1rem;
padding: 1.5rem 2rem .5rem;
}
.controls span:not(:first-of-type) {
padding-left: 4rem;
}
.controls label {
.list-sort label {
display: inline-block;
margin: 0 0 0 .5rem;
margin: 0 1rem 0 0;
}
.file-list {
@ -107,44 +103,4 @@ footer {
footer small + small {
margin-left: 2rem;
}
/*
Start of alternations for dark theme
*/
body.dark {
background-color: #252525;
color: #ecdbb2;
}
body.dark h1 {
color: #9dd08e;
}
body.dark a {
color: #549699;
}
body.dark a.file-name {
color: #ecdbb2;
}
body.dark .controls {
background: #413e3d;
color: #ecdbb2;
}
body.dark input[name="sort"] {
accent-color: #fe6142;
}
body.dark .file-list .file-date {
background: #549699;
color: #ecdbb2;
}
body.dark .file-list .file-size {
background: #79aa7d;
color: #ecdbb2;
}

View file

@ -1,26 +0,0 @@
server {
listen 8080;
server_name localhost;
root /opt/www/;
index index.html index.htm;
location /files/ {
alias /opt/www/files/;
index ___i; # we really need no index here, just listing files
autoindex on;
autoindex_format json;
disable_symlinks off;
}
location / {
root /opt/www/file-browser/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

View file

@ -20,8 +20,8 @@
<div class="container">
<h1>File Browser</h1>
<div class="controls">
<span>sort list by:</span>
<div class="list-sort">
<span>sort list by</span>
<label>
date
<input type="radio" name="sort" value="date" checked>
@ -34,16 +34,6 @@
size
<input type="radio" name="sort" value="size">
</label>
<span>theme:</span>
<label>
light
<input type="radio" name="theme" value="" checked>
</label>
<label>
dark
<input type="radio" name="theme" value="dark">
</label>
</div>
<ul id="file-list" class="file-list">
@ -59,12 +49,14 @@
<footer>
<div class="container">
<small>
<a href="https://github.com/mohamnag/nginx-file-browser">nginx file browser</a>
<a href="https://github.com/mohamnag/nginx-file-browser">nginx file browser</a> by
<a href="http://naghavi.me">Mohammad Naghavi</a>
</small>
<small>
icons by <a href="http://www.freepik.com" title="Freepik">Freepik</a>
from <a href="http://www.flaticon.com" title="Flaticon">flaticon.com</a>
icons by <a href="http://www.freepik.com" title="Freepik">Freepik</a> from <a
href="http://www.flaticon.com"
title="Flaticon">flaticon.com</a>
</small>
</div>
</footer>

View file

@ -6,24 +6,19 @@
* * NOTICE:
* If your nginx config varies from the default config
* provided in this code, you probably need to change
* value of filesBaseUrl here too.
* value of filesBaseUrl on top of this module too.
*
* Created by mohamnag on 11/02/16.
*/
$(document).ready(function () {
function applyTheme() {
var theme = $('input[name=theme]:checked').val()
var filesBaseUrl = "/files";
console.log(`setting theme to '${theme}'`)
$('body')
.removeClass()
.addClass(theme)
localStorage.setItem("theme", theme)
}
var fileListElement = $("#file-list");
var fileItemElementTemplate = fileListElement.find("li").detach();
function renderFileElement(directory, fileName, fileType, fileSize, fileDate) {
@ -208,26 +203,14 @@ $(document).ready(function () {
}
var isNavigating = false;
function navigateToUrlLocation() {
var requestedPath = window.location.hash;
var startPath = requestedPath ? requestedPath.substr(1) : "/";
navigateTo(startPath);
}
var filesBaseUrl = "/files";
var isNavigating = false;
var fileListElement = $("#file-list");
var fileItemElementTemplate = fileListElement.find("li").detach();
// setup theme switching
$('input[name=theme]').on("change", applyTheme);
// apply current theme
var theme = localStorage.getItem("theme")
console.log(`theme '${theme}' loaded`)
$(`input[name=theme][value='${theme}']`).prop('checked', true)
applyTheme()
window.onpopstate = function () {
if (!isNavigating) {
navigateToUrlLocation();