dashy/README.md
2021-07-29 17:58:43 +01:00

37 KiB

Dashy

Dashy helps you organize your self-hosted services, by making them all accessible from a single place

Awesome Self-Hosted Docker Pulls Stars GitHub Status License MIT Current Version Known Vulnerabilities

Features 🌈

  • Instant search by name, domain and tags - just start typing
  • Full customizable keyboard shortcuts for navigation, filtering and launching apps
  • Multiple built-in color themes, with UI color configurator and support for custom CSS
  • Easy to customize every part of your dashboard, layout, icon sizes, behavior and colors etc
  • Many options for icons, including Font-Awesome support, auto-fetching service favicon, images and emojis
  • Option to show service status for each of your apps / links, for basic availability and uptime monitoring
  • Multiple ways of opening apps, either in your browser, a pop-up modal or workspace view
  • Option for full-screen background image, custom nav-bar links, html footer, title, and more
  • Encrypted cloud backup and restore feature available
  • Optional authentication, requiring admins and non-privileged users to log in
  • Easy single-file YAML-based configuration, which can also be configured directly through the UI
  • Small bundle size, fully responsive UI and PWA makes the app easy to use on any device
  • Easy to setup with Docker, or on bare metal, or with 1-Click cloud deployment
  • Multi-language support, with additional languages coming soon
  • Plus lots more...

Demo

For more examples of Dashy in action, see: The Showcase

Live Demos

Demo 1Demo 2Demo 3

Spin up your own Demo

  • 1-Click Deploy: One-Click Deploy with PWD
  • Or on your own machine: docker run -p 8080:80 lissy93/dashy

Recording

Demo

User Showcase

Are using Dashy? Want to share your dashboard here too - Submit your Screenshots to the Showcase!

Screenshots

⬆️ Back to Top


Getting Started 🛫

For full setup instructions, see: Deployment

Deploying from Docker Hub 🐳

You will need Docker installed on your system

docker run -p 8080:80 lissy93/dashy

Or

docker run -d \
  -p 4000:80 \
  -v /root/my-local-conf.yml:/app/public/conf.yml \
  --name my-dashboard \
  --restart=always \
  lissy93/dashy:latest

If you prefer to use Docker Compose, here is an example. You can also build the Docker container from source, by cloning the repo, cd'ing into it and running docker build . and docker compose up.

Once you've got Dashy running, you can take a look at App Management Docs, for info on using health checks, provisioning assets, configuring web servers, securing your app, logs, performance and more.

Deploying from Source 🚀

You will need both git and the latest or LTS version of Node.js installed on your system

  • Get Code: git clone git@github.com:Lissy93/dashy.git and cd dashy
  • Configuration: Fill in you're settings in ./public/conf.yml
  • Install dependencies: yarn
  • Build: yarn build
  • Run: yarn start

See docs Full list of Dashy's commands

Deploy to the Cloud ☁️

Dashy supports 1-Click deployments on several popular cloud platforms. To spin up a new instance, just click a link below:

⬆️ Back to Top


Configuring 🔧

For full configuration documentation, see: Configuring

All of Dashy's configuration is specified in a single YAML file, located at ./public/conf.yml (or ./app/public/conf.yml for Docker). You can find a complete list of available options in th Configuring Docs. If you're using Docker, you'll probably want to pass this file in as a Docker volume (e.g. -v /root/my-local-conf.yml:/app/public/conf.yml).

The config can also be edited directly through the UI, with changes written to your conf.yml file. After making any modifications the app does need to be rebuilt, this should happen automatically but you can also trigger a build with yarn build, docker exec -it [container-id] yarn build, or directly through the UI.

You can check that your config is correct and valid, by running: yarn validate-config. This will validate that your configuration matches Dashy's schema.

Finally, you may find these example config helpful for getting you started.

⬆️ Back to Top


Theming 🎨

For full theming documentation, see: Theming

Example Themes

Dashy comes with a number of built-in themes, but it's also easy to make you're own. All colors, and most other CSS properties are specified using CSS variables, which are documented here. This make modifying styles and customizing the look and feel of Dashy very easy.

You can select a theme, and customize it's colors directly through the UI. But it's also possible tp pass in external stylesheets and styles either in the config file (under appConfig.externalStyleSheet), or by mounting it to /app/src/styles/user-defined-themes.scss with Docker.

Example Themes

⬆️ Back to Top


Icons 🧸

For full iconography documentation, see: Icons

Both sections and items can have an icon associated with them, and defined under the icon attribute. There are many options for icons, including Font Awesome support, automatic fetching from favicon, programmatically generated icons and direct local or remote URLs.

  • Favicon: Set icon: favicon to fetch a services icon automatically from the URL of the corresponding application
  • Font-Awesome: To use any font-awesome icon, specify the category, followed by the icon name, e.g. fas fa-rocket or fab fa-monero. You can also use Pro icons if you have a license key, just set it under appConfig.fontAwesomeKey
  • Generative: Setting icon: generative, will generate a unique for a given service, based on it's URL or IP
  • Emoji: Use an emoji as a tile icon, by putting the emoji's code as the icon attribute. Emojis can be specified either as emojis (🚀), unicode ('U+1F680') or shortcode (':rocket:').
  • URL: You can also pass in a URL to an icon asset, hosted either locally or using any CDN service. E.g. icon: https://i.ibb.co/710B3Yc/space-invader-x256.png.
  • Local Image: To use a local image, store it in ./public/item-icons/ (or create a volume in Docker: -v /local/image/directory:/app/public/item-icons/) , and reference it by name and extension - e.g. set icon: image.png to use ./public/item-icon/image.png. You can also use sub-folders here if you have a lot of icons, to keep them organized.

⬆️ Back to Top


Cloud Backup & Sync ☁

For full backup documentation, see: Cloud Backup & Sync

Dashy has an optional built-in feature for securely backing up your config to a hosted cloud service, and then restoring it on another instance. This feature is totally optional, and if you do not enable it, then Dashy will not make any external network requests.

This is useful not only for backing up your configuration off-site, but it also enables Dashy to be used without having write a YAML config file, and makes it possible to use a public hosted instance, without the need to self-host.

All data is encrypted before being sent to the backend. In Dashy, this is done in CloudBackup.js, using crypto.js's AES method, using the users chosen password as the key. The data is then sent to a Cloudflare worker (a platform for running serverless functions), and stored in a KV data store.

⬆️ Back to Top


Authentication 💂

For full authentication documentation, see: Authentication

Dashy has a built-in login feature, which can be used for basic access control. To enable this feature, add an auth attribute under appConfig, containing an array of users, each with a username, SHA-256 hashed password and optional user type.

appConfig:
  auth:
    - user: alicia
      hash: 4D1E58C90B3B94BCAD9848ECCACD6D2A8C9FBC5CA913304BBA5CDEAB36FEEFA3

At present, access control is handled on the frontend, and therefore in security-critical situations, it is recommended to use an alternate method for authentication, such as Authelia, a VPN or web server and firewall rules.

Example login screen, using Vapourwave theme

⬆️ Back to Top


Status Indicators 🚦

For full monitoring documentation, see: Status Indicators

Dashy has an optional feature that can display a small icon next to each of your running services, indicating it's current status. This is useful if you are using Dashy as your homelab's start page, as it gives you an overview of the health of each of your running services. Hovering over the indicator will show additional information, including average response time and an error message for services which are down.

By default, this feature is off, but you can enable it globally by setting appConfig.statusCheck: true, or enable/ disable it for an individual item, with item[n].statusCheck. You can also specify an time interval in seconds under appConfig.statusCheckInterval, which will determine how often to recheck services, if this value is 0, then status is only checked on initial page load, this is default behavior.

Status Checks demo

⬆️ Back to Top


Opening Methods 🖱️

One of the primary purposes of Dashy is to make launching commonly used apps and services as quick as possible. To aid in this, there are several different options on how items can be opened. You can configure your preference by setting the target property of any item, to one of the following values:

  • sametab - The app will be launched in the current tab
  • newtab - The app will be launched in a new tab
  • modal - Launch app in a resizable/ movable popup modal on the current page
  • workspace - Changes to Workspace view, and launches app

Even if the target is not set (or is set to sametab), you can still launch any given app in an alternative method: Alt + Click will open the modal, and Ctrl + Click will open in a new tab. You can also right-click on any item to see all options (as seen in the screenshot below). This custom context menu can be disabled by setting appConfig.disableContextMenu: true.

The modal and workspace views work by rendering the target application in an iframe. For this to work, the HTTP response header X-Frame-Options for a given application needs to be set to ALLOW. If you are getting a Refused to Connect error then this header is set to DENY (or SAMEORIGIN and it's on a different host).

Here's a quick demo of the workspace view:

Workspace view demo

⬆️ Back to Top


Searching and Shortcuts 🔎

Quickly finding and launching applications is the primary aim of Dashy. To that end instant search and customizable keyboard shortcuts are built-in.

To start filtering, just start typing. No need to select the search bar or use any special key. You can then use either the tab key or arrow keys to select and move between results, and hit enter to launch the currently selected application. You can also use Alt + Enter on a selected app to launch it in a popup modal, Ctrl + Enter to open in new tab, or right-click on it to see all opening methods.

For apps that you use regularly, you can set a custom keybinding. Use the hotkey parameter on a certain item to specify a numeric key, between 0 - 9. You can then launch that app, by just pressing that key, which is very useful for services you use frequently.

Example:

- title: Bookstack
  icon: far fa-books
  url: https://bookstack.local/
  hotkey: 8

Hit Esc at anytime to close any open apps, clear the search field, or hide any modals.

⬆️ Back to Top


Config Editor ⚙️

From the Settings Menu in Dashy, you can download, backup, edit and rest your config. An interactive editor makes editing the config file easy, it will tell you if you've got any errors. After making your changes, you can either apply them locally, or export into your main config file. After saving to the config file to the disk, the app will need to be rebuilt. This will happen automatically, but may take a few minutes. You can also manually trigger a rebuild from the Settings Menu. A full list of available config options can be found here. It's recommend to make a backup of your configuration, as you can then restore it into a new instance of Dashy, without having to set it up again. json2yaml is very useful for converting between YAML to JSON and visa versa.

Workspace view demo

⬆️ Back to Top


Language Switching 🌎

Dashy has the ability to support multiple languages and locales. When available, you're language should be automatically detected and applied on load, based on your browser or systems settings. But you can also select a language through the UI, under Config --> Switch Language.

Alternatively, set you're language in the config file, under appConfig.language. The language must be specified as either a 2-digit ISO 639-1 code (such as en), or where available, the 2-digit code followed by a region or dialect (e.g. en-GB).

Supported Languages

  • 🇬🇧 English: en

Add your Language

I would love for Dashy to be available and comfortable to use for all, including non-native English speakers. If you speak another language, and have a few minutes to sapir, you're help with translating it would be very much appreciated. There's not too much text to translate, and it's all located in a single JSON file, and you don't have to translate it all, as any missing items will just fallback to English. For more info, see the Development Guides Docs, and feel free to reach out if you need any support.


Sections & Items 🗃️

Dashy is made up of a series of sections, each containing a series of items.

Section Features

  • Basics: Each section must have a name and an array of items. Sections can also have an icon e.g. icon: :rocket:. This works the same way as item icons, so you can use Font Awesome, static images, emojis, etc.
  • Collapsing: A section an be collapsed by clicking on it's name, useful for particularly long or less frequently used sections. Collapse state is remembered for next time you load the page, and you can also set displayData.collapsed: true on a given section.
  • Size: You can change the size of a given section, by for example setting displayData.cols: 2 to make a given section span 2 columns/ be double the width. Similarly displayData.rows can be used to set the height of a section by making is span more than rows. By default each of these properties are set to 1
  • Grid Settings: Within a given section, you can change how many items are displayed on each row or column, with displayData.itemCountX for horizontal count, and displayData.itemCountY for vertical count.
  • Colors: You can give a custom color to a certain section with displayData.color, or pass other styles with displayData.customStyles
  • Layout: From the UI, you can also choose a layout, either grid, horizontal or vertical, as well as set the size for items, either small, medium or large, and of course set a theme using the dropdown.
  • For full list of section display options, see section.displayData docs.

Item Features

  • Basics: Items can have a title, description, URL and icon.
  • Key Binding: You can assign frequently used items a hotkey/ shortcut as a number, to quickly launch that app. E.g. if hotkey: 6, then pressing the number 6 will launch that application.
  • Opening Method: Setting the target attribute will define how an item should be opened by default (either newtab, sametab, modal or workspace), or you can right-click on any item to see all options.
  • Status Checking: Setting statusCheck: true will show a small traffic light next to that item, indicating weather the service is currently up/ online. You can also use a custom URL for status checks, with statusCheckUrl or pass some custom headers with statusCheckHeaders.
  • Color: To change the text color of an item, use color, and backgroundColor for background.
  • For full list of all item options, see section.item docs

⬆️ Back to Top


Setting Dashboard Info 🌳

Page settings are defined under pageInfo. Here you can set things like title, sub-title, navigation links, footer text, etc

Custom links for the navigation menu are defined under pageInfo.navLinks.

You can display either custom text or HTML in the footer, using the pageInfo.footerText attribute.

To display a logo or image asset next to the title, set pageInfo.logo to the path to your picture (either local or remote).

It's also possible to hide parts of the page that you do not need (e.g. navbar, footer, search, heading, etc). This is done using the appConfig.hideComponents attribute.

For example, a pageInfo section might look something like this:

pageInfo:
  title: Home Lab
  description: Dashy
  navLinks:
  - title: Home
    path: /
  - title: Server Monitoring
    path: https://server-start.local
  - title: Start Page
    path: https://start-page.local
  footerText: 'My <b>Awesome</b> Dashboard. Built with <a href="https://dashy.to">Dashy</a>'

⬆️ Back to Top


Support 👨‍👩‍👦

Getting Help 🙋‍♀️

For general discussions, check out the Discussions Board

If you're having trouble getting things up and running, feel free to ask a question. The best way to do so is in the discussion, or if you think you think the issue is on Dashy's side, you can raise a ticket. It's best to check the docs and previous questions first, as you'll likley find the solution there.

Raising Issues 🐛

Found a bug, or something that isn't working as you'd expect? Please raise it as an issue so that it can be resolved. Feature requests are also welcome. Similarlty, feedback is very useful, as it helps me know what areas of Dashy need some improvement.

Supporting Dashy 💖

For full details, and other ways you can help out, see: Contributing

If you're using Dashy, and would like to help support it's development, then that would be awesome! Contributions of any type, however small are always very much appreciated, and you will be appropriatley credited for your effort.

Several areas that we need a bit of help with at the moment are:

  • Adding translations - If you speak a second language, help make Dashy availible to non-native English speakers by adding text for you're language
  • Donate a small amount, by Sponsoring @Lissy93 on GitHub (only if you can afford to), and you'll also recieve some extra perks!
  • Community Engagement: Join the discussion, and help answer other users questions, or spread the word by sharing Dashy online or leaving a review / upvote.
  • Share your dashboard in the Showcase, to help provide inspiration for others
  • Submit a PR, to add a new feature, fix a bug, update the docs, add a theme or something else

Sponsor Lissy93 on GitHub

Credits 🏆

For a full list of credits, and attributions to packages used within Dashy, see: Credits

Thank you so much to everyone who has helped with Dashy so far, every single contributuib is very much appreciated.

Sponsors

Contributors Auto-generated contributors

Packages

Developing 🧱

For full development documentation, see: Developing

To set up the development environment:

  1. Get Code: git clone git@github.com:Lissy93/dashy.git and cd dashy
  2. Install dependencies: yarn
  3. Start dev server: yarn dev

Hot reload is enabled, so changes will be automatically detected, compiled and refreshed.

Like most Git repos, we are following the Github Flow standard.

  1. Create a branch (or fork if you're not a collaborator)
  2. Code some awesome stuff, then add and commit your changes
  3. Create a Pull Request, complete the checklist and ensure the build succeeds
  4. Follow up with any reviews on your code
  5. Merge 🎉

Branch names are specified in the following format: [TYPE]/[TICKET]_[TITLE]. E.g. FEATURE/420_Awesome-feature or FIX/690_login-server-error.

Most commits have been using git commit emojis, see gitmoji.dev for what each emoji indicates.

Before you submit your pull request, please ensure you've checked off all the boxes in the template. For your PR to be merged, it must:

  • Must be backwards compatible
  • The build, lint and tests (run by GH actions) must pass
  • There must not be any merge conflicts

Repo Status: Open PRs Total PRs GitHub commit activity Last Commit Contributors

⬆️ Back to Top


Support 🙋‍♀️

For general discussions, the Discussions Board is now active!

If you've found a bug, or something that isn't working as you'd expect, please raise an issue, so that it can be resolved. Similarly, if you're having trouble getting things up and running, feel free to ask a question. Feature requests and feedback are also welcome, as it helps Dashy improve.

Issue Status Resolution Time Open Issues Closed Issues

For more general questions about any of the technologies used, StackOverflow may be more helpful first port of info

If you need to get in touch securely with the author (me, Alicia Sykes), drop me a message at:

⬆️ Back to Top


Documentation 📘

Running Dashy

  • Deployment - Getting Dashy up and running
  • Configuring - Complete list of all available options in the config file
  • Management - Managing your app, updating, security, web server configuration, etc
  • Troubleshooting - Common errors and problems, and how to fix them

Development and Contributing

Feature Docs

⬆️ Back to Top


Credits 🏆

Contributors 👥

Auto-generated contributors

Dependencies 🔗

This app definitely wouldn't have been quite so possible without the making use of the following package and components. Full credit and big kudos to their respective authors, who've done an amazing job in building and maintaining them.

Core

At it's core, the application uses Vue.js, as well as it's services. Styling is done with SCSS, JavaScript is currently Babel, (but I am in the process of converting to TypeScript), linting is done with ESLint, the config is defined in YAML, and there is a simple Node.js server to serve up the static app.

Frontend Components
Utilities
  • crypto-js - Encryption implementations by @evanvosberg and community MIT
  • axios - Promise based HTTP client by @mzabriskie and community MIT
  • ajv - JSON schema Validator by @epoberezkin and community MIT
Backup & Sync Server

Although the app is purely frontend, there is an optional cloud backup and restore feature. This is built as a serverless function on Cloudflare workers using KV and web crypto

External Services

The 1-Click deploy demo uses Play-with-Docker Labs. Code is hosted on GitHub, Docker image is hosted on DockerHub, and the demos are hosted on Netlify.

Alternatives 🙌

There are a few self-hosted web apps, that serve a similar purpose to Dashy. If you're looking for a dashboard, and Dashy doesn't meet your needs, I highly recommend you check these projects out! HomeDash2, Homer (Apache License 2.0), Organizr (GPL-3.0 License) and Heimdall (MIT License)

⬆️ Back to Top


🛣️ Roadmap

For past and future app updates, see: Changelog

The following features and tasks are planned for the near future.

  • Widget support- cards showing live stats and interactive content from your self-hosted services
  • UI Drag & Drop editor and visual configurator
  • Conversion to TypeScript
  • Improved test coverage

⬆️ Back to Top


License 📜

Copyright © 2021 Alicia Sykes <https://aliciasykes.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the “Software”), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWAREOR THE USE
OR OTHER DEALINGS IN THE SOFTWARE.

TDLR; You can do whatever you like with Dashy: use it in private or commercial settings, redistribute and modify it. But you must display this license and credit the author. There is no warranty that this app will work as expected, and the author cannot be held liable for anything that goes wrong. For more info, see TLDR Legal's Explanation of MIT

Octocat

⬆️ Back to Top


Dashy - A feature-rich dashboard for your homelab 🚀 | Product Hunt