From 717894d8c53c0f55ab7e70e9dea6002751c1605d Mon Sep 17 00:00:00 2001 From: Evan Steinkerchner Date: Sun, 20 Mar 2022 20:19:49 -0400 Subject: [PATCH] Initial draft of new docs UI usuing MkDocs --- .gitignore | 8 +- docs/images/logo.png | Bin 0 -> 37168 bytes docs/{ => images}/screenshot.png | Bin docs/index.md | 122 +++++++++++++++++++++++++++++++ docs/stylesheets/styles.css | 7 ++ mkdocs.yml | 81 ++++++++++++++++++++ 6 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 docs/images/logo.png rename docs/{ => images}/screenshot.png (100%) create mode 100644 docs/index.md create mode 100644 docs/stylesheets/styles.css create mode 100644 mkdocs.yml diff --git a/.gitignore b/.gitignore index ee51c88..d2cfd08 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,10 @@ yarn-error.log* # App configuration config.yml -.drone.yml \ No newline at end of file +.drone.yml + +# Python venv +venv + +# MkDocs +site diff --git a/docs/images/logo.png b/docs/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e088a4aa30896cffd3310fbf7b11ce13b3343295 GIT binary patch literal 37168 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 + Homer's donut +

Homer

+ + +

+ A dead simple static HOMepage for your servER to keep + your services on hand, from a simple yaml configuration file. +

+ +
+ +## Demo + +[![Demo](images/screenshot.png)](https://homer-demo.netlify.app) +[Check out the demo!](https://homer-demo.netlify.app) + +## Features + +- [yaml](http://yaml.org/) file configuration +- Installable (pwa) +- Search +- Grouping +- Theme customization +- Offline health check +- keyboard shortcuts: + - `/` Start searching. + - `Escape` Stop searching. + - `Enter` Open the first matching result (respects the bookmark's `_target` property). + - `Alt`/`Option` + `Enter` Open the first matching result in a new tab. + +## Getting started + +Homer is a full static html/js dashboard, generated from the source in `/src` using webpack. It's meant to be served by an HTTP server, **it will not work if you open dist/index.html directly over file:// protocol**. + +See [documentation](docs/configuration.md) for information about the configuration (`assets/config.yml`) options. + +### Using docker + +To launch container: + +```sh +docker run -d \ + -p 8080:8080 \ + -v :/www/assets \ + --restart=always \ + b4bz/homer:latest +``` + +Default assets will be automatically installed in the `/www/assets` directory. Use `UID` and/or `GID` env var to change the assets owner (`docker run -e "UID=1000" -e "GID=1000" [...]`). + +### Using docker-compose + +The `docker-compose.yml` file must be edited to match your needs. +Set the port and volume (equivalent to `-p` and `-v` arguments): + +```yaml +volumes: + - /your/local/assets/:/www/assets +ports: + - 8080:8080 +``` + +To launch container: + +```sh +cd /path/to/docker-compose.yml +docker-compose up -d +``` + +Default assets will be automatically installed in the `/www/assets` directory. Use `UID` and/or `GID` env var to change the assets owner, also in `docker-compose.yml`: + +```yaml +environment: + - UID=1000 + - GID=1000 +``` + +### Using the release tarball (prebuilt, ready to use) + +Download and extract the latest release (`homer.zip`) from the [release page](https://github.com/bastienwirtz/homer/releases), rename the `assets/config.yml.dist` file to `assets/config.yml`, and put it behind a web server. + +```sh +wget https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip +unzip homer.zip +cd homer +cp assets/config.yml.dist assets/config.yml +npx serve # or python -m http.server 8010 or apache, nginx ... +``` + +### Build manually + +```sh +# Using yarn (recommended) +yarn install +yarn build + +# **OR** Using npm +npm install +npm run build +``` + +Then your dashboard is ready to use in the `/dist` directory. diff --git a/docs/stylesheets/styles.css b/docs/stylesheets/styles.css new file mode 100644 index 0000000..e1e1a3e --- /dev/null +++ b/docs/stylesheets/styles.css @@ -0,0 +1,7 @@ +.centered { + text-align: center; +} + +.bold { + font-weight: bold; +} \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..58e37c3 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,81 @@ +# Project information +site_name: Homer +site_url: https://bastienwirtz.github.io/homer/ + +# Repository +repo_name: bastienwirtz/homer +repo_url: https://github.com/bastienwirtz/homer +edit_uri: "" + +# Stylesheet +extra_css: + - stylesheets/styles.css + +# Theme +theme: + logo: images/logo.png + name: material + palette: + - media: "(prefers-color-scheme: light)" + scheme: default + primary: blue + accent: blue + toggle: + icon: material/brightness-4 + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: blue + accent: blue + toggle: + icon: material/brightness-7 + name: Switch to light mode + features: + - content.code.annotate + - navigation.indexes + - navigation.sections + - navigation.top + - navigation.tracking + - search.highlight + - search.share + - search.suggest + - toc.follow + +# Copyright - name for footer text +copyright: Homer dashboard + +# Socials +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/bastienwirtz/homer + - icon: fontawesome/brands/gitter + link: https://gitter.im/homer-dashboard/community + - icon: fontawesome/brands/docker + link: https://hub.docker.com/r/b4bz/homer + +# Extensions +markdown_extensions: + - abbr + - admonition + - attr_list + - def_list + - footnotes + - meta + - md_in_html + - toc: + permalink: true + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + +# Page tree +nav: + - Home: index.md + - Configuration: configuration.md + - Custom services: customservices.md + - Tips & tricks: tips-and-tricks.md + - Development: development.md + - Troubleshooting: troubleshooting.md -- 2.41.0