Comments (11)
Looking at the server certificate the subject alternate names it expects are:
X509v3 Subject Alternative Name: critical
DNS:ip-172-31-16-91, DNS:ip-172-31-16-91.eu-central-1.compute.internal, IP Address:18.197.50.128, IP Address:172.31.16.91
So your brokers
address should be one of these values.
from deployment-automation.
For security, I recommend that the previous posts are redacted/deleted once we have this working. Better still, recreating the environment and certificates, etc will ensure that the details contained in this issue are no longer relevant.
from deployment-automation.
Hi @emredarak. Please can you enable debug...
const { Kafka, logLevel } = require('kafkajs')
const kafka = new Kafka({
clientId: clientId,
brokers: ['*.*.*.*:9092'],
ssl: {
rejectUnauthorized: false,
ca: [fs.readFileSync('/tls/ca/ca.crt', 'utf-8')]
},
logLevel: logLevel.DEBUG
})
It would be helpful if you're able to share the Redpanda log too. Thanks!
from deployment-automation.
Logs after adding logLevel.DEBUG.
{"level":"DEBUG","timestamp":"2023-01-06T09:55:13.428Z","logger":"kafkajs","message":"[Connection] Connecting","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e","ssl":true,"sasl":false}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:13.530Z","logger":"kafkajs","message":"[Connection] Request ApiVersions(key: 18, version: 2)","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e","correlationId":0,"expectResponse":true,"size":50}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:13.571Z","logger":"kafkajs","message":"[Connection] Response ApiVersions(key: 18, version: 2)","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e","correlationId":0,"size":212,"data":{"errorCode":0,"apiVersions":[{"apiKey":0,"minVersion":0,"maxVersion":7},{"apiKey":1,"minVersion":4,"maxVersion":11},{"apiKey":2,"minVersion":0,"maxVersion":4},{"apiKey":3,"minVersion":0,"maxVersion":7},{"apiKey":9,"minVersion":1,"maxVersion":7},{"apiKey":10,"minVersion":0,"maxVersion":2},{"apiKey":16,"minVersion":0,"maxVersion":2},{"apiKey":18,"minVersion":0,"maxVersion":3},{"apiKey":11,"minVersion":0,"maxVersion":5},{"apiKey":12,"minVersion":0,"maxVersion":3},{"apiKey":13,"minVersion":0,"maxVersion":3},{"apiKey":14,"minVersion":0,"maxVersion":3},{"apiKey":19,"minVersion":0,"maxVersion":6},{"apiKey":8,"minVersion":1,"maxVersion":7},{"apiKey":32,"minVersion":0,"maxVersion":2},{"apiKey":33,"minVersion":0,"maxVersion":1},{"apiKey":20,"minVersion":0,"maxVersion":5},{"apiKey":15,"minVersion":0,"maxVersion":4},{"apiKey":17,"minVersion":0,"maxVersion":1},{"apiKey":36,"minVersion":0,"maxVersion":1},{"apiKey":44,"minVersion":0,"maxVersion":0},{"apiKey":42,"minVersion":0,"maxVersion":1},{"apiKey":29,"minVersion":0,"maxVersion":1},{"apiKey":35,"minVersion":0,"maxVersion":1},{"apiKey":30,"minVersion":0,"maxVersion":1},{"apiKey":31,"minVersion":0,"maxVersion":1},{"apiKey":22,"minVersion":0,"maxVersion":3},{"apiKey":24,"minVersion":0,"maxVersion":2},{"apiKey":28,"minVersion":0,"maxVersion":3},{"apiKey":25,"minVersion":0,"maxVersion":1},{"apiKey":26,"minVersion":0,"maxVersion":2},{"apiKey":37,"minVersion":0,"maxVersion":3},{"apiKey":23,"minVersion":0,"maxVersion":3}],"throttleTime":0,"clientSideThrottleTime":0}}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:13.571Z","logger":"kafkajs","message":"[Broker] Verified support for SaslAuthenticate","broker":"*.*.*.*:9092","supportAuthenticationProtocol":true}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:13.575Z","logger":"kafkajs","message":"[Connection] Request Metadata(key: 3, version: 6)","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e","correlationId":1,"expectResponse":true,"size":72}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:13.621Z","logger":"kafkajs","message":"[Connection] Response Metadata(key: 3, version: 6)","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e","correlationId":1,"size":145,"data":{"throttleTime":0,"brokers":[{"nodeId":0,"host":"*.*.*.*","port":9092,"rack":null}],"clusterId":"redpanda.d13ad443-887e-4913-a0f3-91a3d97ac9dc","controllerId":0,"topicMetadata":[{"topicErrorCode":0,"topic":"WebSiteProducer","isInternal":false,"partitionMetadata":[{"partitionErrorCode":0,"partitionId":0,"leader":0,"replicas":[0],"isr":[0],"offlineReplicas":[]}]}],"clientSideThrottleTime":0}}
{"level":"INFO","timestamp":"2023-01-06T09:55:13.622Z","logger":"kafkajs","message":"[Consumer] Starting","groupId":"WebSiteProducer_Group"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:13.623Z","logger":"kafkajs","message":"[Connection] Connecting","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e","ssl":true,"sasl":false}
{"level":"ERROR","timestamp":"2023-01-06T09:55:14.625Z","logger":"kafkajs","message":"[Connection] Connection timeout","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.625Z","logger":"kafkajs","message":"[Connection] disconnecting...","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.626Z","logger":"kafkajs","message":"[Connection] disconnected","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.626Z","logger":"kafkajs","message":"[Connection] disconnecting...","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.626Z","logger":"kafkajs","message":"[Connection] disconnecting...","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.626Z","logger":"kafkajs","message":"[Connection] disconnected","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.626Z","logger":"kafkajs","message":"[Connection] disconnected","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"ERROR","timestamp":"2023-01-06T09:55:14.628Z","logger":"kafkajs","message":"[Consumer] Crash: KafkaJSConnectionError: Connection timeout","groupId":"WebSiteProducer_Group","stack":"KafkaJSConnectionError: Connection timeout\n at Timeout.onTimeout [as _onTimeout] (/home/emredarak/repo/consumer/node_modules/kafkajs/src/network/connection.js:223:23)\n at listOnTimeout (node:internal/timers:559:17)\n at processTimers (node:internal/timers:502:7)"}
{"level":"INFO","timestamp":"2023-01-06T09:55:14.629Z","logger":"kafkajs","message":"[Consumer] Stopped","groupId":"WebSiteProducer_Group"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.629Z","logger":"kafkajs","message":"[Consumer] consumer has stopped, disconnecting","groupId":"WebSiteProducer_Group"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.629Z","logger":"kafkajs","message":"[Connection] disconnecting...","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.629Z","logger":"kafkajs","message":"[Connection] disconnecting...","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.630Z","logger":"kafkajs","message":"[Connection] disconnected","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.630Z","logger":"kafkajs","message":"[Connection] disconnected","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.630Z","logger":"kafkajs","message":"[Connection] disconnecting...","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.630Z","logger":"kafkajs","message":"[Connection] disconnecting...","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.630Z","logger":"kafkajs","message":"[Connection] disconnected","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.630Z","logger":"kafkajs","message":"[Connection] disconnected","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"ERROR","timestamp":"2023-01-06T09:55:14.630Z","logger":"kafkajs","message":"[Consumer] Restarting the consumer in 300ms","retryTime":300,"groupId":"WebSiteProducer_Group"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.668Z","logger":"kafkajs","message":"[Connection] disconnecting...","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.669Z","logger":"kafkajs","message":"[Connection] disconnected","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e"}
{"level":"INFO","timestamp":"2023-01-06T09:55:14.931Z","logger":"kafkajs","message":"[Consumer] Starting","groupId":"WebSiteProducer_Group"}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:14.931Z","logger":"kafkajs","message":"[Connection] Connecting","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e","ssl":true,"sasl":false}
{"level":"DEBUG","timestamp":"2023-01-06T09:55:15.019Z","logger":"kafkajs","message":"[Connection] Request Metadata(key: 3, version: 6)","broker":"*.*.*.*:9092","clientId":"1e8a809c-df6b-4226-b525-37ed154b8b6e","correlationId":2,"expectResponse":true,"size":72}
from deployment-automation.
Hi @emredarak , could you check that TLS is actually enabled and that the SAN works, here's an example from my cluster:
openssl s_client -connect 172.31.12.253:9092 -CAfile /etc/redpanda/certs/truststore.pem
CONNECTED(00000003)
Can't use SSL_get_servername
depth=1 O = Vectorized, CN = Vectorized Test CA
verify return:1
depth=0 O = Vectorized
verify return:1
---
Certificate chain
0 s:O = Vectorized
i:O = Vectorized, CN = Vectorized Test CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDTjCCAjagAwIBAgIBATANBgkqhkiG9w0BAQsFADAyMRMwEQYDVQQKDApWZWN0
b3JpemVkMRswGQYDVQQDDBJWZWN0b3JpemVkIFRlc3QgQ0EwHhcNMjMwMTA2MDgy
NzQxWhcNMjUwMTA1MDgyNzQxWjAVMRMwEQYDVQQKDApWZWN0b3JpemVkMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2FkAisypBkurBiynzk8KGd46uX9d
Pi0Xhjv1oQZJuq/JKTfIqvzN3lKH2kuuLascCk426voitnouoL8Hfrij7YKfRmwc
DlV1mPkm6pMypJUFYulU50G9gfKGnDr2H3NDPajY77D/g/q5wvCVxF9LYaGaTOvb
eX32a/tIAbtV9WeCS09CgcyIzWoVSu1HegvNfvjiiUtf0sEqna3YIgLr64L9j7Yj
8d8m+zNVZat1bwQwg4C2uoPT7E18HaEifhJS5h6YKZACrxAycrjDUe6Wafiiejnx
DyZiNbar+b+0Rkm4u/wO6J76XSTsmBR5qGU1acYYlnes/mt5V4ekp+I2ywIDAQAB
o4GLMIGIMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB
BQUHAwIwVwYDVR0RAQH/BE0wS4IQaXAtMTcyLTMxLTEyLTI1M4IraXAtMTcyLTMx
LTEyLTI1My51cy13ZXN0LTIuY29tcHV0ZS5pbnRlcm5hbIcEEvYsGIcErB8M/TAN
BgkqhkiG9w0BAQsFAAOCAQEAPNDPM01jVfwrle7+MyCbQ9q26JYP173gbGI6+Cde
l1UMl33lSI4TDoKLYquKmv6/c8qWA1OEUYKjjSrySwMJYUNvNeDVC6bSc88irnH2
/9I6n/VreA8cosHV2Z1+VpQ5zTBU6XMYRpH93jI3SWQxjlToh1CHnznKc+HZO71r
+zk8rNZWMhIjN5jcEEG4Pqeu4te0ST/Dk/pLf2xjr+3+9tPJ2j+cHg08iQ1Dkur8
RRRyKjNTCUPmiVFNx48kSAUQuSRBJ2z3dd6WL2ynnH9DP16bJ5JZh/o4YoOsUWfh
hmQQfGjsqbYt1egS3HJYkPV2qQS7gXnywLiCA2Y9U+hLoQ==
-----END CERTIFICATE-----
subject=O = Vectorized
issuer=O = Vectorized, CN = Vectorized Test CA
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1406 bytes and written 363 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
from deployment-automation.
Thanks. Debug doesn't reveal much more. I presume the broker address *.*.*.*:9092
is redacted? With TLS enabled the broker address needs to match the subject alternate name in the certificate.
from deployment-automation.
Actually, I'm not creating certificates, etc from scratch. I am following the steps in Ansible. Assuming there is nothing wrong there, there are no certificate errors.
Ansible creates ca.key first and then ca.crt.
Then, using these 2 files, 3 files are generated for the broker:
- node.crt
- node.key
- truststore.pem => pem version of ca.crt.
Here is the redpanda.yml file.
organization: redpanda-test
cluster_id: redpanda
redpanda:
data_directory: /var/lib/redpanda/data
seed_servers: []
rpc_server:
address: *.*.*.*
port: 33145
rpc_server_tls:
- key_file: /etc/redpanda/certs/node.key
cert_file: /etc/redpanda/certs/node.crt
truststore_file: /etc/redpanda/certs/truststore.pem
enabled: true
kafka_api:
- address: *.*.*.*
port: 9092
kafka_api_tls:
- key_file: /etc/redpanda/certs/node.key
cert_file: /etc/redpanda/certs/node.crt
truststore_file: /etc/redpanda/certs/truststore.pem
enabled: true
admin:
- address: *.*.*.*
port: 9644
admin_api_tls:
- key_file: /etc/redpanda/certs/node.key
cert_file: /etc/redpanda/certs/node.crt
truststore_file: /etc/redpanda/certs/truststore.pem
enabled: true
advertised_rpc_api:
address: *.*.*.*
port: 33145
advertised_kafka_api:
- address: *.*.*.*
port: 9092
rpk:
kafka_api:
brokers:
- *.*.*.*:9092
tls:
truststore_file: /etc/redpanda/certs/truststore.pem
admin_api:
addresses:
- *.*.*.*:9644
tls:
truststore_file: /etc/redpanda/certs/truststore.pem
tune_network: true
tune_disk_scheduler: true
tune_disk_nomerges: true
tune_disk_write_cache: true
tune_disk_irq: true
tune_cpu: true
tune_aio_events: true
tune_clocksource: true
tune_swappiness: true
tune_ballast_file: true
pandaproxy: {}
The certificate I used here is ca.crt. I'm connecting from without creating a certificate for the client.
from deployment-automation.
openssl s_client -connect *.*.*.*:9092 -CAfile ./ca.crt
CONNECTED(00000003)
Can't use SSL_get_servername
depth=1 O = Vectorized, CN = Vectorized TLS CA
verify return:1
depth=0 O = Vectorized
verify return:1
---
Certificate chain
0 s:O = Vectorized
i:O = Vectorized, CN = Vectorized TLS CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIBATANBgkqhkiG9w0BAQsFADA5MRcwFQYDVQQKDA5GdW52
ZXJzZSBHYW1lczEeMBwGA1UEAwwVRnVudmVyc2UgR2FtZXMgVExTIENBMB4XDTIz
MDEwNjA5MzUwM1oXDTMzMDEwMzA5MzUwM1owGTEXMBUGA1UECgwORnVudmVyc2Ug
R2FtZXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCn5lk1hH/yyUg0
szIHTjXbExliPfJwijwRxSmoeGG2XuuQsp3bNMRrbd3xDcVJtlHYOy45r6HV7xD2
UN/VdsbeFnASfXgPaCI97aZGBdoLvTpbOml7vtp0GfNTCnGSuDzdGn6a7mL5w9b9
W71BRGmDv/9zkbjqaI5mXcIZH3tIvq/oCFBCbg1R+LZgbw3faSHWHtE0UN0TEoic
v9KHVQfuC4fCViQCOBTeeR8aSZTIMEYNqTOiZOCMHuli9dE0+tvmN+CJgkdD9s9Y
HgRH5W7jwerEjEHwAC7zg16kpQ1ndYxEmhNVJW20ApUyHct1Y7OXTsCufv+kkVt4
XsmdPYDJAgMBAAGjgYwwgYkwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG
AQUFBwMBBggrBgEFBQcDAjBYBgNVHREBAf8ETjBMgg9pcC0xNzItMzEtMTYtOTGC
LWlwLTE3Mi0zMS0xNi05MS5ldS1jZW50cmFsLTEuY29tcHV0ZS5pbnRlcm5hbIcE
EsUygIcErB8QWzANBgkqhkiG9w0BAQsFAAOCAQEAFX7cHyimfLM6mtHJtmh3tpEe
SYFHS+QPNQFKeSPDhVVCVFtH1pGie8BKZXB1kx2+abBzIiLEEODVhyV/C3FB8s/H
BU/RCOaMX0s1Z9TT7gDO4hcICrXmRSCjcamzP9mlR0jRX3oJ2YnMKrZGdth8vHpf
vhsg5hx9sKehLhPdQ92R8/GCWZhbfapVecQr0unjuAt6RfgGgAFHaPzSiKy5gZcI
sJU2Ue6PUMJwk8DZA4LlkZevNlqzmdyj4cApaTzSY/qZSiphNIofIchYkP0IZgsT
SdYvz26p0G3IXzDiSgE0ibq8mWWIxC9ScjtRX3JAnwytLEig9pkzYqlNxYjnGw==
-----END CERTIFICATE-----
subject=O = Vectorized
issuer=O = Vectorized, CN = Vectorized TLS CA
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1418 bytes and written 363 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
I am using kafkaJS wrong or there is some other situation?
from deployment-automation.
docker run -p 8080:8080 \
-v $(pwd)/src:/etc/console-mounts \
-e KAFKA_BROKERS=*.*.*.*:9092 \
-e KAFKA_TLS_ENABLED=true \
-e KAFKA_TLS_CAFILEPATH=/etc/console-mounts/ca.crt \
docker.redpanda.com/vectorized/console:latest
I opened a separate machine for testing. now Redpanda Console is opening but it's so slow
from deployment-automation.
For security, I recommend that the previous posts are redacted/deleted once we have this working. Better still, recreating the environment and certificates, etc will ensure that the details contained in this issue are no longer relevant.
for security reasons I will turn off all the machines I am currently using and create another one. Thank you.
from deployment-automation.
The whole problem was that I did not use this parameter, which I used at first when creating tls certificates. I close the doors that I opened at first :D Sometimes such things can be overlooked when dealing with a lot of things. Thank you for your efforts.
-e advertise_public_ips=true
from deployment-automation.
Related Issues (20)
- Establish restart fails in some conditions because package_result isn't populated right HOT 4
- Set the Redpanda license HOT 1
- Always reconcile redpanda.yaml as it have node configuration HOT 1
- Validate/test if cluster configuration property of type string can be un-set HOT 3
- node_exporter only needed by grafana/prometheus, so move to grafana install playbook HOT 1
- Terraform for AWS should have a security group rule to allow intra-sg communication HOT 5
- Ansible setup for Redpanda-console HOT 3
- RP tuner fails to complete on RHEL HOT 1
- Test Server Side Schema Validation
- Use module and collection bundles copied onto client from cloudsmith
- Terraform outside of AWS us-west-2 improperly attempts to create AZ still inside us-west-2 HOT 4
- Add test on AZ & on instance types
- GCP Module Work HOT 1
- Helm deployment of Redpanda/Prometheus/Grafana
- Proxy CI fails on ssh connection in buildkite
- when demo certs is false and handle install is true, redpanda_key_file should be copied onto server
- inotify file descriptor issue on large instances causes redpanda galaxy module to crash
- Default Ubuntu version is 20.04 but 23.3.x has retired support for that version HOT 4
- rpk.tune_* options in configs/default.j2 template for redpanda_broker needs to be configurable
- Audit ansible for empty string for "not-set" case
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from deployment-automation.