{
    "componentChunkName": "component---src-templates-issues-tsx",
    "path": "/issues/267",
    "result": {"data":{"issuesJson":{"id":"e2f539eb-eb50-5ef0-b111-1f412e161fac","title":"obsidiandynamics/kafdrop: 一个用于查看 Kafka 主题和浏览消费者组的 Web UI。该工具显示代理、主题、分区、消费者等信息，并允许您查看消息","number":267,"bodyHTML":"<div align=\"center\" dir=\"auto\">\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a><br><br></p>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th align=\"right\">Repos</th>\n<th align=\"left\"><a href=\"https://github.com/obsidiandynamics/kafdrop\">obsidiandynamics/kafdrop</a></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"right\"><strong>Views</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/474239c6a1062aed92e348ae2642af6efd28f22d159f6c68e095ff5475b151e8/68747470733a2f2f76696577732e77686174696c656172656e65642e746f6461792f76696577732f6769746875622f6f6273696469616e64796e616d6963732f6b616664726f702e737667\" alt=\"views\" data-canonical-src=\"https://views.whatilearened.today/views/github/obsidiandynamics/kafdrop.svg\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Stars</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/b55003eabda4bc44e3fde18549601934e5f0acf65bdc8a6cee42324da7aced2a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6f6273696469616e64796e616d6963732f6b616664726f703f636f6c6f723d663266303864266c6f676f3d556e64657274616c65266c6f676f436f6c6f723d656234363330\" alt=\"stars\" data-canonical-src=\"https://img.shields.io/github/stars/obsidiandynamics/kafdrop?color=f2f08d&amp;logo=Undertale&amp;logoColor=eb4630\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Forks</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/2674fd7cb4cf1873f08edf570d30728dec2ded82ecf7e2a5d64e2ae7a4f30759/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f6f6273696469616e64796e616d6963732f6b616664726f703f636f6c6f723d626138366562266c6f676f3d48616e647368616b65266c6f676f436f6c6f723d656136616136\" alt=\"forks\" data-canonical-src=\"https://img.shields.io/github/forks/obsidiandynamics/kafdrop?color=ba86eb&amp;logo=Handshake&amp;logoColor=ea6aa6\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>License</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/8aab460f403fee5a7848a2024b4325680b926cf1b60d32097335811f818b6081/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6f6273696469616e64796e616d6963732f6b616664726f703f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e53556845556741414144414141414177434159414141425841766d48414141414358424957584d41414173544141414c457745416d70775941414144336b6c45515652346e4f335953557a5555426748384a726f57567255474a66456d3773584e63534446784d544c327069347348456778654e526f77586770455742445552522532424e414e4f4b4f4b36366f6f4b4a4742586545475263574163455646475152484677516d483525324630774861655748493944554455354c356b6e6568644f62377a66652532423139636e434a47495243516945596c514237594a4979474c38616f73756c565a36695246516a69474b6b7564576735614c6c704f70704e586e665071773555304459524a6d56786a4367464633424c755a476d416f5655694b4541726d583744375553677351706f72674761336748664b34483663754262435644334771683141352532424c6745253242467749656e514d306a6f446f66714c6f48564e7742796d384370546e416d327a51713073676478624964515a556c416b7150415a3664676a303541446f59526f6f66792532466f5869726f376b3551586a4c6f70677a4b69514e6c4c4461716f4967754577426a7a7150355066446a45394479495879493633464d547751464d43567271774e61763451666f52673538514625324266724d485172454b3844546f434d714e4179574e4866786d54526f4c4f726d5352566747744466714345715a4f4851727a6f34706243557341333431365169364551394b476a6345465267484f724f4b6e5536574162396247455459656b4b7843766a546167394534706a653534446b3551503862624d4859762532464333756541654a6b50304f4778422532424a70426e4172595238455951516e6f4e31414e4661426e5050356c385372736559514c303641646b30464a5938484f5761424d6c6541486a683068506f73497a6c6f3876304125324633345a694f6548726130714b52504d5653493774762532423932747725324676687855654252713456454c674d376642714b354770526d6f514c584e7075625475367a6f4e52706754386e5051627138347764253246494375767978694b4871694e41664933774d367549684271476b4c696977414f734b44714f68743749747239567938536a52424557667941627225324668523142667056514664484a42253246423268683778376a36517077435665655951326b72554235436c636a3641326d3067576a25324244306d4c34397a573563517943484c4e37726a6c6d6d6174457958582532464372547a412532466f51785a6b576c39474a5443566f25324279546a3837253242346769504b6376307149486f344156344430565a727251493334706e70524d36357875652532467a417265453425324654253246536f676c664542794d7369517441546c4c3352414a355948725378365a44665337307337754d486842705225324659423573305057366f455270316236253246667252684b3353444c35546965364f515548516c5133735644752532427a50636b397657453973747225324236496a533967486d5750616861444a25324277434b364e494242587348423948796b587378774470686c436d416476706c6162554a4e6e5a504239342532464e7436784f6538587a4562503257684d335741673147756236744825324233513150673337365239713475716c6e6f36676448476a444f5139306562303141484d3672596975554a314f713472344656756a35765239427a4d3957674e764f7977446869495951467667626366774166774d764863615067425041253246447948476a50624e394138616d6562636477416444354e6633373574787165774e5552656f797677424958594c645170576c6877465771745061435044334173467541535636717171496c62304a766b564331464c39576b4c55556c55574b337a585a4c46432532423125324642726f46746f364f7358497545594a5034447a7a5732594656316f4a614141414141456c46546b5375516d4343\" alt=\"license\" data-canonical-src=\"https://img.shields.io/github/license/obsidiandynamics/kafdrop?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD3klEQVR4nO3YSUzUUBgH8JroWVrUGJfEm7sXNcSDFxMTL2pi4sHEgxeNRowXgpEWBDURR%2BNANOKOK66ooKJGBXeEGRcWAcEVFGQRHFwQmH5%2F0wHaeWHI9DUDU5L5knehdOb7zfe%2B19cnCJGIRCQiEYlQB7YJIyGL8aosulVZ6iRFQjiGKkudWg5aLlpOppNXnfPqw5U0DYRJmVxjCgFF3BLuZGmAoVUiKEArmX7D7USgsQporgGa3gHfK4H6cuBbCVD3Gqh1A5%2BLgE%2BFwIenQM0joDofqLoHVNwBym8CpTnAm2zQq0sgdxbIdQZUlAkqPAZ6dgj05ADoYRoofy%2FoXiro7k5QXjLopgzKiQNlLDaqoIguEwBjzqP5PfDjE9DyIXyI63FMTwQFMCVrqwNav4QfoRg58QF%2BfrMHQrEK8DToCMqNAyWNHfxmTRoLOrmSRVgGtDfqCEqZOHQrzo4pbCUsA3416Qi6EQ9KGjcEFRgHOrOKnU6WAb9bGETYekKxCvjTag9E4pje54Dk5QP8bbMHYv%2FC3ueAeJkP0OGxB%2BJpBnArYR8EYQQnoN1ANFaBnPP5l8SrseYQL06Adk0FJY8HOWaBMleAHjh0hPosIzlo8v0A%2F34ZiOeHra0qKRPMVSI7tv%2B92tw%2FvhxUeBRq4VELgM7fBqK5GpRmoQLXNpubTu6zoNRpgT8nPQbq84wd%2FICuvyxiKHqiNAfI3wM6uIhBqGkLiiwAOsKDqOht7Itr9Vy8SjRBEWfyAbr%2FhR1BfpVQFdHJB%2FB2hh7x7j6QpwCVeeYQ2krUB5Clcj6A2m0gWj%2BD0mL49zW5cQyCHLN7rjlmmatEyXX%2FCrTzA%2FoQxZkWl9GJTCVo%2ByTj87%2B4giPKcv0qIHo4AV4D0VZrrQI34pnpRM65xue%2FzAreE4%2FT%2FSoglfEByMsiQtATlL3RAJ5YHrSx6ZDfS70s7uMHhBpR%2FYB5s0PW6oERp1b6%2FfrRhK3SDL5Tie6OQUHQlQ3sVDu%2BzPck9vWE9str%2B6IjS9gHmWPahaDJ%2BwCK6NIBBXsHB9HykXsxwDphlCmAdvplabUJNnZPB94%2FNt6xOe8XzEbP2WhM3WAg1Gub6tH%2B3Q1Pg376R9q4uqlno6gdHGjDOQ90eb01AHM6rYiuUJ1Oq4r4FVuj5vR9BzM9WgNvOywDhiIYQFvgbcfwAfwMvHcaPgBPA%2FDyHGjPbN9A8amebcdwAdD5Nf375txqewNUReoyvwBIXYLdQpWlhwFWqtPaCPD3AsFuASV6qqqIlb0JvkVC1FL9WkLUUlUWK3zXZLFC%2B1%2FBroFto6OsXIuEYJP4DzzW2YFV1oJaAAAAAElFTkSuQmCC\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>UpdatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/4057f6ed55a4196b995847c924219ece014ade0be80ffda06875a1cae3788cbe/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6f6273696469616e64796e616d6963732f6b616664726f703f646973706c61795f74696d657374616d703d636f6d6d6974746572266c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d557064617465644174\" alt=\"last-commit\" data-canonical-src=\"https://img.shields.io/github/last-commit/obsidiandynamics/kafdrop?display_timestamp=committer&amp;logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=UpdatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>CreatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/caf214bc546c1aa0a03feffe66abbb318304c777fd5450a75e49a2ca4a7679ee/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f637265617465642d61742f6f6273696469616e64796e616d6963732f6b616664726f703f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d437265617465644174\" alt=\"create-at\" data-canonical-src=\"https://img.shields.io/github/created-at/obsidiandynamics/kafdrop?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=CreatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<a href=\"https://github.com/opsre/awesome-ops\">\n</a><p dir=\"auto\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/b964a36ea4078c39f603d46a29436371c7541a2f26e0228d7b21b9d9805b43d3/68747470733a2f2f736f6369616c6966792e6769742e63692f6f707372652f617765736f6d652d6f70732f696d6167653f6465736372697074696f6e3d3126666f6e743d42697474657226666f726b733d31266973737565733d31266c616e67756167653d31266c6f676f3d6874747073253341253246253246617661746172732e67697468756275736572636f6e74656e742e636f6d25324675253246313838353638303230266e616d653d31266f776e65723d31267061747465726e3d436972637569742b426f6172642670756c6c733d31267374617267617a6572733d31267468656d653d4c69676874\" alt=\"\" data-canonical-src=\"https://socialify.git.ci/opsre/awesome-ops/image?description=1&amp;font=Bitter&amp;forks=1&amp;issues=1&amp;language=1&amp;logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F188568020&amp;name=1&amp;owner=1&amp;pattern=Circuit+Board&amp;pulls=1&amp;stargazers=1&amp;theme=Light\" style=\"max-width: 100%;\"></a></p>\n<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a>\n</div>\n<h1 dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://raw.githubusercontent.com/wiki/obsidiandynamics/kafdrop/images/kafdrop-logo.png\"><img src=\"https://raw.githubusercontent.com/wiki/obsidiandynamics/kafdrop/images/kafdrop-logo.png\" width=\"90px\" alt=\"logo\" style=\"max-width: 100%;\"></a> Kafdrop – Kafka Web UI   <a href=\"https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fobsidiandynamics%2Fkafdrop&amp;text=Get%20Kafdrop%20%E2%80%94%20a%20web-based%20UI%20for%20viewing%20%23ApacheKafka%20topics%20and%20browsing%20consumers%20\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/4f677ce944dfdeb7a8cd741560d35d006363ef6160adeb63ee3d8c73373b1f51/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f75726c2f687474702f736869656c64732e696f2e7376673f7374796c653d736f6369616c\" alt=\"Tweet\" data-canonical-src=\"https://img.shields.io/twitter/url/http/shields.io.svg?style=social\" style=\"max-width: 100%;\"></a></h1>\n<p dir=\"auto\"><a href=\"https://github.com/obsidiandynamics/kafdrop/blob/master/LICENSE\"><img src=\"https://camo.githubusercontent.com/eb89d254912231697038ef31a83e262f93b6206783b8c407f1e3dfe8cd9606fa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f70726963652d465245452d3030393866372e737667\" alt=\"Price\" data-canonical-src=\"https://img.shields.io/badge/price-FREE-0098f7.svg\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://github.com/obsidiandynamics/kafdrop/actions/workflows/master.yml\"><img src=\"https://github.com/obsidiandynamics/kafdrop/actions/workflows/master.yml/badge.svg\" alt=\"Release with mvn\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://hub.docker.com/r/obsidiandynamics/kafdrop\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/d226ca9dc86b3a8012cd320544fd9da1f883721a3b675ee5d62ac74f7c331fc8/68747470733a2f2f696d672e736869656c64732e696f2f646f636b65722f70756c6c732f6f6273696469616e64796e616d6963732f6b616664726f702e737667\" alt=\"Docker\" data-canonical-src=\"https://img.shields.io/docker/pulls/obsidiandynamics/kafdrop.svg\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://lgtm.com/projects/g/obsidiandynamics/kafdrop/context:java\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/119d9a3de8db106720ac164820b91f9fd56e9ae3f5ed9a60d05e2cdad0e79aac/68747470733a2f2f696d672e736869656c64732e696f2f6c67746d2f67726164652f6a6176612f672f6f6273696469616e64796e616d6963732f6b616664726f702e7376673f6c6f676f3d6c67746d266c6f676f57696474683d3138\" alt=\"Language grade: Java\" data-canonical-src=\"https://img.shields.io/lgtm/grade/java/g/obsidiandynamics/kafdrop.svg?logo=lgtm&amp;logoWidth=18\" style=\"max-width: 100%;\"></a></p>\n<p dir=\"auto\"><em>Kafdrop is a web UI for viewing Kafka topics and browsing consumer groups.</em> The tool displays information such as brokers, topics, partitions, consumers, and lets you view messages.</p>\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"docs/images/overview.png?raw=true\"><img src=\"docs/images/overview.png?raw=true\" alt=\"Overview Screenshot\" style=\"max-width: 100%;\"></a></p>\n<p dir=\"auto\">This project is a reboot of Kafdrop 2.x, dragged kicking and screaming into the world of Java 17+, Kafka 2.x, Helm and Kubernetes. It's a lightweight application that runs on Spring Boot and is dead-easy to configure, supporting SASL and TLS-secured brokers.</p>\n<h1 dir=\"auto\">Features</h1>\n<ul dir=\"auto\">\n<li><strong>View Kafka brokers</strong> — topic and partition assignments, and controller status</li>\n<li><strong>View topics</strong> — partition count, replication status, and custom configuration</li>\n<li><strong>Browse messages</strong> — JSON, plain text, Avro and Protobuf encoding</li>\n<li><strong>View consumer groups</strong> — per-partition parked offsets, combined and per-partition lag</li>\n<li><strong>Create new topics</strong></li>\n<li><strong>View ACLs</strong></li>\n<li><strong>Support for Azure Event Hubs</strong></li>\n</ul>\n<h1 dir=\"auto\">Requirements</h1>\n<ul dir=\"auto\">\n<li>Java 17 or newer</li>\n<li>Kafka (version 0.11.0 or newer) or Azure Event Hubs</li>\n</ul>\n<p dir=\"auto\">Optional, additional integration:</p>\n<ul dir=\"auto\">\n<li>Schema Registry</li>\n</ul>\n<h1 dir=\"auto\">Getting Started</h1>\n<p dir=\"auto\">You can run the Kafdrop JAR directly, via Docker, or in Kubernetes.</p>\n<h2 dir=\"auto\">Running from JAR</h2>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"java --add-opens=java.base/sun.nio.ch=ALL-UNNAMED \\\n    -jar target/kafdrop-&lt;version&gt;.jar \\\n    --kafka.brokerConnect=&lt;host:port,host:port&gt;,...\"><pre class=\"notranslate\">java --add-opens=java.base/sun.nio.ch=ALL-UNNAMED \\\n    -jar target/kafdrop-<span class=\"pl-k\">&lt;</span>version<span class=\"pl-k\">&gt;</span>.jar \\\n    --kafka.brokerConnect=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span>,...</pre></div>\n<p dir=\"auto\">If unspecified, <code class=\"notranslate\">kafka.brokerConnect</code> defaults to <code class=\"notranslate\">localhost:9092</code>.</p>\n<p dir=\"auto\"><strong>Note:</strong> As of Kafdrop 3.10.0, a ZooKeeper connection is no longer required. All necessary cluster information is retrieved via the Kafka admin API.</p>\n<p dir=\"auto\">Open a browser and navigate to <a href=\"http://localhost:9000\" rel=\"nofollow\">http://localhost:9000</a>. The port can be overridden by adding the following config:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"--server.port=&lt;port&gt; --management.server.port=&lt;port&gt;\"><pre class=\"notranslate\"><code class=\"notranslate\">--server.port=&lt;port&gt; --management.server.port=&lt;port&gt;\n</code></pre></div>\n<p dir=\"auto\">Optionally, configure a schema registry connection with:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"--schemaregistry.connect=http://localhost:8081\"><pre class=\"notranslate\"><code class=\"notranslate\">--schemaregistry.connect=http://localhost:8081\n</code></pre></div>\n<p dir=\"auto\">and if you also require basic auth for your schema registry connection you should add:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"--schemaregistry.auth=username:password\"><pre class=\"notranslate\"><code class=\"notranslate\">--schemaregistry.auth=username:password\n</code></pre></div>\n<p dir=\"auto\">Finally, a default message and key format (e.g. to deserialize Avro messages or keys) can optionally be configured as follows:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"--message.format=AVRO\n--message.keyFormat=DEFAULT\"><pre class=\"notranslate\"><code class=\"notranslate\">--message.format=AVRO\n--message.keyFormat=DEFAULT\n</code></pre></div>\n<p dir=\"auto\">Valid format values are <code class=\"notranslate\">DEFAULT</code>, <code class=\"notranslate\">AVRO</code>, <code class=\"notranslate\">PROTOBUF</code>. This can also be configured at the topic level via dropdown when viewing messages.<br>\nIf key format is unspecified, message format will be used for key too.</p>\n<h2 dir=\"auto\">Configure Protobuf message type</h2>\n<h3 dir=\"auto\">Option 1: Using Protobuf Descriptor</h3>\n<p dir=\"auto\">In case of protobuf message type, the definition of a message could be compiled and transmitted using a descriptor file.<br>\nThus, in order for kafdrop to recognize the message, the application will need to access to the descriptor file(s).<br>\nKafdrop will allow user to select descriptor and well as specifying name of one of the message type provided by the descriptor at runtime.</p>\n<p dir=\"auto\">To configure a folder with protobuf descriptor file(s) (.desc), follow:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"--protobufdesc.directory=/var/protobuf_desc\"><pre class=\"notranslate\"><code class=\"notranslate\">--protobufdesc.directory=/var/protobuf_desc\n</code></pre></div>\n<h3 dir=\"auto\">Option 2 : Using Schema Registry</h3>\n<p dir=\"auto\">In case of no protobuf descriptor file being supplied the implementation will attempt to create the protobuf deserializer using the schema registry instead.</p>\n<h3 dir=\"auto\">Defaulting to Protobuf</h3>\n<p dir=\"auto\">If preferred the message type could be set to default as follows:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"--message.format=PROTOBUF\"><pre class=\"notranslate\"><code class=\"notranslate\">--message.format=PROTOBUF\n</code></pre></div>\n<h2 dir=\"auto\">Running with Docker</h2>\n<p dir=\"auto\">Images are hosted at <a href=\"https://hub.docker.com/r/obsidiandynamics/kafdrop\" rel=\"nofollow\">hub.docker.com/r/obsidiandynamics/kafdrop</a>.</p>\n<p dir=\"auto\">Launch container in background:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run -d --rm -p 9000:9000 \\\n    -e KAFKA_BROKERCONNECT=&lt;host:port,host:port&gt; \\\n    -e SERVER_SERVLET_CONTEXTPATH=&quot;/&quot; \\\n    obsidiandynamics/kafdrop\"><pre class=\"notranslate\">docker run -d --rm -p 9000:9000 \\\n    -e KAFKA_BROKERCONNECT=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    -e SERVER_SERVLET_CONTEXTPATH=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>/<span class=\"pl-pds\">\"</span></span> \\\n    obsidiandynamics/kafdrop</pre></div>\n<p dir=\"auto\">Launch container with some specific JVM options:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run -d --rm -p 9000:9000 \\\n    -e KAFKA_BROKERCONNECT=&lt;host:port,host:port&gt; \\\n    -e JVM_OPTS=&quot;-Xms32M -Xmx64M&quot; \\\n    -e SERVER_SERVLET_CONTEXTPATH=&quot;/&quot; \\\n    obsidiandynamics/kafdrop\"><pre class=\"notranslate\">docker run -d --rm -p 9000:9000 \\\n    -e KAFKA_BROKERCONNECT=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    -e JVM_OPTS=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>-Xms32M -Xmx64M<span class=\"pl-pds\">\"</span></span> \\\n    -e SERVER_SERVLET_CONTEXTPATH=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>/<span class=\"pl-pds\">\"</span></span> \\\n    obsidiandynamics/kafdrop</pre></div>\n<p dir=\"auto\">Launch container in background with protobuff definitions:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run -d --rm -v &lt;path_to_protobuff_descriptor_files&gt;:/var/protobuf_desc -p 9000:9000 \\\n    -e KAFKA_BROKERCONNECT=&lt;host:port,host:port&gt; \\\n    -e SERVER_SERVLET_CONTEXTPATH=&quot;/&quot; \\\n    -e CMD_ARGS=&quot;--message.format=PROTOBUF --protobufdesc.directory=/var/protobuf_desc&quot; \\\n    obsidiandynamics/kafdrop\"><pre class=\"notranslate\">docker run -d --rm -v <span class=\"pl-k\">&lt;</span>path_to_protobuff_descriptor_files<span class=\"pl-k\">&gt;</span>:/var/protobuf_desc -p 9000:9000 \\\n    -e KAFKA_BROKERCONNECT=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    -e SERVER_SERVLET_CONTEXTPATH=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>/<span class=\"pl-pds\">\"</span></span> \\\n    -e CMD_ARGS=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>--message.format=PROTOBUF --protobufdesc.directory=/var/protobuf_desc<span class=\"pl-pds\">\"</span></span> \\\n    obsidiandynamics/kafdrop</pre></div>\n<p dir=\"auto\">Then access the web UI at <a href=\"http://localhost:9000\" rel=\"nofollow\">http://localhost:9000</a>.</p>\n<blockquote>\n<p dir=\"auto\"><strong>Hey there!</strong> We hope you really like Kafdrop! Please take a moment to <a href=\"https://github.com/obsidiandynamics/kafdrop\">⭐</a>the repo or <a href=\"https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fobsidiandynamics%2Fkafdrop&amp;text=Get%20Kafdrop%20%E2%80%94%20a%20web-based%20UI%20for%20viewing%20%23ApacheKafka%20topics%20and%20browsing%20consumers%20\" rel=\"nofollow\">Tweet</a> about it.</p>\n</blockquote>\n<h2 dir=\"auto\">Running in Kubernetes (using a Helm Chart)</h2>\n<p dir=\"auto\">Clone the repository (if necessary):</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/obsidiandynamics/kafdrop &amp;&amp; cd kafdrop\"><pre class=\"notranslate\">git clone https://github.com/obsidiandynamics/kafdrop <span class=\"pl-k\">&amp;&amp;</span> <span class=\"pl-c1\">cd</span> kafdrop</pre></div>\n<p dir=\"auto\">Apply the chart:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"helm upgrade -i kafdrop chart --set image.tag=3.x.x \\\n    --set kafka.brokerConnect=&lt;host:port,host:port&gt; \\\n    --set server.servlet.contextPath=&quot;/&quot; \\\n    --set cmdArgs=&quot;--message.format=AVRO --schemaregistry.connect=http://localhost:8080&quot; \\ #optional\n    --set jvm.opts=&quot;-Xms32M -Xmx64M&quot;\"><pre class=\"notranslate\">helm upgrade -i kafdrop chart --set image.tag=3.x.x \\\n    --set kafka.brokerConnect=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    --set server.servlet.contextPath=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>/<span class=\"pl-pds\">\"</span></span> \\\n    --set cmdArgs=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>--message.format=AVRO --schemaregistry.connect=http://localhost:8080<span class=\"pl-pds\">\"</span></span> <span class=\"pl-cce\">\\ </span><span class=\"pl-c\"><span class=\"pl-c\">#</span>optional</span>\n    --set jvm.opts=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>-Xms32M -Xmx64M<span class=\"pl-pds\">\"</span></span></pre></div>\n<p dir=\"auto\">For all Helm configuration options, have a peek into <a href=\"chart/values.yaml\">chart/values.yaml</a>.</p>\n<p dir=\"auto\">Replace <code class=\"notranslate\">3.x.x</code> with the image tag of <a href=\"https://hub.docker.com/r/obsidiandynamics/kafdrop\" rel=\"nofollow\">obsidiandynamics/kafdrop</a>. Services will be bound on port 9000 by default (node port 30900).</p>\n<p dir=\"auto\"><strong>Note:</strong> The context path <em>must</em> begin with a slash.</p>\n<p dir=\"auto\">Proxy to the Kubernetes cluster:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"kubectl proxy\"><pre class=\"notranslate\">kubectl proxy</pre></div>\n<p dir=\"auto\">Navigate to <a href=\"http://localhost:8001/api/v1/namespaces/default/services/http:kafdrop:9000/proxy\" rel=\"nofollow\">http://localhost:8001/api/v1/namespaces/default/services/http:kafdrop:9000/proxy</a>.</p>\n<h3 dir=\"auto\">Protobuf support via helm chart:</h3>\n<p dir=\"auto\">To install with protobuf support, a \"facility\" option is provided for the deployment, to mount the descriptor files folder, as well as passing the required CMD arguments, via option <em>mountProtoDesc</em>.<br>\nExample:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"helm upgrade -i kafdrop chart --set image.tag=3.x.x \\\n    --set kafka.brokerConnect=&lt;host:port,host:port&gt; \\\n    --set server.servlet.contextPath=&quot;/&quot; \\\n    --set mountProtoDesc.enabled=true \\\n    --set mountProtoDesc.hostPath=&quot;&lt;path/to/desc/folder&gt;&quot; \\\n    --set jvm.opts=&quot;-Xms32M -Xmx64M&quot;\"><pre class=\"notranslate\">helm upgrade -i kafdrop chart --set image.tag=3.x.x \\\n    --set kafka.brokerConnect=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    --set server.servlet.contextPath=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>/<span class=\"pl-pds\">\"</span></span> \\\n    --set mountProtoDesc.enabled=true \\\n    --set mountProtoDesc.hostPath=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>&lt;path/to/desc/folder&gt;<span class=\"pl-pds\">\"</span></span> \\\n    --set jvm.opts=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>-Xms32M -Xmx64M<span class=\"pl-pds\">\"</span></span></pre></div>\n<h2 dir=\"auto\">Building</h2>\n<p dir=\"auto\">After cloning the repository, building is just a matter of running a standard Maven build:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ mvn clean package\"><pre class=\"notranslate\">$ mvn clean package</pre></div>\n<p dir=\"auto\">The following command will generate a Docker image:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"mvn assembly:single docker:build\"><pre class=\"notranslate\">mvn assembly:single docker:build</pre></div>\n<h2 dir=\"auto\">Docker Compose</h2>\n<p dir=\"auto\">There is a <code class=\"notranslate\">docker-compose.yaml</code> file that bundles a Kafka/ZooKeeper instance with Kafdrop:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cd docker-compose/kafka-kafdrop\ndocker-compose up\"><pre class=\"notranslate\"><span class=\"pl-c1\">cd</span> docker-compose/kafka-kafdrop\ndocker-compose up</pre></div>\n<h1 dir=\"auto\">APIs</h1>\n<h2 dir=\"auto\">JSON endpoints</h2>\n<p dir=\"auto\">Starting with version 2.0.0, Kafdrop offers a set of Kafka APIs that mirror the existing HTML views. Any existing endpoint can be returned as JSON by simply setting the <code class=\"notranslate\">Accept: application/json</code> header. Some endpoints are JSON only:</p>\n<ul dir=\"auto\">\n<li><code class=\"notranslate\">/topic</code>: Returns a list of all topics.</li>\n</ul>\n<h2 dir=\"auto\">OpenAPI Specification (OAS)</h2>\n<p dir=\"auto\">To help document the Kafka APIs, OpenAPI Specification (OAS) has been included. The OpenAPI Specification output is available by default at the following Kafdrop URL:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"/v3/api-docs\"><pre class=\"notranslate\"><code class=\"notranslate\">/v3/api-docs\n</code></pre></div>\n<p dir=\"auto\">It is also possible to access the Swagger UI (the HTML views) from the following URL:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"/swagger-ui.html\"><pre class=\"notranslate\"><code class=\"notranslate\">/swagger-ui.html\n</code></pre></div>\n<p dir=\"auto\">This can be overridden with the following configuration:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"springdoc.api-docs.path=/new/oas/path\"><pre class=\"notranslate\"><code class=\"notranslate\">springdoc.api-docs.path=/new/oas/path\n</code></pre></div>\n<p dir=\"auto\">You can disable OpenAPI Specification output with the following configuration:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"springdoc.api-docs.enabled=false\"><pre class=\"notranslate\"><code class=\"notranslate\">springdoc.api-docs.enabled=false\n</code></pre></div>\n<h2 dir=\"auto\">CORS Headers</h2>\n<p dir=\"auto\">Starting in version 2.0.0, Kafdrop sets CORS headers for all endpoints. You can control the CORS header values with the following configurations:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"cors.allowOrigins (default is *)\ncors.allowMethods (default is GET,POST,PUT,DELETE)\ncors.maxAge (default is 3600)\ncors.allowCredentials (default is true)\ncors.allowHeaders (default is Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization)\"><pre class=\"notranslate\"><code class=\"notranslate\">cors.allowOrigins (default is *)\ncors.allowMethods (default is GET,POST,PUT,DELETE)\ncors.maxAge (default is 3600)\ncors.allowCredentials (default is true)\ncors.allowHeaders (default is Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization)\n</code></pre></div>\n<p dir=\"auto\">You can also disable CORS entirely with the following configuration:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"cors.enabled=false\"><pre class=\"notranslate\"><code class=\"notranslate\">cors.enabled=false\n</code></pre></div>\n<h2 dir=\"auto\">Topic Configuration</h2>\n<p dir=\"auto\">By default, you could delete a topic. If you don't want this feature, you could disable it with:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"--topic.deleteEnabled=false\"><pre class=\"notranslate\"><code class=\"notranslate\">--topic.deleteEnabled=false\n</code></pre></div>\n<p dir=\"auto\">By default, you could create a topic. If you don't want this feature, you could disable it with:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"--topic.createEnabled=false\"><pre class=\"notranslate\"><code class=\"notranslate\">--topic.createEnabled=false\n</code></pre></div>\n<h2 dir=\"auto\">Actuator</h2>\n<p dir=\"auto\">Health and info endpoints are available at the following path: <code class=\"notranslate\">/actuator</code></p>\n<p dir=\"auto\">This can be overridden with the following configuration:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"management.endpoints.web.base-path=&lt;path&gt;\"><pre class=\"notranslate\"><code class=\"notranslate\">management.endpoints.web.base-path=&lt;path&gt;\n</code></pre></div>\n<h1 dir=\"auto\">Guides</h1>\n<h2 dir=\"auto\">Connecting to a Secure Broker</h2>\n<p dir=\"auto\">Kafdrop supports TLS (SSL) and SASL connections for <a href=\"http://kafka.apache.org/090/documentation.html#security\" rel=\"nofollow\">encryption and authentication</a>. This can be configured by providing a combination of the following files (placed into the Kafka root directory):</p>\n<ul dir=\"auto\">\n<li><code class=\"notranslate\">kafka.truststore.jks</code>: specifying the certificate for authenticating brokers, if TLS is enabled.</li>\n<li><code class=\"notranslate\">kafka.keystore.jks</code>: specifying the private key to authenticate the client to the broker, if mutual TLS authentication is required.</li>\n<li><code class=\"notranslate\">kafka.properties</code>: specifying the necessary configuration, including key/truststore passwords, cipher suites, enabled TLS protocol versions, username/password pairs, etc. When supplying the truststore and/or keystore files, the <code class=\"notranslate\">ssl.truststore.location</code> and <code class=\"notranslate\">ssl.keystore.location</code> properties will be assigned automatically.</li>\n</ul>\n<h3 dir=\"auto\">Running from JAR</h3>\n<p dir=\"auto\">First create a <code class=\"notranslate\">kafka.properties</code> file with the following content:</p>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"security.protocol=SASL_SSL\nsasl.mechanism=SCRAM-SHA-512\nsasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=&quot;foo&quot; password=&quot;bar&quot;\"><pre class=\"notranslate\"><span class=\"pl-s\">security.protocol=SASL_SSL</span>\n<span class=\"pl-s\">sasl.mechanism=SCRAM-SHA-512</span>\n<span class=\"pl-s\">sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=\"foo\" password=\"bar\"</span></pre></div>\n<p dir=\"auto\">Then run Kafdrop with the following command:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"java -jar target/kafdrop-&lt;version&gt;.jar \\\n    --kafka.brokerConnect=&lt;host:port,host:port&gt; \\\n    --kafka.propertiesFile=./kafka.properties\"><pre class=\"notranslate\">java -jar target/kafdrop-<span class=\"pl-k\">&lt;</span>version<span class=\"pl-k\">&gt;</span>.jar \\\n    --kafka.brokerConnect=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    --kafka.propertiesFile=./kafka.properties</pre></div>\n<h3 dir=\"auto\">Using Docker</h3>\n<p dir=\"auto\">The three files above can be supplied to a Docker instance in base-64-encoded form via environment variables:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run -d --rm -p 9000:9000 \\\n    -e KAFKA_BROKERCONNECT=&lt;host:port,host:port&gt; \\\n    -e KAFKA_PROPERTIES=&quot;$(cat kafka.properties | base64)&quot; \\\n    -e KAFKA_TRUSTSTORE=&quot;$(cat kafka.truststore.jks | base64)&quot; \\   # optional\n    -e KAFKA_KEYSTORE=&quot;$(cat kafka.keystore.jks | base64)&quot; \\       # optional\n    obsidiandynamics/kafdrop\"><pre class=\"notranslate\">docker run -d --rm -p 9000:9000 \\\n    -e KAFKA_BROKERCONNECT=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    -e KAFKA_PROPERTIES=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-s\"><span class=\"pl-pds\">$(</span>cat kafka.properties <span class=\"pl-k\">|</span> base64<span class=\"pl-pds\">)</span></span><span class=\"pl-pds\">\"</span></span> \\\n    -e KAFKA_TRUSTSTORE=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-s\"><span class=\"pl-pds\">$(</span>cat kafka.truststore.jks <span class=\"pl-k\">|</span> base64<span class=\"pl-pds\">)</span></span><span class=\"pl-pds\">\"</span></span> <span class=\"pl-cce\">\\ </span>  <span class=\"pl-c\"><span class=\"pl-c\">#</span> optional</span>\n    -e KAFKA_KEYSTORE=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-s\"><span class=\"pl-pds\">$(</span>cat kafka.keystore.jks <span class=\"pl-k\">|</span> base64<span class=\"pl-pds\">)</span></span><span class=\"pl-pds\">\"</span></span> <span class=\"pl-cce\">\\ </span>      <span class=\"pl-c\"><span class=\"pl-c\">#</span> optional</span>\n    obsidiandynamics/kafdrop</pre></div>\n<p dir=\"auto\">Rather than passing <code class=\"notranslate\">KAFKA_PROPERTIES</code> as a base64-encoded string, you can also place a pre-populated <code class=\"notranslate\">KAFKA_PROPERTIES_FILE</code> into the container:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cat &lt;&lt; EOF &gt; kafka.properties\nsecurity.protocol=SASL_SSL\nsasl.mechanism=SCRAM-SHA-512\nsasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=&quot;foo&quot; password=&quot;bar&quot;\nEOF\n\ndocker run -d --rm -p 9000:9000 \\\n    -v $(pwd)/kafka.properties:/tmp/kafka.properties:ro \\\n    -v $(pwd)/kafka.truststore.jks:/tmp/kafka.truststore.jks:ro \\\n    -v $(pwd)/kafka.keystore.jks:/tmp/kafka.keystore.jks:ro \\\n    -e KAFKA_BROKERCONNECT=&lt;host:port,host:port&gt; \\\n    -e KAFKA_PROPERTIES_FILE=/tmp/kafka.properties \\\n    -e KAFKA_TRUSTSTORE_FILE=/tmp/kafka.truststore.jks \\   # optional\n    -e KAFKA_KEYSTORE_FILE=/tmp/kafka.keystore.jks \\       # optional\n    obsidiandynamics/kafdrop\"><pre class=\"notranslate\">cat <span class=\"pl-s\"><span class=\"pl-k\">&lt;&lt;</span> <span class=\"pl-k\">EOF</span> &gt; kafka.properties</span>\n<span class=\"pl-s\">security.protocol=SASL_SSL</span>\n<span class=\"pl-s\">sasl.mechanism=SCRAM-SHA-512</span>\n<span class=\"pl-s\">sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=\"foo\" password=\"bar\"</span>\n<span class=\"pl-s\"><span class=\"pl-k\">EOF</span></span>\n\ndocker run -d --rm -p 9000:9000 \\\n    -v <span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span>/kafka.properties:/tmp/kafka.properties:ro \\\n    -v <span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span>/kafka.truststore.jks:/tmp/kafka.truststore.jks:ro \\\n    -v <span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span>/kafka.keystore.jks:/tmp/kafka.keystore.jks:ro \\\n    -e KAFKA_BROKERCONNECT=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    -e KAFKA_PROPERTIES_FILE=/tmp/kafka.properties \\\n    -e KAFKA_TRUSTSTORE_FILE=/tmp/kafka.truststore.jks <span class=\"pl-cce\">\\ </span>  <span class=\"pl-c\"><span class=\"pl-c\">#</span> optional</span>\n    -e KAFKA_KEYSTORE_FILE=/tmp/kafka.keystore.jks <span class=\"pl-cce\">\\ </span>      <span class=\"pl-c\"><span class=\"pl-c\">#</span> optional</span>\n    obsidiandynamics/kafdrop</pre></div>\n<p dir=\"auto\">It's sometimes needed to load extra classes, e.g. for a SASL client callback handler. To facilitate that, it is possible to mount a folder with extra JARs, like this:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cat &lt;&lt; EOF &gt; kafka.properties\nsecurity.protocol=SASL_SSL\nsasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule;\nsasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler\nEOF\n\nmkdir extra-kafdrop-classes\nwget --directory-prefix=extra-kafdrop-classes https://repo1.maven.org/maven2/software/amazon/msk/aws-msk-iam-auth/1.0.0/aws-msk-iam-auth-1.0.0.jar\n\ndocker run -d --rm -p 9000:9000 \\\n    -v $(pwd)/kafka.properties:/tmp/kafka.properties:ro \\\n    -v $(pwd)/kafka.truststore.jks:/tmp/kafka.truststore.jks:ro \\\n    -v $(pwd)/kafka.keystore.jks:/tmp/kafka.keystore.jks:ro \\\n    -v $(pwd)/extra-kafdrop-classes:/extra-classes:ro \\\n    -e KAFKA_BROKERCONNECT=&lt;host:port,host:port&gt; \\\n    -e KAFKA_PROPERTIES_FILE=/tmp/kafka.properties \\\n    -e KAFKA_TRUSTSTORE_FILE=/tmp/kafka.truststore.jks \\   # optional\n    -e KAFKA_KEYSTORE_FILE=/tmp/kafka.keystore.jks \\       # optional\n    obsidiandynamics/kafdrop\"><pre class=\"notranslate\">cat <span class=\"pl-s\"><span class=\"pl-k\">&lt;&lt;</span> <span class=\"pl-k\">EOF</span> &gt; kafka.properties</span>\n<span class=\"pl-s\">security.protocol=SASL_SSL</span>\n<span class=\"pl-s\">sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule;</span>\n<span class=\"pl-s\">sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler</span>\n<span class=\"pl-s\"><span class=\"pl-k\">EOF</span></span>\n\nmkdir extra-kafdrop-classes\nwget --directory-prefix=extra-kafdrop-classes https://repo1.maven.org/maven2/software/amazon/msk/aws-msk-iam-auth/1.0.0/aws-msk-iam-auth-1.0.0.jar\n\ndocker run -d --rm -p 9000:9000 \\\n    -v <span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span>/kafka.properties:/tmp/kafka.properties:ro \\\n    -v <span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span>/kafka.truststore.jks:/tmp/kafka.truststore.jks:ro \\\n    -v <span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span>/kafka.keystore.jks:/tmp/kafka.keystore.jks:ro \\\n    -v <span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span>/extra-kafdrop-classes:/extra-classes:ro \\\n    -e KAFKA_BROKERCONNECT=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    -e KAFKA_PROPERTIES_FILE=/tmp/kafka.properties \\\n    -e KAFKA_TRUSTSTORE_FILE=/tmp/kafka.truststore.jks <span class=\"pl-cce\">\\ </span>  <span class=\"pl-c\"><span class=\"pl-c\">#</span> optional</span>\n    -e KAFKA_KEYSTORE_FILE=/tmp/kafka.keystore.jks <span class=\"pl-cce\">\\ </span>      <span class=\"pl-c\"><span class=\"pl-c\">#</span> optional</span>\n    obsidiandynamics/kafdrop</pre></div>\n<h4 dir=\"auto\">Environment Variables</h4>\n<h5 dir=\"auto\">Basic configuration</h5>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th>Name</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code class=\"notranslate\">KAFKA_BROKERCONNECT</code></td>\n<td>Bootstrap list of Kafka host/port pairs. Defaults to <code class=\"notranslate\">localhost:9092</code>.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">KAFKA_PROPERTIES</code></td>\n<td>Additional properties to configure the broker connection (base-64 encoded).</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">KAFKA_TRUSTSTORE</code></td>\n<td>Certificate for broker authentication (base-64 encoded). Required for TLS/SSL.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">KAFKA_KEYSTORE</code></td>\n<td>Private key for mutual TLS authentication (base-64 encoded).</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">SERVER_SERVLET_CONTEXTPATH</code></td>\n<td>The context path to serve requests on (must end with a <code class=\"notranslate\">/</code>). Defaults to <code class=\"notranslate\">/</code>.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">SERVER_PORT</code></td>\n<td>The web server port to listen on. Defaults to <code class=\"notranslate\">9000</code>.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">MANAGEMENT_SERVER_PORT</code></td>\n<td>The Spring Actuator server port to listen on. Defaults to <code class=\"notranslate\">9000</code>.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">SCHEMAREGISTRY_CONNECT </code></td>\n<td>The endpoint of Schema Registry for Avro or Protobuf message</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">SCHEMAREGISTRY_AUTH</code></td>\n<td>Optional basic auth credentials in the form <code class=\"notranslate\">username:password</code>.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">CMD_ARGS</code></td>\n<td>Command line arguments to Kafdrop, e.g. <code class=\"notranslate\">--message.format</code> or <code class=\"notranslate\">--protobufdesc.directory</code> or <code class=\"notranslate\">--server.port</code>.</td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<h5 dir=\"auto\">Advanced configuration</h5>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th>Name</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code class=\"notranslate\">JVM_OPTS</code></td>\n<td>JVM options. E.g.<code class=\"notranslate\">JVM_OPTS: \"-Xms16M -Xmx64M -Xss360K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify\"</code></td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">JMX_PORT</code></td>\n<td>Port to use for JMX. No default; if unspecified, JMX will not be exposed.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">HOST</code></td>\n<td>The hostname to report for the RMI registry (used for JMX). Defaults to <code class=\"notranslate\">localhost</code>.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">KAFKA_PROPERTIES_FILE</code></td>\n<td>Internal location where the Kafka properties file will be written to (if <code class=\"notranslate\">KAFKA_PROPERTIES</code> is set). Defaults to <code class=\"notranslate\">kafka.properties</code>.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">KAFKA_TRUSTSTORE_FILE</code></td>\n<td>Internal location where the truststore file will be written to (if <code class=\"notranslate\">KAFKA_TRUSTSTORE</code> is set). Defaults to <code class=\"notranslate\">kafka.truststore.jks</code>.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">KAFKA_KEYSTORE_FILE</code></td>\n<td>Internal location where the keystore file will be written to (if <code class=\"notranslate\">KAFKA_KEYSTORE</code> is set). Defaults to <code class=\"notranslate\">kafka.keystore.jks</code>.</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">SSL_ENABLED</code></td>\n<td>Enabling HTTPS (SSL) for Kafdrop server. Default is <code class=\"notranslate\">false</code></td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">SSL_KEY_STORE_TYPE</code></td>\n<td>Type of SSL keystore. Default is <code class=\"notranslate\">PKCS12</code></td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">SSL_KEY_STORE</code></td>\n<td>Path to keystore file</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">SSL_KEY_STORE_PASSWORD</code></td>\n<td>Keystore password</td>\n</tr>\n<tr>\n<td><code class=\"notranslate\">SSL_KEY_ALIAS</code></td>\n<td>Key alias</td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<h3 dir=\"auto\">Using Helm</h3>\n<p dir=\"auto\">Like in the Docker example, supply the files in base-64 form:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"helm upgrade -i kafdrop chart --set image.tag=3.x.x \\\n    --set kafka.brokerConnect=&lt;host:port,host:port&gt; \\\n    --set kafka.properties=&quot;$(cat kafka.properties | base64)&quot; \\\n    --set kafka.truststore=&quot;$(cat kafka.truststore.jks | base64)&quot; \\\n    --set kafka.keystore=&quot;$(cat kafka.keystore.jks | base64)&quot;\"><pre class=\"notranslate\">helm upgrade -i kafdrop chart --set image.tag=3.x.x \\\n    --set kafka.brokerConnect=<span class=\"pl-k\">&lt;</span>host:port,host:port<span class=\"pl-k\">&gt;</span> \\\n    --set kafka.properties=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-s\"><span class=\"pl-pds\">$(</span>cat kafka.properties <span class=\"pl-k\">|</span> base64<span class=\"pl-pds\">)</span></span><span class=\"pl-pds\">\"</span></span> \\\n    --set kafka.truststore=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-s\"><span class=\"pl-pds\">$(</span>cat kafka.truststore.jks <span class=\"pl-k\">|</span> base64<span class=\"pl-pds\">)</span></span><span class=\"pl-pds\">\"</span></span> \\\n    --set kafka.keystore=<span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-s\"><span class=\"pl-pds\">$(</span>cat kafka.keystore.jks <span class=\"pl-k\">|</span> base64<span class=\"pl-pds\">)</span></span><span class=\"pl-pds\">\"</span></span></pre></div>\n<h2 dir=\"auto\">Updating the Bootstrap theme</h2>\n<p dir=\"auto\">Edit the <code class=\"notranslate\">.scss</code> files in the <code class=\"notranslate\">theme</code> directory, then run <code class=\"notranslate\">theme/install.sh</code>. This will overwrite <code class=\"notranslate\">src/main/resources/static/css/bootstrap.min.css</code>. Then build as usual. (Requires <code class=\"notranslate\">npm</code>.)</p>\n<h2 dir=\"auto\">Securing the Kafdrop UI</h2>\n<p dir=\"auto\">Kafdrop doesn't (yet) natively implement an authentication mechanism to restrict user access. Here's a quick workaround using NGINX using Basic Auth. The instructions below are for macOS and Homebrew.</p>\n<h3 dir=\"auto\">Requirements</h3>\n<ul dir=\"auto\">\n<li>NGINX: install using <code class=\"notranslate\">which nginx &gt; /dev/null || brew install nginx</code></li>\n<li>Apache HTTP utilities: <code class=\"notranslate\">which htpasswd &gt; /dev/null || brew install httpd</code></li>\n</ul>\n<h3 dir=\"auto\">Setup</h3>\n<p dir=\"auto\">Set the admin password (you will be prompted):</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"htpasswd -c /usr/local/etc/nginx/.htpasswd admin\"><pre class=\"notranslate\">htpasswd -c /usr/local/etc/nginx/.htpasswd admin</pre></div>\n<p dir=\"auto\">Add a logout page in <code class=\"notranslate\">/usr/local/opt/nginx/html/401.html</code>:</p>\n<div class=\"highlight highlight-text-html-basic notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"&lt;!DOCTYPE html&gt;\n&lt;p&gt;Not authorized. &lt;a href=&quot;&lt;!--# echo var=&quot;scheme&quot; --&gt;://&lt;!--# echo var=&quot;http_host&quot; --&gt;/&quot;&gt;Login&lt;/a&gt;.&lt;/p&gt;\"><pre class=\"notranslate\"><span class=\"pl-c1\">&lt;!DOCTYPE html<span class=\"pl-kos\">&gt;</span></span>\n<span class=\"pl-kos\">&lt;</span><span class=\"pl-ent\">p</span><span class=\"pl-kos\">&gt;</span>Not authorized. <span class=\"pl-kos\">&lt;</span><span class=\"pl-ent\">a</span> <span class=\"pl-c1\">href</span>=\"<span class=\"pl-c\">&lt;!--# echo var=\"scheme\" --&gt;</span><span class=\"pl-s\">://&lt;!--# echo var=</span>\"<span class=\"pl-c1\">http_host</span>\" --<span class=\"pl-kos\">&gt;</span>/\"<span class=\"pl-kos\">&gt;</span>Login<span class=\"pl-kos\">&lt;/</span><span class=\"pl-ent\">a</span><span class=\"pl-kos\">&gt;</span>.<span class=\"pl-kos\">&lt;/</span><span class=\"pl-ent\">p</span><span class=\"pl-kos\">&gt;</span></pre></div>\n<p dir=\"auto\">Use the following snippet for <code class=\"notranslate\">/usr/local/etc/nginx/nginx.conf</code>:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"worker_processes 4;\n\nevents {\n  worker_connections 1024;\n}\n\nhttp {\n  upstream kafdrop {\n    server 127.0.0.1:9000;\n    keepalive 64;\n  }\n\n  server {\n    listen *:8080;\n    server_name _;\n    access_log /usr/local/var/log/nginx/nginx.access.log;\n    error_log /usr/local/var/log/nginx/nginx.error.log;\n    auth_basic &quot;Restricted Area&quot;;\n    auth_basic_user_file /usr/local/etc/nginx/.htpasswd;\n\n    location / {\n      proxy_pass http://kafdrop;\n    }\n\n    location /logout {\n      return 401;\n    }\n\n    error_page 401 /errors/401.html;\n\n    location /errors {\n      auth_basic off;\n      ssi        on;\n      alias /usr/local/opt/nginx/html;\n    }\n  }\n}\"><pre class=\"notranslate\"><code class=\"notranslate\">worker_processes 4;\n\nevents {\n  worker_connections 1024;\n}\n\nhttp {\n  upstream kafdrop {\n    server 127.0.0.1:9000;\n    keepalive 64;\n  }\n\n  server {\n    listen *:8080;\n    server_name _;\n    access_log /usr/local/var/log/nginx/nginx.access.log;\n    error_log /usr/local/var/log/nginx/nginx.error.log;\n    auth_basic \"Restricted Area\";\n    auth_basic_user_file /usr/local/etc/nginx/.htpasswd;\n\n    location / {\n      proxy_pass http://kafdrop;\n    }\n\n    location /logout {\n      return 401;\n    }\n\n    error_page 401 /errors/401.html;\n\n    location /errors {\n      auth_basic off;\n      ssi        on;\n      alias /usr/local/opt/nginx/html;\n    }\n  }\n}\n</code></pre></div>\n<p dir=\"auto\">Run NGINX:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nginx\"><pre class=\"notranslate\">nginx</pre></div>\n<p dir=\"auto\">Or reload its configuration if already running:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nginx -s reload\"><pre class=\"notranslate\">nginx -s reload</pre></div>\n<p dir=\"auto\">To logout, browse to <a href=\"http://localhost:8080/logout\" rel=\"nofollow\">/logout</a>.</p>\n<blockquote>\n<p dir=\"auto\"><strong>Hey there!</strong> We hope you really like Kafdrop! Please take a moment to <a href=\"https://github.com/obsidiandynamics/kafdrop\">⭐</a>the repo or <a href=\"https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fobsidiandynamics%2Fkafdrop&amp;text=Get%20Kafdrop%20%E2%80%94%20a%20web-based%20UI%20for%20viewing%20%23ApacheKafka%20topics%20and%20browsing%20consumers%20\" rel=\"nofollow\">Tweet</a> about it.</p>\n</blockquote>\n<h1 dir=\"auto\">Contributing Guidelines</h1>\n<p dir=\"auto\">See <a href=\"CONTRIBUTING.md\">here</a>.</p>\n<h2 dir=\"auto\">Release workflow</h2>\n<p dir=\"auto\">To cut an official release, these are the steps:</p>\n<ol dir=\"auto\">\n<li>\n<p dir=\"auto\">Commit a new version on master that has the <code class=\"notranslate\">-SNAPSHOT</code> suffix stripped (see <code class=\"notranslate\">pom.xml</code>). Once the commit is merged, the CI will treat it as a release build, and will end up publishing more artifacts than the regular (non-release/snapshot) build. One of those will be a dockerhub push to the specific version and \"latest\" tags. (The regular build doesn't update \"latest\").</p>\n</li>\n<li>\n<p dir=\"auto\">You can then edit the release description in GitHub to describe what went into the release.</p>\n</li>\n<li>\n<p dir=\"auto\">After the release goes through successfully, you need to prepare the repo for the next version, which requires committing the next snapshot version on master again. So we should increment the minor version and add again the <code class=\"notranslate\">-SNAPSHOT</code> suffix.</p>\n</li>\n</ol>","updatedAt":"2025-05-21T16:04:38Z","upvoteCount":null,"author":{"login":"eryajf","avatarUrl":"https://avatars.githubusercontent.com/u/33259379?u=e4a4090a38ac2473aaed4ef9945233636776c6c3&v=4","url":"https://github.com/eryajf"},"category":null,"labels":{"edges":[{"node":{"name":"更多","color":"25B472"}},{"node":{"name":"Kafka-Manage","color":"21adcf"}},{"node":{"name":"obsidiandynamics","color":"b1a4d6"}}]},"comments":{"edges":[]}}},"pageContext":{"number":267,"previous":{"title":"derailed/k9s: Kubernetes CLI，以风格化的方式管理您的集群！","number":266},"next":{"title":"xxd763795151/kafka-console-ui:  一款轻量级的 kafka 可视化管理平台，安装配置快捷、简单易用。","number":268}}},
    "staticQueryHashes": ["151096407","2861350382"]}