This article outlines how to get Shipyard 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, for tutorials covering basic tasks.
- Setting up the Development Environment
- Git Strategy
- Resources for Beginners
- App Info
- Code Style Guide
- Application Structure
- Development Tools
- Misc / Notes
You will need either the latest or LTS version of Node.js to build and serve the application and Git to easily fetch the code, and push any changes. If you plan on running or deploying the container, you'll also need Docker. To avoid any unexpected issues, ensure you've got at least NPM V 7.5 or Yarn 1.22 (you may find NVM helpful for switching/ managing versions).
- Get Code:
git clone https://github.com/khulnaSoft/shipyard.git
- Navigate into the directory:
cd shipyard
- Install dependencies:
yarn
- Start dev server:
yarn dev
Shipyard should now be being served on http://localhost:8080/. Hot reload is enabled, so making changes to any of the files will trigger them to be rebuilt and the page refreshed.
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 runyarn build
ordocker 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)
yarn dev
- Starts the development server with hot reloadingyarn lint
- Lints code to ensure it follows a consistent, neat styleyarn test
- Runs tests, and outputs results
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 withyarn validate-config
ordocker exec -it [container-id] yarn validate-config
. Your config file needs to be in/user-data/conf.yml
(or within your Docker container at/app/user-data/conf.yml
). This will first check that your YAML is valid, and then validates it against Shipyard's schema.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-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 theyarn build
andyarn start
commandsyarn 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, thenyarn dev
would be more appropriate, as it's significantly faster at recompiling (under 1 second), and has hot reloading, linting and testing integratedyarn pm2-start
- Starts the Node server using PM2, 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. If you are running the app on bare metal, it is recommended to use this start command
- If you are using NPM, replace
yarn
withnpm run
- If you are using Docker, precede each command with
docker exec -it [container-id]
. Container ID can be found by runningdocker ps
- You can manage the app using the Vue-CLI Service, with
npx vue-cli-service [command]
. Or to start the Vue Management UI, runnpx vue ui
, and openhttp://localhost:8000
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
file.
NODE_ENV
- Current environment, can be either development, production or testPORT
- The port to expose the running application onHOST
- The host that Shipyard is running on, domain or IPBASE_URL
- The default base path for serving up static assetsVUE_APP_DOMAIN
- Usually the same as BASE_URL, but accessible in frontendINTEGRITY
- Should enable SRI for build script and link resourcesIS_DOCKER
- Computed automatically on build. Indicates if running in containerVUE_APP_VERSION
- Again, set automatically using package.json during build timeBACKUP_DIR
- Directory for conf.yml backups
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.
Like most Git repos, we are following the Github Flow standard.
- Create a branch (or fork if you don'd have write access)
- Code some awesome stuff ๐งโ๐ป
- Add, commit and push your changes to your branch/ fork
- Head over to GitHub and create a Pull Request
- Fill in the required sections in the template, and hit submit
- Follow up with any reviews on your code
- Merge ๐
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
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
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!
New to Web Development? Glad you're here! Shipyard 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:
- Open Source for Beginners
- Introduction to Vue.js
- Vue.js Walkthrough
- ES6 Features
- Definitive guide to SCSS
- Complete beginners guide to Docker
- Docker Classroom - Interactive Tutorials
- Quick start TypeScript guide
- Complete TypeScript tutorial series
- Using TypeScript with Vue.js
- Git cheat sheet
- Basics of using NPM
As well as Node, Git and Docker- you'll also need an IDE (e.g. VS Code or Vim) and a terminal (Windows users may find WSL more convenient).
Linting is done using ESLint, and using the Vue.js Styleguide, which is very similar to the AirBnB Styleguide. 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
The most significant things to note are:
- Indentation should be done with two spaces
- Strings should use single quotes
- All statements must end in a semi-colon
- The final element in all objects must be preceded with a comma
- Maximum line length is 100
- There must be exactly one blank line between sections, before function names, and at the end of the file
- With conditionals, put else on the same line as your if block's closing brace
- All multiline blocks must use braces
- Avoid console statements in the frontend
Styleguides:
- Vue: Vue styleguide
- JavaScript: github.com/airbnb/javascript
โฎ
โโโ package.json # Project meta-data, dependencies and paths to scripts
โโโ src/ # Project front-end source code
โโโ server.js # A Node.js server to serve up the /dist directory
โโโ services/ # All server-side endpoints and utilities
โโโ vue.config.js # Vue.js configuration
โโโ Dockerfile # The blueprint for building the Docker container
โโโ docker-compose.yml # A Docker run command
โโโ .env # Location for any environmental variables
โโโ yarn.lock # Auto-generated list of current packages and version numbers
โโโ docs/ # Markdown documentation
โโโ README.md # Readme, basic info for getting started
โโโ LICENSE.md # License for use
โฏ
./src
โโโ App.vue # Vue.js starting file
โโโ assets # Static non-compiled assets
โ โโโ fonts # .ttf font files
โ โโโ locales # All app text, each language in a separate JSON file
โ โฐโโ interface-icons # SVG icons used in the app
โโโ components # All front-end Vue web components
โ โโโ Charts # Charting components for dynamically displaying widget data
โ โ โโโ Gauge.vue # A speed-dial style chart for showing 0 - 100 values
โ โ โฐโโ PercentageChart.vue # A horizontal bar for showing percentage breakdowns
โ โโโ 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
โ โ โโโ EditSiteMeta.vue # Form where the user can edit site meta data
โ โ โโโ JsonEditor.vue # JSON editor, where the user can modify the main config file
โ โ โฐโโ RebuildApp.vue # A component allowing user to trigger a rebuild through the UI
โ โโโ FormElements # Basic form elements used throughout the app
โ โ โโโ Button.vue # Standard button component
โ โ โโโ Radio.vue # Standard radio button input
โ โ โโโ Select.vue # Standard dropdown input selector
โ โ โโโ Input.vue # Standard text field input component
โ โ โฐโโ Toggle.vue # Standard on / off toggle switch
โ โโโ InteractiveEditor # Components for the interactive UI config editor
โ โ โโโ AddNewSectionLauncher # Button that launches the EditSection form, used for adding new section
โ โ โโโ EditAppConfig.vue # Form for editing appConfig
โ โ โโโ EditPageInfo.vue # Form for editing pageInfo
โ โ โโโ EditSection.vue # Form for adding / editing sections
โ โ โโโ EditItem.vue # Form for adding or editing items
โ โ โโโ EditModeSaveMenu.vue # The bar at the bottom of screen in edit mode, containing save buttons
โ โ โโโ EditModeTopBanner.vue # The bar at the top of screen in edit mode
โ โ โโโ ExportConfigMenu.vue # Modal for viewing / exporting edited config
โ โ โโโ MoveItemTo.vue # Form for moving / copying items to other sections
โ โ โฐโโ SaveCancelButtons.vue # Buttons visible in all the edit menus, to save or cancel changes
โ โโโ LinkItems # Components for Sections and Link Items
โ โ โโโ Collapsable.vue # The collapsible functionality of sections
โ โ โโโ IframeModal.vue # Pop-up iframe modal, for viewing websites within the app
โ โ โโโ Item.vue # Main link item, which is displayed within an item group
โ โ โโโ ItemGroup.vue # Item group is a section containing icons
โ โ โโโ ItemIcon.vue # The icon used by both items and sections
โ โ โโโ ItemOpenMethodIcon.vue # A small icon, visible on hover, indicating opening method
โ โ โโโ ItemContextMenu.vue # The right-click menu, for showing Item opening methods and info
โ โ โโโ SectionContextMenu.vue # The right-click menu, for showing Section edit/ open options
โ โ โฐโโ 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
โ โ โฐโโ WidgetView.vue # Workspace container for displaying widgets in main content
โ โโโ Widgets # Directory contains all custom widget components
โ โ โฐโโ .... # Too many to list, see widget docs instead
โ โฐโโ Settings # Components relating to the quick-settings, in the top-right
โ โโโ 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
โ โโโ KeyboardShortcutInfo.vue# Small pop-up displaying the available keyboard shortcuts
โ โโโ LanguageSwitcher.vue # Dropdown in a modal for changing app language
โ โโโ LayoutSelector.vue # Set of buttons, letting the user select their desired layout
โ โโโ SearchBar.vue # The input field in the header, used for searching the app
โ โโโ SettingsContainer.vue # Container that wraps all the quick-settings components
โ โฐโโ ThemeSelector.vue # Drop-down menu enabling the user to select and change themes
โโโ main.js # Main front-end entry point
โโโ registerServiceWorker.js # Registers and manages service workers, for PWA apps
โโโ router.js # Defines all available application routes
โโโ styles # Directory of all globally used common SCSS styles
โ โโโ color-palette.scss # All color variable names and default values
โ โโโ color-themes.scss # All variable values for built-in themes
โ โโโ dimensions.scss # Dimensions and sizes as variables
โ โโโ global-styles.scss # Basics and style resets used globally
โ โโโ media-queries.scss # Screen sizes and media queries
โ โโโ style-helpers.scss # SCSS functions used for modifying values
โ โโโ typography.scss # Font and text styles used globally
โ โฐโโ user-defined-themes.scss # Empty, put any custom styles or themes here
โโโ mixins # Reusable component bases, extended by other views / components
โ โโโ ChartingMixin.js # Functions for rendering charts in widget components
โ โโโ GlancesMixin.js # Functions for fetching system info from Glances for widgets
โ โโโ HomeMixin.js # Functions for homepage, used by default, minimal and workspace views
โ โฐโโ WidgetMixin.js # Functions for all widgets, like data fetching, updating and error handling
โโโ 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
โ โโโ 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
โ โโโ KeycloakAuth.js # Singleton class to manage Keycloak authentication
โ โโโ languages.js # Handles fetching, switching and validating languages
โ โฐโโ ThemeHelper.js # Function that handles the fetching and setting of user themes
โฐโโ views # Directory of available pages, corresponding to available routes
โโโ Home.vue # The home page container
โโโ About.vue # About page
โโโ Login.vue # TAuthentication page
โโโ Minimal.vue # The minimal view
โฐโโ Workspace.vue # The workspace view with apps in sidebar
The easiest method of checking performance is to use Chromium's build in auditing tool, Lighthouse. To run the test, open Developer Tools (usually F12) --> Lighthouse and click on the 'Generate Report' button at the bottom.
BundlePhobia is a really useful app that lets you analyze the cost of adding any particular dependency to an application
When running the build command, several warnings appear. These are not errors, and do not affect the security or performance of the application. They will be addressed in a future update
WARN A new version of sass-loader is available. Please upgrade for best experience.
- Currently we're using an older version of SASS loader, since the more recent releases do not seem to be compatible with the Vue CLI's webpack configuration.
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.