From 17a108f75ff22a584c8ffafe725c74c4f3c639cc Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Fri, 6 Jan 2023 11:42:02 +1000 Subject: [PATCH] Use upstream in host config --- .../20201013035839_initial_data.sql | 25 +++++++++++++++---- backend/internal/entity/host/model.go | 11 ++++++-- backend/internal/entity/host/template.go | 11 ++------ backend/internal/nginx/control.go | 13 +++++++--- backend/internal/nginx/template_test.go | 2 +- backend/internal/nginx/templates.go | 12 ++++++--- 6 files changed, 49 insertions(+), 25 deletions(-) diff --git a/backend/embed/migrations/20201013035839_initial_data.sql b/backend/embed/migrations/20201013035839_initial_data.sql index d7a9112..22a7e63 100644 --- a/backend/embed/migrations/20201013035839_initial_data.sql +++ b/backend/embed/migrations/20201013035839_initial_data.sql @@ -156,9 +156,9 @@ INSERT INTO `nginx_template` ( {{#unless Host.IsDisabled}} server { - set $forward_scheme {{Host.ForwardScheme}}; - set $server ""{{Host.ForwardHost}}""; - set $port {{Host.ForwardPort}}; + set $forward_scheme {{Host.ForwardScheme}} http; # todo + set $server ""{{Host.ForwardHost}}""; # todo + set $port {{Host.ForwardPort}} 80; # todo {{#if Config.Ipv4}} listen 80; @@ -168,11 +168,13 @@ server { {{/if}} {{#if Certificate.ID}} + {{#if Config.Ipv4}} listen 443 ssl {{#if Host.HTTP2Support}}http2{{/if}}; {{/if}} {{#if Config.Ipv6}} listen [::]:443 ssl {{#if Host.HTTP2Support}}http2{{/if}}; {{/if}} + {{/if}} server_name {{#each Host.DomainNames}}{{this}} {{/each}}; @@ -222,6 +224,8 @@ server { # default location: location / { + proxy_http_version 1.1; + {{#if Host.AccessListID}} # Authorization auth_basic ""Authorization required""; @@ -245,11 +249,22 @@ server { {{#if Host.AllowWebsocketUpgrade}} proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; - proxy_http_version 1.1; {{/if}} # Proxy! - include conf.d/include/proxy.conf; + add_header X-Served-By $host; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Scheme $scheme; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $remote_addr; + + {{#if Upstream.ID}} + # upstream + proxy_pass $forward_scheme://npm_upstream_{{Upstream.ID}}; + {{else}} + # proxy + proxy_pass $forward_scheme://$server:$port; + {{/if}} } # Legacy Custom Configuration diff --git a/backend/internal/entity/host/model.go b/backend/internal/entity/host/model.go index 31cf405..e449cb0 100644 --- a/backend/internal/entity/host/model.go +++ b/backend/internal/entity/host/model.go @@ -55,7 +55,7 @@ type Model struct { Certificate *certificate.Model `json:"certificate,omitempty"` NginxTemplate *nginxtemplate.Model `json:"nginx_template,omitempty"` User *user.Model `json:"user,omitempty"` - Upstream *upstream.Model `json:"upstream,omitempty"` + Upstream upstream.Model `json:"upstream,omitempty"` } func (m *Model) getByQuery(query string, params []interface{}) error { @@ -119,7 +119,7 @@ func (m *Model) Expand(items []string) error { if m.UpstreamID > 0 { var u upstream.Model u, err = upstream.GetByID(m.UpstreamID) - m.Upstream = &u + m.Upstream = u } if util.SliceContainsItem(items, "user") && m.ID > 0 { @@ -140,6 +140,12 @@ func (m *Model) Expand(items []string) error { m.NginxTemplate = &templ } + if util.SliceContainsItem(items, "upstream") && m.UpstreamID > 0 { + var ups upstream.Model + ups, err = upstream.GetByID(m.UpstreamID) + m.Upstream = ups + } + return err } @@ -171,6 +177,7 @@ func (m *Model) GetTemplate() Template { Status: m.Status, ErrorMessage: m.ErrorMessage, IsDisabled: m.IsDisabled, + Upstream: m.Upstream, } return t diff --git a/backend/internal/entity/host/template.go b/backend/internal/entity/host/template.go index 957b977..4fb54ef 100644 --- a/backend/internal/entity/host/template.go +++ b/backend/internal/entity/host/template.go @@ -1,13 +1,6 @@ package host -type TemplateUpstream struct { - Hostname string - Port int - BalanceMethod string - MaxFails int - FailTimeout int - AdvancedConfig string -} +import "npm/internal/entity/upstream" // Template is the model given to the template parser, converted from the Model type Template struct { @@ -34,5 +27,5 @@ type Template struct { AdvancedConfig string Status string ErrorMessage string - Upstreams []TemplateUpstream + Upstream upstream.Model } diff --git a/backend/internal/nginx/control.go b/backend/internal/nginx/control.go index 9d34ad2..3a319cf 100644 --- a/backend/internal/nginx/control.go +++ b/backend/internal/nginx/control.go @@ -14,7 +14,7 @@ import ( // ConfigureHost will attempt to write nginx conf and reload nginx func ConfigureHost(h host.Model) error { // nolint: errcheck, gosec - h.Expand([]string{"certificate", "nginxtemplate"}) + h.Expand([]string{"certificate", "nginxtemplate", "upstream"}) var certificateTemplate certificate.Template if h.Certificate != nil { @@ -22,10 +22,15 @@ func ConfigureHost(h host.Model) error { } data := TemplateData{ - ConfDir: fmt.Sprintf("%s/nginx/hosts", config.Configuration.DataFolder), - DataDir: config.Configuration.DataFolder, - Host: h.GetTemplate(), Certificate: certificateTemplate, + ConfDir: fmt.Sprintf("%s/nginx/hosts", config.Configuration.DataFolder), + Config: Config{ // todo + Ipv4: true, + Ipv6: false, + }, + DataDir: config.Configuration.DataFolder, + Host: h.GetTemplate(), + Upstream: h.Upstream, } filename := fmt.Sprintf("%s/host_%d.conf", data.ConfDir, h.ID) diff --git a/backend/internal/nginx/template_test.go b/backend/internal/nginx/template_test.go index 20c4bd8..4fbcacc 100644 --- a/backend/internal/nginx/template_test.go +++ b/backend/internal/nginx/template_test.go @@ -92,7 +92,7 @@ server { Certificate: test.cert.GetTemplate(), } - output, err := generateHostConfig(template, templateData) + output, err := renderTemplate(template, templateData) assert.Equal(t, test.want.err, err) assert.Equal(t, test.want.output, output) }) diff --git a/backend/internal/nginx/templates.go b/backend/internal/nginx/templates.go index 951cc42..78d432f 100644 --- a/backend/internal/nginx/templates.go +++ b/backend/internal/nginx/templates.go @@ -13,25 +13,29 @@ import ( "github.com/aymerick/raymond" ) +type Config struct { + Ipv4 bool + Ipv6 bool +} + // TemplateData is a struct type TemplateData struct { ConfDir string + Config Config DataDir string Host host.Template Certificate certificate.Template Upstream upstream.Model } -func generateHostConfig(template string, data TemplateData) (string, error) { +func renderTemplate(template string, data TemplateData) (string, error) { logger.Debug("Rendering Template - Template: %s", template) logger.Debug("Rendering Template - Data: %+v", data) return raymond.Render(template, data) - - // todo: apply some post processing to this config, stripe trailing whitespace from lines and then remove groups of 2+ \n's so the config looks nicer } func writeTemplate(filename, template string, data TemplateData) error { - output, err := generateHostConfig(template, data) + output, err := renderTemplate(template, data) if err != nil { output = fmt.Sprintf("# Template Error: %s", err.Error()) }