Securely access remote devices and servers

Build Status

Build Status Build Status

Deviceplane is an open source device management tool for embedded systems and edge computing. It solves various infrastructure problems related to remote device management such as:

  • Network connectivity and SSH access
  • Orchestration and deployment of remote updates
  • Host and application monitoring
  • Device organization: naming, labeling, searching, and filtering of devices
  • Access and security controls

Deviceplane integrates with your device by running a lightweight static binary via your system supervisor. It can be used with nearly any Linux distro, which means you can continue using Ubuntu, Raspbian, a Yocto build, or whatever else fits your needs.

A hosted version of Deviceplane is available at https://cloud.deviceplane.com/.

Documentation

Visit https://deviceplane.com/docs to view the full documentation.

Getting Started

The architecture of Deviceplane is simple and designed to be easy to run and manage. The backend can be run with a single Docker command:

docker run -d --restart=unless-stopped -p 8080:8080 deviceplane/deviceplane

For more information on hosting Deviceplane yourself, check out the self-hosted docs.

Local Development

Setup the database

This command will reset the database to an empty state and then seed it with some basic data.

make db-reset

Run the controller

This command starts the controller running on port 8080 by default.

go run cmd/controller/main.go --allowed-origin "http://localhost:3000"

Run the web application

Run the following commands in the ui/ directory

npm install
npm start

The login is [email protected] / password.

Run the agent

Navigate to the /devices/register route in the web application. A command to run the agent locally will be generated and printed to the browser console.

Support

For bugs, issues, and feature requests please submit a GitHub issue.

For security issues, please email [email protected] instead of posting a public issue on GitHub.

For support, please email [email protected].

License

Copyright (c) Deviceplane, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Comments
  • How to connect from one container to another

    How to connect from one container to another

    Hi everyone,

    thanks for developing this product. I am just trying it out locally so far it looks very interesting!

    Right now I ran into an issue I can't figure out how to do this properly. As the container names are created dynamically, and the links property is not supported, what is currently the way to connect to a different container via 'http://containername...' ?

    Thanks, Andreas

    P.S.: What is the best way to provide you feedback and ideas? Shall I write individual issues in here?

  • Documentation about deploying

    Documentation about deploying

    Hi !

    I was hopping to test deviceplan. Where can I find the documentation about "deploying" ? https://deviceplane.com/docs/deploying/ (broken link)

    Thanks for the help.

  • Visibility into release scheduling process

    Visibility into release scheduling process

    When I deploy a release, it is unclear to me how the subsequent release scheduling process works. I typically SSH into my device and run docker ps repeatedly until I see that my change has taken effect.

    It would be nice to have some visibility into the status of the scheduling process.

  • Force a device to pull latest image from a tag

    Force a device to pull latest image from a tag

    I would like to be able to force a device to pull the latest version of a Docker image when the underlying release has not changed.

    For example, I noticed that your demo-release specifies the image by its ID:

    demo-go:
      image: deviceplane/demo-go:614617567844e1b74e45622785719d4b8a728eea
    

    I'd like to be able to use an image tag instead:

    demo-go:
      image: deviceplane/demo-go:latest
    

    And have some CLI command that allows me to force my devices to pull a newer version of the image specified by the tag latest.

  • Is there any available network API or plans to develop one?

    Is there any available network API or plans to develop one?

    Hello!

    We are users of on-premises Deviceplane instance, we love it 😊.

    We are used to CLI, but want to automate some things, integrated with our project modules. For that purpose is there any available network API (like REST)? We would like to have the exact same functionality of CLI exposed to our business logic using a network interface.

    Thank you!

  • Let mysql ignore

    Let mysql ignore "lost+found" directories, making it more compatible with some volume mounts

    ignore the lost+found directory, to allow more easy mounting of the mysql datadir (with ext4 volumes for example)

    This lets things play a bit more nicely with some storage systems (such as Kubernetes with a storage backend that provisions filesystem based disks, like for example with AWS EKS or our product, KubeSail.com).

    We're building a template for DevicePlane over at https://kubesail.com/template/erulabs/deviceplane

    Thanks!

  • Add device filter conditions for application scheduling and service states.

    Add device filter conditions for application scheduling and service states.

    These two conditions function like any other condition:

    type Condition struct {
    	Type   ConditionType          `json:"type"`
    	Params map[string]interface{} `json:"params"`
    }
    

    Querying by application existence

    To get devices based on whether an application is running on them, use:

    const ApplicationExistenceCondition = ConditionType("ApplicationExistenceCondition")
    type ApplicationExistenceConditionParams struct {
    	ApplicationID string   `json:"applicationId"`
    	Operator      Operator `json:"operator"`
    }
    

    Where operator is either:

    OperatorExists    = Operator("exists")
    OperatorNotExists = Operator("does not exist")
    

    An example query using this condition is:

    "[{\"type\":\"ApplicationExistenceCondition\",\"params\":{\"operator\":\"exists\",\"applicationId\":\"app_1YJdqxzJW0kxuNqYiqiKE54gou3\"}}]"
    

    Querying by application release version

    To get devices based on whether an application release is running on them, use:

    const ApplicationReleaseCondition = ConditionType("ApplicationReleaseCondition")
    type ApplicationReleaseConditionParams struct {
    	ApplicationID string   `json:"applicationId"`
    	Operator      Operator `json:"operator"`
    	Release     string   `json:"release"`
    }
    

    Where operator is either:

    OperatorIs    = Operator("is")
    OperatorIsNot = Operator("is not")
    

    And release is the ID ("rel_...") of a release or "latest".

    An example query using this condition is:

    "[{\"type\":\"ApplicationReleaseCondition\",\"params\":{\"operator\":\"is\",\"applicationId\":\"app_1YJdqxzJW0kxuNqYiqiKE54gou3\", \"release\":\"rel_1YJduIBd1TUAev63qVV72Nzan6m\"}}]"
    

    Querying by service state

    To get devices based on whether a service has a given state, use:

    const ServiceStateCondition         = ConditionType("ServiceStateCondition")
    type ServiceStateConditionParams struct {
    	ApplicationID string       `json:"applicationId"`
    	Service       string       `json:"service"`
    	Operator      Operator     `json:"operator"`
    	ServiceState  ServiceState `json:"serviceState"`
    }
    

    Where operator is either:

    OperatorIs    = Operator("is")
    OperatorIsNot = Operator("is not")
    

    And service state (also in pkg/models) is one of:

    const (
    	ServiceStateUnknown                   ServiceState = "unknown"
    	ServiceStatePullingImage              ServiceState = "pulling image"
    	ServiceStateCreatingContainer         ServiceState = "creating container"
    	ServiceStateStoppingPreviousContainer ServiceState = "stopping previous container"
    	ServiceStateRemovingPreviousContainer ServiceState = "removing previous container"
    	ServiceStateStartingContainer         ServiceState = "starting container"
    	ServiceStateRunning                   ServiceState = "running"
    	ServiceStateExited                    ServiceState = "exited"
    )
    

    An example query using this condition is:

    "[{\"type\":\"ServiceStateCondition\",\"params\":{\"operator\":\"is not\",\"service\":\"demo-go\",\"serviceState\":\"running\",\"applicationID\":\"app_1YJdqxzJW0kxuNqYiqiKE54gou3\"}}]"
    
  • Is installing docker required for devices?

    Is installing docker required for devices?

    I am reading "In order to register a device, we first need to install Docker on the device." in the docs. Is this a real requirement? I can't just install the agent on the linux device?

  • Bump xterm from 2.9.2 to 3.8.1 in /ui

    Bump xterm from 2.9.2 to 3.8.1 in /ui

    Bumps xterm from 2.9.2 to 3.8.1.

    Release notes

    Sourced from xterm's releases.

    3.8.1

    🐞 Bug fixes

    3.8.0

    🆕 Features

    🐞 Bug fixes

    • Add a fallback for link underline colors in case there is an issue extracting the color (#1670)
    • Improve unicode support in link handling (#1678) via @​jerch
    • Reduce dynamic texture atlas unnecessary objects and draw from an ImageBitmap (#1692) via @​Tyriar
    • Fix scroll APIs not affecting the scroll bar (#1698) via @​Tyriar
    • Add additional NPE checks to link logic (#1703) via @​Tyriar
    • Prevent NPE when disposing the terminal shortly after creation (#1717) via @​Tyriar

    📝 Documentation and internal improvements

    🎉 New real-world use cases

    3.7.0

    🆕 Features

    🐞 Bug fixes

    ... (truncated)
    Commits
    • 711752a v3.8.1
    • 3592c64 Remove request term info handler
    • ae61292 Merge pull request #1729 from xtermjs/Tyriar-patch-1
    • 8fd4bdd Bump version to 3.8.0
    • a7b051c Merge pull request #1717 from Tyriar/charatlas_npe
    • b92bbf5 Merge branch 'master' into charatlas_npe
    • d4ec50e Merge pull request #1718 from zwhitchcox/patch-2
    • 5a1c71c Don't delete fake terminal
    • bbf36fe Prevent NPE when disposing terminal shortly after creation
    • 990bf5c Merge pull request #1711 from pfitzseb/patch-1
    • Additional commits viewable in compare view
    Maintainer changes

    This version was pushed to npm by tyriar, a new releaser for xterm since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • InitializeUser fails

    InitializeUser fails

    InitializeUser fails when registering/confirming a new user because the insert into users does not include the column 'name' which is set to not null.

    A quick fix to get past that is to alter the table and provide a default value: ALTER TABLE users ALTER name SET DEFAULT 'Default Name'; or make it nullable: ALTER TABLE users MODIFY name VARCHAR(100);

  • API Documentation for Signup/Project Creation etc

    API Documentation for Signup/Project Creation etc

    I would like to create users / projects / registrations tokens without going through the web gui.

    Are there any docs for the APIs against the controller to do this?

    Even a swagger manifest would be enough I guess but I don't see that in the ui src.

    Thanks

  • Device plane Cloud UI issue when more than 100 devices registered

    Device plane Cloud UI issue when more than 100 devices registered

    Hello,

    We are using https://cloud.deviceplane.com/. When there are more than 100 devices registered under the same namespace, the UI shows the right number of devices, bu the list of devices is limited to 100. Even filtering does not seem to find the extra devices. As soon as you remove old devices and get under the 100s again, the new devices appear.

    This looks like a simple pagination issue.

    Thanks

  • Remove projects remotely with the deviceplane command

    Remove projects remotely with the deviceplane command

    I would like to include the option to delete a project remotely with the deviceplane command line, currently is:

    Commands:
       configure  --  Configure this CLI utility.
    
       project  --  Manage projects.
         list [<flags>]  --  List projects.
         create  --  Create a new project.
    
       device  --  Manage devices.
         list [<flags>]  --  List devices.
         ssh [<flags>] <device>  --  SSH into a device.
         inspect [<flags>] <device>  --  Inspect a device's properties and labels.
         reboot <device>  --  Reboot a device.
    
       reboot <device>  --  Reboot a device.
    

    And I would like to include:

    ...
       project  --  Manage projects.
         delete [<flags>] <project>  --  Delete project.
    ...
    
  • Deviceplane behind a proxy

    Deviceplane behind a proxy

    Hi.

    We are deploying Deviceplane server behind a proxy, but we are experiencing some issues. It seems that Deviceplane publishes its own URL, but with missing path parts. Is there a way to configure Deviceplane so that the public URL set in the proxy, including path?

    Thank you!

Suite of libraries for IoT devices (written in Go), experimental for x/exp/io

Go libraries/drivers for IoT devices This repo contains a suite of libraries for IoT devices/sensors/actuators. The suite is meant to be as dependency

Sep 26, 2022
Automatically updates the firmware of all your Shelly devices at once.

shelly-bulk-update Automatically updates the firmware of all your Shelly devices at once. Installation Download the binary for your platform: macOS cu

Nov 2, 2022
A realtime teenage driver behaviour monitoring system integrating OBII sensor, smart watch, smartphone, and Raspberry Pi, which examines over time novice teenage driving performance and risk

DriverMonitor A realtime teenage driver behaviour monitoring system integrating OBII sensor, smart watch, smartphone, and Raspberry Pi, which examines

Nov 27, 2021
Golang framework for robotics, drones, and the Internet of Things (IoT)
Golang framework for robotics, drones, and the Internet of Things (IoT)

Gobot (https://gobot.io/) is a framework using the Go programming language (https://golang.org/) for robotics, physical computing, and the Internet of

Dec 29, 2022
Industrial IoT Messaging and Device Management Platform
Industrial IoT Messaging and Device Management Platform

Mainflux Mainflux is modern, scalable, secure, open-source, and patent-free IoT cloud platform written in Go. It accepts user and thing (sensor, actua

Dec 31, 2022
Secure and Interoperable Internet of Things

plgd Cloud Internet of Things (IoT) technologies have evolved rapidly in recent years and continue to change how we interact with our surroundings. Fo

Dec 26, 2022
Gobot - Golang framework for robotics, drones, and the Internet of Things (IoT)
Gobot - Golang framework for robotics, drones, and the Internet of Things (IoT)

Gobot (https://gobot.io/) is a framework using the Go programming language (https://golang.org/) for robotics, physical computing, and the Internet of Things.

Jan 8, 2023
Raspberry pi project that controls jack-o-lantern via servo motor and PIR motion sensors
Raspberry pi project that controls jack-o-lantern via servo motor and PIR motion sensors

pumpkin-pi ?? Raspberry pi project that controls jack-o-lantern via servo motor and PIR motion sensors to simulate it "watching" you. Inspired by Ryde

Sep 13, 2022
A robust and easy to use MQTT rule engine
A robust and easy to use MQTT rule engine

⚙ MQTT COMMANDER A robust and easy to use MQTT rule engine Configure your MQTT Rules via easy to use YML Files Supports JSON encoded MQTT Messages Sup

Sep 21, 2022
Exploring and comparing different IOT messaging protocols / transports.

IOT Messaging Protocols Blynk https://blynk.io/ A fully integrated suite of IoT software Device provisioning Sensor data visualization Remote control

Jan 2, 2022
Read metrics from a Message Queue in Json format and expose them in a Prometheus compatible format

mq2prom Read metrics from a Message Queue in Json format and expose them in a Prometheus compatible format. Currently only works for MQTT compatible M

Jan 24, 2022
IoT platform with things/user management and visualization, in Go with Docker using microservices

BARIOT IoT platform to Manage Users and their Things and visualize their data. Microservices services architecture build with Go and docker (compose).

Jun 22, 2022
lirc.go - a library to send and receive via lircd

LIRC Go client for Linux Infrared Remote Control (LIRC) package Usage package main import ( "github.com/chbmuc/lirc" "log" "time" ) func keyPo

Oct 24, 2022
A opinionated multi-tenant hyperscale Internet of Things platform to connect IoT devices fast and securely with minimal TCO

infinimesh IoT Platform infinimesh is a opinionated multi-tenant hyperscale Internet of Things platform to connect IoT devices fast and securely with

Feb 14, 2022
Awesome-italia-remote - A list of remote-friendly or full-remote companies that targets Italian talents

Awesome Italia Remote A list of remote-friendly or full-remote companies that ta

Dec 29, 2022
scrapligo -- is a Go library focused on connecting to devices, specifically network devices (routers/switches/firewalls/etc.) via SSH and NETCONF.
scrapligo -- is a Go library focused on connecting to devices, specifically network devices (routers/switches/firewalls/etc.) via SSH and NETCONF.

scrapligo -- scrap(e c)li (but in go!) -- is a Go library focused on connecting to devices, specifically network devices (routers/switches/firewalls/etc.) via SSH and NETCONF.

Jan 4, 2023
mdmb is a tool for simulating Apple devices interacting with Apple MDM servers.

mdmb mdmb — short for MDM Benchmark, à la ab — is a tool for simulating Apple devices interacting with Apple MDM servers. mdmb creates sets of fake Ap

Dec 1, 2022
A CLI tool that can be used to disrupt wireless connectivity in your area by jamming all the wireless devices connected to multiple access points.

sig-716i A CLI tool written in Go that can be used to disrupt wireless connectivity in the area accessible to your wireless interface. This tool scans

Oct 14, 2022
Chore is a elegant and simple tool for executing common tasks on remote servers.
Chore is a elegant and simple tool for executing common tasks on remote servers.

Chore is a tool for executing common tasks you run on your remote servers. You can easily setup tasks for deployment, commands, and more.

May 20, 2022
SSH Manager - manage authorized_keys file on remote servers

SSH Manager - manage authorized_key file on remote servers This is a simple tool that I came up after having to on-boarding and off-boarding developer

Dec 6, 2022