Merge pull request #191 from cloud-inovasi/refactor153-rename-to-portainer

Refactor153 rename to portainer
pull/202/head
Anthony Lapenna 2016-09-04 15:01:02 +12:00 committed by GitHub
commit bb9cebd759
37 changed files with 104 additions and 111 deletions

2
.gitignore vendored
View File

@ -7,4 +7,4 @@ bower_components
*.iml
dist
dist/*
ui-for-docker-checksum.txt
portainer-checksum.txt

2
.godir
View File

@ -1 +1 @@
dockerui
portainer

View File

@ -6,4 +6,4 @@ VOLUME /data
EXPOSE 9000
ENTRYPOINT ["/ui-for-docker"]
ENTRYPOINT ["/portainer"]

View File

@ -1,4 +1,4 @@
Cloudinovasi-ui: Copyright (c) 2016 Cloudinovasi
Portainer: Copyright (c) 2016 CloudInovasi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1 +1 @@
web: dockerui -p ":$PORT" -e "$DOCKER_ENDPOINT"
web: portainer -p ":$PORT" -e "$DOCKER_ENDPOINT"

View File

@ -1,16 +1,9 @@
# Cloudinovasi UI for Docker
# Portainer
A fork of the amazing UI for Docker by Michael Crosby and Kevan Ahlquist (https://github.com/kevana/ui-for-docker) using the rdash-angular theme (https://github.com/rdash/rdash-angular).
Portainer is a web interface for the Docker remote API.
![Dashboard](/dashboard.png)
UI For Docker is a web interface for the Docker Remote API. The goal is to provide a pure client side implementation so it is effortless to connect and manage docker.
## Goals
* Minimal dependencies - I really want to keep this project a pure html/js app.
* Consistency - The web UI should be consistent with the commands found on the docker CLI.
## Supported Docker versions
The following Docker versions are supported:
@ -22,28 +15,28 @@ The following Docker versions are supported:
### Quickstart
1. Run: `docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock cloudinovasi/cloudinovasi-ui`
1. Run: `docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock cloudinovasi/portainer`
2. Open your browser to `http://<dockerd host ip>:9000`
Bind mounting the Unix socket into the UI For Docker container is much more secure than exposing your docker daemon over TCP.
Bind mounting the Unix socket into the Portainer container is much more secure than exposing your docker daemon over TCP.
The `--privileged` flag is required for hosts using SELinux.
### Specify socket to connect to Docker daemon
By default UI For Docker connects to the Docker daemon with`/var/run/docker.sock`. For this to work you need to bind mount the unix socket into the container with `-v /var/run/docker.sock:/var/run/docker.sock`.
By default Portainer connects to the Docker daemon with`/var/run/docker.sock`. For this to work you need to bind mount the unix socket into the container with `-v /var/run/docker.sock:/var/run/docker.sock`.
You can use the `--host`, `-H` flags to change this socket:
```
# Connect to a tcp socket:
$ docker run -d -p 9000:9000 cloudinovasi/cloudinovasi-ui -H tcp://127.0.0.1:2375
$ docker run -d -p 9000:9000 cloudinovasi/portainer -H tcp://127.0.0.1:2375
```
```
# Connect to another unix socket:
$ docker run -d -p 9000:9000 cloudinovasi/cloudinovasi-ui -H unix:///path/to/docker.sock
$ docker run -d -p 9000:9000 cloudinovasi/portainer -H unix:///path/to/docker.sock
```
### Swarm support
@ -54,17 +47,17 @@ You can access a specific view for you Swarm cluster by defining the `--swarm` f
```
# Connect to a tcp socket and enable Swarm:
$ docker run -d -p 9000:9000 cloudinovasi/cloudinovasi-ui -H tcp://<SWARM_HOST>:<SWARM_PORT> --swarm
$ docker run -d -p 9000:9000 cloudinovasi/portainer -H tcp://<SWARM_HOST>:<SWARM_PORT> --swarm
```
*NOTE*: Due to Swarm not exposing information in a machine readable way, the app is bound to a specific version of Swarm at the moment.
### Change address/port UI For Docker is served on
UI For Docker listens on port 9000 by default. If you run UI For Docker inside a container then you can bind the container's internal port to any external address and port:
### Change address/port Portainer is served on
Portainer listens on port 9000 by default. If you run Portainer inside a container then you can bind the container's internal port to any external address and port:
```
# Expose UI For Docker on 10.20.30.1:80
$ docker run -d -p 10.20.30.1:80:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock cloudinovasi/cloudinovasi-ui
# Expose Portainer on 10.20.30.1:80
$ docker run -d -p 10.20.30.1:80:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock cloudinovasi/portainer
```
### Access a Docker engine protected via TLS
@ -74,13 +67,13 @@ Ensure that you have access to the CA, the cert and the public key used to acces
These files will need to be named `ca.pem`, `cert.pem` and `key.pem` respectively. Store them somewhere on your disk and mount a volume containing these files inside the UI container:
```
$ docker run -d -p 9000:9000 cloudinovasi/cloudinovasi-ui -v /path/to/certs:/certs -H https://my-docker-host.domain:2376 --tlsverify
$ docker run -d -p 9000:9000 cloudinovasi/portainer -v /path/to/certs:/certs -H https://my-docker-host.domain:2376 --tlsverify
```
You can also use the `--tlscacert`, `--tlscert` and `--tlskey` flags if you want to change the default path to the CA, certificate and key file respectively:
```
$ docker run -d -p 9000:9000 cloudinovasi/cloudinovasi-ui -v /path/to/certs:/certs -H https://my-docker-host.domain:2376 --tlsverify --tlscacert /certs/myCa.pem --tlscert /certs/myCert.pem --tlskey /certs/myKey.pem
$ docker run -d -p 9000:9000 cloudinovasi/portainer -v /path/to/certs:/certs -H https://my-docker-host.domain:2376 --tlsverify --tlscacert /certs/myCa.pem --tlscert /certs/myCert.pem --tlskey /certs/myKey.pem
```
*Note*: Replace `/path/to/certs` to the path to the certificate files on your disk.
@ -92,10 +85,10 @@ You can use the `--logo` flag to specify an URL to your own logo.
For example, using the Docker logo:
```
$ docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock cloudinovasi/cloudinovasi-ui --logo "https://www.docker.com/sites/all/themes/docker/assets/images/brand-full.svg"
$ docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock cloudinovasi/portainer --logo "https://www.docker.com/sites/all/themes/docker/assets/images/brand-full.svg"
```
The custom logo will replace the CloudInovasi logo in the UI.
The custom logo will replace the Portainer logo in the UI.
### Hide containers with specific labels
@ -110,38 +103,38 @@ $ docker run -d --label owner=acme nginx
You can hide it in the view by starting the ui with:
```
$ docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock cloudinovasi/cloudinovasi-ui -l owner=acme
$ docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock cloudinovasi/portainer -l owner=acme
```
### Reverse proxy configuration
Has been tested with Nginx 1.11.
Use the following configuration to host the UI at `myhost.mydomain.com/dockerui`:
Use the following configuration to host the UI at `myhost.mydomain.com/portainer`:
```nginx
upstream cloudinovasi-ui {
upstream portainer {
server ADDRESS:PORT;
}
server {
listen 80;
location /dockerui/ {
location /portainer/ {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://cloudinovasi-ui/;
proxy_pass http://portainer/;
}
location /dockerui/ws/ {
location /portainer/ws/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_pass http://cloudinovasi-ui/ws/;
proxy_pass http://portainer/ws/;
}
}
```
Replace `ADDRESS:PORT` with the CloudInovasi UI container details.
Replace `ADDRESS:PORT` with the Portainer container details.
### Host your own apps
@ -153,10 +146,10 @@ For more information about hosting your own template definition and the format,
### Available options
The following options are available for the `ui-for-docker` binary:
The following options are available for the `portainer` binary:
* `--host`, `-H`: Docker daemon endpoint (default: `"unix:///var/run/docker.sock"`)
* `--bind`, `-p`: Address and port to serve UI For Docker (default: `":9000"`)
* `--bind`, `-p`: Address and port to serve Portainer (default: `":9000"`)
* `--data`, `-d`: Path to the data folder (default: `"."`)
* `--assets`, `-a`: Path to the assets (default: `"."`)
* `--swarm`, `-s`: Swarm cluster support (default: `false`)

View File

@ -1,4 +1,4 @@
package main // import "github.com/cloudinovasi/ui-for-docker"
package main // import "github.com/cloudinovasi/portainer"
import (
"gopkg.in/alecthomas/kingpin.v2"
@ -9,7 +9,7 @@ func main() {
kingpin.Version("1.7.0")
var (
endpoint = kingpin.Flag("host", "Dockerd endpoint").Default("unix:///var/run/docker.sock").Short('H').String()
addr = kingpin.Flag("bind", "Address and port to serve UI For Docker").Default(":9000").Short('p').String()
addr = kingpin.Flag("bind", "Address and port to serve Portainer").Default(":9000").Short('p').String()
assets = kingpin.Flag("assets", "Path to the assets").Default(".").Short('a').String()
data = kingpin.Flag("data", "Path to the data").Default(".").Short('d').String()
tlsverify = kingpin.Flag("tlsverify", "TLS support").Default("false").Bool()

View File

@ -1,13 +1,13 @@
angular.module('uifordocker', [
'uifordocker.templates',
angular.module('portainer', [
'portainer.templates',
'ui.bootstrap',
'ui.router',
'ui.select',
'ngCookies',
'ngSanitize',
'uifordocker.services',
'uifordocker.helpers',
'uifordocker.filters',
'portainer.services',
'portainer.helpers',
'portainer.filters',
'dashboard',
'container',
'containerConsole',

View File

@ -1,5 +1,5 @@
angular
.module('uifordocker')
.module('portainer')
.directive('rdHeaderContent', function rdHeaderContent() {
var directive = {
requires: '^rdHeader',

View File

@ -1,5 +1,5 @@
angular
.module('uifordocker')
.module('portainer')
.directive('rdHeaderTitle', function rdHeaderTitle() {
var directive = {
requires: '^rdHeader',

View File

@ -1,5 +1,5 @@
angular
.module('uifordocker')
.module('portainer')
.directive('rdHeader', function rdHeader() {
var directive = {
scope: {

View File

@ -1,5 +1,5 @@
angular
.module('uifordocker')
.module('portainer')
.directive('rdLoading', function rdLoading() {
var directive = {
restrict: 'AE',

View File

@ -1,5 +1,5 @@
angular
.module('uifordocker')
.module('portainer')
.directive('rdWidgetBody', function rdWidgetBody() {
var directive = {
requires: '^rdWidget',

View File

@ -1,5 +1,5 @@
angular
.module('uifordocker')
.module('portainer')
.directive('rdWidgetFooter', function rdWidgetFooter() {
var directive = {
requires: '^rdWidget',

View File

@ -1,5 +1,5 @@
angular
.module('uifordocker')
.module('portainer')
.directive('rdWidgetHeader', function rdWidgetTitle() {
var directive = {
requires: '^rdWidget',

View File

@ -1,5 +1,5 @@
angular
.module('uifordocker')
.module('portainer')
.directive('rdWidgetTaskbar', function rdWidgetTaskbar() {
var directive = {
requires: '^rdWidget',

View File

@ -1,5 +1,5 @@
angular
.module('uifordocker')
.module('portainer')
.directive('rdWidget', function rdWidget() {
var directive = {
scope: {

View File

@ -1,4 +1,4 @@
angular.module('uifordocker.filters', [])
angular.module('portainer.filters', [])
.filter('truncate', function () {
'use strict';
return function (text, length, end) {

View File

@ -1,4 +1,4 @@
angular.module('uifordocker.helpers', [])
angular.module('portainer.helpers', [])
.factory('ImageHelper', [function ImageHelperFactory() {
'use strict';
return {

View File

@ -1,4 +1,4 @@
angular.module('uifordocker.services', ['ngResource', 'ngSanitize'])
angular.module('portainer.services', ['ngResource', 'ngSanitize'])
.factory('Container', ['$resource', 'Settings', function ContainerFactory($resource, Settings) {
'use strict';
// Resource for interacting with the docker containers

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,18 +1,18 @@
{
"name": "uifordocker",
"name": "portainer",
"version": "1.7.0",
"homepage": "https://github.com/kevana/ui-for-docker",
"homepage": "https://github.com/cloud-inovasi/portainer",
"authors": [
"Michael Crosby <crosbymichael@gmail.com>",
"Kevan Ahlquist <ahlquistkd@gmail.com>",
"Anthony Lapenna <anthony.lapenna@cloudinovasi.id>"
],
"description": "A web interface for the Docker Remote API.",
"keywords": [
"uifordocker",
"dockerui",
"docker",
"api"
"ui",
"api",
"portainer",
"uifordocker",
"dockerui"
],
"license": "MIT",
"ignore": [

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -1,5 +1,5 @@
upstream dockerui {
server dockerui:9000;
upstream portainer {
server portainer:9000;
}
server {
@ -12,6 +12,6 @@ server {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://dockerui;
proxy_pass http://portainer;
}
}

View File

@ -1,10 +1,10 @@
dockerui:
image: cloudinovasi/ui-for-docker
portainer:
image: cloudinovasi/portainer
command: -e http://<SWARM_HOST>:<SWARM_PORT>
nginx:
build: .
links:
- dockerui
- portainer
ports:
- 80:80

View File

@ -93,7 +93,7 @@ module.exports = function (grunt) {
},
clean: {
all: ['<%= distdir %>/*'],
app: ['<%= distdir %>/*', '!<%= distdir %>/ui-for-docker'],
app: ['<%= distdir %>/*', '!<%= distdir %>/portainer'],
tmpl: ['<%= distdir %>/templates']
},
copy: {
@ -253,35 +253,35 @@ module.exports = function (grunt) {
},
shell: {
buildImage: {
command: 'docker build --rm -t ui-for-docker .'
command: 'docker build --rm -t portainer .'
},
buildBinary: {
command: [
'docker run --rm -v $(pwd)/api:/src centurylink/golang-builder',
'shasum api/ui-for-docker > ui-for-docker-checksum.txt',
'shasum api/portainer > portainer-checksum.txt',
'mkdir -p dist',
'mv api/ui-for-docker dist/'
'mv api/portainer dist/'
].join(' && ')
},
run: {
command: [
'docker stop ui-for-docker',
'docker rm ui-for-docker',
'docker run --privileged -d -p 9000:9000 -v /tmp/docker-ui:/data -v /var/run/docker.sock:/var/run/docker.sock --name ui-for-docker ui-for-docker -d /data'
'docker stop portainer',
'docker rm portainer',
'docker run --privileged -d -p 9000:9000 -v /tmp/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer -d /data'
].join(';')
},
runSwarm: {
command: [
'docker stop ui-for-docker',
'docker rm ui-for-docker',
'docker run -d -p 9000:9000 -v /tmp/docker-ui:/data --name ui-for-docker ui-for-docker -H tcp://10.0.7.10:4000 --swarm -d /data'
'docker stop portainer',
'docker rm portainer',
'docker run -d -p 9000:9000 -v /tmp/portainer:/data --name portainer portainer -H tcp://10.0.7.10:4000 --swarm -d /data'
].join(';')
},
runSsl: {
command: [
'docker stop ui-for-docker',
'docker rm ui-for-docker',
'docker run -d -p 9000:9000 -v /tmp/docker-ui:/data -v /tmp/docker-ssl:/certs --name ui-for-docker ui-for-docker -H tcp://10.0.7.10:2376 -d /data --tlsverify'
'docker stop portainer',
'docker rm portainer',
'docker run -d -p 9000:9000 -v /tmp/portainer:/data -v /tmp/docker-ssl:/certs --name portainer portainer -H tcp://10.0.7.10:2376 -d /data --tlsverify'
].join(';')
},
cleanImages: {
@ -291,7 +291,7 @@ module.exports = function (grunt) {
'if': {
binaryNotExist: {
options: {
executable: 'dist/ui-for-docker'
executable: 'dist/portainer'
},
ifFalse: ['shell:buildBinary']
}

View File

@ -2,7 +2,7 @@
<html lang="en" ng-app="<%= pkg.name %>">
<head>
<meta charset="utf-8">
<title>CloudInovasi UI for Docker</title>
<title>Portainer</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="<%= pkg.author %>">
@ -32,8 +32,8 @@
<ul class="sidebar">
<li class="sidebar-main">
<a ng-click="toggleSidebar()">
<img ng-if="config.logo" ng-src="{{ config.logo }}" class="img-responsive logo" alt="CloudInovasi UI">
<img ng-if="!config.logo" src="images/logo.png" class="img-responsive logo" alt="CloudInovasi UI">
<img ng-if="config.logo" ng-src="{{ config.logo }}" class="img-responsive logo">
<img ng-if="!config.logo" src="images/logo.png" class="img-responsive logo" alt="Portainer">
<span class="menu-icon glyphicon glyphicon-transfer"></span>
</a>
</li>
@ -68,7 +68,7 @@
</ul>
<div class="sidebar-footer">
<div class="col-xs-12">
<a href="https://github.com/cloud-inovasi/cloudinovasi-ui" target="_blank">CloudInovasi UI {{ uiVersion }}</a>
<a href="https://github.com/cloud-inovasi/portainer" target="_blank">Portainer {{ uiVersion }}</a>
</div>
</div>
</div>

View File

@ -1,19 +1,19 @@
{
"author": "Michael Crosby & Kevan Ahlquist",
"name": "uifordocker",
"homepage": "https://github.com/kevana/ui-for-docker",
"author": "Cloud Inovasi",
"name": "portainer",
"homepage": "https://github.com/cloud-inovasi/portainer",
"version": "1.7.0",
"repository": {
"type": "git",
"url": "git@github.com:kevana/ui-for-docker.git"
"url": "git@github.com:cloud-inovasi/portainer.git"
},
"bugs": {
"url": "https://github.com/kevana/ui-for-docker/issues"
"url": "https://github.com/cloud-inovasi/portainer/issues"
},
"licenses": [
{
"type": "MIT",
"url": "https://raw.githubusercontent.com/kevana/ui-for-docker/master/LICENSE"
"url": "https://raw.githubusercontent.com/cloud-inovasi/portainer/develop/LICENSE"
}
],
"engines": {

View File

@ -1,7 +1,7 @@
describe('ContainerController', function () {
var $scope, $httpBackend, mockContainer, $routeParams;
beforeEach(module('dockerui'));
beforeEach(module('portainer'));
beforeEach(inject(function ($rootScope, $controller, _$routeParams_) {
@ -22,8 +22,8 @@ describe('ContainerController', function () {
$httpBackend.expectGET('dockerapi/containers/json').respond({
'Created': 1421817232,
'id': 'b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f',
'Image': 'dockerui:latest',
'Name': '/dockerui'
'Image': 'portainer:latest',
'Name': '/portainer'
});
}
@ -33,8 +33,8 @@ describe('ContainerController', function () {
$scope.container = {
'Created': 1421817232,
'id': 'b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f',
'Image': 'dockerui:latest',
'Name': '/dockerui'
'Image': 'portainer:latest',
'Name': '/portainer'
};
$scope.container.newContainerName = "newName";

View File

@ -1,7 +1,7 @@
describe("ContainerTopController", function () {
var $scope, $httpBackend, $routeParams;
beforeEach(angular.mock.module('dockerui'));
beforeEach(angular.mock.module('portainer'));
beforeEach(inject(function (_$rootScope_, _$httpBackend_, $controller, _$routeParams_) {
$scope = _$rootScope_.$new();

View File

@ -1,7 +1,7 @@
describe('NetworkController', function () {
var $scope, $httpBackend, $routeParams;
beforeEach(module('dockerui'));
beforeEach(module('portainer'));
beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
$scope = {};
$httpBackend = _$httpBackend_;

View File

@ -1,7 +1,7 @@
describe('NetworksController', function () {
var $scope, $httpBackend, $routeParams;
beforeEach(module('dockerui'));
beforeEach(module('portainer'));
beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
$scope = {};
$httpBackend = _$httpBackend_;

View File

@ -1,7 +1,7 @@
describe('startContainerController', function () {
var scope, $location, createController, mockContainer, $httpBackend;
beforeEach(angular.mock.module('dockerui'));
beforeEach(angular.mock.module('portainer'));
beforeEach(inject(function ($rootScope, $controller, _$location_) {
$location = _$location_;
@ -20,11 +20,11 @@ describe('startContainerController', function () {
}));
function expectGetContainers() {
$httpBackend.expectGET('dockerapi/containers/json?all=1').respond([{
'Command': './dockerui -e /docker.sock',
'Command': './portainer -e /docker.sock',
'Created': 1421817232,
'Id': 'b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f',
'Image': 'dockerui:latest',
'Names': ['/dockerui'],
'Image': 'portainer:latest',
'Names': ['/portainer'],
'Ports': [{
'IP': '0.0.0.0',
'PrivatePort': 9000,

View File

@ -1,7 +1,7 @@
describe("StatsController", function () {
var $scope, $httpBackend, $routeParams;
beforeEach(angular.mock.module('dockerui'));
beforeEach(angular.mock.module('portainer'));
beforeEach(inject(function (_$rootScope_, _$httpBackend_, $controller, _$routeParams_) {
$scope = _$rootScope_.$new();

View File

@ -1,7 +1,7 @@
describe('VolumesController', function () {
var $scope, $httpBackend, $routeParams;
beforeEach(module('dockerui'));
beforeEach(module('portainer'));
beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
$scope = {};
$httpBackend = _$httpBackend_;

View File

@ -1,5 +1,5 @@
describe('filters', function () {
beforeEach(module('dockerui.filters'));
beforeEach(module('portainer.filters'));
describe('truncate', function () {
it('should truncate the string to 10 characters ending in "..." by default', inject(function (truncateFilter) {

View File

@ -7,7 +7,7 @@ files = [
JASMINE_ADAPTER,
'dist/angular.js',
'dist/vendor.js',
'dist/dockerui.js',
'dist/portainer.js',
'bower_components/angular-mocks/angular-mocks.js',
'test/unit/**/*.spec.js'
];