![now](https://github.com/zeit/art/blob/a7867d60f54a41127023a8740a221921df309d24/now-cli/repo-banner.png?raw=true)
[![Build Status](https://travis-ci.org/zeit/now-cli.svg?branch=master)](https://travis-ci.org/zeit/now-cli)
[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/)
## Usage
Now enables instant immutable deployments to **any cloud provider**
with a simple API that's scalable, intuitive and optimized for collaboration.
This is all it takes to deploy, for example, a Node.js project:
```
cd my-project
cat server.js
```
```js
require('http').createServer((req, res) => {
res.end('▲ Hello World')
}).listen(process.env.PORT)
```
and deploy!
```
now
```
The output of the `now` command will be a unique url to the deployment. No need for git.
## Features
- **Single command deployment**: `now`.
- **100% OSS** and licensed under Apache 2.0
- **Serverless**. Worry about code, not servers.
- **Immutable**. Every time you write `now`, a new deployment is provisioned.
- **Pluggable**. Client can query any public and private cloud provider APIs
- **Flexible**. Interact with multiple clouds at once: `now gcp deploy && now aws deploy`
- **Single command setup**: `now [provider] login`
- **Secure**. All deployments are served over SSL
- **Dynamic and Static**. Deploy popular runtimes or static websites
- **Remote fs support**. Deploy any github project with `now project/repo`, gitlab with `gitlab://`. [PRs welcome](https://github.com/zeit/now-cli/pulls)!
## Installation
To install the latest version:
```
npm install -g now@beta
```
Note: while the API has been in production for over a year, the different
providers are still under heavy development
Optionally, you can clone this repo and run `npm run build` to
produce the [pkg](https://github.com/zeit/pkg) binaries.
## Setup
Configuration of one or more providers via `login` command is necessary.
Global configuration is stored as `~/.now/config.json`. Your default provider will be the first one you log in to. If you are logged into multiple providers and want to set default provider, run:
```
now config set defaultProvider gcp
```
### Now.sh
```
now login
```
To skip the configuration steps and deploy to `https://now.sh`
execute `now login` without any parameters, defaulting to the `sh` provider (equivalent to: `now sh login`).
[Now.sh](https://zeit.co/now) is _**free** for open-source projects and static deployments_. It supports `Dockerfile`, `package.json` and static sites out of the box. All builds are reproducible and executed in the cloud.
### AWS Lambda (`aws`)
Run:
```
now aws login
```
If you have already run `aws configure` before, you will be offered
to synchronize your credentials.
Serverless deployments are provisioned by using:
- Lambda functions λ
- A proxy is automatically used to bridge the API between
HTTP and lambda functions and retain a consistent interface
- Certificate Manager
- API Gateway
### Google Cloud Platform (`gcp`)
```
$ now gcp login
```
and follow the instructions!
### Microsoft Azure (`az`)
```
$ now az login
```
and follow the instructions!
## Project Configuration
The v1 release of `now.json` includes the following specification:
- `name` (optional, recommended) `String`
- `description` (optional, recommended) `String`
- `type` (optional, recommended). One of:
- `String` an unique identifier for the project type. The following
are recommended choices to be supported by every provider:
- `docker`
- `nodejs`
- `static`
- `Object`
when it's necessary to specify a version or multiple interacting runtimes. It's a dictionary of runtime identifier and [SemVer-compatible]() version. For example:
```
{ "type": { "docker": "1.x.x" } }
```
- `provider` (optional) indicates affinity to a certain provider
- `target` (optional) `String`
- specifies a directory or file to deploy. If relative, it's resolved
to the project directory. This is useful when a certain
deployment type (like `static`) has an output target, like an `out`
or `dist` directory.
- `env` (optional). One of
- `Object` a dictionary mapping the name of the environmental variable
to expose to the deployment and its value.
If the value begins with `@`, it's considered a
- `Array` a list of suggested environmental variables that the project
_might_ require to be deployed and function correctly
- `regions` - `Array` of `String`
- specifies one or more regition identifiers to deploy to. A wildcard
can be used to signify deployment to all supported regions by the
provider
- `files` - `Array` of `String`
- specifies a whitelist of what files have to be deployed
To supply provider-specific configuration, you can include an arbitrary `Object` and use the provider identifier as the key.
## Global Configuration
The client will initialize a `.now` directory in the user's home
directory upon first running.
There, two files can be found:
- `config.json`
- `auth.json`
## Implementation notes
Now is directly modeled after UNIX. It's useful to think of the primary subcommands `deploy`, `alias` and `rm` as being the "cloud equivalents" of `cp`, `ln` and `rm`.
The minimal set of commands that providers must supply are:
[] | deploy |
the default command to launch a deployment |
remove | rm |
remove a deployment identified by its unique URL |
Recommended, but not required, commands are:
alias | ln |
associates a URL with a permanent domain name |
secrets ls | rm | add |
manage deployment secrets |
domains ls | add | rm |
manage domains |
dns ls | add | rm |
manage dns records |
certs ls | add | rm |
manage certificates |
The `build` step for serverless deployments is implemented locally and is compatible with projects configured with the `type` `nodejs`, and others are on the way!
## Philosophy
### Immutability
Each time you write `now` a new deployment is provisioned. Whenever
possible, providers should strive to make deployments idempotent in the
absence of changes to:
- Originating source code
- Configuration
- Environment variables
### Standards compliance
All projects expose a HTTP/1.1-compatible interface. A port is provided
via the standard `process.env.PORT`.
### Secure
Whenever possible, deployments are strongly encouraged to be served over SSL. The process of provisioning certificates should be transparent to the user.
### Projects should require minimal JSON configuration
Whenever possible, projects should be deployable with minimal or no configuration.
### Avoid manifest duplication
If the configuration or conventions imposed by a programming language
or framework are present, attempt to provide sane defaults.
Examples of this is the presence of `Dockerfile` or `package.json`. When
publishing a project it's recommended that the [`type`](#type) is strictly
configured in [`now.json`](#now-json) to avoid
## Contributions and Roadmap
#### Community
All feedback and suggestions are welcome!
- 💬 Chat: Join us on [zeit.chat](https://zeit.chat) `#now-client`.
- 📣 Stay up to date on new features and announcments on [@zeithq](https://twitter.com/zeithq).
- 🔐 Subscribe to our [security](http://zeit.us12.list-manage1.com/subscribe?u=3c9e9e13d7e6dae8faf375bed&id=110e586914) mailing list to stay up-to-date on urgent security disclosures.
Please note: we adhere to the [contributor coventant](http://contributor-covenant.org/) for
all interactions in our community.
#### Contributions
To get started contributing, make sure you're running `node` `8.x.x`. Clone this repository:
```
git clone https://github.com/zeit/now-cli
```
To test the [`pkg`](https://github.com/zeit/pkg) binary distribution, run:
```
npm run build
```
#### Ongoing development
- Support for `now `, with support for:
- Binaries as a first-class deployment type
- Static deployments as a fallback
- We are working on built-in support for provisioning [Kubernetes](https://kubernetes.io/)
replication controllers and pods, in a similar vein as the [Draft](https://github.com/azure/draft) project.
- A simple API to register custom providers and pluggable build systems externally, such as Travis, Circle CI, etc.
- A companion desktop app [Now Desktop](https://github.com/zeit/now-desktop)
is available, released under the MIT license.
Work is ongoing for pluggable providers to enable:
- Team collaboration
- One-click context switch
- Drag and drop deployments
- Adding interoperabity between objects that live in different providers
- Providing a Next.js and React powered dashboard that can be deployed anywhere
## Why Ship a `pkg`-ed Binary?
- Simpler installation for non-Node users like those deploying [static files](https://zeit.co/blog/unlimited-static) or [Dockerfiles](https://zeit.co/blog/now-dockerfile).
- Consistency across platforms and installation mechanisms (`npm`, `brew` and manual scripts)
- Parsing and evaluation optimizations lead to a faster bootup time
- Easier installation in automation environments (like CI systems)
- Increased safety by providing a unified signature mechanism for releases
- We're able to select our own Node version of choice and can take advantage of the latest features
## Caught a Bug?
1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
2. Link the package to the global module directory: `npm run link` (not `npm link`)
3. You can now start using `now` from the command line!
As always, you can use `npm test` to run the tests and see if your changes have broken anything.
## Authors
- Guillermo Rauch ([@rauchg](https://twitter.com/rauchg)) - [▲ZEIT](https://zeit.co)
- Leo Lamprecht ([@notquiteleo](https://twitter.com/notquiteleo)) - [▲ZEIT](https://zeit.co)
- Tony Kovanen ([@TonyKovanen](https://twitter.com/TonyKovanen)) - [▲ZEIT](https://zeit.co)
- Olli Vanhoja ([@OVanhoja](https://twitter.com/OVanhoja)) - [▲ZEIT](https://zeit.co)
- Naoyuki Kanezawa ([@nkzawa](https://twitter.com/nkzawa)) - [▲ZEIT](https://zeit.co)