From 2416b53c456393c4268cec3860cfaf0e173887cb Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sun, 19 Sep 2021 23:08:00 +0100 Subject: [PATCH] :arrows_counterclockwise: Sync docs from master --- docs/assets/CONTRIBUTORS.svg | 22 ++-- docs/assets/repo-visualization.svg | 1 + docs/configuring.md | 79 +++++++++--- docs/contributing.md | 6 +- docs/credits.md | 94 +++++++++++--- docs/deployment.md | 3 +- docs/developing.md | 126 ++++++++++--------- docs/development-guides.md | 45 ++++++- docs/icons.md | 69 ++++++++--- docs/management.md | 26 ++-- docs/multi-language-support.md | 43 ++++--- docs/privacy.md | 30 ++++- docs/quick-start.md | 4 +- docs/readme.md | 2 +- docs/release-workflow.md | 158 ++++++++++++++++++++++++ docs/searching.md | 190 ++++++++++++++++------------- docs/showcase.md | 7 ++ docs/showcase/11-ricky-cz.png | Bin 0 -> 180640 bytes docs/status-indicators.md | 12 +- docs/troubleshooting.md | 22 ++++ 20 files changed, 687 insertions(+), 252 deletions(-) create mode 100644 docs/assets/repo-visualization.svg create mode 100644 docs/release-workflow.md create mode 100644 docs/showcase/11-ricky-cz.png diff --git a/docs/assets/CONTRIBUTORS.svg b/docs/assets/CONTRIBUTORS.svg index e1e60610..7fa0b7dc 100644 --- a/docs/assets/CONTRIBUTORS.svg +++ b/docs/assets/CONTRIBUTORS.svg @@ -1,24 +1,30 @@ - + - + - - - - + + + + + + + - + + + + - + \ No newline at end of file diff --git a/docs/assets/repo-visualization.svg b/docs/assets/repo-visualization.svg new file mode 100644 index 00000000..35834737 --- /dev/null +++ b/docs/assets/repo-visualization.svg @@ -0,0 +1 @@ +viewsviewsutilsutilsstylesstylescomponentscomponentsassetsassetsWorkspaceWorkspaceSettingsSettingsPageStrcturePageStrctureMinimalViewMinimalViewLinkItemsLinkItemsFormElementsFormElementsConfigurationConfigurationlocaleslocalesinterface-iconsinterface-iconsLogin.vueLogin.vueLogin.vueHome.vueHome.vueHome.vueMinimal.vueMinimal.vueMinimal.vueemojis.jsonemojis.jsonemojis.jsonConfigSche...ConfigSche...ConfigSche...Auth.jsAuth.jsAuth.jsdefaults.jsdefaults.jsdefaults.jscolor-them...color-them...color-them...CustomThe...CustomThe...CustomThe...Item.vueItem.vueItem.vueItemIcon.vueItemIcon.vueItemIcon.vueSection.vueSection.vueSection.vueConfigCon...ConfigCon...ConfigCon...JsonEdito...JsonEdito...JsonEdito...CloudBac...CloudBac...CloudBac...hi.jsonhi.jsonhi.jsonru.jsonru.jsonru.jsonar.jsonar.jsonar.jsonja.jsonja.jsonja.jsonfr.jsonfr.jsonfr.jsones.jsones.jsones.jsonpt.jsonpt.jsonpt.jsonit.jsonit.jsonit.jsonsl.jsonsl.jsonsl.jsonen.jsonen.jsonen.jsonde.jsonde.jsonde.json.js.json.scss.svg.vueeach dot sized by file size \ No newline at end of file diff --git a/docs/configuring.md b/docs/configuring.md index 50ab8648..dea1152f 100644 --- a/docs/configuring.md +++ b/docs/configuring.md @@ -2,24 +2,40 @@ All app configuration is specified in [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml) which is in [YAML Format](https://yaml.org/) format. +--- + +#### Contents + +- [**`pageInfo`**](#pageinfo) - Header text, footer, title, navigation, etc + - [`navLinks`](#pageinfonavlinks-optional) - Navigation bar items and links +- [**`appConfig`**](#appconfig-optional) - Main application settings + - [`webSearch`](#appconfigwebsearch-optional) - Configure web search engine options + - [`hideComponents`](#appconfighidecomponents-optional) - Show/ hide page components + - [`auth`](#appconfigauth-optional) - Built-in authentication setup + - [`users`](#appconfigauthusers-optional) - Setup for simple auth + - [`keycloak`](#appconfigauthkeycloak-optional) - Auth using Keycloak +- [**`sections`**](#section) - List of sections + - [`displayData`](#sectiondisplaydata-optional) - Section display settings + - [`icon`](#sectionicon-and-sectionitemicon) - Icon for a section + - [`items`](#sectionitem) - List of items + - [`icon`](#sectionicon-and-sectionitemicon) - Icon for an item +- [**Notes**](#notes) + - [About YAML](#about-yaml) + - [Config Saving Methods](#config-saving-methods) + - [Preventing Changes](#preventing-changes-being-written-to-disk) + - [Example](#example) + +--- + Tips: - You may find it helpful to look at some sample config files to get you started, a collection of which can be found [here](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10) - You can check that your config file fits the schema, by running `yarn validate-config` - After modifying your config, the app needs to be recompiled, by running `yarn build` - this happens automatically whilst the app is running if you're using Docker -- It is recommended to make and keep a backup of your config file. You can download your current config through the UI either from the Config menu, or using the `/download` endpoint. Alternatively, you can use the [Cloud Backup](/docs/backup-restore) feature. +- It is recommended to make and keep a backup of your config file. You can download your current config through the UI either from the Config menu, or using the `/download` endpoint. Alternatively, you can use the [Cloud Backup](./docs/backup-restore) feature. - The config can also be modified directly through the UI, validated and written to the conf.yml file. - All fields are optional, unless otherwise stated. -### About YAML -If you're new to YAML, it's pretty straight-forward. The format is exactly the same as that of JSON, but instead of using curly braces, structure is denoted using whitespace. This [quick guide](https://linuxhandbook.com/yaml-basics/) should get you up to speed in a few minutes, for more advanced topics take a look at this [Wikipedia article](https://en.wikipedia.org/wiki/YAML). - -### Config Saving Methods -When updating the config through the JSON editor in the UI, you have two save options: **Local** or **Write to Disk**. -- Changes saved locally will only be applied to the current user through the browser, and will not apply to other instances - you either need to use the cloud sync feature, or manually update the conf.yml file. -- On the other-hand, if you choose to write changes to disk, then your main `conf.yml` file will be updated, and changes will be applied to all users, and visible across all devices. For this functionality to work, you must be running Dashy with using the Docker container, or the Node server. A backup of your current configuration will also be saved in the same directory. - -### Preventing Changes being Written to Disk -To disallow any changes from being written to disk via the UI config editor, set `appConfig.allowConfigEdit: false`. If you are using users, and have setup `auth` within Dashy, then only users with `type: admin` will be able to write config changes to disk. +--- ### Top-Level Fields @@ -60,6 +76,7 @@ To disallow any changes from being written to disk via the UI config editor, set **`startingView`** | `enum` | _Optional_ | Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI. Can be either `default`, `minimal` or `workspace`. Defaults to `default` **`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping each of your services and display their status as a dot next to each item. This can be overridden by setting `statusCheck` under each item. Defaults to `false` **`statusCheckInterval`** | `boolean` | _Optional_ | The number of seconds between checks. If set to `0` then service will only be checked on initial page load, which is usually the desired functionality. If value is less than `10` you may experience a hit in performance. Defaults to `0` +**`webSearch`** | `object` | _Optional_ | Configuration options for the web search feature, set your default search engine, opening method or disable web search. See [`webSearch`](#appconfigwebsearch-optional) **`backgroundImg`** | `string` | _Optional_ | Path to an optional full-screen app background image. This can be either remote (http) or local (/). Note that this will slow down initial load **`enableFontAwesome`** | `boolean` | _Optional_ | Where `true` is enabled, if left blank font-awesome will be enabled only if required by 1 or more icons **`fontAwesomeKey`** | `string` | _Optional_ | If you have a font-awesome key, then you can use it here and make use of premium icons. It is a 10-digit alpha-numeric string from you're FA kit URL (e.g. `13014ae648`) @@ -77,8 +94,9 @@ To disallow any changes from being written to disk via the UI config editor, set **`allowConfigEdit`** | `boolean` | _Optional_ | Should prevent / allow the user to write configuration changes to the conf.yml from the UI. When set to `false`, the user can only apply changes locally using the config editor within the app, whereas if set to `true` then changes can be written to disk directly through the UI. Defaults to `true`. Note that if authentication is enabled, the user must be of type `admin` in order to apply changes globally. **`enableErrorReporting`** | `boolean` | _Optional_ | Enable reporting of unexpected errors and crashes. This is off by default, and **no data will ever be captured unless you explicitly enable it**. Turning on error reporting helps previously unknown bugs get discovered and fixed. Dashy uses [Sentry](https://github.com/getsentry/sentry) for error reporting. Defaults to `false`. **`sentryDsn`** | `boolean` | _Optional_ | If you need to monitor errors in your instance, then you can use Sentry to collect and process bug reports. Sentry can be self-hosted, or used as SaaS, once your instance is setup, then all you need to do is pass in the DSN here, and enable error reporting. You can learn more on the [Sentry DSN Docs](https://docs.sentry.io/product/sentry-basics/dsn-explainer/). Note that this will only ever be used if `enableErrorReporting` is explicitly enabled. +**`disableSmartSort`** | `boolean` | _Optional_ | For the most-used and last-used app sort functions to work, a basic open-count is stored in local storage. If you do not want this to happen, then disable smart sort here, but you wil no longer be able to use these sort options. Defaults to `false`. **`disableUpdateChecks`** | `boolean` | _Optional_ | If set to true, Dashy will not check for updates. Defaults to `false`. -**`disableServiceWorker`** | `boolean` | _Optional_ | Service workers cache web applications to improve load times and offer basic offline functionality, and are enabled by default in Dashy. The service worker can sometimes cause older content to be cached, requiring the app to be hard-refreshed. If you do not want SW functionality, or are having issues with caching, set this property to `true` to disable all service workers. +**`enableServiceWorker`** | `boolean` | _Optional_ | Service workers cache web applications to improve load times and offer basic offline functionality, and are enabled by default in Dashy. The service worker can sometimes cause older content to be cached, requiring the app to be hard-refreshed. If you do not want SW functionality, or are having issues with caching, set this property to `true` to disable all service workers. **`disableContextMenu`** | `boolean` | _Optional_ | If set to `true`, the custom right-click context menu will be disabled. Defaults to `false`. **[⬆️ Back to Top](#)** @@ -86,7 +104,7 @@ To disallow any changes from being written to disk via the UI config editor, set ### `appConfig.auth` _(optional)_ **Field** | **Type** | **Required**| **Description** --- | --- | --- | --- -**`users`** | `array` | _Optional_ | An array of objects containing usernames and hashed passwords. If this is not provided, then authentication will be off by default, and you will not need any credentials to access the app. See [`appConfig.auth.users`](#appconfigauthusers-optional).
**Note** this method of authentication is handled on the client side, so for security critical situations, it is recommended to use an [alternate authentication method](/docs/authentication#alternative-authentication-methods). +**`users`** | `array` | _Optional_ | An array of objects containing usernames and hashed passwords. If this is not provided, then authentication will be off by default, and you will not need any credentials to access the app. See [`appConfig.auth.users`](#appconfigauthusers-optional).
**Note** this method of authentication is handled on the client side, so for security critical situations, it is recommended to use an [alternate authentication method](/docs/authentication#alternative-authentication-methods). **`enableKeycloak`** | `object` | _Optional_ | If set to `true`, then authentication using Keycloak will be anabled. Note that you need to have an instance running, and have also configured `auth.keycloak`. Defaults to `false` **`keycloak`** | `boolean` | _Optional_ | Config options to point Dashy to your Keycloak server. Requires `enableKeycloak: true`. See [`auth.keycloak`](#appconfigauthkeycloak-optional) for more info **`enableGuestAccess`** | `boolean` | _Optional_ | When set to `true`, an unauthenticated user will be able to access the dashboard, with read-only access, without having to login. Requires `auth.users` to be configured. Defaults to `false`. @@ -115,6 +133,16 @@ For more info, see the **[Authentication Docs](/docs/authentication)** **[⬆️ Back to Top](#)** +**Field** | **Type** | **Required**| **Description** +--- | --- | --- | --- +**`disableWebSearch`** | `string` | _Optional_ | Web search is enabled by default, but can be disabled by setting this property to `true` +**`searchEngine`** | `string` | _Optional_ | Set the key name for your search engine. Can also use a custom engine by setting this property to `custom`. Currently supported: `duckduckgo`, `google`, `whoogle`, `qwant`, `startpage`, `searx-bar` and `searx-info`. Defaults to `duckduckgo` +**`customSearchEngine`** | `string` | _Optional_ | You can also use a custom search engine, or your own self-hosted instance. This requires `searchEngine: custom` to be set. Then add the URL of your service, with GET query string included here +**`openingMethod`** | `string` | _Optional_ | Set your preferred opening method for search results: `newtab`, `sametab`, `workspace`. Defaults to `newtab` +**`searchBangs`** | `object` | _Optional_ | A key-value-pair set of custom search _bangs_ for redirecting query to a specific app or search engine. The key of each should be the bang you will type (typically starting with `/`, `!` or `:`), and value is the destination, either as a search engine key (e.g. `reddit`) or a URL with search parameters (e.g. `https://en.wikipedia.org/w/?search=`) + + +**[⬆️ Back to Top](#)** ### `appConfig.hideComponents` _(optional)_ @@ -154,6 +182,7 @@ For more info, see the **[Authentication Docs](/docs/authentication)** **`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping the URL associated with the current service, and display its status as a dot next to the item. The value here will override `appConfig.statusCheck` so you can turn off or on checks for a given service. Defaults to `appConfig.statusCheck`, falls back to `false` **`statusCheckUrl`** | `string` | _Optional_ | If you've enabled `statusCheck`, and want to use a different URL to what is defined under the item, then specify it here **`statusCheckHeaders`** | `object` | _Optional_ | If you're endpoint requires any specific headers for the status checking, then define them here +**`statusCheckAllowInsecure`** | `boolean` | _Optional_ | By default, any request to insecure content will be blocked. Setting this option to `true` will disable the `rejectUnauthorized` option, enabling you to ping non-HTTPS services for the current item. Defaults to `false` **`color`** | `string` | _Optional_ | An optional color for the text and font-awesome icon to be displayed in. Note that this will override the current theme and so may not display well **`backgroundColor`** | `string` | _Optional_ | An optional background fill color for the that given item. Again, this will override the current theme and so might not display well against the background **`provider`** | `string` | _Optional_ | The name of the provider for a given service, useful for when including hosted apps. In some themes, this is visible under the item name @@ -164,12 +193,13 @@ For more info, see the **[Authentication Docs](/docs/authentication)** **Field** | **Type** | **Required**| **Description** --- | --- | --- | --- +**`sortBy`** | `string` | _Optional_ | The sort order for items within the current section. By default items are displayed in the order in which they are listed in within the config. The following sort options are supported: `most-used` (most opened apps first), `last-used` (the most recently used apps), `alphabetical`, `reverse-alphabetical`, `random` and `default` **`collapsed`** | `boolean` | _Optional_ | If true, the section will be collapsed initially, and will need to be clicked to open. Useful for less regularly used, or very long sections. Defaults to `false` -**`color`** | `string` | _Optional_ | A custom accent color for the section, as a hex code or HTML color (e.g. `#fff`) -**`customStyles`** | `string` | _Optional_ | Custom CSS properties that should be applied to that section, e.g. `border: 2px dashed #ff0000;` -**`itemSize`** | `string` | _Optional_ | Specify the size for items within this group, either `small`, `medium` or `large`. Note that this will overide any settings specified through the UI **`rows`** | `number` | _Optional_ | Height of the section, specified as the number of rows it should span vertically, e.g. `2`. Defaults to `1`. Max is `5`. **`cols`** | `number` | _Optional_ | Width of the section, specified as the number of columns the section should span horizontally, e.g. `2`. Defaults to `1`. Max is `5`. +**`itemSize`** | `string` | _Optional_ | Specify the size for items within this group, either `small`, `medium` or `large`. Note that this will overide any settings specified through the UI +**`color`** | `string` | _Optional_ | A custom accent color for the section, as a hex code or HTML color (e.g. `#fff`) +**`customStyles`** | `string` | _Optional_ | Custom CSS properties that should be applied to that section, e.g. `border: 2px dashed #ff0000;` **`sectionLayout`** | `string` | _Optional_ | Specify which CSS layout will be used to responsivley place items. Can be either `auto` (which uses flex layout), or `grid`. If `grid` is selected, then `itemCountX` and `itemCountY` may also be set. Defaults to `auto` **`itemCountX`** | `number` | _Optional_ | The number of items to display per row / horizontally. If not set, it will be calculated automatically based on available space. Can only be set if `sectionLayout` is set to `grid`. Must be a whole number between `1` and `12` **`itemCountY`** | `number` | _Optional_ | The number of items to display per column / vertically. If not set, it will be calculated automatically based on available space. If `itemCountX` is set, then `itemCountY` can be calculated automatically. Can only be set if `sectionLayout` is set to `grid`. Must be a whole number between `1` and `12` @@ -183,10 +213,25 @@ For more info, see the **[Authentication Docs](/docs/authentication)** **Field** | **Type** | **Required**| **Description** --- | --- | --- | --- -**`icon`** | `string` | _Optional_ | The icon for a given item or section. Can be a font-awesome icon, favicon, remote URL or local URL. If set to `favicon`, the icon will be automatically fetched from the items website URL. To use font-awesome, specify the category, followed by the icon name, e.g. `fas fa-rocket`, `fab fa-monero` or `fal fa-duck` - note that to use pro icons, you mut specify `appConfig.fontAwesomeKey`. Similarly, you can also use [simple-icons](https://simpleicons.org/) by setting icon to `si-[icon-name]` or [material-design-icons](https://dev.materialdesignicons.com/icons) by setting icon to `mdi-[icon-name]`. If set to `generative`, then a unique icon is generated from the apps URL or IP. You can also use hosted any by specifying it's URL, e.g. `https://i.ibb.co/710B3Yc/space-invader-x256.png`. To use a local image, first store it in `./public/item-icons/` (or `-v /app/public/item-icons/` in Docker) , and reference it by name and extension - e.g. set `image.png` to use `./public/item-icon/image.png`, you can also use sub-folders if you have a lot of icons, to keep them organised. +**`icon`** | `string` | _Optional_ | The icon for a given item or section. See [Icon Docs](/docs/icons) for all available supported icon types. To auto-fetch icon from a services URL, aet to `favicon`. To use font-awesome, specify the category, followed by the icon name, e.g. `fas fa-rocket`, `fab fa-monero` or `fal fa-duck`. Similarly, for branded icons, you can use [simple-icons](https://simpleicons.org/) by setting icon to `si-[icon-name]` or [material-design-icons](https://dev.materialdesignicons.com/icons) by setting icon to `mdi-[icon-name]`. If set to `generative`, then a unique icon is generated from the apps URL or IP. You can also use hosted any by specifying it's URL, e.g. `https://i.ibb.co/710B3Yc/space-invader-x256.png`. To use a local image, first store it in `./public/item-icons/` (or `-v /app/public/item-icons/` in Docker) , and reference it by name and extension - e.g. set `image.png` to use `./public/item-icon/image.png`, you can also use sub-folders if you have a lot of icons, to keep them organised. **[⬆️ Back to Top](#)** +--- + +## Notes + +### About YAML +If you're new to YAML, it's pretty straight-forward. The format is exactly the same as that of JSON, but instead of using curly braces, structure is denoted using whitespace. This [quick guide](https://linuxhandbook.com/yaml-basics/) should get you up to speed in a few minutes, for more advanced topics take a look at this [Wikipedia article](https://en.wikipedia.org/wiki/YAML). + +### Config Saving Methods +When updating the config through the JSON editor in the UI, you have two save options: **Local** or **Write to Disk**. +- Changes saved locally will only be applied to the current user through the browser, and will not apply to other instances - you either need to use the cloud sync feature, or manually update the conf.yml file. +- On the other-hand, if you choose to write changes to disk, then your main `conf.yml` file will be updated, and changes will be applied to all users, and visible across all devices. For this functionality to work, you must be running Dashy with using the Docker container, or the Node server. A backup of your current configuration will also be saved in the same directory. + +### Preventing Changes being Written to Disk +To disallow any changes from being written to disk via the UI config editor, set `appConfig.allowConfigEdit: false`. If you are using users, and have setup `auth` within Dashy, then only users with `type: admin` will be able to write config changes to disk. + ### Example ```yaml diff --git a/docs/contributing.md b/docs/contributing.md index 090c106c..6b68ec9b 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -20,7 +20,7 @@ Dashy now has a [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/sho ## Improve the Docs Found a typo, or something that isn't as clear as it could be? Maybe I've missed something off altogether, or you hit a roadblock that took you a while to figure out. Submitting a pull request to add to or improve the documentation will help future users get Dashy up and running more easily. -All content is located either in the README or [`/docs/`](/docs) directory, and synced to the Wiki and website using a GH action (workflows/wiki-sync.yml). +All content is located either in the [`./README.md`](/README) or [`/docs/`](/docs) directory, and synced to the Wiki and website using a GH [action](/actions/workflows/wiki-sync.yml). ## Raise a bug If you've found a bug, then please do raise it as an issue. This will help me know if there's something that needs fixing. Try and include as much detail as possible, such as your environment, steps to reproduce, any console output and maybe an example screenshot or recording if necessary. @@ -89,7 +89,7 @@ If you've enjoyed Dashy, you can follow the me to get updates about other projec [![Alicia Sykes's Website](https://img.shields.io/badge/aliciasykes.com--lightgrey?style=social&logo=Tencent%20QQ)](https://aliciasykes.com) [![Alicia Sykes's Blog](https://img.shields.io/badge/Blog--lightgrey?style=social&logo=micro.blog)](https://notes.aliciasykes.com/) -If you like, you could also consider [subscribing to my mailing list](https://notes.aliciasykes.com/subscribe) for very occasional blog post updates, or even [nominating me (`@lissy93`)](https://stars.github.com/nominate/) on the GitHub Star Programme. +If you like, you could also consider [subscribing to my mailing list](https://notes.aliciasykes.com/subscribe) for very occasional blog post updates. --- @@ -97,7 +97,7 @@ If you like, you could also consider [subscribing to my mailing list](https://no For a full list of Dashy's contributors, see the [Credits Page](/docs/credits) -![Auto-generated contributors](https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/CONTRIBUTORS.svg) +[![Auto-generated contributors](https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/CONTRIBUTORS.svg)](/docs/credits) ### Star-Gazers Over Time diff --git a/docs/credits.md b/docs/credits.md index 631e477e..4d32ca0f 100644 --- a/docs/credits.md +++ b/docs/credits.md @@ -50,21 +50,28 @@ Snyk Bot - - - onedr0p -
- ᗪєνιη ᗷυнʟ -
- UrekD
UrekD
+ + + + onedr0p +
+ ᗪєνιη ᗷυнʟ +
+ + + daentech +
+ Dan Gilbert +
+ BeginCI @@ -79,6 +86,13 @@ DeepSource Bot + + + FormatToday +
+ FormatToday +
+ turnrye @@ -153,6 +167,27 @@ Snyk Bot + + + netlify +
+ Netlify +
+ + + + viezly +
+ Viezly +
+ + + + muse-dev +
+ MuseDev +
+ github-actions[bot] @@ -162,20 +197,24 @@ -## Dependencies 🔗 +> The above section is auto-generated, using [contribute-list](https://github.com/marketplace/actions/contribute-list) by @akhilmhdh. + +--- + +## 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. For a full breakdown of dependency licenses, please see [Legal](https://github.com/Lissy93/dashy/blob/master/.github/LEGAL) -##### Core -At it's core, the application uses [Vue.js](https://github.com/vuejs/vue), as well as it's services. Styling is done with [SCSS](https://github.com/sass/sass), JavaScript is currently [Babel](https://github.com/babel/babel), (but I am in the process of converting to [TypeScript](https://github.com/Microsoft/TypeScript)). Linting is done with [ESLint](https://github.com/eslint/eslint) and [Prettier](https://prettier.io/), both following the [AirBnB Styleguide](https://github.com/airbnb/javascript). The config is defined in [YAML](https://github.com/yaml/yaml), and there is a simple [Node.js](https://github.com/nodejs/node) server to serve up the static app and the optional API endpoints. +#### Core +At it's core, the application uses [**Vue.js**](https://github.com/vuejs/vue), as well as it's services with [**VueX**](https://vuex.vuejs.org/) for state management. Styling is done with [**SCSS**](https://github.com/sass/sass), JavaScript is currently [**Babel**](https://github.com/babel/babel), (but I am in the process of converting to [**TypeScript**](https://github.com/Microsoft/TypeScript)). Linting is done with [**ESLint**](https://github.com/eslint/eslint) and [**Prettier**](https://prettier.io/), both following the [**AirBnB Styleguide**](https://github.com/airbnb/javascript). The config is defined in [**YAML**](https://github.com/yaml/yaml), with a simple [**Node.js**](https://github.com/nodejs/node) server to serve up the static app and the optional API endpoints, and container deployment is done with [**Docker**](https://www.docker.com/). -##### Utilities +#### Utilities - [`crypto-js`](https://github.com/brix/crypto-js) - Encryption implementations by @evanvosberg and community `MIT` - [`axios`](https://github.com/axios/axios) - Promise based HTTP client by @mzabriskie and community `MIT` - [`ajv`](https://github.com/ajv-validator/ajv) - JSON schema Validator by @epoberezkin and community `MIT` -- [`vue-i18n`](https://github.com/kazupon/vue-i18n) - Internationalization plugin by @kazupon and community `MIT` +- [`i18n`](https://github.com/kazupon/vue-i18n) - Internationalization plugin by @kazupon and community `MIT` -##### Frontend Components +#### Frontend Components - [`vue-select`](https://github.com/sagalbot/vue-select) - Dropdown component by @sagalbot `MIT` - [`vue-js-modal`](https://github.com/euvl/vue-js-modal) - Modal component by @euvl `MIT` - [`v-tooltip`](https://github.com/Akryum/v-tooltip) - Tooltip component by @Akryum `MIT` @@ -185,12 +224,33 @@ At it's core, the application uses [Vue.js](https://github.com/vuejs/vue), as we - [`vue-toasted`](https://github.com/shakee93/vue-toasted) - Toast notification component by @shakee93 `MIT` - [`vue-swatches`](https://github.com/saintplay/vue-swatches) - Color palete picker by @saintplay `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](https://workers.cloudflare.com/) using [KV](https://developers.cloudflare.com/workers/runtime-apis/kv) and [web crypto](https://developers.cloudflare.com/workers/runtime-apis/web-crypto) +#### Backup & Sync Server +Although the app is purely frontend, there is an optional cloud sync feature, for off-site backup and restore. This is built as a serverless function on [Cloudflare workers](https://workers.cloudflare.com/) using [KV](https://developers.cloudflare.com/workers/runtime-apis/kv) and [web crypto](https://developers.cloudflare.com/workers/runtime-apis/web-crypto) -##### External Services +#### External Services The 1-Click deploy demo uses [Play-with-Docker Labs](https://play-with-docker.com/). Code is hosted on [GitHub](https://github.com), Docker images are hosted on [DockerHub](https://hub.docker.com/), and the demos are hosted on [Netlify](https://www.netlify.com/). +#### Actions +This repo makes heavy use of [GitHub actions](https://github.com/features/actions) to run automated workflows. The following base actions are totally awesome, and have been extremely useful. Full credit to their respective authors + +- [`action-autotag`](https://github.com/butlerlogic/action-autotag) by @butlerlogic - Tags new versions when app version changes +- [`action-wiki-sync`](https://github.com/joeizzard/action-wiki-sync) by @joeizzard - Copies the markdown docs to the GH wiki +- [`contributors-list`](https://github.com/bubkoo/contributors-list) by @bubkoo - Generates contributors SVG +- [`contributors-readme-action`](https://github.com/akhilmhdh/contributors-readme-action) by @akhilmhdh - Inserts contributors into credits +- [`create-pull-request`](https://github.com/eter-evans/create-pull-request) by @eter-evans - Creates pull request +- [`github-pages-deploy-action`](https://github.com/JamesIves/github-pages-deploy-action) by @JamesIves - Deploy app to GH pages +- [`github-release-commenter`](https://github.com/apexskier/github-release-commenter) by @apexskier - Updates issues when fix is released +- [`github-sponsors-readme-action`](https://github.com/JamesIves/github-sponsors-readme-action) by @JamesIves - Inserts sponsors into credits +- [`is-sponsor-label-action`](https://github.com/JasonEtco/is-sponsor-label-action) by @JasonEtco - Label sponsors, for priority support +- [`issues-translate-action`](https://github.com/tomsun28/issues-translate-action) by @tomsun28 - Translates non-English issues and comments +- [`misspell-fixer-action`](https://github.com/sobolevn/misspell-fixer-action) by @sobolevn - Finds and fixes typos +- [`please-star-first`](https://github.com/uhyo/please-star-first) by @uhyo - Closes certain issues by non-stargazers +- [`pr-commenter-action`](https://github.com/exercism/pr-commenter-action) by @exercism - Adds info comments to PR based on the files changed +- [`snyk note`](https://github.com/snyk/actions/node) by @snyk - Reports vulnerabilities in the code or dependencies +- [`todo-to-issue-action`](https://github.com/alstr/todo-to-issue-action) by @alstr - Opens issues from todos in the code +- [`yarn-lock-changes`](https://github.com/Simek/yarn-lock-changes) by @Simek - Outputs dependency changes in PR + --- -> This page is auto-generated, using [contribute-list](https://github.com/marketplace/actions/contribute-list) by @akhilmhdh. +## You! +Would you like to be listed here? Whatever your skill set, Dashy needs people like you to help support future development. Check out the [Contributing Page](/docs/contributing) for ways that you can get involved. Huge thank you to everyone who has already contributed! 💖 diff --git a/docs/deployment.md b/docs/deployment.md index 10c35be5..3506764a 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -29,8 +29,7 @@ Once you've got Dashy up and running, you'll want to configure it with your own ![Docker Supported Architecture](https://img.shields.io/badge/Architectures-amd64%20|%20arm32v7%20|%20arm64v8-6ba6e5) ![Docker Base Image](https://img.shields.io/badge/Base_Image-Alpine_3.14-6ba6e5) ![Docker Hosted on](https://img.shields.io/badge/Hosted_on-DockerHub-6ba6e5) -](https://hub.docker.com/r/lissy93/dashy) - +](https://hub.docker.com/r/lissy93/dashy)
**Status**: [ ![Docker Build Status](https://img.shields.io/docker/cloud/build/lissy93/dashy?label=Docker%20Build) ![Docker Pulls](https://img.shields.io/docker/pulls/lissy93/dashy?color=ecb2f7) diff --git a/docs/developing.md b/docs/developing.md index 0ae7c453..3bb45090 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -2,14 +2,24 @@ # Developing This article outlines how to get Dashy running in a development environment, and outlines the basics of the architecture. -If you're adding new features, you may want to check out the [Development Guides](/docs/development-guides) docs, for tutorials covering basic tasks. +If you're adding new features, you may want to check out the [Development Guides](./docs/development-guides) docs, for tutorials covering basic tasks. - [Setting up the Development Environment](#setting-up-the-dev-environment) + - [Prerequisites](#prerequisites) + - [Running the App](#running-the-project) + - [Project Commands](#project-commands) + - [Environmental Variables](#environmental-variables) +- [Git Strategy](#git-strategy) + - [Flow](#git-flow) + - [Branches](#git-branch-naming) + - [Commit emojis](#commit-emojis) + - [PR Guidelines](#pr-guidelines) - [Resources for Beginners](#resources-for-beginners) -- [Style Guide](#style-guide) -- [Frontend Components](#frontend-components) -- [Project Structure](#directory-structure) -- [Dependencies and Packages](#dependencies-and-packages) +- [App Info](#app-info) +- [Code Style Guide](#style-guide) +- [Application Structure](#application-structure) +- [Development Tools](#development-tools) +- [Misc / Notes](#notes) ## Setting up the Dev Environment @@ -27,50 +37,45 @@ Dashy should now be being served on http://localhost:8080/. Hot reload is enable ### Project Commands -- `yarn dev` - Starts the development server with hot reloading -- `yarn build` - Builds the project for production, and outputs it into `./dist` -- `yarn start` - Starts a web server, and serves up the production site from `./dist` -- `yarn validate-config` - Parses and validates your `conf.yml` against Dashy's schema -- `yarn lint` - Lints code to ensure it follows a consistent, neat style -- `yarn test` - Runs tests, and outputs results +#### Basics +- **`yarn build`** - In the interest of speed, the application is pre-compiled, this means that the config file is read during build-time, and therefore the app needs to rebuilt for any new changes to take effect. Luckily this is very straight forward. Just run `yarn build` or `docker exec -it [container-id] yarn build` +- **`yarn start`** - Starts a web server, and serves up the production site from `./dist` (must run build command first) -There is also: -- `yarn build-and-start` will run `yarn build` and `yarn start` -- `yarn build-watch` will output contents to `./dist` and recompile when anything in `./src` is modified, you can then use either `yarn start` or your own server, to have a production environment that watches for changes. +#### Development +- **`yarn dev`** - Starts the development server with hot reloading +- **`yarn lint`** - Lints code to ensure it follows a consistent, neat style +- **`yarn test`** - Runs tests, and outputs results -Using the Vue CLI: -- The app is build with Vue, and uses the [Vue-CLI Service](https://cli.vuejs.org/guide/cli-service.html) for basic commands. -- If you have [NPX](https://github.com/npm/npx) installed, then you can invoke the Vue CLI binary using `npx vue-cli-service [command]` -- Vue also has a GUI environment that can be used for basic project management, and may be useful for beginners, this can be started by running `vue ui`, and opening up `http://localhost:8000` +#### Utils and Checks +- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/public/conf.yml` (or within your Docker container at `/app/public/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js). +- **`yarn health-check`** - Checks that the application is up and running on it's specified port, and outputs current status and response times. Useful for integrating into your monitoring service, if you need to maintain high system availability -Note: +#### Alternate Start Commands +- **`yarn build-and-start`** - Builds the app, runs checks and starts the production server. Commands are run in parallel, and so is faster than running them in independently. Uses the `yarn build` and `yarn start` commands +- **`yarn build-watch`** - If you find yourself making frequent changes to your configuration, and do not want to have to keep manually rebuilding, then this option is for you. It will watch for changes to any files within the projects root, and then trigger a rebuild. Note that if you are developing new features, then `yarn dev` would be more appropriate, as it's significantly faster at recompiling (under 1 second), and has hot reloading, linting and testing integrated +- **`yarn pm2-start`** - Starts the Node server using [PM2](https://pm2.keymetrics.io/), a process manager for Node.js applications, that helps them stay alive. PM2 has some built-in basic monitoring features, and an optional [management solution](https://pm2.io/). If you are running the app on bare metal, it is recommended to use this start command + +#### Notes - If you are using NPM, replace `yarn` with `npm run` - If you are using Docker, precede each command with `docker exec -it [container-id]`. Container ID can be found by running `docker ps` +- You can manage the app using the [Vue-CLI Service](https://cli.vuejs.org/guide/cli-service.html), with `npx vue-cli-service [command]`. Or to start the Vue Management UI, run `npx vue ui`, and open `http://localhost:8000` ### Environmental Variables All environmental variables are optional. Currently there are not many environmental variables used, as most of the user preferences are stored under `appConfig` in the `conf.yml` file. -You can set variables within your local development environment using a `.env` file. - -Any environmental variables used by the frontend are preceded with `VUE_APP_`. Vue will merge the contents of your `.env` file into the app in a similar way to the ['dotenv'](https://github.com/motdotla/dotenv) package, where any variables that you set on your system will always take preference over the contents of any `.env` file. - -- `PORT` - The port in which the application will run (defaults to `4000` for the Node.js server, and `80` within the Docker container) -- `NODE_ENV` - Which environment to use, either `production`, `development` or `test` -- `VUE_APP_DOMAIN` - The URL where Dashy is going to be accessible from. This should include the protocol, hostname and (if not 80 or 443), then the port too, e.g. `https://localhost:3000`, `http://192.168.1.2:4002` or `https://dashy.mydomain.com` - - -If you do add new variables, ensure that there is always a fallback (define it in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js)), so as to not cause breaking changes. Don't commit your `.env` file to git, but instead take a few moments to document what you've added under the appropriate section. Try and follow the concepts outlined in the [12 factor app](https://12factor.net/config). +You can set variables either in your environment, or using the [`.env`](https://github.com/Lissy93/dashy/blob/master/.env) file. +- `NODE_ENV` - Current environment, can be either development, production or test +- `PORT` - The port to expose the running application on +- `HOST` - The host that Dashy is running on, domain or IP +- `BASE_URL` - The default base path for serving up static assets +- `VUE_APP_DOMAIN` - Usually the same as BASE_URL, but accessible in frontend +- `INTEGRITY` - Should enable SRI for build script and link resources +- `IS_DOCKER` - Computed automatically on build. Indicates if running in container +- `VUE_APP_VERSION` - Again, set automatically using package.json during build time ### Environment Modes -You can set the environment using the `NODE_ENV` variable. -The correct environment will be selected based on the script you run by default -The following environments are supported. -- `production` -- `development` -- `test` - -For more info, see [Vue CLI Environment Modes](https://cli.vuejs.org/guide/mode-and-env.html#modes). +You can set the environment using the `NODE_ENV` variable. By default, the correct environment should be selected based on the script you run to start the app. The following environments are supported: `production`, `development` and `test`. For more info, see [Vue CLI Environment Modes](https://cli.vuejs.org/guide/mode-and-env.html#modes). --- @@ -135,6 +140,7 @@ When you submit your PR, include the required info, by filling out the PR templa - Finally, check the checkboxes, to confirm that the standards are met, and hit submit! --- + ## Resources for Beginners New to Web Development? Glad you're here! Dashy is a pretty simple app, so it should make a good candidate for your first PR. Presuming that you already have a basic knowledge of JavaScript, the following articles should point you in the right direction for getting up to speed with the technologies used in this project: - [Introduction to Vue.js](https://v3.vuejs.org/guide/introduction.html) @@ -152,6 +158,8 @@ As well as Node, Git and Docker- you'll also need an IDE (e.g. [VS Code](https:/ --- +## App Info + ## Style Guide Linting is done using [ESLint](https://eslint.org/), and using the [Vue.js Styleguide](https://github.com/vuejs/eslint-config-standard), which is very similar to the [AirBnB Stylguide](https://github.com/airbnb/javascript). You can run `yarn lint` to report and fix issues. While the dev server is running, issues will be reported to the console automatically, and any lint errors will trigger the build to fail. Note that all lint checks must pass before any PR can be merged. Linting is also run as a git pre-commit hook @@ -175,8 +183,6 @@ Styleguides: ## Application Structure -### Directory Structure - #### Files in the Root: `./` ``` ╮ @@ -206,6 +212,7 @@ Styleguides: ├── components # All front-end Vue web components │ ├── Configuration # Components relating to the user config pop-up │ │ ├── AppInfoModal.vue # A modal showing core app info, like version, language, etc +│ │ ├── AppVersion.vue # Shows current version from package.json, compares with GitHub │ │ ├── CloudBackupRestore.vue # Form where the user manages cloud sync options │ │ ├── ConfigContainer.vue # Main container, wrapping all other config components │ │ ├── CustomCss.vue # Form where the user can input custom CSS @@ -224,14 +231,24 @@ Styleguides: │ │ ├── ItemIcon.vue # The icon used by both items and sections │ │ ├── ItemOpenMethodIcon.vue # A small icon, visible on hover, indicating opening method │ │ ╰── StatusIndicator.vue # Traffic light dot, showing if app is online or down +│ ├── Minimal View # Components used for the startpage / minimal alternative view +│ │ ├── MinimalHeading.vue # Title part of minimal view +│ │ ├── MinimalSearch.vue # Search bar for minimal view +│ │ ╰── MinimalSection.vue # Tabbed-Item section for minimal view │ ├── PageStrcture # Components relating the main structure of the page │ │ ├── Footer.vue # Footer, visible at the bottom of all pages │ │ ├── Header.vue # Header, visible at the top of pages, and includes title and nav │ │ ├── LoadingScreen.vue # Splash screen shown on first load │ │ ├── Nav.vue # Navigation bar, includes a list of links │ │ ╰── PageTitle.vue # Page title and sub-title, visible within the Header +│ ├── Workspace # Components used for the multi-tasking/ Workspace view +│ │ ├── MultiTaskingWeb.vue # When multi-tasking enabled, generates new iframe +│ │ ├── SideBar.vue # The left sidebar for the workspace view +│ │ ├── SideBarItem.vue # App item for the sidebar view +│ │ ├── SideBarSection.vue # Collapsible collection of items within workspace sidebar +│ │ ╰── WebContent.vue # Workspace iframe view, displays content of current app │ ╰── Settings # Components relating to the quick-settings, in the top-right -│ ├── AuthButtons.vue # Logout button and other app info +│ ├── AuthButtons.vue # Logout button and other app info │ ├── ConfigLauncher.vue # Icon that when clicked will launch the Configuration component │ ├── CustomThemeMaker.vue # Color pickers for letting user build their own theme │ ├── ItemSizeSelector.vue # Set of buttons used to set and save item size @@ -248,14 +265,21 @@ Styleguides: ├── utils # Directory of re-used helper functions │ ├── ArrowKeyNavigation.js # Functionality for arrow-key navigation │ ├── Auth.js # Handles all authentication related actions +│ ├── CheckSectionVisibility.js # Checks which parts of the page should be visible/ hidden based on config │ ├── ClickOutside.js # A directive for detecting click, used to hide dropdown, modal or context menu -│ ├── ConfigAccumulator.js # Central place for managing and combining config │ ├── ConfigHelpers.js # Helper functions for managing configuration │ ├── CloudBackup.js # Functionality for encrypting, processing and network calls │ ├── ConfigSchema.json # The schema, used to validate the users conf.yml file +│ ├── ConfigAccumulator.js # Central place for managing and combining config +│ ├── ConfigHelpers.json # Collection of helper functions to process config using accumulator │ ├── ConfigValidator.js # A helper script that validates the config file against schema +│ ├── CoolConsole.js # Prints info, warning and error messages to browser console, with a cool style │ ├── defaults.js # Global constants and their default values +│ ├── emojis.json # List of emojis with unicode and shortcode, used for emoji icon feature +│ ├── EmojiUnicodeRegex.js # Regular expression to validate emoji unicode format, for emoji icons │ ├── ErrorHandler.js # Helper function called when an error is returned +│ ├── InitServiceWorker.js # Initializes and manages service worker, if enabled +│ ├── Search.js # Helper functions for searching/ filtering items in all views │ ├── JsonToYaml.js # Function that parses and converts raw JSON into valid YAML │ ├── languages.js # Handles fetching, switching and validating languages │ ╰── ThemeHelper.js # Function that handles the fetching and setting of user themes @@ -267,23 +291,9 @@ Styleguides: ╰── Workspace.vue # The workspace view with apps in sidebar ``` -### Frontend Components - -All frontend code is located in the `./src` directory, which is split into 5 sub-folders: -- **Components** - All frontend web components are located here. Each component should have a distinct, well defined and simple task, and ideally should not be too long. The components directory is organised into a series of sub-directories, representing a specific area of the application - - **PageStrcture** - Components relating to overall page structure (nav, footer, etc) - - FormElements - Reusable form elements (button, input field, etc) - - LinkItems - Components relating to Dashy's sections and items (item group, item, item icon, etc) - - Configuration - Components relating to Dashy's configuration forms (cloud backup, JSON editor, etc) -- **Views** - Each view directly corresponds to a route (defined in the router), and in effectively a page. They should have minimal logic, and just contain a few components -- **Utils** - These are helper functions, or logic that is used within the app does not include an UI elements -- **Styles** - Any SCSS that is used globally throughout that app, and is not specific to a single component goes here. This includes variables, color themes, typography settings, CSS reset and media queries -- **Assets** - Static assets that need to be bundled into the application, but do not require any manipulation go here. This includes interface icons and fonts - -The structure of the components directory is similar to that of the frontend application layout - -

+#### Visualisation of Source Directory +![File Breakdown](https://raw.githubusercontent.com/Lissy93/dashy/master/docs/assets/repo-visualization.svg) --- @@ -296,6 +306,7 @@ The easiest method of checking performance is to use Chromium's build in auditin [BundlePhobia](https://bundlephobia.com/) is a really useful app that lets you analyze the cost of adding any particular dependency to an application --- + ## Notes ### Known Warnings @@ -306,4 +317,3 @@ When running the build command, several warnings appear. These are not errors, a `WARN asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).` - For the PWA to support Windows 10, a splash screen asset is required, and is quite large. This throws a warning, however PWA assets are not loaded until needed, so shouldn't have any impact on application performance. A similar warning is thrown for the Raleway font, and that is looking to be addressed. -`glob-parent Security Alert` - This will be fixed soon. The version of glob-parent that is used by the latest version of Vue-CLI has a security issue associated with it. I am waiting on Vue to update their dependencies. diff --git a/docs/development-guides.md b/docs/development-guides.md index 5b81919e..32fb0f8d 100644 --- a/docs/development-guides.md +++ b/docs/development-guides.md @@ -141,6 +141,40 @@ Running `yarn upgrade` will updated all dependencies based on the ranges specifi --- +## Developing Netlify Cloud Functions + +When Dashy is deployed to Netlify, it is effectively running as a static app, and therefore the server-side code for the Node.js endpoints is not available. However Netlify now supports serverless cloud lambda functions, which can be used to replace most functionality. + +#### 1. Run Netlify Dev Server + +First off, install the Netlify CLI: `npm install netlify-cli -g` +Then, from within the root of Dashy's directory, start the server, by running: `netlify dev` + +#### 2. Create a lambda function + +This should be saved it in the [`./services/serverless-functions`](https://github.com/Lissy93/dashy/tree/master/services/serverless-functions) directory + +```javascript +exports.handler = async () => ({ + statusCode: 200, + body: 'Return some data here...', +}); +``` + +#### 3. Redirect the Node endpoint to the function + +In the [`netlify.toml`](https://github.com/Lissy93/dashy/blob/FEATURE/serverless-functions/netlify.toml) file, add a 301 redirect, with the path to the original Node.js endpoint, and the name of your cloud function + +```toml +[[redirects]] + from = "/status-check" + to = "/.netlify/functions/cloud-status-check" + status = 301 + force = true +``` + +--- + ## Hiding Page Furniture on Certain Routes For some pages (such as the login page, the minimal start page, etc) the basic page furniture, (like header, footer, nav, etc) is not needed. This section explains how you can hide furniture on a new view (step 1), or add a component that should be hidden on certain views (step 2). @@ -175,4 +209,13 @@ Finally, in the markup of your component, just add a `v-if` statement, referenci ``` ---- \ No newline at end of file +--- + +## Adding / Using Environmental Variables +All environmental variables are optional. Currently there are not many environmental variables used, as most of the user preferences are stored under `appConfig` in the `conf.yml` file. + +You can set variables either in your environment, or using the [`.env`](https://github.com/Lissy93/dashy/blob/master/.env) file. + +Any environmental variables used by the frontend are preceded with `VUE_APP_`. Vue will merge the contents of your `.env` file into the app in a similar way to the ['dotenv'](https://github.com/motdotla/dotenv) package, where any variables that you set on your system will always take preference over the contents of any `.env` file. + +If add any new variables, ensure that there is always a fallback (define it in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js)), so as to not cause breaking changes. Don't commit the contents of your `.env` file to git, but instead take a few moments to document what you've added under the appropriate section. Try and follow the concepts outlined in the [12 factor app](https://12factor.net/config). diff --git a/docs/icons.md b/docs/icons.md index b6439283..2b4bcd53 100644 --- a/docs/icons.md +++ b/docs/icons.md @@ -3,11 +3,13 @@ Both sections and items can have an icon, which is specified using the `icon` attribute. Using icons improves the aesthetics of your UI and makes the app more intuitive to use. There are several options when it comes to setting icons, and this article outlines each of them - [Font Awesome Icons](#font-awesome) +- [Simple Icons](#simple-icons) - [Auto-Fetched Favicons](#favicons) - [Generative Icons](#generative-icons) - [Emoji Icons](#emoji-icons) - [Icons by URL](#icons-by-url) - [Local Icons](#local-icons) +- [Material Design Icons](#material-design-icons) - [No Icon](#no-icon)

@@ -16,7 +18,9 @@ Both sections and items can have an icon, which is specified using the `icon` at Note that, if you are using icons from an external source (like font-awesome or material-design-icons), then the relevant font file will be loaded in automatically if and when needed, but combining icons from multiple services may have a negative impact on performance. -### Font Awesome +--- + +## Font Awesome You can use any [Font Awesome Icon](https://fontawesome.com/icons) simply by specifying it's identifier. This is in the format of `[category] [name]` and can be found on the page for any given icon on the Font Awesome site. For example: `fas fa-rocket`, `fab fa-monero` or `fas fa-unicorn`. Font-Awesome has a wide variety of free icons, but you can also use their pro icons if you have a membership. To do so, you need to specify your license key under: `appConfig.fontAwesomeKey`. This is usually a 10-digit string, for example `13014ae648`. @@ -25,7 +29,29 @@ Font-Awesome has a wide variety of free icons, but you can also use their pro ic

-### Favicons +--- + +## Simple Icons +[SimpleIcons.org](https://simpleicons.org/) is a collection of 2000+ high quality, free and open source brand and logo SVG icons. Usage of which is very similar to font-awesome icons. First find the glyph you want to use on the [website](https://simpleicons.org/), then just set your icon the the simple icon slug, prefixed with `si-`. + +For example: +```yaml +sections: +- name: Simple Icons Example + items: + - title: Portainer + icon: si-portainer + - title: FreeNAS + icon: si-freenas + - title: NextCloud + icon: si-nextcloud + - title: Home Assistant + icon: si-homeassistant +``` + +--- + +## Favicons Dashy can auto-fetch the favicon for a given service using it's URL. Just set `icon: favicon` to use this feature. If the services URL is a local IP, then Dashy will attempt to find the favicon from `http://[ip]/favicon.ico`. This has two issues, favicons are not always hosted at the same location for every service, and often the default favicon is a low resolution. Therefore to fix this, for remote services an API is used to return a high-quality icon for any online service.

@@ -42,41 +68,45 @@ The default favicon API is [Favicon Kit](https://faviconkit.com/), a free and re You can also force Dashy to always get favicons from the root of the domain, and not use an external service, by setting `appConfig.faviconApi` to `local`. -### Generative Icons +To use a different favicon API for certain items, then set `icon: favicon-[api]`, e.g. `favicon-clearbit` + +If for a given service none of the APIs work in your situation, and nor does local, then the best option is to find the path of the services logo or favicon, and set the icon to the URL of the raw image. + +--- + +## Generative Icons Uses a unique and programmatically generated icon for a given service. This is particularly useful when you have a lot of similar services with a different IP or port, and no specific icon. These icons are generated with [ipsicon.io](https://ipsicon.io/). To use this option, just set an item's to: `icon: generative`.

-### Emoji Icons +--- + +## Emoji Icons You can use almost any emoji as an icon for items or sections. You can specify the emoji either by pasting it directly, using it's unicode ( e.g. `'U+1F680'`) or shortcode (e.g. `':rocket:'`). You can find these codes for any emoji using [Emojipedia](https://emojipedia.org/) (near the bottom of emoji each page), or for a quick reference to emoji shortcodes, check out [emojis.ninja](https://emojis.ninja/) by @nomanoff.

-The following examples will all render the same rocket (🚀) emoji: +For example, these will all render the same rocket (🚀) emoji: `icon: ':rocket:'` or `icon: 'U+1F680'` or `icon: 🚀` -```yaml -items: -- title: Shortcode - icon: ':rocket:' -- title: Unicode - icon: 'U+1F680' -- title: Emoji - icon: 🚀 -``` +--- -### Icons by URL +## Icons by URL You can also set an icon by passing in a valid URL pointing to the icons location. For example `icon: https://i.ibb.co/710B3Yc/space-invader-x256.png`, this can be in .png, .jpg or .svg format, and hosted anywhere- so long as it's accessible from where you are hosting Dashy. The icon will be automatically scaled to fit, however loading in a lot of large icons may have a negative impact on performance, especially if you visit Dashy from new devices often. -### Local Icons +--- + +## Local Icons You may also want to store your icons locally, bundled within Dashy so that there is no reliance on outside services. This can be done by putting the icons within Dashy's `./public/item-icons/` directory. If you are using Docker, then the easiest option is to map a volume from your host system, for example: `-v /local/image/directory:/app/public/item-icons/`. To reference an icon stored locally, just specify it's name and extension. For example, if my icon was stored in `/app/public/item-icons/maltrail.png`, then I would just set `icon: maltrail.png`. You can also use sub-folders within the `item-icons` directory to keep things organised. You would then specify an icon with it's folder name slash image name. For example: `networking/monit.png` -### Material Design Icons +--- + +## Material Design Icons Dashy also supports 5000+ [material-design-icons](https://github.com/Templarian/MaterialDesign). To use these, first find the name/ slug for your icon [here](https://dev.materialdesignicons.com/icons), and then prefix is with `mdi-`. For example: @@ -93,8 +123,7 @@ sections: ``` -### Simple Icons -To use glyphs from [SimpleIcons.org](https://simpleicons.org/), first find the icon slug, and then prefix it with `si-`. The image will be loaded directly from the Simple Icons +--- -### No Icon +## No Icon If you don't wish for a given item or section to have an icon, just leave out the `icon` attribute. diff --git a/docs/management.md b/docs/management.md index 210a9a7e..e1c2623e 100644 --- a/docs/management.md +++ b/docs/management.md @@ -3,22 +3,18 @@ ## Providing Assets Although not essential, you will most likely want to provide several assets to Dashy. All web assets can be found in the `/public` directory. +For example: - `./public/conf.yml` - As mentioned, this is your main application config file -- `./public/item-icons` - If you're using your own icons, you can choose to store them locally for better load time, and this is the directory to put them in. You can also use sub-folders here to keep things organized. You then reference these assets relative this the direcroties path, for example: to use `./public/item-icons/networking/netdata.png` as an icon for one of your links, you would set `icon: networking/netdata.png` -- Also within `./public` you'll find standard website assets, including `favicon.ico`, `manifest.json`, `robots.txt`, etc. There's no need to modify these, but you can do so if you wish. +- `./public/item-icons` - If you're using your own icons, you can choose to store them locally for better load time, and this is the directory to put them in. You can also use sub-folders here to keep things organized +- Also within `./public` you'll find standard website assets, including `favicon.ico`, `manifest.json`, `robots.txt`, etc. There's no need to pass these in, but you can do so if you wish -## Basic Commands +This is easy to do using [Docker Volumes](https://docs.docker.com/storage/volumes/), which lets you share a file or directory between your host system, and the container. Volumes are specified in the Docker run command, or Docker compose file, using the `--volume` or `-v` flags. The value of which consists of the path to the file / directory on your host system, followed by the destination path within the container. Fields are separated by a colon (`:`), and must be in the correct order. For example: `-v ~/alicia/my-local-conf.yml:/app/public/conf.yml` -Now that you've got Dashy running, there are a few commands that you need to know. +## Running Commands -The following commands are defined in the [`package.json`](https://github.com/Lissy93/dashy/blob/master/package.json#L5) file, and are run with `yarn`. If you prefer, you can use NPM, just replace instances of `yarn` with `npm run`. If you are using Docker, then you will need to precede each command with `docker exec -it [container-id]`, where container ID can be found by running `docker ps`. For example `docker exec -it 26c156c467b4 yarn build`. +The project has a few commands that can be used for various tasks, you can find a list of these either in the [Developing Docs](/docs/developing#project-commands), or by looking at the [`package.json`](https://github.com/Lissy93/dashy/blob/master/package.json#L5). These can be used by running `yarn [command-name]`. -- **`yarn build`** - In the interest of speed, the application is pre-compiled, this means that the config file is read during build-time, and therefore the app needs to rebuilt for any new changes to take effect. Luckily this is very straight forward. Just run `yarn build` or `docker exec -it [container-id] yarn build` -- **`yarn validate-config`** - If you have quite a long configuration file, you may wish to check that it's all good to go, before deploying the app. This can be done with `yarn validate-config` or `docker exec -it [container-id] yarn validate-config`. Your config file needs to be in `/public/conf.yml` (or within your Docker container at `/app/public/conf.yml`). This will first check that your YAML is valid, and then validates it against Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js). -- **`yarn health-check`** - Checks that the application is up and running on it's specified port, and outputs current status and response times. Useful for integrating into your monitoring service, if you need to maintain high system availability -- **`yarn build-watch`** - If you find yourself making frequent changes to your configuration, and do not want to have to keep manually rebuilding, then this option is for you. It will watch for changes to any files within the projects root, and then trigger a rebuild. Note that if you are developing new features, then `yarn dev` would be more appropriate, as it's significantly faster at recompiling (under 1 second), and has hot reloading, linting and testing integrated -- **`yarn build-and-start`** - Builds the app, runs checks and starts the production server. Commands are run in parallel, and so is faster than running them in independently -- **`yarn pm2-start`** - Starts the Node server using [PM2](https://pm2.keymetrics.io/), a process manager for Node.js applications, that helps them stay alive. PM2 has some built-in basic monitoring features, and an optional [management solution](https://pm2.io/). If you are running the app on bare metal, it is recommended to use this start command + But if you're using Docker, then you'll need to execute them within the container. This can be done by preceding each command with `docker exec -it [container-id]`, where container ID can be found by running `docker ps`. For example `docker exec -it 26c156c467b4 yarn build`. You can also enter the container, with `docker exec -it [container-id] /bin/ash`, and navigate around it with normal Linux commands. ## Healthchecks @@ -67,7 +63,7 @@ If you're not so comfortable on the command line, then you can use a tool like [ Dashy has [basic authentication](/docs/authentication) built in, however at present this is handled on the front-end, and so where security is critical, it is recommended to use an alternative method. See [here](/docs/authentication#alternative-authentication-methods) for options regarding securing Dashy. -**[⬆️ Back to Top](#)** +**[⬆️ Back to Top](#management)** --- ## Updating @@ -105,7 +101,7 @@ For more information, see the [Watchtower Docs](https://containrrr.dev/watchtowe 4. Re-build: `yarn build` 5. Start: `yarn start` -**[⬆️ Back to Top](#)** +**[⬆️ Back to Top](#management)** --- @@ -180,7 +176,7 @@ Then restart Apache, with `sudo systemctl restart apache2` 8. If you need to change the port, click 'Add environmental variable', give it the name 'PORT', choose a port number and press 'Save'. 9. Dashy should now be running at your selected path an on a given port -**[⬆️ Back to Top](#)** +**[⬆️ Back to Top](#management)** --- @@ -189,4 +185,4 @@ Then restart Apache, with `sudo systemctl restart apache2` Dashy has built-in authentication and login functionality. However, since this is handled on the client-side, if you are using Dashy in security-critical situations, it is recommended to use an alternate method for authentication, such as [Authelia](https://www.authelia.com/), a VPN or web server and firewall rules. For more info, see **[Authentication Docs](/docs/authentication)**. -**[⬆️ Back to Top](#)** \ No newline at end of file +**[⬆️ Back to Top](#management)** \ No newline at end of file diff --git a/docs/multi-language-support.md b/docs/multi-language-support.md index a99c5d76..44eb2cc2 100644 --- a/docs/multi-language-support.md +++ b/docs/multi-language-support.md @@ -1,23 +1,32 @@ # Internationalization -Internationalization is the process of making an application available in other languages. This is important, as not everyone is a native English speaker. +Internationalization is the process of making an application available in other languages. This is important, as not everyone is a native English speaker. This page explains how you can switch languages, how to add a new language, and how to make text translatable when writing a new component. -## Available Languages - -An up-to-date list of all currently supported languages can be found in [`./src/utils/languages.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/languages.js). Languages are specified by their 2-digit [ISO-639 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`, `fr`, `de`, `es`, etc) +- [Setting your Language](#setting-language) +- [Adding a new Language](#adding-a-new-language) +- [Adding New Text to a Component](#adding-new-text-to-a-component) --- -## How to change Language +## Setting Language By default, Dashy will attempt to use the language of your browser or system. If a translation for your language does not yet exist, it will fallback to English. -You can also manually select your language. This can be done, either through the UI (Config --> Language), or by setting it in your config file: +#### In the UI +You can manually select your language in the UI. Under the Config Menu, click the Language button, and select your language from the dropdown menu. Your preference will be saved in local storage. + +#### Config File +You can also set your language in the config file. Specify the ISO code of one of the supported languages, under `appConfig.lang`. For example: + ```yaml appConfig: - lang: de + lang: de ``` +#### Available Languages + +At the time of writing the following languages are supported: `en`, `zh-CN`, `nl`, `fr`, `de`, `es`, `sl`, `it`, `pt`, `ru`, `ar`, `hi`, `ja`, but an up-to-date list of all implemented translations can be found in [`./src/utils/languages.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/languages.js). Languages are specified by their 2-digit [ISO-639 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes), or sometimes a 4-digit code if it's a regional dialect. + --- ## Adding a new Language @@ -27,9 +36,10 @@ Dashy is using [vue-i18n](https://vue-i18n.intlify.dev/guide/) to manage multi-l Adding a new language is pretty straightforward, with just three steps: ##### 1. Create a new Language File -Create a new JSON file in `./src/assets/locales` name is a 2-digit [ISO-639 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language, E.g. for German `de.json`, French `fr.json` or Spanish `es.json` - You can find a list of all ISO codes at [iso.org](https://www.iso.org/obp/ui). -If your language is a specific dialect or regional language, then use the Posfix [CLDR](http://cldr.unicode.org/) format, where, e.g. `en-GB.json` (British), `es-MX.json` (Spanish, in Mexico) or `zh-CN.json` (Chinese, simplified) - A list of which can be found [here](https://github.com/unicode-org/cldr-json/blob/master/cldr-json/cldr-core/availableLocales.json) +Create a new JSON file in `./src/assets/locales` for your language. +You should name it with the 2-digit [ISO-639 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your locale (e.g. for German `de.json`, French `fr.json` or Spanish `es.json`) - You can find a list of all ISO codes at [iso.org](https://www.iso.org/obp/ui). +If your language is a specific dialect or regional translation, then use the Posfix [CLDR](http://cldr.unicode.org/) format, where, e.g. `en-GB.json` (British English), `es-MX.json` (Spanish, in Mexico) or `zh-CN.json` (Chinese, simplified) - A list of which can be found [here](https://github.com/unicode-org/cldr-json/blob/master/cldr-json/cldr-core/availableLocales.json) ##### 2. Translate! Using [`en.json`](https://github.com/Lissy93/dashy/tree/master/src/assets/locales/en.json) as an example, translate the JSON values to your language, while leaving the keys as they are. It's fine to leave out certain items, as if they're missing they will fall-back to English. If you see any attribute which include curly braces (`{xxx}`), then leave the inner value of these braces as is, as this is for variables. @@ -78,12 +88,9 @@ If you are not comfortable with making pull requests, or do not want to modify t --- -## Adding Text - -If you're working on a new component, then any text that is displayed to the user should be extracted out of the component, and stored in the file. This also applies to any existing components, that might have been forgotten to be translated. - -Thankfully, everything is already setup, and so is as easy as adding text to the JSON file, and pasting the key to that text in your component. +## Adding New Text to a Component +If you're working on a new component, then any text that is displayed to the user should be extracted out of the component, and stored in the file. This also applies to any existing components, that might have been forgotten to be translated. Thankfully, everything is already setup, so this is a pretty easy job. #### 1. Add Translated Text @@ -95,8 +102,7 @@ Firstly, go to [`./src/assets/locales/en.json`](https://github.com/Lissy93/dashy } ``` -Note that you **must** add English translations for all text. Missing languages are not a problem, as they will always fallback to Enslish, but if the English is missing, then nothing can be displayed. - +Note that you **must** add English translations for all text. Missing languages are not a problem, as they will always fallback to English, but if the English is missing, then nothing can be displayed. #### 2. Use Text within Component @@ -143,10 +149,9 @@ In [`./src/components/Settings/SearchBar.vue`](https://github.com/Lissy93/dashy/
+ />
``` @@ -159,6 +164,6 @@ Then in [`./src/assets/locales/en.json`](https://github.com/Lissy93/dashy/blob/m "search-label": "Search", "search-placeholder": "Start typing to filter", }, - ... + ... } ``` diff --git a/docs/privacy.md b/docs/privacy.md index 273347d1..51762614 100644 --- a/docs/privacy.md +++ b/docs/privacy.md @@ -56,15 +56,17 @@ The following section outlines all data that is stored in the browsers, as cooki - `LAYOUT_ORIENTATION` - Preferred section layout, either horizontal, vertical or auto - `COLLAPSE_STATE` - Remembers which sections are collapsed - `ICON_SIZE` - Size of items, either small, medium or large -- `THEME: 'theme` - Users applied theme +- `THEME` - Users applied theme - `CUSTOM_COLORS` - Any color modifications made to a given theme - `BACKUP_ID` - If a backup has been made, the ID is stored here - `BACKUP_HASH` - A unique hash of the previous backups meta data - `HIDE_SETTINGS` - Lets user hide or show the settings menu -- `USERNAME` - If user logged in, store username in order to welcome them +- `USERNAME` - If user logged in, store username. Only used to show welcome message, not used for auth - `CONF_SECTIONS` - Array of sections, only used when user applies changes locally - `PAGE_INFO` - Config page info, only used when user applies changes locally - `APP_CONFIG` - App config, only used when user applies changes locally +- `MOST_USED` - If smart sort is used to order items by most used, store open count +- `LAST_USED` - If smart sort is used to order items by last used, store timestamps --- @@ -95,6 +97,30 @@ This is covered in more detail in [App Management](/docs/management). --- +## Security Features + +#### Subresource Integrity +[Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) or SRI is a security feature that enables browsers to verify that resources they fetch are delivered without unexpected manipulation. It works by allowing you to provide a cryptographic hash that a fetched resource must match. This prevents the app from loading any resources that have been manipulated, by verifying the files hashes. It safeguards against the risk of an attacker injecting arbitrary malicious content into any files served up via a CDN. + +Dashy supports SRI, and it is recommended to enable this if you are hosting your dashboard via a public CDN. To enable SRI, set the `INTEGRITY` environmental variable to `true`. + +#### Authentication +Dashy supports both basic auth, as well as server-based SSO using Keycloak. Full details of which, along with alternate authentication methods can be found in the [Authentication Docs](/docs/authentication). If your dashboard is exposed to the internet and/ or contains any sensitive info it is strongly recommended to configure access control with Keycloak or another server-side method. + +--- + +## Disabling Features +You may wish to disable features that you don't want to use, if they involve storing data in the browser or making network requests. +- To disable smart-sort (uses local storage), set `appConfig.disableSmartSort: true` +- To disable update checks (makes external request to GH), set `appConfig.disableUpdateChecks: true` +- To disable web search (redirect to external / internal content), set `appConfig.disableWebSearch: true` +- To keep status checks disabled (external/ internal requests), set `appConfig.statusCheck: false` +- To keep font-awesome icons disabled (external requests), set `appConfig.enableFontAwesome: false` +- To keep error reporting disabled (external requests and data collection), set `appConfig.enableErrorReporting: false` +- To keep the service worker disabled (stores cache of app in browser data), set `appConfig.enableServiceWorker: false` + +--- + ## Reporting a Security Issue If you think you've found a critical issue with Dashy, please send an email to `security@mail.alicia.omg.lol`. You can encrypt it, using [`0688 F8D3 4587 D954 E9E5 1FB8 FEDB 68F5 5C02 83A7`](https://keybase.io/aliciasykes/pgp_keys.asc?fingerprint=0688f8d34587d954e9e51fb8fedb68f55c0283a7). You should receive a response within 48 hours. diff --git a/docs/quick-start.md b/docs/quick-start.md index 91f77892..36b14c39 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -121,8 +121,8 @@ Then edit `./public/conf.yml` and rebuild the app with `yarn build` ## Alternative Deployment Method 2 - Netlify -Don't have a server? No problem! You can run Dashy for free on Netlify (as well as many [other cloud providers](/docs/deployment#deploy-to-cloud-service)). All you need it a GitHub account. +Don't have a server? No problem! You can run Dashy for free on Netlify (as well as many [other cloud providers](./docs/deployment#deploy-to-cloud-service)). All you need it a GitHub account. 1. Fork Dashy's repository on GitHub -2. [Log in](https://app.netlify.com/login/) to Netlify with GitHub +2. [Log in](app.netlify.com/login/) to Netlify with GitHub 3. Click "New site from Git" and select your forked repo, then click **Deploy**! 4. You can then edit the config in `./public/conf.yml` in your repo, and Netlify will rebuild the app diff --git a/docs/readme.md b/docs/readme.md index 631e4fb8..b6dd1d3e 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -27,6 +27,6 @@ ### Misc - [Privacy & Security](/docs/privacy) - List of requests, potential issues, and security resources - [License](/docs/license) - Copy of the MIT License -- [Legal](https://github.com/Lissy93/dashy/blob/master/.github/LEGAL.md) - Licenses of direct dependencies +- [Legal](https://github.com/Lissy93/dashy/blob/master/.github/LEGAL) - Licenses of direct dependencies - [Code of Conduct](/docs/code-of-conduct) - Contributor Covenant Code of Conduct - [Changelog](/docs/changelog) - Details of recent changes, and historical versions diff --git a/docs/release-workflow.md b/docs/release-workflow.md new file mode 100644 index 00000000..951b1d67 --- /dev/null +++ b/docs/release-workflow.md @@ -0,0 +1,158 @@ + +# Releases and Workflows + +- [Release Schedule](#release-schedule) +- [Deployment Process](#deployment-process) +- [Git Strategy](#git-strategy) +- [Automated Workflows](#automated-workflows) + +## Release Schedule + +We're using [Semantic Versioning](https://semver.org/), to indicate major, minor and patch versions. You can find the current version number in the readme, and check your apps version under the config menu. The version number is pulled from the [package.json](https://github.com/Lissy93/dashy/blob/master/package.json#L3) file. + +Typically there is a new major release every 2 weeks, usually on Sunday, and you can view these under the [Releases Page](https://github.com/Lissy93/dashy/releases). Each new version will also have a corresponding [tag on GitHub](https://github.com/Lissy93/dashy/tags), and each major release will also result in the creation of a new [tag on DockerHub](https://hub.docker.com/r/lissy93/dashy/tags), so that you can fix your container to a certain version. + +For a full breakdown of each change, you can view the [Changelog](https://github.com/Lissy93/dashy/blob/master/.github/CHANGELOG). Each new feature or significant change needs to be submitted through a pull request, which makes it easy to review and track these changes, and roll back if needed. + +--- + +## Deployment Process + +All changes and new features are submitted as pull requests, which can then be tested, reviewed and (hopefully) merged into the master branch. Every time there is a change in the major version number, a new release is published. This usually happens every 2 weeks, on a Sunday. + +When a PR is opened: +- The feature branch is built, and deployed as a Netlify instance. This can be accessed at: `https://deploy-preview-[pr-number]--dashy-dev.netlify.app`, and this URL as well as a link to the build logs are added as a comment on the PR by Netlify bot +- Depending on what files were modified, the bot may also add a comment to remind the author of useful info +- A series of checks will run on the new code, using GH Actions, and prevent merging if they fail. This includes: linting, testing, code quality and complexity checking, security scanning and a spell check +- If a new dependency was added, liss-bot will comment with a summary of those changes, as well as the cost of the module, version, and any security concerns. If the bundle size has increased, this will also be added as a comment + +After the PR is merged: +- The app is build, and deployed to: https://dev.dashy.to +- A new tag in GitHub is created, using the apps version number (from the package.json) +- The Docker container is built, and published under the `:latest` tag on DockerHub and GHCR + +When a new major version is released: +- A new GitHub release is created and published, under new versions tag, with info from the changelog +- The container is built and published under a new tag will be created on DockerHub, called `:release-[version]` +- An announcement is opened in GitHub discussions, outlining the main changes, where users can comment and ask questions + +[![Netlify Status](https://api.netlify.com/api/v1/badges/3a0216c3-1ed0-40f5-ad90-ff68b1c96c09/deploy-status)](https://app.netlify.com/sites/dashy-dev/deploys) + +--- + +## Git Strategy + +### Git Flow +Like most Git repos, we are following the [Github Flow](https://guides.github.com/introduction/flow) standard. + +1. Create a branch (or fork if you don'd have write acces) +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 🎉 + +### Git Branch Naming +The format of your branch name should be something similar to: `[TYPE]/[TICKET]_[TITLE]` +For example, `FEATURE/420_Awesome-feature` or `FIX/690_login-server-error` + +### Commit Emojis +Using a single emoji at the start of each commit message, to indicate the type task, makes the commit ledger easier to understand, plus it looks cool. + +- 🎨 `:art:` - Improve structure / format of the code. +- ⚡️ `:zap:` - Improve performance. +- 🔥 `:fire:` - Remove code or files. +- 🐛 `:bug:` - Fix a bug. +- 🚑️ `:ambulance:` - Critical hotfix +- ✨ `:sparkles:` - Introduce new features. +- 📝 `:memo:` - Add or update documentation. +- 🚀 `:rocket:` - Deploy stuff. +- 💄 `:lipstick:` - Add or update the UI and style files. +- 🎉 `:tada:` - Begin a project. +- ✅ `:white_check_mark:` - Add, update, or pass tests. +- 🔒️ `:lock:` - Fix security issues. +- 🔖 `:bookmark:` - Make a Release or Version tag. +- 🚨 `:rotating_light:` - Fix compiler / linter warnings. +- 🚧 `:construction:` - Work in progress. +- ⬆️ `:arrow_up:` - Upgrade dependencies. +- 👷 `:construction_worker:` - Add or update CI build system. +- ♻️ `:recycle:` - Refactor code. +- 🩹 `:adhesive_bandage:` - Simple fix for a non-critical issue. +- 🔧 `:wrench:` - Add or update configuration files. +- 🍱 `:bento:` - Add or update assets. +- 🗃️ `:card_file_box:` - Perform database schema related changes. +- ✏️ `:pencil2:` - Fix typos. +- 🌐 `:globe_with_meridians:` - Internationalization and translations. + +For a full list of options, see [gitmoji.dev](https://gitmoji.dev/) + +### PR Guidelines +Once you've made your changes, and pushed them to your fork or branch, you're ready to open a pull request! + +For a pull request 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 + +When you submit your PR, include the required info, by filling out the PR template. Including: +- A brief description of your changes +- The issue, ticket or discussion number (if applicable) +- For UI relate updates include a screenshot +- If any dependencies were added, explain why it was needed, state the cost associated, and confirm it does not introduce any security issues +- Finally, check the checkboxes, to confirm that the standards are met, and hit submit! + +--- + +## Automated Workflows + +Dashy makes heavy use of [GitHub Actions](https://github.com/features/actions) to fully automate the checking, testing, building, deploying of the project, as well as administration tasks like management of issues, tags, releases and documentation. The following section outlines each workflow, along with a link the the action file, current status and short description. A lot of these automations were made possible using community actions contributed to GH marketplace by some amazing people. + + +### Code Processing + +Action | Description +--- | --- +**Code Linter**
[![code-linter.yml](https://github.com/Lissy93/dashy/actions/workflows/code-linter.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/code-linter.yml) | After a pull request is created, all new code changes will be linted, and the CI will fail with a helpful message if the code has any formatting inconsistencies +**Code Spell Check**
[![code-spell-check.yml](https://github.com/Lissy93/dashy/actions/workflows/code-spell-check.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/code-spell-check.yml) | After a PR submitted, all auto-fixable spelling errors will be detected, then Liss-Bot will create a separate PR to propose the fixes +**Dependency Update Summary**
[![dependency-updates-summary.yml](https://github.com/Lissy93/dashy/actions/workflows/dependency-updates-summary.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/dependency-updates-summary.yml) | After a PR is submitted, if any of the dependencies are modified, then Liss-Bot will add a comment, explaining which packages have been added, removed, updated or downgraded, as well as other helpful info +**Get Size**
[![get-size.yml](https://github.com/Lissy93/dashy/actions/workflows/get-size.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/get-size.yml) | Adds comment to PR if the size of the built + bundled application has changed compared to the previous version +**Security Scan**
[![security-scanning.yml](https://github.com/Lissy93/dashy/actions/workflows/security-scanning.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/security-scanning.yml) | Uses Snyk to scan the code and dependencies after a PR. Will add a comment and cause the build to fail if a new vulnerability or potential issue is present + +### Releases + +Action | Description +--- | --- +**Create Tag**
[![auto-tag-pr.yml](https://github.com/Lissy93/dashy/actions/workflows/auto-tag-pr.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/auto-tag-pr.yml) | Whenever the version indicated in package.json is updates, a new GitHub tag will be created for that point in time +**Build App**
[![build-app.yml](https://github.com/Lissy93/dashy/actions/workflows/build-app.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/build-app.yml) | After changes are merged into the master branch, the app will be build, with output pushed to the `dev-demo` branch +**Cache Artifacts**
[![cache-artifacts.yml](https://github.com/Lissy93/dashy/actions/workflows/cache-artifacts.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/cache-artifacts.yml) | After build, returned files will be cached for future actions for that commit +**Docker Publish**
[![docker-publish.yml](https://github.com/Lissy93/dashy/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/docker-publish.yml) | After PR is merged, the multi-architecture Docker container will be built, and then published to GHCR + +### Issue Management + +Action | Description +--- | --- +**Close Incomplete Issues**
[![close-incomplete-issues.yml](https://github.com/Lissy93/dashy/actions/workflows/close-incomplete-issues.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/close-incomplete-issues.yml) | Issues which do not match any of the issue templates will be closed, and a comment posted explaining why +**Close Stale Issues**
[![close-stale-issues.yml](https://github.com/Lissy93/dashy/actions/workflows/close-stale-issues.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/close-stale-issues.yml) | Issues which have not been updated for 6 weeks will have a comment posted to them. If the author does not reply within the next week, then the issue will be marked as stale and closed. The original author may still reopen the issue at any time +**Close Potential Spam Issues**
[![issue-spam-control.yml](https://github.com/Lissy93/dashy/actions/workflows/issue-spam-control.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/issue-spam-control.yml) | Auto-closes issues, and adds a comment if it was submitted by a user who hasn't yet interacted with the repo, is new to GitHub and has not starred the repository. The comment will advise them to check their issue is complete, and then allow them to reopen it +**Issue Translator**
[![issue-translator.yml](https://github.com/Lissy93/dashy/actions/workflows/issue-translator.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/issue-translator.yml) | Auto-translates any comments and issues that were written in any language other than English, and posts the translation as a comment below +**Label Sponsors**
[![label-sponsors.yml](https://github.com/Lissy93/dashy/actions/workflows/label-sponsors.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/label-sponsors.yml) | Adds a special label to any issues or pull requests raised by users who are sponsoring the project via GitHub, so that they can get priority support +**LGTM Comment**
[![lgtm-comment.yml](https://github.com/Lissy93/dashy/actions/workflows/lgtm-comment.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/lgtm-comment.yml) | When a PR review contains the words LGTM (looks good to me), the Liss-Bot will reply with a random celebratory or thumbs up GIF, just as a bit of fun +**Mind your Language**
[![mind-your-language.yml](https://github.com/Lissy93/dashy/actions/workflows/mind-your-language.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/mind-your-language.yml) | Replies to any comment (on issue or PR) that contains profanities, offensive or inappropriate language with a polite note reminding the user of the code of conduct +**Release Notifier**
[![release-commenter.yml](https://github.com/Lissy93/dashy/actions/workflows/release-commenter.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/release-commenter.yml) | Once a release has been published which fixes an issue, a comment will be added to the relevant issues informing the user who raised it that it was fixed in the current release +**Update Issue after Merge**
[![update-issue-after-pr.yml](https://github.com/Lissy93/dashy/actions/workflows/update-issue-after-pr.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/update-issue-after-pr.yml) | After a PR which fixes an issue is merged, Liss-Bot will add a comment to said issue based on the git commit message +**Auto Add Comment Based on Tag**
[![add-comment-from-tag.yml](https://github.com/Lissy93/dashy/actions/workflows/add-comment-from-tag.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/add-comment-from-tag.yml) | Will add comment with useful info to certain issues, based on the tag applied + +### PR Management + +Action | Description +--- | --- +**PR Commenter**
[![pr-commenter.yml](https://github.com/Lissy93/dashy/actions/workflows/pr-commenter.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/pr-commenter.yml) | Adds comment with helpful info to pull requests, based on which files have been changes +**Issue from Todo Code**
[![raise-issue-from-todo.yml](https://github.com/Lissy93/dashy/actions/workflows/raise-issue-from-todo.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/raise-issue-from-todo.yml) | When a `todo` note is found in the code after a PR, then Liss-Bot will automatically raise an issue, so that the todo can be addressed/ implemented. The issue will be closed once the todo has been implemented or removed + +### Documentation & Reports + +Action | Description +--- | --- +**Generate Credits**
[![generate-credits.yml](https://github.com/Lissy93/dashy/actions/workflows/generate-credits.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/generate-credits.yml) | Generates a report, including contributors, collaborators, sponsors, bots and helpful users. Will then insert a markdown table with thanks to these GitHub users and links to their profiles into the Credits page, as well as a summary of sponsors and top contributors into the main readme +**Wiki Sync**
[![wiki-sync.yml](https://github.com/Lissy93/dashy/actions/workflows/wiki-sync.yml/badge.svg)](https://github.com/Lissy93/dashy/actions/workflows/wiki-sync.yml) | Generates and publishes the repositories wiki page using the markdown files within the docs directory + +--- \ No newline at end of file diff --git a/docs/searching.md b/docs/searching.md index dddd8424..870618d1 100644 --- a/docs/searching.md +++ b/docs/searching.md @@ -1,83 +1,107 @@ -# Keyboard Shortcuts - -## Searching -One of the primary purposes of Dashy is to allow you to quickly find and launch a given app. To make this as quick as possible, there is no need to touch the mouse, or press a certain key to begin searching - just start typing. Results will be filtered in real-time. No need to worry about case, special characters or small typos, these are taken care of, and your results should appear. - -## Navigating -You can navigate through your items or search results using the keyboard. You can use Tab to cycle through results, and Shift + Tab to go backwards. Or use the arrow keys, , , and . - -## Launching Apps -You can launch a elected app by hitting Enter. This will open the app using your default opening method, specified in `target` (either `newtab`, `sametab`, `modal` or `workspace`). You can also use Alt + Enter to open the app in a pop-up modal, or Ctrl + Enter to open it in a new tab. For all available opening methods, just right-click on an item, to bring up the context menu. - -## Tags -By default, items are filtered by the `title` attribute, as well as the hostname (extracted from `url`), the `provider` and `description`. If you need to find results based on text which isn't included in these attributes, then you can add `tags` to a given item. - -```yaml - items: - - title: Plex - description: Media library - icon: favicon - url: https://plex.lab.local - tags: [ movies, videos, music ] - - title: FreshRSS - description: RSS Reader - icon: favicon - url: https://freshrss.lab.local - tags: [ news, updates, blogs ] - -``` - -In the above example, Plex will be visible when searching for 'movies', and FreshRSS with 'news' - - -## Custom Hotkeys -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 much quicker than searching for it, if it's an app you use frequently. - -```yaml -- title: Bookstack - icon: far fa-books - url: https://bookstack.lab.local/ - hotkey: 2 -- title: Git Tea - icon: fab fa-git - url: https://git.lab.local/ - target: workspace - hotkey: 3 -``` - -In the above example, pressing 2 will launch Bookstack. Or hitting 3 will open Git in the workspace view. - -## Web Search -It's possible to search the web directly from Dashy, which might be useful if you're using Dashy as your start page. This can be done by typing your query as normal, and then pressing . Web search options are configured under `appConfig.webSearch`. - -#### Setting Search Engine -Set your default search engine using the `webSearch.searchEngine` property. This defaults to DuckDuckGo. Search engine must be referenced by their key, the following providers are supported: -- [`duckduckgo`](https://duckduckgo.com), [`google`](https://google.com), [`whoogle`](https://whoogle.sdf.org), [`qwant`](https://www.qwant.com), [`startpage`](https://www.startpage.com), [`searx-bar`](https://searx.bar), [`searx-info`](https://searx.info) -- [`searx-tiekoetter`](https://searx.tiekoetter.com), [`searx-bissisoft`](https://searx.bissisoft.com), [`ecosia`](https://www.ecosia.org), [`metager`](https://metager.org/meta), [`swisscows`](https://swisscows.com), [`mojeek`](https://www.mojeek.com) -- [`wikipedia`](https://en.wikipedia.org), [`wolframalpha`](https://www.wolframalpha.com), [`stackoverflow`](https://stackoverflow.com), [`github`](https://github.com), [`reddit`](https://www.reddit.com), [`youtube`](https://youtube.com), [`bbc`](https://www.bbc.co.uk) - -#### Using Custom Search Engine -You can also use a custom search engine, that isn't included in the above list (like a self-hosted instance of [Whoogle](https://github.com/benbusby/whoogle-search) or [Searx](https://searx.github.io/searx/)). Set `searchEngine: custom`, and then specify the URL (plus query params) to you're search engine under `customSearchEngine`. - -For example: -```yaml -appConfig: - webSearch: - searchEngine: custom - customSearchEngine: 'https://searx.local/search?q=' -``` - -#### Setting Opening Method -In a similar way to opening apps, you can specify where you would like search results to be opened. This is done under the `openingMethod` attribute, and can be set to either `newtab`, `sametab` or `workspace`. By default results are opened in a new tab. - -#### Disabling Web Search -Web search can be disabled, by setting `disableWebSearch`, for example: - -```yaml -appConfig: - webSearch: { disableWebSearch: true } -``` - -## Clearing Search -You can clear your search term at any time, by pressing Esc. -This can also be used to close an open pop-up modal. +# Keyboard Shortcuts + +## Searching +One of the primary purposes of Dashy is to allow you to quickly find and launch a given app. To make this as quick as possible, there is no need to touch the mouse, or press a certain key to begin searching - just start typing. Results will be filtered in real-time. No need to worry about case, special characters or small typos, these are taken care of, and your results should appear. + +## Navigating +You can navigate through your items or search results using the keyboard. You can use Tab to cycle through results, and Shift + Tab to go backwards. Or use the arrow keys, , , and . + +## Launching Apps +You can launch a elected app by hitting Enter. This will open the app using your default opening method, specified in `target` (either `newtab`, `sametab`, `modal` or `workspace`). You can also use Alt + Enter to open the app in a pop-up modal, or Ctrl + Enter to open it in a new tab. For all available opening methods, just right-click on an item, to bring up the context menu. + +## Tags +By default, items are filtered by the `title` attribute, as well as the hostname (extracted from `url`), the `provider` and `description`. If you need to find results based on text which isn't included in these attributes, then you can add `tags` to a given item. + +```yaml + items: + - title: Plex + description: Media library + icon: favicon + url: https://plex.lab.local + tags: [ movies, videos, music ] + - title: FreshRSS + description: RSS Reader + icon: favicon + url: https://freshrss.lab.local + tags: [ news, updates, blogs ] + +``` + +In the above example, Plex will be visible when searching for 'movies', and FreshRSS with 'news' + + +## Custom Hotkeys +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 much quicker than searching for it, if it's an app you use frequently. + +```yaml +- title: Bookstack + icon: far fa-books + url: https://bookstack.lab.local/ + hotkey: 2 +- title: Git Tea + icon: fab fa-git + url: https://git.lab.local/ + target: workspace + hotkey: 3 +``` + +In the above example, pressing 2 will launch Bookstack. Or hitting 3 will open Git in the workspace view. + +## Web Search +It's possible to search the web directly from Dashy, which might be useful if you're using Dashy as your start page. This can be done by typing your query as normal, and then pressing . Web search options are configured under `appConfig.webSearch`. + +### Setting Search Engine +Set your default search engine using the `webSearch.searchEngine` property. This defaults to DuckDuckGo. Search engine must be referenced by their key, the following providers are supported: +- [`duckduckgo`](https://duckduckgo.com), [`google`](https://google.com), [`whoogle`](https://whoogle.sdf.org), [`qwant`](https://www.qwant.com), [`startpage`](https://www.startpage.com), [`searx-bar`](https://searx.bar), [`searx-info`](https://searx.info) +- [`searx-tiekoetter`](https://searx.tiekoetter.com), [`searx-bissisoft`](https://searx.bissisoft.com), [`ecosia`](https://www.ecosia.org), [`metager`](https://metager.org/meta), [`swisscows`](https://swisscows.com), [`mojeek`](https://www.mojeek.com) +- [`wikipedia`](https://en.wikipedia.org), [`wolframalpha`](https://www.wolframalpha.com), [`stackoverflow`](https://stackoverflow.com), [`github`](https://github.com), [`reddit`](https://www.reddit.com), [`youtube`](https://youtube.com), [`bbc`](https://www.bbc.co.uk) + +### Using Custom Search Engine +You can also use a custom search engine, that isn't included in the above list (like a self-hosted instance of [Whoogle](https://github.com/benbusby/whoogle-search) or [Searx](https://searx.github.io/searx/)). Set `searchEngine: custom`, and then specify the URL (plus query params) to you're search engine under `customSearchEngine`. + +For example: +```yaml +appConfig: + webSearch: + searchEngine: custom + customSearchEngine: 'https://searx.local/search?q=' +``` + +### Setting Opening Method +In a similar way to opening apps, you can specify where you would like search results to be opened. This is done under the `openingMethod` attribute, and can be set to either `newtab`, `sametab` or `workspace`. By default results are opened in a new tab. + +### Using Bangs +An insanely useful feature of DDG is [Bangs](https://duckduckgo.com/bang), where you type a specific character combination at the start of your search query, and it will be redirected the that website, such as '!w Docker' will display the Docker wikipedia page. Dashy has a similar feature, enabling you to define your own custom bangs to redirect search results to a specific app, website or search engine. + +This is done under the `searchBangs` property, with a list of key value pairs. The key is what you will type, and the value is the destination, either as an identifier or a URL with query parameters. + +For example: + +```yaml +appConfig: + webSearch: + searchEngine: 'duckduckgo' + openingMethod: 'newtab' + searchBangs: + /r: reddit + /w: wikipedia + /s: https://whoogle.local/search?q= + /a: https://www.amazon.co.uk/s?k= + ':wolf': wolframalpha + ':so': stackoverflow + ':git': github +``` + +Note that bangs begging with `!` or `:` must be surrounded them in quotes + +### Disabling Web Search +Web search can be disabled, by setting `disableWebSearch`, for example: + +```yaml +appConfig: + webSearch: { disableWebSearch: true } +``` + +## Clearing Search +You can clear your search term at any time, resting the UI to it's initial state, by pressing Esc. +This can also be used to close any open pop-up modals. diff --git a/docs/showcase.md b/docs/showcase.md index 5cb00b7f..91d50534 100644 --- a/docs/showcase.md +++ b/docs/showcase.md @@ -54,6 +54,13 @@ --- +### First Week of Self-Hosting +> By [u//RickyCZ](https://www.reddit.com/user/RickyCZ) + +![screenshot-week-of-self-hosting](https://raw.githubusercontent.com/Lissy93/dashy/master/docs/showcase/11-ricky-cz.png) + +--- + ### Ground Control > By [@dtctek](https://github.com/dtctek) diff --git a/docs/showcase/11-ricky-cz.png b/docs/showcase/11-ricky-cz.png new file mode 100644 index 0000000000000000000000000000000000000000..8c8ddcbb7dd8c3bbefaa5cf15a2de83f65768564 GIT binary patch literal 180640 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

VKuDx_v2r8}3$X1!eGr3a{4)Z&!aM%m%WIa` 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�S-CLdKSw;SbEP^qkT2Jq%lI$3Q}6qC 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%0AOT(#QLwl_~ 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 eWB=O;-;TA&U(${3BqyGmc#Vq6i literal 0 HcmV?d00001 diff --git a/docs/status-indicators.md b/docs/status-indicators.md index 5c700a0f..9d3ad488 100644 --- a/docs/status-indicators.md +++ b/docs/status-indicators.md @@ -3,7 +3,7 @@ Dashy has an optional feature that can display a small icon next to each of your running services, indicating it's current status. This can be 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. The status feature will show response time, response code, online/ offline check and if applicable, a relevant error message

- +

## Enabling Status Indicators @@ -42,7 +42,7 @@ By default, with status indicators enabled Dashy will check an applications stat The following example, will instruct Dashy to continuously check the status of your services every 20 seconds -```yaml +``` appConfig: statusCheck: true statusCheckInterval: 20 @@ -70,9 +70,13 @@ Vary: Origin ``` If the URL you are checking is not using HTTPS, then you may need to disable the rejection of insecure requests. This can be done by setting `statusCheckAllowInsecure` to true for a given item. -If you're serving Dashy though a CDN, instead of using the Node server or Docker image, then the Node endpoint that makes requests will not be available to you, and all requests will fail. A workaround for this may be implemented in the future, but in the meantime, your only option is to use the Docker or Node deployment method. +If you get an error, like `Service Unavailable: Server resulted in a fatal error`, even when it's definitely online, this is most likely caused by missing the protocol. Don't forget to include `https://` (or whatever protocol) before the URL, and ensure that if needed, you've specified the port. -For further troubleshooting, use an application like [Postman](https://postman.com) to diagnose the issue. +Currently, the status check needs a page to be rendered, so if this URL in your browser does not return anything, then status checks will not work. This may be modified in the future, but in the meantime, a fix would be to make your own status service, which just checks if your app responds with whatever code you'd like, and then return a 200 plus renders an arbitrary message. Then just point `statusCheckUrl` to your custom page. + +For further troubleshooting, use an application like [Postman](https://postman.com) to diagnose the issue. Set the parameter to `GET`, and then make a call to: `https://[url-of-dashy]/ping/?&url=[service-url]`. Where the service URL must have first been encoded (e.g. with `encodeURIComponent()` or [urlencoder.io](https://www.urlencoder.io/)) + +If you're serving Dashy though a CDN, instead of using the Node server or Docker image, then the Node endpoint that makes requests will not be available to you, and all requests will fail. A workaround for this may be implemented in the future, but in the meantime, your only option is to use the Docker or Node deployment method. ## How it Works diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 11e334ec..ed688748 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -135,3 +135,25 @@ Just add the [-host-header](https://ngrok.com/docs#http-host-header) flag, e.g. ## Warnings in the Console during deploy Please acknowledge the difference between errors and warnings before raising an issue about messages in the console. It's not unusual to see warnings about a new version of a certain package being available, an asset bundle bing oversized or a service worker not yet having a cache. These shouldn't have any impact on the running application, so please don't raise issues about these unless it directly relates to a bug or issue you're experiencing. Errors on the other hand should not appear in the console, and they are worth looking into further. + +--- + +## Status Checks Failing +If you're using status checks, and despite a given service being online, the check is displaying an error, there are a couple of things you can look at: + +If your service requires requests to include any authorization in the headers, then use the `statusCheckHeaders` property, as described in the [docs](/docs/status-indicators#setting-custom-headers). + +If you are still having issues, it may be because your target application is blocking requests from Dashy's IP. This is a [CORS error](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS), and can be fixed by setting the headers on your target app, to include: +``` +Access-Control-Allow-Origin: https://location-of-dashy/ +Vary: Origin +``` +If the URL you are checking has an unsigned certificate, or is not using HTTPS, then you may need to disable the rejection of insecure requests. This can be done by setting `statusCheckAllowInsecure` to true for a given item. + +If you get an error, like `Service Unavailable: Server resulted in a fatal error`, even when it's definitely online, this is most likely caused by missing the protocol. Don't forget to include `https://` (or whatever protocol) before the URL, and ensure that if needed, you've specified the port. + +Currently, the status check needs a page to be rendered, so if this URL in your browser does not return anything, then status checks will not work. This may be modified in the future, but in the meantime, a fix would be to make your own status service, which just checks if your app responds with whatever code you'd like, and then return a 200 plus renders an arbitrary message. Then just point `statusCheckUrl` to your custom page. + +For further troubleshooting, use an application like [Postman](https://postman.com) to diagnose the issue. Set the parameter to `GET`, and then make a call to: `https://[url-of-dashy]/ping/?&url=[service-url]`. Where the service URL must have first been encoded (e.g. with `encodeURIComponent()` or [urlencoder.io](https://www.urlencoder.io/)) + +If you're serving Dashy though a CDN, instead of using the Node server or Docker image, then the Node endpoint that makes requests will not be available to you, and all requests will fail. A workaround for this may be implemented in the future, but in the meantime, your only option is to use the Docker or Node deployment method. \ No newline at end of file