fixed route gone after container restart / Brename

This commit is contained in:
yusing 2024-10-02 15:38:36 +08:00
parent a7a922308e
commit aa16287447
6 changed files with 43 additions and 21 deletions

View file

@ -2,7 +2,6 @@ package middleware
import ( import (
"net" "net"
"net/http"
D "github.com/yusing/go-proxy/internal/docker" D "github.com/yusing/go-proxy/internal/docker"
E "github.com/yusing/go-proxy/internal/error" E "github.com/yusing/go-proxy/internal/error"
@ -53,10 +52,7 @@ func NewRealIP(opts OptionsRaw) (*Middleware, E.NestedError) {
riWithOpts := new(realIP) riWithOpts := new(realIP)
riWithOpts.m = &Middleware{ riWithOpts.m = &Middleware{
impl: riWithOpts, impl: riWithOpts,
before: func(next http.HandlerFunc, w ResponseWriter, r *Request) { before: Rewrite(riWithOpts.setRealIP),
riWithOpts.setRealIP(r)
next(w, r)
},
} }
riWithOpts.realIPOpts = realIPOptsDefault() riWithOpts.realIPOpts = realIPOptsDefault()
err := Deserialize(opts, riWithOpts.realIPOpts) err := Deserialize(opts, riWithOpts.realIPOpts)

View file

@ -2,7 +2,6 @@ package middleware
import ( import (
"net" "net"
"net/http"
) )
const ( const (
@ -15,7 +14,7 @@ const (
) )
var SetXForwarded = &Middleware{ var SetXForwarded = &Middleware{
before: func(next http.HandlerFunc, w ResponseWriter, req *Request) { before: Rewrite(func(req *Request) {
req.Header.Del("Forwarded") req.Header.Del("Forwarded")
req.Header.Del(xForwardedFor) req.Header.Del(xForwardedFor)
req.Header.Del(xForwardedHost) req.Header.Del(xForwardedHost)
@ -32,16 +31,14 @@ var SetXForwarded = &Middleware{
} else { } else {
req.Header.Set(xForwardedProto, "https") req.Header.Set(xForwardedProto, "https")
} }
next(w, req) }),
},
} }
var HideXForwarded = &Middleware{ var HideXForwarded = &Middleware{
before: func(next http.HandlerFunc, w ResponseWriter, req *Request) { before: Rewrite(func(req *Request) {
req.Header.Del("Forwarded") req.Header.Del("Forwarded")
req.Header.Del(xForwardedFor) req.Header.Del(xForwardedFor)
req.Header.Del(xForwardedHost) req.Header.Del(xForwardedHost)
req.Header.Del(xForwardedProto) req.Header.Del(xForwardedProto)
next(w, req) }),
},
} }

View file

@ -87,7 +87,7 @@ func (p *DockerProvider) shouldIgnore(container D.Container) bool {
func (p *DockerProvider) OnEvent(event W.Event, routes R.Routes) (res EventResult) { func (p *DockerProvider) OnEvent(event W.Event, routes R.Routes) (res EventResult) {
switch event.Action { switch event.Action {
case events.ActionContainerStart, events.ActionContainerDie: case events.ActionContainerStart, events.ActionContainerStop:
break break
default: default:
return return
@ -96,13 +96,43 @@ func (p *DockerProvider) OnEvent(event W.Event, routes R.Routes) (res EventResul
defer b.To(&res.err) defer b.To(&res.err)
routes.RangeAll(func(k string, v R.Route) { routes.RangeAll(func(k string, v R.Route) {
if v.Entry().ContainerID == event.ActorID { if v.Entry().ContainerID == event.ActorID ||
v.Entry().ContainerName == event.ActorName {
b.Add(v.Stop()) b.Add(v.Stop())
routes.Delete(k) routes.Delete(k)
res.nRemoved++ res.nRemoved++
} }
}) })
if res.nRemoved == 0 { // id & container name changed
// load all routes (rescan)
routesNew, err := p.LoadRoutesImpl()
routesOld := routes
if routesNew.Size() == 0 {
b.Add(E.FailWith("rescan routes", err))
return
}
routesNew.Range(func(k string, v R.Route) bool {
if !routesOld.Has(k) {
routesOld.Store(k, v)
b.Add(v.Start())
res.nAdded++
return false
}
return true
})
routesOld.Range(func(k string, v R.Route) bool {
if !routesNew.Has(k) {
b.Add(v.Stop())
routesOld.Delete(k)
res.nRemoved++
return false
}
return true
})
return
}
client, err := D.ConnectClient(p.dockerHost) client, err := D.ConnectClient(p.dockerHost)
if err.HasError() { if err.HasError() {
b.Add(E.FailWith("connect to docker", err)) b.Add(E.FailWith("connect to docker", err))

View file

@ -176,7 +176,9 @@ func (p *Provider) watchEvents() {
case event := <-events: case event := <-events:
res := p.OnEvent(event, p.routes) res := p.OnEvent(event, p.routes)
l.Infof("%s event %q", event.Type, event) l.Infof("%s event %q", event.Type, event)
if res.nAdded > 0 || res.nRemoved > 0 {
l.Infof("%d route added, %d routes removed", res.nAdded, res.nRemoved) l.Infof("%d route added, %d routes removed", res.nAdded, res.nRemoved)
}
if res.err.HasError() { if res.err.HasError() {
l.Error(res.err) l.Error(res.err)
} }

View file

@ -97,11 +97,6 @@ func NewHTTPRoute(entry *P.ReverseProxyEntry) (*HTTPRoute, E.NestedError) {
httpRoutesMu.Lock() httpRoutesMu.Lock()
defer httpRoutesMu.Unlock() defer httpRoutesMu.Unlock()
_, exists := httpRoutes.Load(entry.Alias)
if exists {
return nil, E.Duplicated("HTTPRoute alias", entry.Alias)
}
r := &HTTPRoute{ r := &HTTPRoute{
Alias: entry.Alias, Alias: entry.Alias,
TargetURL: (*URL)(entry.URL), TargetURL: (*URL)(entry.URL),

View file

@ -96,6 +96,8 @@ func (w DockerWatcher) EventsWithOptions(ctx context.Context, options DockerList
} }
} }
defer w.client.Close()
w.Debugf("client connected") w.Debugf("client connected")
cEventCh, cErrCh := w.client.Events(eventsCtx, options) cEventCh, cErrCh := w.client.Events(eventsCtx, options)