Merge pull request #191 from cloud-inovasi/refactor153-rename-to-portainer
Refactor153 rename to portainerpull/202/head
commit
bb9cebd759
|
@ -7,4 +7,4 @@ bower_components
|
||||||
*.iml
|
*.iml
|
||||||
dist
|
dist
|
||||||
dist/*
|
dist/*
|
||||||
ui-for-docker-checksum.txt
|
portainer-checksum.txt
|
||||||
|
|
|
@ -6,4 +6,4 @@ VOLUME /data
|
||||||
|
|
||||||
EXPOSE 9000
|
EXPOSE 9000
|
||||||
|
|
||||||
ENTRYPOINT ["/ui-for-docker"]
|
ENTRYPOINT ["/portainer"]
|
||||||
|
|
4
LICENSE
4
LICENSE
|
@ -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
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -16,7 +16,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
||||||
UI For Docker: Copyright (c) 2013-2016 Michael Crosby (crosbymichael.com), Kevan Ahlquist (kevanahlquist.com), Anthony Lapenna (anthonylapenna at cloudinovasi dot id)
|
UI For Docker: Copyright (c) 2013-2016 Michael Crosby (crosbymichael.com), Kevan Ahlquist (kevanahlquist.com), Anthony Lapenna (anthonylapenna at cloudinovasi dot id)
|
||||||
|
|
||||||
|
|
2
Procfile
2
Procfile
|
@ -1 +1 @@
|
||||||
web: dockerui -p ":$PORT" -e "$DOCKER_ENDPOINT"
|
web: portainer -p ":$PORT" -e "$DOCKER_ENDPOINT"
|
||||||
|
|
59
README.md
59
README.md
|
@ -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)
|
![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
|
## Supported Docker versions
|
||||||
|
|
||||||
The following Docker versions are supported:
|
The following Docker versions are supported:
|
||||||
|
@ -22,28 +15,28 @@ The following Docker versions are supported:
|
||||||
|
|
||||||
### Quickstart
|
### 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`
|
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.
|
The `--privileged` flag is required for hosts using SELinux.
|
||||||
|
|
||||||
### Specify socket to connect to Docker daemon
|
### 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:
|
You can use the `--host`, `-H` flags to change this socket:
|
||||||
|
|
||||||
```
|
```
|
||||||
# Connect to a tcp 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:
|
# 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
|
### 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:
|
# 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.
|
*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
|
### Change address/port Portainer 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:
|
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
|
# 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/cloudinovasi-ui
|
$ 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
|
### 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:
|
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:
|
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.
|
*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:
|
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
|
### 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:
|
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
|
### Reverse proxy configuration
|
||||||
|
|
||||||
Has been tested with Nginx 1.11.
|
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
|
```nginx
|
||||||
upstream cloudinovasi-ui {
|
upstream portainer {
|
||||||
server ADDRESS:PORT;
|
server ADDRESS:PORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
|
|
||||||
location /dockerui/ {
|
location /portainer/ {
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Connection "";
|
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 Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
proxy_set_header Connection "upgrade";
|
||||||
proxy_http_version 1.1;
|
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
|
### Host your own apps
|
||||||
|
|
||||||
|
@ -153,10 +146,10 @@ For more information about hosting your own template definition and the format,
|
||||||
|
|
||||||
### Available options
|
### 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"`)
|
* `--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: `"."`)
|
* `--data`, `-d`: Path to the data folder (default: `"."`)
|
||||||
* `--assets`, `-a`: Path to the assets (default: `"."`)
|
* `--assets`, `-a`: Path to the assets (default: `"."`)
|
||||||
* `--swarm`, `-s`: Swarm cluster support (default: `false`)
|
* `--swarm`, `-s`: Swarm cluster support (default: `false`)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package main // import "github.com/cloudinovasi/ui-for-docker"
|
package main // import "github.com/cloudinovasi/portainer"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gopkg.in/alecthomas/kingpin.v2"
|
"gopkg.in/alecthomas/kingpin.v2"
|
||||||
|
@ -9,7 +9,7 @@ func main() {
|
||||||
kingpin.Version("1.7.0")
|
kingpin.Version("1.7.0")
|
||||||
var (
|
var (
|
||||||
endpoint = kingpin.Flag("host", "Dockerd endpoint").Default("unix:///var/run/docker.sock").Short('H').String()
|
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()
|
assets = kingpin.Flag("assets", "Path to the assets").Default(".").Short('a').String()
|
||||||
data = kingpin.Flag("data", "Path to the data").Default(".").Short('d').String()
|
data = kingpin.Flag("data", "Path to the data").Default(".").Short('d').String()
|
||||||
tlsverify = kingpin.Flag("tlsverify", "TLS support").Default("false").Bool()
|
tlsverify = kingpin.Flag("tlsverify", "TLS support").Default("false").Bool()
|
||||||
|
|
10
app/app.js
10
app/app.js
|
@ -1,13 +1,13 @@
|
||||||
angular.module('uifordocker', [
|
angular.module('portainer', [
|
||||||
'uifordocker.templates',
|
'portainer.templates',
|
||||||
'ui.bootstrap',
|
'ui.bootstrap',
|
||||||
'ui.router',
|
'ui.router',
|
||||||
'ui.select',
|
'ui.select',
|
||||||
'ngCookies',
|
'ngCookies',
|
||||||
'ngSanitize',
|
'ngSanitize',
|
||||||
'uifordocker.services',
|
'portainer.services',
|
||||||
'uifordocker.helpers',
|
'portainer.helpers',
|
||||||
'uifordocker.filters',
|
'portainer.filters',
|
||||||
'dashboard',
|
'dashboard',
|
||||||
'container',
|
'container',
|
||||||
'containerConsole',
|
'containerConsole',
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
angular
|
angular
|
||||||
.module('uifordocker')
|
.module('portainer')
|
||||||
.directive('rdHeaderContent', function rdHeaderContent() {
|
.directive('rdHeaderContent', function rdHeaderContent() {
|
||||||
var directive = {
|
var directive = {
|
||||||
requires: '^rdHeader',
|
requires: '^rdHeader',
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
angular
|
angular
|
||||||
.module('uifordocker')
|
.module('portainer')
|
||||||
.directive('rdHeaderTitle', function rdHeaderTitle() {
|
.directive('rdHeaderTitle', function rdHeaderTitle() {
|
||||||
var directive = {
|
var directive = {
|
||||||
requires: '^rdHeader',
|
requires: '^rdHeader',
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
angular
|
angular
|
||||||
.module('uifordocker')
|
.module('portainer')
|
||||||
.directive('rdHeader', function rdHeader() {
|
.directive('rdHeader', function rdHeader() {
|
||||||
var directive = {
|
var directive = {
|
||||||
scope: {
|
scope: {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
angular
|
angular
|
||||||
.module('uifordocker')
|
.module('portainer')
|
||||||
.directive('rdLoading', function rdLoading() {
|
.directive('rdLoading', function rdLoading() {
|
||||||
var directive = {
|
var directive = {
|
||||||
restrict: 'AE',
|
restrict: 'AE',
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
angular
|
angular
|
||||||
.module('uifordocker')
|
.module('portainer')
|
||||||
.directive('rdWidgetBody', function rdWidgetBody() {
|
.directive('rdWidgetBody', function rdWidgetBody() {
|
||||||
var directive = {
|
var directive = {
|
||||||
requires: '^rdWidget',
|
requires: '^rdWidget',
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
angular
|
angular
|
||||||
.module('uifordocker')
|
.module('portainer')
|
||||||
.directive('rdWidgetFooter', function rdWidgetFooter() {
|
.directive('rdWidgetFooter', function rdWidgetFooter() {
|
||||||
var directive = {
|
var directive = {
|
||||||
requires: '^rdWidget',
|
requires: '^rdWidget',
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
angular
|
angular
|
||||||
.module('uifordocker')
|
.module('portainer')
|
||||||
.directive('rdWidgetHeader', function rdWidgetTitle() {
|
.directive('rdWidgetHeader', function rdWidgetTitle() {
|
||||||
var directive = {
|
var directive = {
|
||||||
requires: '^rdWidget',
|
requires: '^rdWidget',
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
angular
|
angular
|
||||||
.module('uifordocker')
|
.module('portainer')
|
||||||
.directive('rdWidgetTaskbar', function rdWidgetTaskbar() {
|
.directive('rdWidgetTaskbar', function rdWidgetTaskbar() {
|
||||||
var directive = {
|
var directive = {
|
||||||
requires: '^rdWidget',
|
requires: '^rdWidget',
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
angular
|
angular
|
||||||
.module('uifordocker')
|
.module('portainer')
|
||||||
.directive('rdWidget', function rdWidget() {
|
.directive('rdWidget', function rdWidget() {
|
||||||
var directive = {
|
var directive = {
|
||||||
scope: {
|
scope: {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
angular.module('uifordocker.filters', [])
|
angular.module('portainer.filters', [])
|
||||||
.filter('truncate', function () {
|
.filter('truncate', function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
return function (text, length, end) {
|
return function (text, length, end) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
angular.module('uifordocker.helpers', [])
|
angular.module('portainer.helpers', [])
|
||||||
.factory('ImageHelper', [function ImageHelperFactory() {
|
.factory('ImageHelper', [function ImageHelperFactory() {
|
||||||
'use strict';
|
'use strict';
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
angular.module('uifordocker.services', ['ngResource', 'ngSanitize'])
|
angular.module('portainer.services', ['ngResource', 'ngSanitize'])
|
||||||
.factory('Container', ['$resource', 'Settings', function ContainerFactory($resource, Settings) {
|
.factory('Container', ['$resource', 'Settings', function ContainerFactory($resource, Settings) {
|
||||||
'use strict';
|
'use strict';
|
||||||
// Resource for interacting with the docker containers
|
// Resource for interacting with the docker containers
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 1.9 KiB |
14
bower.json
14
bower.json
|
@ -1,18 +1,18 @@
|
||||||
{
|
{
|
||||||
"name": "uifordocker",
|
"name": "portainer",
|
||||||
"version": "1.7.0",
|
"version": "1.7.0",
|
||||||
"homepage": "https://github.com/kevana/ui-for-docker",
|
"homepage": "https://github.com/cloud-inovasi/portainer",
|
||||||
"authors": [
|
"authors": [
|
||||||
"Michael Crosby <crosbymichael@gmail.com>",
|
|
||||||
"Kevan Ahlquist <ahlquistkd@gmail.com>",
|
|
||||||
"Anthony Lapenna <anthony.lapenna@cloudinovasi.id>"
|
"Anthony Lapenna <anthony.lapenna@cloudinovasi.id>"
|
||||||
],
|
],
|
||||||
"description": "A web interface for the Docker Remote API.",
|
"description": "A web interface for the Docker Remote API.",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"uifordocker",
|
|
||||||
"dockerui",
|
|
||||||
"docker",
|
"docker",
|
||||||
"api"
|
"ui",
|
||||||
|
"api",
|
||||||
|
"portainer",
|
||||||
|
"uifordocker",
|
||||||
|
"dockerui"
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"ignore": [
|
"ignore": [
|
||||||
|
|
BIN
dashboard.png
BIN
dashboard.png
Binary file not shown.
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 56 KiB |
|
@ -1,5 +1,5 @@
|
||||||
upstream dockerui {
|
upstream portainer {
|
||||||
server dockerui:9000;
|
server portainer:9000;
|
||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
|
@ -12,6 +12,6 @@ server {
|
||||||
|
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Connection "";
|
proxy_set_header Connection "";
|
||||||
proxy_pass http://dockerui;
|
proxy_pass http://portainer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
dockerui:
|
portainer:
|
||||||
image: cloudinovasi/ui-for-docker
|
image: cloudinovasi/portainer
|
||||||
command: -e http://<SWARM_HOST>:<SWARM_PORT>
|
command: -e http://<SWARM_HOST>:<SWARM_PORT>
|
||||||
|
|
||||||
nginx:
|
nginx:
|
||||||
build: .
|
build: .
|
||||||
links:
|
links:
|
||||||
- dockerui
|
- portainer
|
||||||
ports:
|
ports:
|
||||||
- 80:80
|
- 80:80
|
||||||
|
|
28
gruntFile.js
28
gruntFile.js
|
@ -93,7 +93,7 @@ module.exports = function (grunt) {
|
||||||
},
|
},
|
||||||
clean: {
|
clean: {
|
||||||
all: ['<%= distdir %>/*'],
|
all: ['<%= distdir %>/*'],
|
||||||
app: ['<%= distdir %>/*', '!<%= distdir %>/ui-for-docker'],
|
app: ['<%= distdir %>/*', '!<%= distdir %>/portainer'],
|
||||||
tmpl: ['<%= distdir %>/templates']
|
tmpl: ['<%= distdir %>/templates']
|
||||||
},
|
},
|
||||||
copy: {
|
copy: {
|
||||||
|
@ -253,35 +253,35 @@ module.exports = function (grunt) {
|
||||||
},
|
},
|
||||||
shell: {
|
shell: {
|
||||||
buildImage: {
|
buildImage: {
|
||||||
command: 'docker build --rm -t ui-for-docker .'
|
command: 'docker build --rm -t portainer .'
|
||||||
},
|
},
|
||||||
buildBinary: {
|
buildBinary: {
|
||||||
command: [
|
command: [
|
||||||
'docker run --rm -v $(pwd)/api:/src centurylink/golang-builder',
|
'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',
|
'mkdir -p dist',
|
||||||
'mv api/ui-for-docker dist/'
|
'mv api/portainer dist/'
|
||||||
].join(' && ')
|
].join(' && ')
|
||||||
},
|
},
|
||||||
run: {
|
run: {
|
||||||
command: [
|
command: [
|
||||||
'docker stop ui-for-docker',
|
'docker stop portainer',
|
||||||
'docker rm ui-for-docker',
|
'docker rm portainer',
|
||||||
'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 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(';')
|
].join(';')
|
||||||
},
|
},
|
||||||
runSwarm: {
|
runSwarm: {
|
||||||
command: [
|
command: [
|
||||||
'docker stop ui-for-docker',
|
'docker stop portainer',
|
||||||
'docker rm ui-for-docker',
|
'docker rm portainer',
|
||||||
'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 run -d -p 9000:9000 -v /tmp/portainer:/data --name portainer portainer -H tcp://10.0.7.10:4000 --swarm -d /data'
|
||||||
].join(';')
|
].join(';')
|
||||||
},
|
},
|
||||||
runSsl: {
|
runSsl: {
|
||||||
command: [
|
command: [
|
||||||
'docker stop ui-for-docker',
|
'docker stop portainer',
|
||||||
'docker rm ui-for-docker',
|
'docker rm portainer',
|
||||||
'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 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(';')
|
].join(';')
|
||||||
},
|
},
|
||||||
cleanImages: {
|
cleanImages: {
|
||||||
|
@ -291,7 +291,7 @@ module.exports = function (grunt) {
|
||||||
'if': {
|
'if': {
|
||||||
binaryNotExist: {
|
binaryNotExist: {
|
||||||
options: {
|
options: {
|
||||||
executable: 'dist/ui-for-docker'
|
executable: 'dist/portainer'
|
||||||
},
|
},
|
||||||
ifFalse: ['shell:buildBinary']
|
ifFalse: ['shell:buildBinary']
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<html lang="en" ng-app="<%= pkg.name %>">
|
<html lang="en" ng-app="<%= pkg.name %>">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<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="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="description" content="">
|
<meta name="description" content="">
|
||||||
<meta name="author" content="<%= pkg.author %>">
|
<meta name="author" content="<%= pkg.author %>">
|
||||||
|
@ -32,8 +32,8 @@
|
||||||
<ul class="sidebar">
|
<ul class="sidebar">
|
||||||
<li class="sidebar-main">
|
<li class="sidebar-main">
|
||||||
<a ng-click="toggleSidebar()">
|
<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" ng-src="{{ config.logo }}" class="img-responsive logo">
|
||||||
<img ng-if="!config.logo" src="images/logo.png" class="img-responsive logo" alt="CloudInovasi UI">
|
<img ng-if="!config.logo" src="images/logo.png" class="img-responsive logo" alt="Portainer">
|
||||||
<span class="menu-icon glyphicon glyphicon-transfer"></span>
|
<span class="menu-icon glyphicon glyphicon-transfer"></span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -68,7 +68,7 @@
|
||||||
</ul>
|
</ul>
|
||||||
<div class="sidebar-footer">
|
<div class="sidebar-footer">
|
||||||
<div class="col-xs-12">
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
12
package.json
12
package.json
|
@ -1,19 +1,19 @@
|
||||||
{
|
{
|
||||||
"author": "Michael Crosby & Kevan Ahlquist",
|
"author": "Cloud Inovasi",
|
||||||
"name": "uifordocker",
|
"name": "portainer",
|
||||||
"homepage": "https://github.com/kevana/ui-for-docker",
|
"homepage": "https://github.com/cloud-inovasi/portainer",
|
||||||
"version": "1.7.0",
|
"version": "1.7.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git@github.com:kevana/ui-for-docker.git"
|
"url": "git@github.com:cloud-inovasi/portainer.git"
|
||||||
},
|
},
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/kevana/ui-for-docker/issues"
|
"url": "https://github.com/cloud-inovasi/portainer/issues"
|
||||||
},
|
},
|
||||||
"licenses": [
|
"licenses": [
|
||||||
{
|
{
|
||||||
"type": "MIT",
|
"type": "MIT",
|
||||||
"url": "https://raw.githubusercontent.com/kevana/ui-for-docker/master/LICENSE"
|
"url": "https://raw.githubusercontent.com/cloud-inovasi/portainer/develop/LICENSE"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
describe('ContainerController', function () {
|
describe('ContainerController', function () {
|
||||||
var $scope, $httpBackend, mockContainer, $routeParams;
|
var $scope, $httpBackend, mockContainer, $routeParams;
|
||||||
|
|
||||||
beforeEach(module('dockerui'));
|
beforeEach(module('portainer'));
|
||||||
|
|
||||||
|
|
||||||
beforeEach(inject(function ($rootScope, $controller, _$routeParams_) {
|
beforeEach(inject(function ($rootScope, $controller, _$routeParams_) {
|
||||||
|
@ -22,8 +22,8 @@ describe('ContainerController', function () {
|
||||||
$httpBackend.expectGET('dockerapi/containers/json').respond({
|
$httpBackend.expectGET('dockerapi/containers/json').respond({
|
||||||
'Created': 1421817232,
|
'Created': 1421817232,
|
||||||
'id': 'b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f',
|
'id': 'b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f',
|
||||||
'Image': 'dockerui:latest',
|
'Image': 'portainer:latest',
|
||||||
'Name': '/dockerui'
|
'Name': '/portainer'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,8 +33,8 @@ describe('ContainerController', function () {
|
||||||
$scope.container = {
|
$scope.container = {
|
||||||
'Created': 1421817232,
|
'Created': 1421817232,
|
||||||
'id': 'b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f',
|
'id': 'b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f',
|
||||||
'Image': 'dockerui:latest',
|
'Image': 'portainer:latest',
|
||||||
'Name': '/dockerui'
|
'Name': '/portainer'
|
||||||
};
|
};
|
||||||
$scope.container.newContainerName = "newName";
|
$scope.container.newContainerName = "newName";
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
describe("ContainerTopController", function () {
|
describe("ContainerTopController", function () {
|
||||||
var $scope, $httpBackend, $routeParams;
|
var $scope, $httpBackend, $routeParams;
|
||||||
|
|
||||||
beforeEach(angular.mock.module('dockerui'));
|
beforeEach(angular.mock.module('portainer'));
|
||||||
|
|
||||||
beforeEach(inject(function (_$rootScope_, _$httpBackend_, $controller, _$routeParams_) {
|
beforeEach(inject(function (_$rootScope_, _$httpBackend_, $controller, _$routeParams_) {
|
||||||
$scope = _$rootScope_.$new();
|
$scope = _$rootScope_.$new();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
describe('NetworkController', function () {
|
describe('NetworkController', function () {
|
||||||
var $scope, $httpBackend, $routeParams;
|
var $scope, $httpBackend, $routeParams;
|
||||||
|
|
||||||
beforeEach(module('dockerui'));
|
beforeEach(module('portainer'));
|
||||||
beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
|
beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
|
||||||
$scope = {};
|
$scope = {};
|
||||||
$httpBackend = _$httpBackend_;
|
$httpBackend = _$httpBackend_;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
describe('NetworksController', function () {
|
describe('NetworksController', function () {
|
||||||
var $scope, $httpBackend, $routeParams;
|
var $scope, $httpBackend, $routeParams;
|
||||||
|
|
||||||
beforeEach(module('dockerui'));
|
beforeEach(module('portainer'));
|
||||||
beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
|
beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
|
||||||
$scope = {};
|
$scope = {};
|
||||||
$httpBackend = _$httpBackend_;
|
$httpBackend = _$httpBackend_;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
describe('startContainerController', function () {
|
describe('startContainerController', function () {
|
||||||
var scope, $location, createController, mockContainer, $httpBackend;
|
var scope, $location, createController, mockContainer, $httpBackend;
|
||||||
|
|
||||||
beforeEach(angular.mock.module('dockerui'));
|
beforeEach(angular.mock.module('portainer'));
|
||||||
|
|
||||||
beforeEach(inject(function ($rootScope, $controller, _$location_) {
|
beforeEach(inject(function ($rootScope, $controller, _$location_) {
|
||||||
$location = _$location_;
|
$location = _$location_;
|
||||||
|
@ -20,11 +20,11 @@ describe('startContainerController', function () {
|
||||||
}));
|
}));
|
||||||
function expectGetContainers() {
|
function expectGetContainers() {
|
||||||
$httpBackend.expectGET('dockerapi/containers/json?all=1').respond([{
|
$httpBackend.expectGET('dockerapi/containers/json?all=1').respond([{
|
||||||
'Command': './dockerui -e /docker.sock',
|
'Command': './portainer -e /docker.sock',
|
||||||
'Created': 1421817232,
|
'Created': 1421817232,
|
||||||
'Id': 'b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f',
|
'Id': 'b17882378cee8ec0136f482681b764cca430befd52a9bfd1bde031f49b8bba9f',
|
||||||
'Image': 'dockerui:latest',
|
'Image': 'portainer:latest',
|
||||||
'Names': ['/dockerui'],
|
'Names': ['/portainer'],
|
||||||
'Ports': [{
|
'Ports': [{
|
||||||
'IP': '0.0.0.0',
|
'IP': '0.0.0.0',
|
||||||
'PrivatePort': 9000,
|
'PrivatePort': 9000,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
describe("StatsController", function () {
|
describe("StatsController", function () {
|
||||||
var $scope, $httpBackend, $routeParams;
|
var $scope, $httpBackend, $routeParams;
|
||||||
|
|
||||||
beforeEach(angular.mock.module('dockerui'));
|
beforeEach(angular.mock.module('portainer'));
|
||||||
|
|
||||||
beforeEach(inject(function (_$rootScope_, _$httpBackend_, $controller, _$routeParams_) {
|
beforeEach(inject(function (_$rootScope_, _$httpBackend_, $controller, _$routeParams_) {
|
||||||
$scope = _$rootScope_.$new();
|
$scope = _$rootScope_.$new();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
describe('VolumesController', function () {
|
describe('VolumesController', function () {
|
||||||
var $scope, $httpBackend, $routeParams;
|
var $scope, $httpBackend, $routeParams;
|
||||||
|
|
||||||
beforeEach(module('dockerui'));
|
beforeEach(module('portainer'));
|
||||||
beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
|
beforeEach(inject(function (_$httpBackend_, $controller, _$routeParams_) {
|
||||||
$scope = {};
|
$scope = {};
|
||||||
$httpBackend = _$httpBackend_;
|
$httpBackend = _$httpBackend_;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
describe('filters', function () {
|
describe('filters', function () {
|
||||||
beforeEach(module('dockerui.filters'));
|
beforeEach(module('portainer.filters'));
|
||||||
|
|
||||||
describe('truncate', function () {
|
describe('truncate', function () {
|
||||||
it('should truncate the string to 10 characters ending in "..." by default', inject(function (truncateFilter) {
|
it('should truncate the string to 10 characters ending in "..." by default', inject(function (truncateFilter) {
|
||||||
|
|
|
@ -7,7 +7,7 @@ files = [
|
||||||
JASMINE_ADAPTER,
|
JASMINE_ADAPTER,
|
||||||
'dist/angular.js',
|
'dist/angular.js',
|
||||||
'dist/vendor.js',
|
'dist/vendor.js',
|
||||||
'dist/dockerui.js',
|
'dist/portainer.js',
|
||||||
'bower_components/angular-mocks/angular-mocks.js',
|
'bower_components/angular-mocks/angular-mocks.js',
|
||||||
'test/unit/**/*.spec.js'
|
'test/unit/**/*.spec.js'
|
||||||
];
|
];
|
||||||
|
|
Loading…
Reference in New Issue