{"record":{"id":"c7318ed4fa719000","repo":"alibaba/canal","slug":"canal-admin-passwd-is-empty-pls-check-https-gi","errorCode":null,"errorMessage":"canal.admin.passwd is empty , pls check https://github.com/alibaba/canal/issues/4941","messagePattern":"canal\\.admin\\.passwd is empty , pls check https://github\\.com/alibaba/canal/issues/4941","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalLauncher.java","lineNumber":58,"sourceCode":"            System.setProperty(\"rocketmq.client.logUseSlf4j\",\"true\");\n\n            logger.info(\"## load canal configurations\");\n            String conf = System.getProperty(\"canal.conf\", \"classpath:canal.properties\");\n            Properties properties = new Properties();\n            if (conf.startsWith(CLASSPATH_URL_PREFIX)) {\n                conf = StringUtils.substringAfter(conf, CLASSPATH_URL_PREFIX);\n                properties.load(CanalLauncher.class.getClassLoader().getResourceAsStream(conf));\n            } else {\n                properties.load(new FileInputStream(conf));\n            }\n\n            final CanalStarter canalStater = new CanalStarter(properties);\n            String managerAddress = CanalController.getProperty(properties, CanalConstants.CANAL_ADMIN_MANAGER);\n            if (StringUtils.isNotEmpty(managerAddress)) {\n                String user = CanalController.getProperty(properties, CanalConstants.CANAL_ADMIN_USER);\n                String passwd = CanalController.getProperty(properties, CanalConstants.CANAL_ADMIN_PASSWD);\n                if (StringUtils.isEmpty(passwd)) {\n                    throw new IllegalArgumentException(\n                        \"canal.admin.passwd is empty , pls check https://github.com/alibaba/canal/issues/4941\");\n                }\n                String adminPort = CanalController.getProperty(properties, CanalConstants.CANAL_ADMIN_PORT, \"11110\");\n                boolean autoRegister = BooleanUtils.toBoolean(CanalController.getProperty(properties,\n                    CanalConstants.CANAL_ADMIN_AUTO_REGISTER));\n                String autoCluster = CanalController.getProperty(properties, CanalConstants.CANAL_ADMIN_AUTO_CLUSTER);\n                String name = CanalController.getProperty(properties, CanalConstants.CANAL_ADMIN_REGISTER_NAME);\n                if (StringUtils.isEmpty(name)) {\n                    name = AddressUtils.getHostName();\n                }\n\n                String registerIp = CanalController.getProperty(properties, CanalConstants.CANAL_REGISTER_IP);\n                if (StringUtils.isEmpty(registerIp)) {\n                    registerIp = AddressUtils.getHostIp();\n                }\n                final PlainCanalConfigClient configClient = new PlainCanalConfigClient(managerAddress,\n                    user,\n                    passwd,","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalLauncher.java#L40-L76","documentation":"Thrown by CanalLauncher during startup when canal.admin.manager is set (manager mode) but canal.admin.passwd is empty. This is the admin-credential counterpart to error 292: it validates that enabling the canal-manager integration requires a non-empty admin password. References the same issue #4941.","triggerScenarios":"canal.properties sets canal.admin.manager to a non-empty address but leaves canal.admin.passwd blank. CanalLauncher reads both and checks isNotEmpty(managerAddress) && isEmpty(passwd).","commonSituations":"Enabling canal-admin integration for the first time and forgetting the password; the password line commented out; an env override that set the manager address but not the password.","solutions":["Set canal.admin.passwd to the canal-admin user's password (or hash).","If you did not intend manager mode, clear canal.admin.manager.","Ensure canal.admin.user is also set (the launcher reads it alongside passwd).","Restart Canal after correcting the properties."],"exampleFix":"# before (canal.properties)\ncanal.admin.manager = 127.0.0.1:8089\n# canal.admin.passwd =\n# after\ncanal.admin.manager = 127.0.0.1:8089\ncanal.admin.user = admin\ncanal.admin.passwd = yourPassword","handlingStrategy":"validation","validationCode":"// Pre-flight check before launching\nString manager = properties.getProperty(CanalConstants.CANAL_ADMIN_MANAGER);\nString passwd = properties.getProperty(CanalConstants.CANAL_ADMIN_PASSWD);\nif (StringUtils.isNotEmpty(manager) && StringUtils.isEmpty(passwd)) {\n    throw new IllegalArgumentException(\n        \"canal.admin.manager is set but canal.admin.passwd is empty; set the password or clear the manager address.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["When enabling canal-admin integration, set canal.admin.user and canal.admin.passwd together.","Validate canal.properties before deploy.","Watch for env-var overrides that set the manager address without the password."],"tags":["config","auth","admin","startup","deployer"],"backgroundTag":null,"analyzedSha":"87be50e87686a3e8af08c368d0e1ffd1f59eb04a","analyzedAt":"2026-08-14T04:30:11.918Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}