Code Monkey home page Code Monkey logo

rancher-letsencrypt's Introduction

Rancher + Let's Encrypt = Awesome Sauce

Let's Encrypt Certificate Manager for Rancher

Latest Version Circle CI Docker Pulls License

A Rancher service that obtains free SSL/TLS certificates from the Let's Encrypt CA, adds them to Rancher's certificate store and manages renewal and propagation of updated certificates to load balancers.

Requirements

  • Rancher Server >= v1.5.0

  • If using a DNS-based challenge, existing account with one of the supported DNS providers:

    • Aurora DNS
    • AWS Route 53
    • Azure DNS
    • CloudFlare
    • DigitalOcean
    • DNSimple
    • Dyn
    • Gandi
    • NS1
    • Ovh
    • Vultr
  • If using the HTTP challenge, a reverse proxy that routes example.com/.well-known/acme-challenge to rancher-letsencrypt.

How to use

This application is distributed via the Rancher Community Catalog.

Enable the Community Catalog under Admin => Settings in the Rancher UI. Then locate the Let's Encrypt template in the Catalog section of the UI and follow the instructions.

Storing certificate in shared storage volume

By default the created SSL certificate is stored in Rancher's certificate store for usage in Rancher load balancers.

You can specify a volume name to store account data, certificate and private key in a (host scoped) named Docker volume. To share the certificates with other services you may specify a persistent storage driver (e.g. rancher-nfs).

See the README in the Rancher catalog for more information.

Provider specific usage

AWS Route 53

Note: If you have both a private and public zone in Route53 for the domain, you need to run the service configured with public DNS resolvers (this is now the default).

The following IAM policy describes the minimum permissions required when using AWS Route 53 for domain authorization.
Replace <HOSTED_ZONE_ID> with the ID of the hosted zone that encloses the domain(s) for which you are going to obtain certificates. You may use a wildcard (*) in place of the ID to make this policy work with all of the hosted zones associated with an AWS account.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:GetChange",
                "route53:ListHostedZonesByName"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "route53:ChangeResourceRecordSets"
            ],
            "Resource": [
                "arn:aws:route53:::hostedzone/<HOSTED_ZONE_ID>"
            ]
        }
    ]
}

OVH

First create your credentials on https://eu.api.ovh.com/createToken/ by filling out the form like this:

  • Account ID: Your OVH account ID
  • Password: Your password
  • Script name: letsencrypt
  • Script description: Letsencrypt for Rancher
  • Validity: Unlimited
  • Rights:
    • GET /domain/zone/*
    • POST /domain/zone/*
    • DELETE /domain/zone/*

Then deploy this service using the generated key, application secret and consumer key.

HTTP

If you prefer not to use a DNS-based challenge or your provider is not supported, you can use the HTTP challenge. Simply choose HTTP from the list of providers. Then make sure that HTTP requests to domain.com/.well-known/acme-challenge are forwarded to port 80 of the rancher-letsencrypt service, e.g. by configuring a Rancher load balancer accordingly. If you are using another reverse proxy (e.g. Nginx) you need to make sure it passed the original host header through to the backend.

Rancher Load Balancer Let's Encrypt Targets

Building the image

make build && make image

Contributions

PR's welcome!

rancher-letsencrypt's People

Contributors

bcyrill avatar davidknezic avatar edeckers avatar janeczku avatar rschmukler avatar willseward avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rancher-letsencrypt's Issues

Client.Timeout Exceeded

Hi, I'm getting the following error in Rancher.

26-5-2016` 12:41:38level=info msg="Starting Let's Encrypt Certificate Manager v0.2.7 5dbb48c"
26-5-2016 12:41:48level=fatal msg="LetsEncrypt client: Could not create client: get directory at 'https://acme-v01.api.letsencrypt.org/directory': failed to get \"https://acme-v01.api.letsencrypt.org/directory\": Get https://acme-v01.api.letsencrypt.org/directory: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)"

After which the rancher stack restarts. I'm using CloudFlare DNS. No stale _acme-challenge records are set. The error is present in v0.2.9 and v0.2.5 as well. Any known solution for this problem?

Check if domains has changed

If you try to add a new domain to an existing certificate it is not detected it so no new certificate is issued. It still finds the certificate in the store and on rancher, so the result is a nop rather than the error about not managing an existing certificate.

Make the DNS provider optionnal [Proposal]

I tried to use your letsencrypt stack. but I ran into a problem : I don't use one of the supported DNS provider.

But sending the certificate to the provider is only useful if the DNS provider provide a reverse-proxy services (like Cloudflare), and thus should be optional, allowing the user to use the stack more easily.

Would it be possible?

DNSimple API description needs clarity

The token that needs to be supplied while installing is the Domain Token. There are three different tokens you can get at dnsimple.com for your account and/or domain. Please update the field's description to reflect this.

Introduce the simple HTTP challenge

I've been using jwilder/nginx-proxy for a couple of months now and had a great experience. However, it doesn't really work nicely with the Rancher load balancer service.

This is why I've switched to rancher-letsencrypt, which is amazing too. However, it's unusable for all the services we deploy at work. This is because I don't have access to the DNS records for the domains.

Luckily, there's multiple challenges available in the ACME standard, one of which is the simple HTTP challenge. This is how I've created certificates for our work domains using jwilder/nginx-proxy.

Now it would be great if rancher-letsencrypt had the option to use the HTTP-based challange instead of the DNS-based. Would that be possible?

Failed to get cert with DigitalOcean

hi, i'm using digitalocean dns provider, after offering newly-generated token from digitalocean.com, i got error logs from rancher:
Error presenting token: HTTP 403: forbidden: You do not have access for the attempted action

Is there any help? Thanks!

Fails on CloudFlare DNS

Just started having it fail to obtain certificates with CloudFlare DNS.

4/24/2016 1:54:14 PMlevel=info msg="Starting Let's Encrypt Certificate Manager v0.2.8 5d5d280"
4/24/2016 1:54:14 PMlevel=info msg="Using locally stored Let's Encrypt account for colton@*****"
4/24/2016 1:54:14 PMlevel=info msg="Trying to obtain SSL certificate for ..."
4/24/2016 1:57:22 PMlevel=error msg="[****] Error obtaining certificate: acme: Error 400 - urn:acme:error:malformed - Unable to update challenge :: Response does not complete challenge"

There was a recent change to crackcomm/cloudflare#4 that has broken compatibility with other Rancher Go-based components. This may be the cause of the issue I'm seeing.

Unsupported DNS provider

Hello ,

I am using rancher v1.1.3 and docker v1.8 .
I tried to configure your producat to work with Namecheap and get the error:
level=info msg="Starting Let's Encrypt Certificate Manager v0.3.0 f8965f6"
level=info msg="Generating private key (2048) for [email protected]."
level=info msg="Creating Let's Encrypt account for [email protected]"
level=fatal msg="LetsEncrypt client: Could not set DNS provider: Unsupported DNS provider: Namecheap"

Best Regards

Create multiple certificates

Hi there, not sure if i can be done or if it's worth it, but do you have any plans to create multiple certificates instead of having one with multiple hostnames?
I think it could be useful for big projects where a company would like to not expose other services domains in the certificate.

I imagine having the same comma-separated list of domains but instead of having everything in a certificate, use the certificate field as a prefix for the new certificates it's going to create

can't make it work with rancher-nfs

Have no problems at storing certificates on data volume containers inside host, but I'm not able to make it work with rancher-nfs and digitalocean block volume.

I attach the volume to rancher server host and spin up the rancher driver on agent host giving the ip of my rancher server and /mnt/volume-name as mount point.

The volume becomes available, but I'm not able to tell letsencrypt to use it.

Scheduled renewal date later than expiration date for existing certificates

When i upgrade the rancher-letsencrypt node and the certificate already exists, I get the following behavior:

31.1.2017 09:42:17level=info msg="Starting Let's Encrypt Certificate Manager v0.4.0 3c41d73"
31.1.2017 09:42:17level=info msg="Generating private key (P384) for user@domain."
31.1.2017 09:42:18level=info msg="Creating Let's Encrypt account for user@domain"
31.1.2017 09:42:18level=info msg="Using Let's Encrypt Production API"
31.1.2017 09:42:18level=info msg="Found locally stored certificate 'domain'"
31.1.2017 09:42:18level=info msg="Found existing certificate 'domain' in Rancher"
31.1.2017 09:42:18level=info msg="Managing renewal of certificate 'domain'"
31.1.2017 09:42:18level=info msg="Certificate renewal scheduled for 2017/03/19 21:00 UTC"

This looks fine, however my certificate is actually expiring on 2017/03/10. Is this a bug or wanted behavior? I definitely do not think it's a great UX...

Upgrade community catalog

Hello janeczku,

Thank you for your great work. Do you have an estimate when there will be an update for the community catalog? It is now at 0.2.7

I don't get a cert.pem

After setting up Let's encrypt with the options to save to a folder, the certificate is generated and seems to work with NGINX. However the files that are generated and placed in the certs folder are:

  • fullchain.pem
  • metadata.json
  • privkey.pem

I expected that there would be a domain.crt file as well that contains the actual domain certificate. Am I missing something? I would like to use the certificates for a server that is outside of rancher.

How to update the certificates?

How would you update the certificates retrieved, e.g. adding a subdomain? Would you create a new services for that, or remove the old stack and redo it with the addition domain?

Support for NSone DNS Provider

This issue is a request for support for NSOne as a DNS provider. Lego already seems to contain support so hopefully this should be relatively easy.

Thanks for this epic service!

AWS Route53 Provider fails in case of multiple Hosted Zones and wildcard CNAME record

When there are multiple Hosted Zones, rancher-letsencrypt does not use the right enclosing zone in Route53. Instead it seems to pick the first one in the list or maybe there is a bug in the algorithm that tries to find the enclosing Hosted Zone. This results in a failure like below (I've changed the actual domain names).

7/19/2016 3:36:27 PMlevel=info msg="Starting Let's Encrypt Certificate Manager v0.3.0 f8965f6"
7/19/2016 3:36:30 PMlevel=info msg="Using locally stored Let's Encrypt account for ****@gmail.com"
7/19/2016 3:36:30 PMlevel=info msg="Trying to obtain SSL certificate (foo.bar.foo.com) from Let's Encrypt CA"
7/19/2016 3:36:31 PMlevel=error msg="[foo.bar.foo.com] Error obtaining certificate: Error presenting token: Failed to change Route 53 record set: InvalidChangeBatch: RRSet with DNS name _acme-challenge.foo.bar.foo.com. is not permitted in zone notfoo.notfoo.com.\n\tstatus code: 400, request id: cd6a6547-4db5-11e6-a875-bf12718e75ac"

Let's Encrypt failure to start

I am beginning to see these error messages

April 4, 2016 8:31:41 AM GMT+7level=info msg="Starting Let's Encrypt Certificate Manager v0.2.5 a31b992"
April 4, 2016 8:31:51 AM GMT+7level=fatal msg="Rancher client: Get https://my.rancher.api.host/v1: net/http: request canceled (Client.Timeout exceeded while awaiting headers)"

Before that rancher-letsencrypt has been working normally for me. What could be the reason for the error?

Support DNSimple

Looks like work has already begun? I can help out on this but I would need some time because I'm new to Rancher.

Volume size required

After upgraded to v0.4.0 and tryed to use rancher-ebs storage, i got this error message :

Upgrading (Failed to allocate instance [container:1i8153]: Bad instance [container:1i8153] in state [error]: Error response from daemon: create letsencrypt_lets-encrypt_2bf09: VolumeDriver.Create: size is required)

Is there a way to pass a volumedriver option, or maybe target a already existing volume?

How often/when are certificates renewed?

It says in the Rancher UI (and also got an email from Let's encrypt about it 10 days ago) that my certifcate will expire in 12 days, so my question is: how often are the certs renewed? Do I have to manually do something or will the renewal only run in like the last 3 days or something?

If I have multiple certs in mutiple directories, will this work?

Hello,

I have multiple directories with multiple certs in my config, each folder is a domain, I want to keep all domains separated, so I ask if this container will update every directory with a cert and metadata or I must have a singe directory with a unique file with all certs.

Best regards,

Allow for custom containers to mount specific certificates

Currently only the LB is able to use the LE generated certificates, however one might want to use the generated certificates in other contexts (such as nginx SSL termination).

According to a previously answered question it's currently possible to mount the volume holding the certificates however this is, according to the answer, not going to be possible in the future.

I'd very much appreciate if I could use one LE container for all my certificates and would therefore like to be able to get the certificates directly from this one container.

Anti Replay nonce error in Production mode

Trying to obtain a cert with the latest catalog version I'm unable to obtain a cert.

See some issues floating around as late as the last couple weeks that letsencrypt may have an issue (a note in 3rd week Jan, tought they had it fixed, note from last week suggests other users (of letsencrypt clients) are having this issue.

If you have a minute could you look into this? I'd really like to deploy a production service using rancher-letsencrypt (have one ready to go, production mode has it stopped)

Thanks!!!

What's the purpose of dns providers ?

Hi,
first thanks a lot for this module.

Sorry for the noob question but what's the purpose of using DNS providers ?
let's encrypt as itself doesn't use it if I don't get wrong ?

I want to know the way it works because my dns provider is ovh but my dns zone is managed by a private server.

Many thanks !

Error obtaining certificate

Hi there

I've just se tup a new rancher deployment, and Am currently trying to ge this letsencrypt stack working.

I simply added from the catalog, filled in the details (I'm using DNSimple) and launched. The service keeps restarting, and by using the docker logs command, I see the following lines, repeated over and over:

level=info msg="Starting Let's Encrypt Certificate Manager v0.2.7 5dbb48c"
level=info msg="Using locally stored Let's Encrypt account for [email protected]"
level=info msg="Trying to obtain SSL certificate for myhost.mydomain.uk"
level=error msg="[myhost.mydomain.uk] Error obtaining certificate: Error presenting token dns: domain must be fully qualified"

I was using a real domain which is already set up in DNSimple, but have obviously swapped it out for a placeholder there.

Any suggestions would be appreciated, thanks!

Don't obtain cert if one already exists (persist LE User)

If I spawn a LE stack, it gets a certificate and stores it in the certificate store. If I then remove the stack and recreate it with the same settings, it will 'Found existing certificate 'cake' in Rancher' but still go out and grab a fresh one from LetsEncrypt.

For production usage, this isn't safe. I never want to pull a new certificate unnecessarily unless the previous one is about to expire (or maybe if I enable that functionality and in sandbox mode). If it's a worry about populating the local volume/directory with the certificate, we should pull the present one from the Certificate Store and save it.

What happens on renewal [question]

Hi,

Just a question on what happens when the certs are renewed and propagated to the load balancers. Will the load balancers restart or will all new connections just use the updated certs without any interruption? Im mainly using long running websocket connections.

Thank you :)

Regards,
Riaan

Ovh configuration from rancher catalog version

Hi,

When we install this container from rancher catalog, it's not possible to set env vars or setup needed config from GUI. Is it missing or i have missed something ?

Thx in advance.

Fix/Remove Load Balancer Update

Using the new 1.2.0 release, I've been doing some testing with this service and I've found the following:

  1. Interaction with the Certificate Store still works perfectly.
  2. Looking for Load Balancers does not work and doesn't have to anymore. The new LB automatically sees something changes and updates (see below).

Log from replacing a self-signed I loaded up with one day remaining.

12/13/2016 5:20:00 PMlevel=info msg="Starting Let's Encrypt Certificate Manager v0.3.0 f8965f6"
12/13/2016 5:20:00 PMlevel=info msg="Using locally stored Let's Encrypt account for [email protected]"
12/13/2016 5:20:00 PMlevel=info msg="Found locally stored certificate 'cake'"
12/13/2016 5:20:00 PMlevel=info msg="Found existing certificate 'cake' in Rancher"
12/13/2016 5:20:00 PMlevel=info msg="Serial number mismatch between Rancher and local certificate 'pypi'"
12/13/2016 5:20:01 PMlevel=info msg="Updated Rancher certificate 'cake'"
12/13/2016 5:20:01 PMlevel=info msg="Certificate is not being used by any load balancer"
12/13/2016 5:20:01 PMlevel=info msg="Certificate renewal scheduled for 2017/02/19 12:00 UTC"

From Vincent in IRC:

yes the new balancer reads metadata and sees something changes, so the letsencrypt template doesn't need to try and do that anymore

Additonally, I'd appreciate a bit more information in the log lines around things like using the sandbox server etc.. i.e.

Trying to obtain SSL certificate (domain.com) from Let's Encrypt CA Sandbox server

certificate expiration

The certificate generated expires in 90 days. I have the number 12 in the renewal_time options.

Change renewal time to prevent expiration notices

The current renewal time is 14 days, but letsencrypt sends out renewal notifications 19 days before expiration. I propose to change the renewal time to 20 days, so a user will receive these notifications only if something went wrong.

UDP connection refused

Hi,

I have an issue when creating a new certificate with dnsimple. It looks like the connection to dnsimple was successful. The TXT record was created.
But after that the connection to or from rancher is not working.
Do I have to publish the 53 DNS port of rancher. Or can you give me a hint whats wrong in my setup?

Here is my log output:

10/5/2016 1:36:26 PMlevel=info msg="Starting Let's Encrypt Certificate Manager v0.3.0 f8965f6"
10/5/2016 1:36:26 PMlevel=info msg="Using locally stored Let's Encrypt account for **@**"
10/5/2016 1:36:26 PMlevel=info msg="Trying to obtain SSL certificate (my.domain.com) from Let's Encrypt CA"
10/5/2016 1:37:31 PMlevel=error msg="[my.domain.com] Error obtaining certificate: Time limit exceeded. Last error: read udp 172.17.0.3:39687->83.222.134.149:53: read: connection refused"

The ip 83.222.134.149 has only a rancher-agent running not the server.
And there is no public 53 port on 83.222.134.149.

Rancher Server 1.1.4
Let's Encrypt 3.0.0

Maybe someone has a hint for me.
Thank you.

volume issues

I just created a a new letsencrypt using the catalog, this is the configuration :

letsencrypt:
environment:
API_VERSION: Production
AWS_ACCESS_KEY: ''
AWS_SECRET_KEY: ''
CERT_NAME: *******************
CLOUDFLARE_EMAIL: ***************************
CLOUDFLARE_KEY: ****************************************
DNSIMPLE_EMAIL: ''
DNSIMPLE_KEY: ''
DOMAINS: *****************************
DO_ACCESS_TOKEN: ''
DYN_CUSTOMER_NAME: ''
DYN_PASSWORD: ''
DYN_USER_NAME: ''
EMAIL: *****************
EULA: 'Yes'
PROVIDER: CloudFlare
PUBLIC_KEY_TYPE: RSA-4096
RENEWAL_TIME: '12'
labels:
io.rancher.container.create_agent: 'true'
io.rancher.container.agent.role: environment
image: janeczku/rancher-letsencrypt:v0.3.0
volumes:

  • /srv/docker/letsencrypt/production/certs:/etc/letsencrypt/production/certs

The problem is if I go in /srv/docker/letsencrypt/production/certs it's empty.

Note: I can still use the one for the rancher LB

Can´t obtain certifiate using cloudflare

I installed the letsenrypt service from the rancher catalog and did all the nessecary configuration. On startup, I get the following errormessage in the service:

Error obtaining certificate: Error presenting token: invalid character '<' looking for beginning of value"

I´ve entered my domain, that is registered and active in cloudflare and additionaly a subdomain and I get the errormessage for both domain names.

Error saving certificate 'Production': Failed to read certificate expiry date: Pem decode did not yield a valid block. Is the certificate in the right format?

Hello!

My letsencrypt stopped working and I got the following error message:

Error saving certificate 'Production': Failed to read certificate expiry date: Pem decode did not yield a valid block. Is the certificate in the right format?

What is causing the issue and how can I fix it? I didn't change anything since the last renewal and back then, it worked perfectly.

Thank you very much.

Time limit exceeded with Cloudflare provider

This is the output of rancher-letsencrypt with -debug=1:

7/25/2016 11:04:21 PM[INFO][foo.com, bar.foo.com, biz.foo.com, baz.foo.com, boz.foo.com, qux.foo.com, qix.foo.com] acme: Obtaining bundled SAN certificate
7/25/2016 11:04:22 PM[INFO][foo.com] acme: Could not find solver for: http-01
7/25/2016 11:04:22 PM[INFO][foo.com] acme: Could not find solver for: tls-sni-01
7/25/2016 11:04:22 PM[INFO][foo.com] acme: Trying to solve DNS-01
7/25/2016 11:04:27 PM[INFO][foo.com] Checking DNS record propagation...
7/25/2016 11:04:33 PM[INFO][foo.com] The server validated our request
7/25/2016 11:04:37 PM[INFO][bar.foo.com] acme: Trying to solve DNS-01
7/25/2016 11:04:40 PM[INFO][bar.foo.com] Checking DNS record propagation...
7/25/2016 11:04:47 PM[INFO][bar.foo.com] The server validated our request
7/25/2016 11:04:51 PM[INFO][biz.foo.com] acme: Could not find solver for: tls-sni-01
7/25/2016 11:04:51 PM[INFO][biz.foo.com] acme: Trying to solve DNS-01
7/25/2016 11:04:54 PM[INFO][biz.foo.com] Checking DNS record propagation...
7/25/2016 11:06:59 PM[INFO][baz.foo.com] acme: Could not find solver for: tls-sni-01
7/25/2016 11:06:59 PM[INFO][baz.foo.com] acme: Could not find solver for: http-01
7/25/2016 11:06:59 PM[INFO][baz.foo.com] acme: Trying to solve DNS-01
7/25/2016 11:07:02 PM[INFO][baz.foo.com] Checking DNS record propagation...
7/25/2016 11:09:07 PM[INFO][boz.foo.com] acme: Trying to solve DNS-01
7/25/2016 11:09:09 PM[INFO][boz.foo.com] Checking DNS record propagation...
7/25/2016 11:11:12 PM[INFO][qux.foo.com] acme: Could not find solver for: tls-sni-01
7/25/2016 11:11:12 PM[INFO][qux.foo.com] acme: Trying to solve DNS-01
7/25/2016 11:11:13 PM[INFO][qux.foo.com] Checking DNS record propagation...
7/25/2016 11:13:15 PM[INFO][qix.foo.com] acme: Trying to solve DNS-01
7/25/2016 11:13:17 PM[INFO][qix.foo.com] Checking DNS record propagation...
7/25/2016 11:14:46 PM[INFO][qix.foo.com] The server validated our request
7/25/2016 11:14:48 PMlevel=error msg="[biz.foo.com] Error obtaining certificate: Time limit exceeded. Last error: NS kai.ns.cloudflare.com. did not return the expected TXT record"
7/25/2016 11:14:48 PMlevel=error msg="[baz.foo.com] Error obtaining certificate: Time limit exceeded. Last error: NS kai.ns.cloudflare.com. did not return the expected TXT record"
7/25/2016 11:14:48 PMlevel=error msg="[boz.foo.com] Error obtaining certificate: Time limit exceeded. Last error: NS kai.ns.cloudflare.com. did not return the expected TXT record"
7/25/2016 11:14:48 PMlevel=error msg="[qux.foo.com] Error obtaining certificate: Time limit exceeded. Last error: NS kai.ns.cloudflare.com. did not return the expected TXT record"

Any ideas on what's going on here?

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.