{
  "manifest_version": "1.0.0",
  "template": {
    "id": "d54b25a3-d53a-4c25-a3bf-156e3ce021db",
    "slug": "apache-kafka-or-just-updated-kraft-event",
    "name": "Apache Kafka | (Just Updated) KRaft Event Streaming, SASL Login On From Boot",
    "description": "Apache Kafka KRaft node. SASL login on from boot, data on a volume.",
    "url": "https://railway.com/deploy/apache-kafka-or-just-updated-kraft-event",
    "upstream": {
      "image": "apache/kafka:4.3.1@sha256:77e3df9054047a88b520d0cc46e16696d3b22022e1d580aeccd2632df6532837"
    }
  },
  "services": [
    {
      "name": "kafka",
      "source": {
        "image": "apache/kafka:4.3.1@sha256:77e3df9054047a88b520d0cc46e16696d3b22022e1d580aeccd2632df6532837"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/kafka",
      "tcp_ports": [
        19092
      ],
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "KAFKA_PASSWORD",
      "service": "kafka",
      "description": "Provide a value for KAFKA_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "kafka",
      "description": "Provide a value for RAILWAY_RUN_UID.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "KAFKA_PUBLIC_HOST",
      "service": "kafka",
      "description": "Provide a value for KAFKA_PUBLIC_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "KAFKA_PUBLIC_PORT",
      "service": "kafka",
      "description": "Provide a value for KAFKA_PUBLIC_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "KAFKA_PRIVATE_HOST",
      "service": "kafka",
      "description": "Provide a value for KAFKA_PRIVATE_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "KAFKA_BOOTSTRAP_PUBLIC",
      "service": "kafka",
      "description": "Provide a value for KAFKA_BOOTSTRAP_PUBLIC.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "KAFKA_BOOTSTRAP_INTERNAL",
      "service": "kafka",
      "description": "Provide a value for KAFKA_BOOTSTRAP_INTERNAL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "apache-kafka-or-just-updated-kraft-event"
      }
    },
    "cli": "railway deploy --template apache-kafka-or-just-updated-kraft-event",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "d54b25a3-d53a-4c25-a3bf-156e3ce021db",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "45df22f4-2230-4ee2-98a4-c325aa936ee9": {
                  "icon": null,
                  "name": "kafka",
                  "deploy": {
                    "startCommand": "/bin/sh -c 'D=/var/lib/kafka; echo \"[railway] kafka uid=$(id -u) data_owner=$(stat -c %u:%g $D) pids.max=$(cat /sys/fs/cgroup/pids.max 2>/dev/null) mem.max=$(cat /sys/fs/cgroup/memory.max 2>/dev/null)\"; MAX=$(cat /sys/fs/cgroup/memory.max 2>/dev/null); case \"$MAX\" in \"\"|max) MB=2048;; *) MB=$((MAX/1048576));; esac; HEAP=$((MB*50/100)); [ \"$HEAP\" -lt 512 ] && HEAP=512; [ \"$HEAP\" -gt 2048 ] && HEAP=2048; PUBH=${KAFKA_PUBLIC_HOST:-$KAFKA_PRIVATE_HOST}; PUBP=${KAFKA_PUBLIC_PORT:-9092}; mkdir -p $D/data $D/config; chown 1000:1000 $D $D/data $D/config; C=$D/config/server.properties; printf \"%s\\n\" \"process.roles=broker,controller\" \"node.id=1\" \"controller.quorum.voters=1@127.0.0.1:9093\" \"controller.listener.names=CONTROLLER\" \"listeners=CONTROLLER://127.0.0.1:9093,BROKER://127.0.0.1:9094,INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:19092\" \"advertised.listeners=BROKER://127.0.0.1:9094,INTERNAL://$KAFKA_PRIVATE_HOST:9092,EXTERNAL://$PUBH:$PUBP\" \"inter.broker.listener.name=BROKER\" \"listener.security.protocol.map=CONTROLLER:PLAINTEXT,BROKER:PLAINTEXT,INTERNAL:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT\" \"sasl.enabled.mechanisms=SCRAM-SHA-256\" \"listener.name.internal.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;\" \"listener.name.external.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;\" \"authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer\" \"super.users=User:admin;User:ANONYMOUS\" \"allow.everyone.if.no.acl.found=false\" \"log.dirs=$D/data\" \"num.partitions=3\" \"auto.create.topics.enable=true\" \"offsets.topic.replication.factor=1\" \"transaction.state.log.replication.factor=1\" \"transaction.state.log.min.isr=1\" \"share.coordinator.state.topic.replication.factor=1\" \"share.coordinator.state.topic.min.isr=1\" \"group.initial.rebalance.delay.ms=0\" > $C; chown 1000:1000 $C; echo \"[railway] heap=${HEAP}m advertised internal=$KAFKA_PRIVATE_HOST:9092 external=$PUBH:$PUBP\"; export HOME=$D KAFKA_HEAP_OPTS=\"-Xms512m -Xmx${HEAP}m\" JAVA_TOOL_OPTIONS=-XX:ActiveProcessorCount=2; if [ ! -f $D/data/meta.properties ]; then echo \"[railway] formatting storage\"; CID=$(/opt/kafka/bin/kafka-storage.sh random-uuid | tail -1); su -p -s /bin/sh appuser -c \"/opt/kafka/bin/kafka-storage.sh format -t $CID -c $C --add-scram SCRAM-SHA-256=[name=admin,password=$KAFKA_PASSWORD]\" || exit 1; fi; exec su -p -s /bin/sh appuser -c \"exec /opt/kafka/bin/kafka-server-start.sh $C\"'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "apache/kafka:4.3.1@sha256:77e3df9054047a88b520d0cc46e16696d3b22022e1d580aeccd2632df6532837"
                  },
                  "variables": {
                    "KAFKA_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{KAFKA_PASSWORD}}"
                    },
                    "RAILWAY_RUN_UID": {
                      "isOptional": false,
                      "defaultValue": "{{RAILWAY_RUN_UID}}"
                    },
                    "KAFKA_PUBLIC_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_TCP_PROXY_DOMAIN}}"
                    },
                    "KAFKA_PUBLIC_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_TCP_PROXY_PORT}}"
                    },
                    "KAFKA_PRIVATE_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "KAFKA_BOOTSTRAP_PUBLIC": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}"
                    },
                    "KAFKA_BOOTSTRAP_INTERNAL": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}:9092"
                    }
                  },
                  "networking": {
                    "tcpProxies": {
                      "19092": {}
                    }
                  },
                  "volumeMounts": {
                    "45df22f4-2230-4ee2-98a4-c325aa936ee9": {
                      "mountPath": "/var/lib/kafka"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 1,
    "needs_volume": true
  },
  "generated_at": "2026-10-19T22:14:48.327Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-10-19T20:26:55.490Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_0fb5b8b55c4644cabb7d",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 29,
    "typical_build_seconds": 0,
    "typical_start_seconds": 10,
    "slowest_service": "kafka"
  }
}
