Giter Club home page Giter Club logo

Comments (11)

jrkinley avatar jrkinley commented on May 25, 2024 1

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.

jrkinley avatar jrkinley commented on May 25, 2024 1

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.

jrkinley avatar jrkinley commented on May 25, 2024

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.

emredarak avatar emredarak commented on May 25, 2024

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.

tmgstevens avatar tmgstevens commented on May 25, 2024

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.

jrkinley avatar jrkinley commented on May 25, 2024

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.

emredarak avatar emredarak commented on May 25, 2024

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:

  1. node.crt
  2. node.key
  3. 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.

emredarak avatar emredarak commented on May 25, 2024
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.

emredarak avatar emredarak commented on May 25, 2024
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.

emredarak avatar emredarak commented on May 25, 2024

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.

emredarak avatar emredarak commented on May 25, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.