mirror of https://github.com/portainer/portainer
chore(build-system): make assets default relative, serve assets from assets/public (#1309)
parent
c4e75fc858
commit
34d40e4876
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/portainer/portainer"
|
"github.com/portainer/portainer"
|
||||||
|
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gopkg.in/alecthomas/kingpin.v2"
|
"gopkg.in/alecthomas/kingpin.v2"
|
||||||
|
@ -54,6 +55,15 @@ func (*Service) ParseFlags(version string) (*portainer.CLIFlags, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
kingpin.Parse()
|
kingpin.Parse()
|
||||||
|
|
||||||
|
if !filepath.IsAbs(*flags.Assets) {
|
||||||
|
ex, err := os.Executable()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
*flags.Assets = filepath.Join(filepath.Dir(ex), *flags.Assets)
|
||||||
|
}
|
||||||
|
|
||||||
return flags, nil
|
return flags, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ package cli
|
||||||
const (
|
const (
|
||||||
defaultBindAddress = ":9000"
|
defaultBindAddress = ":9000"
|
||||||
defaultDataDirectory = "/data"
|
defaultDataDirectory = "/data"
|
||||||
defaultAssetsDirectory = "/"
|
defaultAssetsDirectory = "./"
|
||||||
defaultNoAuth = "false"
|
defaultNoAuth = "false"
|
||||||
defaultNoAnalytics = "false"
|
defaultNoAnalytics = "false"
|
||||||
defaultTLSVerify = "false"
|
defaultTLSVerify = "false"
|
||||||
|
|
|
@ -3,7 +3,7 @@ package cli
|
||||||
const (
|
const (
|
||||||
defaultBindAddress = ":9000"
|
defaultBindAddress = ":9000"
|
||||||
defaultDataDirectory = "C:\\data"
|
defaultDataDirectory = "C:\\data"
|
||||||
defaultAssetsDirectory = "/"
|
defaultAssetsDirectory = "./"
|
||||||
defaultNoAuth = "false"
|
defaultNoAuth = "false"
|
||||||
defaultNoAnalytics = "false"
|
defaultNoAnalytics = "false"
|
||||||
defaultTLSVerify = "false"
|
defaultTLSVerify = "false"
|
||||||
|
|
|
@ -3,12 +3,8 @@ package handler
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/portainer/portainer"
|
|
||||||
httperror "github.com/portainer/portainer/http/error"
|
|
||||||
|
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -16,22 +12,13 @@ import (
|
||||||
type FileHandler struct {
|
type FileHandler struct {
|
||||||
http.Handler
|
http.Handler
|
||||||
Logger *log.Logger
|
Logger *log.Logger
|
||||||
allowedDirectories map[string]bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFileHandler returns a new instance of FileHandler.
|
// NewFileHandler returns a new instance of FileHandler.
|
||||||
func NewFileHandler(assetPath string) *FileHandler {
|
func NewFileHandler(assetPublicPath string) *FileHandler {
|
||||||
h := &FileHandler{
|
h := &FileHandler{
|
||||||
Handler: http.FileServer(http.Dir(assetPath)),
|
Handler: http.FileServer(http.Dir(assetPublicPath)),
|
||||||
Logger: log.New(os.Stderr, "", log.LstdFlags),
|
Logger: log.New(os.Stderr, "", log.LstdFlags),
|
||||||
allowedDirectories: map[string]bool{
|
|
||||||
"/": true,
|
|
||||||
"/css": true,
|
|
||||||
"/js": true,
|
|
||||||
"/images": true,
|
|
||||||
"/fonts": true,
|
|
||||||
"/ico": true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
|
@ -46,17 +33,10 @@ func isHTML(acceptContent []string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (handler *FileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
func (handler *FileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
requestDirectory := path.Dir(r.URL.Path)
|
|
||||||
if !handler.allowedDirectories[requestDirectory] {
|
|
||||||
httperror.WriteErrorResponse(w, portainer.ErrResourceNotFound, http.StatusNotFound, handler.Logger)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if !isHTML(r.Header["Accept"]) {
|
if !isHTML(r.Header["Accept"]) {
|
||||||
w.Header().Set("Cache-Control", "max-age=31536000")
|
w.Header().Set("Cache-Control", "max-age=31536000")
|
||||||
} else {
|
} else {
|
||||||
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
|
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.Handler.ServeHTTP(w, r)
|
handler.Handler.ServeHTTP(w, r)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/portainer/portainer/http/security"
|
"github.com/portainer/portainer/http/security"
|
||||||
|
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"path/filepath"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Server implements the portainer.Server interface
|
// Server implements the portainer.Server interface
|
||||||
|
@ -42,7 +43,7 @@ func (server *Server) Start() error {
|
||||||
requestBouncer := security.NewRequestBouncer(server.JWTService, server.TeamMembershipService, server.AuthDisabled)
|
requestBouncer := security.NewRequestBouncer(server.JWTService, server.TeamMembershipService, server.AuthDisabled)
|
||||||
proxyManager := proxy.NewManager(server.ResourceControlService, server.TeamMembershipService, server.SettingsService)
|
proxyManager := proxy.NewManager(server.ResourceControlService, server.TeamMembershipService, server.SettingsService)
|
||||||
|
|
||||||
var fileHandler = handler.NewFileHandler(server.AssetsPath)
|
var fileHandler = handler.NewFileHandler(filepath.Join(server.AssetsPath, "public"))
|
||||||
var authHandler = handler.NewAuthHandler(requestBouncer, server.AuthDisabled)
|
var authHandler = handler.NewAuthHandler(requestBouncer, server.AuthDisabled)
|
||||||
authHandler.UserService = server.UserService
|
authHandler.UserService = server.UserService
|
||||||
authHandler.CryptoService = server.CryptoService
|
authHandler.CryptoService = server.CryptoService
|
||||||
|
|
11
gruntfile.js
11
gruntfile.js
|
@ -57,7 +57,7 @@ module.exports = function (grunt) {
|
||||||
|
|
||||||
// Project configuration.
|
// Project configuration.
|
||||||
grunt.initConfig({
|
grunt.initConfig({
|
||||||
distdir: 'dist',
|
distdir: 'dist/public',
|
||||||
shippedDockerVersion: '17.09.0-ce',
|
shippedDockerVersion: '17.09.0-ce',
|
||||||
pkg: grunt.file.readJSON('package.json'),
|
pkg: grunt.file.readJSON('package.json'),
|
||||||
config: {
|
config: {
|
||||||
|
@ -72,8 +72,8 @@ module.exports = function (grunt) {
|
||||||
css: ['assets/css/app.css']
|
css: ['assets/css/app.css']
|
||||||
},
|
},
|
||||||
clean: {
|
clean: {
|
||||||
all: ['<%= distdir %>/*'],
|
all: ['<%= distdir %>/../*'],
|
||||||
app: ['<%= distdir %>/*', '!<%= distdir %>/portainer*', '!<%= distdir %>/docker*'],
|
app: ['<%= distdir %>/*', '!<%= distdir %>/../portainer*', '!<%= distdir %>/../docker*'],
|
||||||
tmpl: ['<%= distdir %>/templates'],
|
tmpl: ['<%= distdir %>/templates'],
|
||||||
tmp: ['<%= distdir %>/js/*', '!<%= distdir %>/js/app.*.js', '<%= distdir %>/css/*', '!<%= distdir %>/css/app.*.css']
|
tmp: ['<%= distdir %>/js/*', '!<%= distdir %>/js/app.*.js', '<%= distdir %>/css/*', '!<%= distdir %>/css/app.*.css']
|
||||||
},
|
},
|
||||||
|
@ -93,7 +93,8 @@ module.exports = function (grunt) {
|
||||||
release: {
|
release: {
|
||||||
src: '<%= src.html %>',
|
src: '<%= src.html %>',
|
||||||
options: {
|
options: {
|
||||||
root: '<%= distdir %>'
|
root: '<%= distdir %>',
|
||||||
|
dest: '<%= distdir %>'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -187,7 +188,7 @@ module.exports = function (grunt) {
|
||||||
run: {
|
run: {
|
||||||
command: [
|
command: [
|
||||||
'docker rm -f portainer',
|
'docker rm -f portainer',
|
||||||
'docker run -d -p 9000:9000 -v $(pwd)/dist:/app -v /tmp/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock:z --name portainer portainer/base /app/portainer-linux-' + arch + ' --no-analytics -a /app'
|
'docker run -d -p 9000:9000 -v $(pwd)/dist:/app -v /tmp/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock:z --name portainer portainer/base /app/portainer-linux-' + arch + ' --no-analytics'
|
||||||
].join(';')
|
].join(';')
|
||||||
},
|
},
|
||||||
downloadDockerBinary: {
|
downloadDockerBinary: {
|
||||||
|
|
Loading…
Reference in New Issue