\r\n \u003Cbase href=\"{{ .base }}\" />\r\n \u003Clink rel=\"alternate icon\" type=\"image/png\" href=\"./favicons/favicon-light-default.png\" id=\"favicon-png\" />\r\n \u003Clink rel=\"icon\" type=\"image/svg+xml\" href=\"./favicons/favicon-light-default.svg\" id=\"favicon-svg\" />\r\n \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n \u003Cmeta name=\"theme-color\" content=\"#65a30d\" />\r\n \u003Ctitle>{{ .title }}\u003C/title>\r\n \u003Cscript type=\"\" src=\"./web-config.js\">\u003C/script>\r\n\u003C/head>\r\n\u003Cbody>\r\n \u003Cdiv id=\"app\">\u003C/div>\r\n \u003Cscript type=\"module\" src=\"/src/main.ts\">\u003C/script>\r\n\u003C/body>\r\n\u003C/html>\r\n```\r\n\r\nInject the base href in the index.html\r\n\r\nserver/web/web.go\r\n```go\r\nfunc handleIndex(c *gin.Context) {\r\n c.HTML(200, \"index.html\", gin.H{\r\n \"base\": server.Config.Server.Path + \"/\",\r\n \"title\": server.Config.Server.PageTitle,\r\n })\r\n}\r\n```\r\n\r\n`server.Config.Server.Path` could be calculated from `server.Config.Server.Host` (or maybe overwritten by CLI option)\r\n\r\ncmd/server/server.go\r\n```go\r\nserverURL, err := url.Parse(c.String(\"server-host\"))\r\nif err != nil {\r\n panic(err)\r\n}\r\nserver.Config.Server.Path = serverURL.Path\r\n```\r\n\r\nRedirects are prefixed with new path:\r\n\r\nserver/api/login.go\r\n```go\r\nc.Redirect(303, server.Config.Server.Path+\"/login?error=oauth_error\")\r\n```\r\n\r\n\n\n### Alternative\n\n_No response_\n\n### Additional context\n\n#### Absolute UI paths:\r\n\r\n\r\nhttps://github.com/woodpecker-ci/woodpecker/blob/1786c0554a3f347924a0a1d36c8b2684eb45ac86/web/index.html#L5\r\nhttps://github.com/woodpecker-ci/woodpecker/blob/1786c0554a3f347924a0a1d36c8b2684eb45ac86/web/index.html#L6\r\nhttps://github.com/woodpecker-ci/woodpecker/blob/1786c0554a3f347924a0a1d36c8b2684eb45ac86/web/index.html#L10\r\nhttps://github.com/woodpecker-ci/woodpecker/blob/1786c0554a3f347924a0a1d36c8b2684eb45ac86/web/src/compositions/useAuthentication.ts#L15\r\n\r\nand more ...\r\n\r\n#### Absolute redirect paths:\r\n\r\nhttps://github.com/woodpecker-ci/woodpecker/blob/1786c0554a3f347924a0a1d36c8b2684eb45ac86/server/api/login.go#L55\r\nhttps://github.com/woodpecker-ci/woodpecker/blob/1786c0554a3f347924a0a1d36c8b2684eb45ac86/server/api/login.go#L71\r\nhttps://github.com/woodpecker-ci/woodpecker/blob/1786c0554a3f347924a0a1d36c8b2684eb45ac86/server/api/login.go#L81\r\n\r\nand more ...\r\n\r\n#### Ingress configuration for woodpecker\r\n\r\n```yaml\r\napiVersion: networking.k8s.io/v1\r\nkind: Ingress\r\nmetadata:\r\n name: \"woodpecker\"\r\n annotations:\r\n external-dns.alpha.kubernetes.io/hostname: \"local.cluster\"\r\n cert-manager.io/cluster-issuer: \"cluster-selfsigned\"\r\n kubernetes.io/ingress.class: \"nginx\"\r\n nginx.ingress.kubernetes.io/proxy-buffer-size: \"64k\"\r\n nginx.ingress.kubernetes.io/rewrite-target: \"/$2\"\r\nspec:\r\n tls:\r\n - hosts:\r\n - local.cluster\r\n secretName: \"cluster-tls\"\r\n rules:\r\n - host: \"local.cluster\"\r\n http:\r\n paths:\r\n - path: \"/woodpecker(/|$)(.*)\"\r\n pathType: ImplementationSpecific\r\n backend:\r\n service:\r\n name: \"woodpecker\"\r\n port:\r\n number: 8000\r\n```\n\n### Validations\n\n- [X] Read the [Contributing Guidelines](https://github.com/woodpecker-ci/woodpecker/blob/master/CONTRIBUTING.md).\n- [X] Read the [docs](https://woodpecker-ci.org/docs/intro).\n- [X] Check that there isn't already an [issue](https://github.com/woodpecker-ci/woodpecker/issues) that request the same feature to avoid creating a duplicate.",[2943],{"name":2944,"color":2945},"feature","180DBE",1429,"Improve ingress/reverse proxy support","2023-04-29T15:51:52Z","https://github.com/woodpecker-ci/woodpecker/issues/1429",0.7511216,{"description":2952,"labels":2953,"number":2956,"owner":2874,"repository":2875,"state":2903,"title":2957,"updated_at":2958,"url":2959,"score":2960},"### Clear and concise description of the problem\n\nAs a user I may want to select a language in Woodpecker which isn't the language my Browser is set to.\n\n### Suggested solution\n\nAdd some language selection in the user details screen `/user` (clicking on the user icon).\n\n### Alternative\n\n_No response_\n\n### Additional context\n\nfollow up of #258 \n\n### Validations\n\n- [X] Read the [Contributing Guidelines](https://github.com/woodpecker-ci/woodpecker/blob/master/CONTRIBUTING.md).\n- [X] Read the [docs](https://woodpecker-ci.org/docs/intro).\n- [X] Check that there isn't already an [issue](https://github.com/woodpecker-ci/woodpecker/issues) that request the same feature to avoid creating a duplicate.",[2954,2955],{"name":2915,"color":2916},{"name":2944,"color":2945},1109,"Allow user to set language","2022-10-27T00:42:41Z","https://github.com/woodpecker-ci/woodpecker/issues/1109",0.76648194,{"description":2962,"labels":2963,"number":2964,"owner":2874,"repository":2875,"state":2903,"title":2965,"updated_at":2966,"url":2967,"score":2968},"### Clear and concise description of the problem\n\nOn GitHub Actions we use `github.event.number` to get the event number.\r\nWe use this event number for sorting and naming build artifacts.\r\nFor example one of our artifacts could be named: `overte-server-PR123-ab123cd-aarch64.tar.xz`\r\n\r\nIn WoodpeckerCI there doesn't appear to be a way to get the event number. There is only a way to get the event type via `CI_BUILD_EVENT`\n\n### Suggested solution\n\nFor people to be able to use the event number, I would suggest an `CI_BUILD_EVENT_NUMBER` environment variable.\n\n### Alternative\n\n_No response_\n\n### Additional context\n\nFor clarification, a `github.event.number` in context of a Pull Request is just the Pull Request number.\n\n### Validations\n\n- [X] Read the [Contributing Guidelines](https://github.com/woodpecker-ci/woodpecker/blob/master/CONTRIBUTING.md).\n- [X] Read the [docs](https://woodpecker-ci.org/docs/intro).\n- [X] Check that there isn't already an [issue](https://github.com/woodpecker-ci/woodpecker/issues) that request the same feature to avoid creating a duplicate.",[],1058,"`CI_BUILD_EVENT_NUMBER` environment variable","2022-07-31T17:56:52Z","https://github.com/woodpecker-ci/woodpecker/issues/1058",0.7765967,{"description":2970,"labels":2971,"number":2973,"owner":2874,"repository":2875,"state":2903,"title":2974,"updated_at":2975,"url":2976,"score":2977},"version: latest\r\n\r\nWhen sending a sigterm to the runner with `sudo docker kill woodpecker --signal=SIGTERM`, the runner gracefully shutsdown, but the server panics\r\n\r\n```\r\npanic: Write called after Handler finished\r\n\r\ngoroutine 29210 [running]:\r\nnet/http.(*http2responseWriter).write(0xc000012828, 0x18, 0x0, 0x0, 0x0, 0x11009c2, 0x18, 0x1045f60, 0x7f359512c401, 0x7f359512c460)\r\n /usr/local/go/src/net/http/h2_bundle.go:6256 +0x1f7\r\nnet/http.(*http2responseWriter).WriteString(0xc000012828, 0x11009c2, 0x18, 0x7f359512c460, 0xc000012828, 0x7f359512c401)\r\n /usr/local/go/src/net/http/h2_bundle.go:6249 +0x55\r\nio.WriteString(0x7f359512c440, 0xc000012828, 0x11009c2, 0x18, 0xc000012828, 0x7f3595967101, 0x7f359512c420)\r\n /usr/local/go/src/io/io.go:309 +0x74\r\ngithub.com/gin-gonic/gin.(*responseWriter).WriteString(0xc0002f9500, 0x11009c2, 0x18, 0x7f359512c420, 0xc0002f9500, 0xc001807e01)\r\n /drone/src/github.com/woodpecker-ci/woodpecker/vendor/github.com/gin-gonic/gin/response_writer.go:85 +0x7a\r\nio.WriteString(0x7f3595967170, 0xc0002f9500, 0x11009c2, 0x18, 0xc0002f9500, 0xc0000797c0, 0x0)\r\n /usr/local/go/src/io/io.go:309 +0x74\r\ngithub.com/woodpecker-ci/woodpecker/server/api.LogStreamSSE.func2(0x12dfdd0, 0xc0003b8180, 0xc0015dbad0, 0xc000edee40, 0x12e9e58, 0xc0002f9500, 0xc0016111b0)\r\n /drone/src/github.com/woodpecker-ci/woodpecker/server/api/stream.go:207 +0x168\r\ncreated by github.com/woodpecker-ci/woodpecker/server/api.LogStreamSSE\r\n /drone/src/github.com/woodpecker-ci/woodpecker/server/api/stream.go:191 +0x699\r\n```",[2972],{"name":2868,"color":2869},471,"Server panic after signal SIGTERM","2021-11-26T04:08:10Z","https://github.com/woodpecker-ci/woodpecker/issues/471",0.7777705,{"description":2979,"labels":2980,"number":2982,"owner":2874,"repository":2875,"state":2903,"title":2983,"updated_at":2984,"url":2985,"score":2986},"```\r\n{\"level\":\"trace\",\"time\":\"2023-11-07T15:23:21Z\",\"caller\":\"/woodpecker/src/github.com/woodpecker-ci/woodpecker/server/router/router.go:43\",\"message\":\"[POST] /api/repos/repair\"}\r\n{\"level\":\"error\",\"error\":\"user does not exist [uid: 0, name: , keyid: 0]\",\"time\":\"2023-11-07T15:23:21Z\",\"caller\":\"/woodpecker/src/github.com/woodpecker-ci/woodpecker/server/api/repo.go:579\",\"message\":\"get repo '0xd9a/fedilab_website_wip' from forge\"}\r\n{\"level\":\"debug\",\"ip\":\"::ffff\",\"latency\":22.813033,\"method\":\"POST\",\"path\":\"/api/repos/repair\",\"status\":500,\"time\":\"2023-11-07T15:23:21Z\",\"user-agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15\",\"time\":\"2023-11-07T15:23:21Z\",\"caller\":\"/woodpecker/src/github.com/woodpecker-ci/woodpecker/server/router/middleware/logger.go:59\"}\r\n```\r\n\r\nhttps://github.com/woodpecker-ci/woodpecker/blob/5a7b689e303d0a5d3969ea267f0c433db50812f8/server/api/repo.go#L577\r\n\r\n",[2981],{"name":2868,"color":2869},2791,"repair all repos fail","2023-12-14T18:08:36Z","https://github.com/woodpecker-ci/woodpecker/issues/2791",0.77982163,["Reactive",2988],{},["Set"],["ShallowReactive",2991],{"$fTRc1wZytZ_XrK4EfJfei_Sz-An4H4Yy6syhVxH_PVJc":-1,"$f-vbxGKN5BXGwdiSKmiGxyelFK0xq-wVzhbRtjuUDzBE":-1},"/woodpecker-ci/woodpecker/1512"]