
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "3 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЬрд╛рдУ рдкрд░ рдкреНрд░реЙрдХреНрд╕реА-рд╕реЗрд╡рд╛" рд▓реЗрдЦ рдХрд╛ рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдКрдкрд░ рд╣реВрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╣реИ, рдореБрдЦреНрдп рддрд░реНрдХ рддреАрди рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзреАрд░ рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рд╛рд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
proxy := httputil.NewSingleHostReverseProxy(url) r.Header.Set(header, value) proxy.ServeHTTP(w, r)
рдХреИрдЯ рдХреЗ рддрд╣рдд рдЧреЛрд▓рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдХрд╣рд╛рдиреА рд╣реИ рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ рдХрдо рд╕реЗ рдХрдо рд╕рдВрднрд╡ рд╕рдордп рдореЗрдВ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЖрдЗрдП рдпрд╣ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдкреНрд░реЙрдХреНрд╕реА рд╕реЗрд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рддрд╣рдд рдХреНрдпрд╛ рд╣реЛред
рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рдЙрд▓рдЯ рджреЗрдВ
рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд░реНрд╡рд░ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдмреИрдХ рдХреЛ рдлреЙрд░рд╡рд░реНрдб рдХрд░рддрд╛ рд╣реИред
рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрди рд╕рд░реНрд╡рд░реЛрдВ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкреНрд░реЙрдХреНрд╕реА рд╕реНрд╡рдпрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХрд┐рд╕ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдкреАрдЫреЗ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реНрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЫрд┐рдкрд╛ рд░рд╣рддрд╛ рд╣реИред

рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА
рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдорд┐рдд рдкреНрд░реЙрдХреНрд╕реА рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХрд┐рд╕реА рднреА рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░реЙрдХреНрд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рдордиреЗ рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдордзреНрдпрд╕реНрде рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЙрдХреНрд╕реА (рдлреЙрд░рд╡рд░реНрдб рдкреНрд░реЙрдХреНрд╕реА)
рдХреНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рд▓реЛрдб рд╕рдВрддреБрд▓рди,
- рдП / рдмреА рдкрд░реАрдХреНрд╖рдг
- рд╕рдВрд╕рд╛рдзрди рдХреИрд╢рд┐рдВрдЧ,
- рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ рдХрд╛ рд╕рдВрдкреАрдбрд╝рди,
- рдЯреНрд░реИрдлрд╝рд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ,
- рдкреНрд░рд╛рдзрд┐рдХрд░рдг
рдмреЗрд╢рдХ, рдЧреБрдВрдЬрд╛рдЗрд╢ рдЗрди рдЫрд╣ рдмрд┐рдВрджреБрдУрдВ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рддрдереНрдп рд░рдЪрдирд╛рддреНрдордХрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧреБрдВрдЬрд╛рдЗрд╢ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред
рдХрд╛рд░реНрдп
рд╣рдо рдПрдХ VMmanager 6 рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рдЕрдЪреНрдЫрд╛ рджрд┐рди, рд╣рдордиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрди рд╕рдореВрд╣реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХреЛ рдЪреБрдирд╛ред
рдЧреНрд░реЗрдлрд╛рдирд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдРрд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рддреАрди "рдмрдЯреНрд╕" рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред
- рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реИ - рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗрд╡рд╛ред
- рд╣рдо рдЧреНрд░рд╛рдлрд╛рдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╢реБрд░реВ рдФрд░ рдЕрдзрд┐рдХреГрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
- рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реАрдзреЗ рддреМрд░ рдкрд░ Grafana рдХреА рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╢рд░реНрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЧреНрд░реЗрдлрд╛рдирд╛ рдХреЛ рдЖрдВрддрд░рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд░рдЦрдиреЗ рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╡рд╣ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗрд╡рд╛ рдореЗрдВ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЕрдиреБрд░реЛрдз рдХреЛ Grafana рдХреЛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛ред
рд╡рд┐рдЪрд╛рд░
рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдЧреНрд░реЗрдлрд╛рдирд╛ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ ( рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди ) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢реАрд░реНрд╖рдХ рд╣реИ, рддреЛ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдЕрдзрд┐рдХреГрдд рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╢реАрд░реНрд╖рдХ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВред

рдХреЙрд▓ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ "рдЧреНрд░рд╛рдлрд╛рдирд╛-рдкреНрд░реЙрдХреНрд╕реА, рдпрд╛ рд░рд╛рдЙрдВрдб-рдЯреНрд░рд┐рдк"
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдмрд╣реБрдд рдорд╛рдирдХ рд╣реИред рд╣рдо http-server рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ 4000 рдкреЛрд░реНрдЯ рдкрд░ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рднреА "/" рдкрддреЗ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рд╣реЛрдЧрд╛ред
func main() { http.HandleFunc("/", handlerProxy) if err := http.ListenAndServe(":4000", nil); err != nil { panic(err) } }
рдХрд╛рдо рдХрд╛ рдереЛрдХ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред
[рдХрдЯ рдХреЗ рддрд╣рдд рдкреВрд░рд╛ рдХреЛрдб] func handlerProxy(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL.Host) if strings.HasPrefix(r.URL.String(), "/api") {
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореБрдЦреНрдп рдЪрд░ рдореИрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рд░рдЦрддрд╛ рд╣реВрдВ:
grafanaUser = "admin"
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ; рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЙрдХреНрд╕реА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдпрд╛ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдХрдВрдЯреЗрдирд░ рдкрд░реНрдпрд╛рд╡рд░рдг рднреА рдЕрдХреНрд╕рд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, os.Getenv рдЖрдкрдХреЛ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдЕрдЧрд▓рд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЬрд╛рдВрдЪ рд╣реИ:
if strings.HasPrefix(r.URL.String(), "/api") { err := CheckRights(r.Header) if err != nil { SendJSONError(w, err.Error()) return } }
рдпрджрд┐ рдЕрдиреБрд░реЛрдз grafana.host/api рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо Grafana рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рд╕рддреНрдпрд╛рдкрди рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЬреЗрдПрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдкреАрдПрдирдЬреА рдЖрдЗрдХрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЬреАрдИрдЯреА рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдмрд┐рдВрджреБ рдХреЛ рдкрд░реЗрд╢рд╛рди рди рдХрд░реЗрдВред рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рд╢реАрд░реНрд╖ рд▓реЗрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдирдХреНрд╢рд╛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд GET рдЕрдиреБрд░реЛрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗрд╡рд╛ рдЙрдкрдХрд░рдг рдпрд╣рд╛рдВ рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░реЗрдВ, рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рдж, рд╣рдо рдЖрдзрд╛рд░ рдкрде рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ:
url, err := url.Parse(fmt.Sprintf("http://%s/", grafanaHost))
HTTP рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдирдХ рдиреЙрдЯрдкреБрдЯрд┐рд▓ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо ReverseProxy рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред
proxy := httputil.NewSingleHostReverseProxy(url)
ReverseProxy рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рд╣реИ рдЬреЛ рдПрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХреЛ рднреЗрдЬреЗрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╡рд╛рдкрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВред
рдпрд╣ "рдЖрдзрд╛рд░ рдкрде + рдЕрдиреБрд░реЛрдзрд┐рдд рдпреВрдЖрд░рдПрд▓" рдкрддреЗ рдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрддрд╛ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рдЖрдпрд╛ рд╣реИ: 4000 / рдПрдкреАрдЖрдИ / рдХреБрдЫ, рддреЛ рдЙрд╕рдХрд╛ рдЕрдиреБрд░реЛрдз рдЧреНрд░рд╛рдлреНрдЯрд╛рдирд╛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛: 3000 / рдПрдкреА / рдХреБрдЫ, рдЬрд╣рд╛рдВ рдЧреНрд░рд╛рдлрд╛рдирд╛: 3000 рдЖрдзрд╛рд░ рдкрде рдиреНрдпреВрд╕реЗрд▓рд┐рдВрдЧрд╣реЙрд╕реНрдЯрд░реЗрд╡рд░реНрд╕рдкреНрд░реЛрд╕реА, рдФрд░ рдПрдкреА / рдХреБрдЫ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдЕрдиреБрд░реЛрдз рд╣реИред
Grafana рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдЬреЛрдбрд╝реЗрдВ рдФрд░ ServeHTTP рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдЬреЛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдереЛрдХ рдХрд░реЗрдЧрд╛ред
r.Header.Set(grafanaHeader, grafanaUser) proxy.ServeHTTP(w, r)
рд╣реБрдб рдХреЗ рддрд╣рдд, ServeHTTP рдмрд╣реБрдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХреНрд╕-рдлреЙрд░рд╡рд░реНрдбреЗрдб-рд╣реЗрдбрд░ рдпрд╛ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП 101 рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдПрдХ рд╕рдордЧреНрд░ рдкрддреЗ рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдЙрддреНрддрд░ рдХреЛ ResponseWriter рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо
рд╕рднреА рдХреЛрдб github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред
рдирд┐рд░реАрдХреНрд╖рдг
рдбреЙрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВред рдЖрдЗрдП рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рджреЛ рдХрдВрдЯреЗрдирд░ - рдкреНрд░реЙрдХреНрд╕реА рдФрд░ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдмрдирд╛рдПрдВред рд╣рдо рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдмрд┐рдВрджреБ рдирд╣реАрдВ рдмрдирд╛рдПрдВрдЧреЗ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИред рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХрдВрдЯреЗрдирд░ рдЕрдиреБрдкрд▓рдмреНрдз рдСрдлрд╝рд▓рд╛рдЗрди рд╣реЛрдЧрд╛, рдкреНрд░реЙрдХреНрд╕реА рдХрдВрдЯреЗрдирд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдПрдБ:
docker network create --driver=bridge --subnet=192.168.0.0/16 gnet
рд╣реЗрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЛрдб рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХрдВрдЯреЗрдирд░ рдЙрдард╛рдПрдВ:
docker run -d --name=grafana --network=gnet -e "GF_AUTH_PROXY_ENABLED=true" -e "GF_AUTH_PROXY_HEADER_NAME=X-GRAFANA-AUTH" grafana/grafana
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдбреЗрдореЛ рд╣реИ рди рдХрд┐ рдЕрдВрддрд┐рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред рдХрдо рд╕реЗ рдХрдо, рдЖрдкрдХреЛ рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрдВрдЬреАрдХрд░рдг рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ред
рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдЙрдард╛рдПрдБ:
docker run -d --name proxy -p 4000:4000 --network=gnet grafana_proxy:latest
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдЬрд╛рдПрдВ: 4000ред
рдорд╣рд╛рди, рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдПрдХ рдЕрдзрд┐рдХреГрдд рдЧреНрд░реЗрдлрд╛рдирд╛ рд╣реИред
рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рдФрд░ рдХрдВрдЯреЗрдирд░ рдЙрдард╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдирд┐рд░реНрджреЗрд╢ рдЬреАрдердм рдкрд░ рд╣реИрдВред