From 1f88eddccad6be68b8aa405902c18e7672b736ff Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 5 Nov 2014 17:08:53 +0100 Subject: [PATCH 01/84] [dotcloud-cctrl-migration] First version of introduction guide --- .../An Introduction.md | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 Guides/dotCloud-cloudControl migration/An Introduction.md diff --git a/Guides/dotCloud-cloudControl migration/An Introduction.md b/Guides/dotCloud-cloudControl migration/An Introduction.md new file mode 100644 index 0000000..77c89f8 --- /dev/null +++ b/Guides/dotCloud-cloudControl migration/An Introduction.md @@ -0,0 +1,92 @@ +# An Introduction to cloudControl for dotCloud Developers + +Welcome to cloudControl! You'll find a lot of similarities here to +dotCloud, but some important differences too. We'll try to cover the +biggest differences here and we'll also provide more specific +information for each programming language and dotCloud service type. + +## Can I still use my favorite language? + +Yes, cloudControl is even more flexible than dotCloud on language +support. You'll find up to date versions of Python, PHP, NodeJS, Ruby, +Java, Scala, Clojure, Play and Gradle here, and custom buildpacks +can give you access to even more languages like Go, Erlang, Lisp, Lua, +C, Haskell, and Perl. + +More information on the specifics of porting applications in specific +languages and frameworks are available here. Note that we are continuously +expanding these guides to include all dotCloud services. + +## Do I still have access to my favorite databases? + +Yes, but on cloudControl, all stateful services are provided as +"Add-on" services. Some of them are run by cloudControl and some are +third party services, but cloudControl will be your single point of +contact for billing and support. + +More information about the specifics of porting Add-ons like MySQL, +Redis, MongoDB, Postgre/PostGIS are in the relevant guides here. +Note that we will continually expand these guides to include all dotCloud +services. + +## Can I still create multiple services for my application? +Yes, but in a different way. cloudControl does not provide services +as we know them in dotCloud. Instead, each application can have +multiple deployments, which run one separate web process each. +Furthermore, each deployment can serve multiple worker processes using the +[Worker "Add-on"](http://next.dotcloud.com/dev-center/add-on-documentation/worker) and other stateful services via "Add-on" +services. + +## Can I keep using the same Version Control System for my code? +It depends. You can only push code on cloudControl when it's +version-controlled by Git. So if you are using Mercurial, Subversion or +no VCS at all, a migration to Git is required. For more information on +how to migrate, see these resources on converting from [Mercurial to Git](http://hivelogic.com/articles/converting-from-mercurial-to-git/), +and from [Subversion to Git](http://www.subgit.com/). + +## Do I still get loadbalancing, scaling, SSL, seamless deployment... + +Yes! cloudControl still behaves in all the ways you'd expect. + +# Where should I begin? + +A good place to start is to read the [Quickstart](https://www.cloudcontrol.com/dev-center/Quickstart) +and [Platform Documentation](https://www.cloudcontrol.com/dev-center/Platform%20Documentation) +to get familiar with the cloudControl PaaS. + +Then read the docs [here](TODO-add-link) comparing the dotCloud +CLI to the cloudControl CLI and `dotcloud.yml` to a `Procfile` (including +a comparison of build/deploy processes in general). + +## Missing Pieces + +When you're familiar with all that cloudControl offers, you should +consider if you're using any of the following features of dotCloud, because +these will require some important changes to your application: + +* `~/data` for persistent data. cloudControl does not persist data + between deployments, so you need to use a database or other persistent + file service like Google Cloud Storage. Whatever you push to cloudControl + needs to be stateless. +* `nginx.conf` to create redirects, URL rewrites, basic auth, or + serving static assets. While it is possible to run *nginx* in a + cloudControl deployment, it is not typical. The strategy to work around + this will depend on the language and framework you're using. +* `supervisord.conf` to run additional processes. While it is possible + to install and run *supervisord* in a cloudControl deployment, it is + not typical. Most deployments run only one process. +* `ssh` to manually tweak your running application. You can get + something like *ssh* on cloudControl, but it is limited to a new + instance which has been created just for your interactive + session. You can't directly interact with an instance you've + previously deployed. You can, however, run the same code in a new + container and interact with the same databases and deployments, so you + can still interactively manage and perform data migrations. +* *older versions*: On dotCloud the OS and most of the software runs on + Ubuntu 10.04LTS (circa 2010). You may find that you need to + update your code to use newer versions of your libraries and other + dependencies on cloudControl, which runs on Ubuntu 12.04. + +If you have mission-critical applications that are affected by some of these +“missing pieces”, please contact us at support@dotcloud.com and we will do our +very best to guide you through a solution for your use case. From cb419927777cb78eb7d20d9d267305eaf5e40f5a Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 5 Nov 2014 17:09:32 +0100 Subject: [PATCH 02/84] [dotcloud-cctrl-migration] First version of CLI Cheatsheet --- .../CLI Cheatsheet.md | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md diff --git a/Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md b/Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md new file mode 100644 index 0000000..2aa9c13 --- /dev/null +++ b/Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md @@ -0,0 +1,50 @@ +# dotCloud to cloudControl CLI Cheat Sheet + +Here are the dotCloud CLI commands translated to their equivalents in +the cloudControl CLI, listed in the same order as they appear in +`dotcloud -h`. + +## User specific commands + +`dotcloud`| `dcapp` +---------------------:|------------------------------- +`setup` | You will be prompted for credentials after every 15 minutes of inactivity. To prevent this, export `DC_EMAIL` and `DC_PASSWORD` into your environment. +`check` | N/A +`list` | `-l` +`create APP_NAME` | `create APP_NAME (java, nodejs, php, python, ruby)` for these pre-defined language types. +`create APP_NAME` (custom service) | `create custom --buildpack BUILDPACK_REPO_URL` The url has to be a non-ssh, public git repository. +`-h, --help` | `-h, --help` +`--version` | `-v` + +## Application specific commands + +`dotcloud -A APP_NAME`| `dcapp APP_NAME[/DEP_NAME]` +---------------------:|------------------------------- +`connect / disconnect / app` | N/A. `APP_NAME` must always be specified explicitly as you may have done with `dotcloud -A APP_NAME`. +`destroy` | `undeploy` for deployments and `delete` for apps +`destroy SERVICE` | `addon.remove ADDON_NAME.OPTION` +`activity` | N/A +`info` | `details / addon / worker` +`url` | `alias` +`open` | `open` +`run` | `run COMMAND` **Note**: deploys new container just for running command. +`memory` | N/A, use a Performance & Monitoring Add-on +`traffic` | N/A, use a Performance & Monitoring Add-on +`push` | `push` **Note**: use `push --ship` if you want it to deploy in the same step. Use DEP_NAME to push something besides the default. +`push --clean` | `push --clear-buildpack-cache` +`deploy` | `deploy` +`deploy previous` | `rollback` +`dlist` | `log deploy` +`dlogs` | `log deploy` +`env list` | `config` and `addon.creds` **Note**: config is implemented as a free Add-on. +`env set` | `config.add` +`env unset` | `config.remove` +`scale instances=N memory=Y` | `deploy --containers N --memory Y` or `addon.upgrade / addon.downgrade` **Note**: Add-ons have their own tiers and scaling capabilities. +`restart` | `deploy` +`domain list` | `alias` +`domain add` | `alias.add` +`domain rm` | `alias.remove` +`revisions` | N/A. You can `deploy` any of your last 10 pushed git hashes. +`upgrade` | `deploy --stack STACK_NAME` +`--debug, -D` | N/A +`--assume-yes, --assume-no` | N/A. Use the API if you need full scriptability. cloudControl's API is fully supported. From bba3c2eda7a5e35d904f23f8f40830918b065240 Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 5 Nov 2014 17:10:10 +0100 Subject: [PATCH 03/84] [dotcloud-cctrl-migration] First version of converting dotcloud.yml guide --- .../Converting dotcloud.yml.md | 391 ++++++++++++++++++ 1 file changed, 391 insertions(+) create mode 100644 Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md diff --git a/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md b/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md new file mode 100644 index 0000000..418a0f4 --- /dev/null +++ b/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md @@ -0,0 +1,391 @@ +# Converting dotcloud.yml to cloudControl + +For a better general understanding, an essential difference between +an application on dotcloud and an application on cloudControl should +be emphasized first. +In an application on dotcloud several service types can be defined with +different endpoints. Thus, for example, a dotcloud application can combine +a Ruby on Rails and a Python Flask implementation as two services. +In an application on cloudControl you can have multiple deployments of one +service type. And you can define only one web service per deployment. +To achieve the same on cloudControl you have to create several applications +for several service types. + +Your `dotcloud.yml` build file is a good place to start when +converting your dotCloud application to run on cloudControl. This is +where you've defined what services you need and sometimes their +settings as well. This document will walk you through each section of +a `dotcloud.yml` file with considerations for how to convert to +cloudControl configurations. The structure of this document will +mostly follow the [Build file +documentation](http://docs.dotcloud.com/guides/build-file/) in the +dotCloud docs. You should be familiar with that document (or all the +parts of your `dotcloud.yml` file) to use this document. + +Since the `dotcloud.yml` file also defines some of the build time +behavior, we will also compare the dotCloud and cloudControl build +processes. + +In the below document we will use the term "process" to refer to dotcloud "service", +since in a Procfile you can only define the command to start the +web process and multiple worker processes. + + +## Location + +Your `dotcloud.yml` file is located in the root of your source +tree. For example: + +``` +myapp/ +├── dotcloud.yml +├── admin/ (source code for adminstration backend) +└── frontend/ (source code for frontend) +``` + +You should open that file and read through it as you read through this +document. + +The corresponding file on cloudControl is the `Procfile`. The format +of the Procfile is much simpler than `dotcloud.yml` because most of +the configuration is handled through the `dcapp` CLI and +Buildpacks, but the basic idea is the same: list web and worker +processes in the deployment and define some behavior. + +You should create a new `Procfile` at the same level as your +`dotcloud.yml`. We'll talk about what to add to this file below. + + +## `dotcloud.yml` format + +Here is the example `dotcloud.yml` from the dotCloud +documentation. We'll walk through each section below. The sections of +your own `dotcloud.yml` may appear in a different order. + +``` +# Required parameters for a service: service name and type +servicename1: # Any name up to 16 characters using a-z, 0-9 and _ + type: ruby # Must be valid service type. + +servicename2: + type: python + + # --------------------------------------------------------------- + # Optional parameters: All the following parameters are optional. + + # Define the location of this service's code + approot: directory/relative/to/dotcloud_yml/ # Defaults to '.' + + # Build Hooks. Paths are relative to approot. + prebuild: executable_name # Defaults to undefined. + postbuild: executable_name # Defaults to undefined. + postinstall: executable_name # Defaults to './postinstall'. + + # Ubuntu packages installed via apt-get install. + systempackages: + - packagename + - another-packagename + + # Configuration for your service. See docs for each dotCloud Service. + config: + service_specific_parameter1: valueA + service_specific_parameter2: valueB + + # Custom ports. HTTP ports are proxied. + # Most services do not need custom ports. + ports: + portname1: http # Name is arbitrary, type is (http|tcp|udp) + portname2: tcp + + # Environment variables. Shared by all services. + environment: + EXAMPLEVAR1: EXAMPLE_VALUE + EXAMPLEVAR2: EXAMPLE_VALUE_TOO + + # Supervisor.conf shortcuts + # You can use one or the other of (process|processess), but not + # both. + # This is almost directly translatable to the Procfile + process: executable_name # Defaults to './run' + processes: # For when you have more than one process to run. + process_name1: path/to/executable1 + process_name2: path/to/executable2 + + # List of dependencies, best for PERL/PHP but also Python and Ruby + requirements: # Defaults to empty list. + - dependency_package_name_1 + - dependency_package_2 +``` + +This shows two services, `servicename1` and `servicename2`. Each has a +type, and `servicename2` has a lot of other parameters related to it. + +For contrast, here is a similar `Procfile` with two Python services +instead of a mix of Ruby and Python. We'll talk about why that is +important in the *type* section below. + +Python celery example: + +``` +web: celery flower --port=$PORT --broker=$CLOUDAMQP_URL --auth=$FLOWER_AUTH_EMAIL +worker: celery -A tasks worker --loglevel=info +``` + +## servicename, processes and names: A Little Magic + +Your application on dotCloud can have multiple services, each with its own +unique name. The same is true on cloudControl, where these are also known +as "processes". Where the service names on dotCloud are fairly arbitrary, on +cloudControl there is one magic name, `web`. + +**A process with the name `web` will be the one which gets HTTP traffic.** +See the *ports* section below for more information. + +Non-http services are treated as worker and the names can be arbitrary. + +## type: Very Different on cloudControl + +cloudControl does not provide services as we know them in dotCloud. +Since there is only one type for an entire Procfile, you +specify the type when you `dcapp create` the application. +You can specify one of the predefined types (buildpacks): +`java`, `nodejs`, `php`, `python`, `ruby` or `custom`. + +In a `Procfile` the service name is actually called a "process type" +because the name can affect its behavior in the special case of +`web`. Procfiles don't actually have the idea of a `type` of service +**because all the services in a Procfile run in the same type of +environment**. That is, you cannot create `servicename1` as a `ruby` +type and `servicename2` as a `python` type. **That's a big difference +from a `dotcloud.yml` file.** If you need multiple languages in your +project, you may need to create multiple applications. + +### Running Code + +In a `Procfile`, both `servicename1` and `servicename2` run in the +same language type and on the same code base. +If you only have one web process and the rest are workers, then +converting to a Procfile is trivial: + +``` +servicename1: + type: python + +servicename2: + type: python-worker + +servicename3: + type: rabbitmq +``` + +becomes (for a Python Celery app with a CloudAMQP Add-on for RabbitMQ): + +``` +web: celery flower --port=$PORT --broker=$CLOUDAMQP_URL --auth=$FLOWER_AUTH_EMAIL +worker: celery -A tasks worker --loglevel=info +``` + +The entry for the web or worker process will be executed as a shell commandline. + +> For more specific details, please see the porting guide specific to +Python or your language of choice. + +If you need to run some code in a mix of languages, e.g. Ruby and +Python (as in the example `dotcloud.yml` file above), then you will +need to create multiple applications with a different type or a single +application with a custom buildpack to install the languages you need. + +### Non-code services + +But what if some of your `type`s in your dotcloud.yml are not +programming languages? What if they are services like MySQL or Redis? + +**A `Procfile` only specifies the "code services" of your +application. This is very different from a `dotcloud.yml` file.** + +"Data Services" like MySQL and Redis, as well as many other types of +services like logging, monitoring, and even SSL are handled outside of +the `Procfile` with +[Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) +via `dcapp addon.add`. + +## approot + +You may have used the `approot` directive in `dotcloud.yml` to tell +the platform where to find the code to run, but the cloudControl +`Procfile` lets you set this first command explicitly, so **you don't +need an `approot`**. If you need to change directory before running +your first statement, you can do that in the command of the +`Procfile`: + +``` +web: cd myapproot; sh startapp.sh +``` + +(*myapproot* and *startapp.sh* are arbitrary names, just for example) + +For php based applications you have to change the approot in another way. +Since the php-scripts are executed by php-fpm you have to set the apache's +`DocumentRoot`, see [Manually Setting the DocumentRoot](https://github.com/cloudControl/buildpack-php#manually-setting-the-documentroot). + +cloudControl processes do not have any magically-created directories +like the dotCloud services. There are neither `code` nor `current` +symbolic links. The root of your home directory has the same format +and contents as the directory which contained your `Procfile`. + + +## prebuild, postbuild, postinstall: Build Hooks + +If you are using a `prebuild` or `postbuild` script in your +`dotcloud.yml`, that could mean you need to create [your own +Buildpack](https://www.cloudcontrol.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). +You can write a Buildpack from scratch, or you can compose multiple +Buildpacks together (using [a third party meta-buildpack](https://github.com/ddollar/heroku-buildpack-multi)). In +any case, a Buildpack will enable you to create your own custom +service type with the software you want pre-installed (like a +`prebuild` script) and any build and post-build compilation steps you +need (like your `postbuild` script). + +If you have a `postinstall` script, you can run the same step as part +of your Procfile command, e.g. Procfile: + +``` +web: cd myapproot; postinstall.sh; sh startapp.sh +``` + +## systempackages + +Like `prebuild` and `postbuild` scripts, a `systempackages` section in +your `dotcloud.yml` file probably means you need to create your own +Buildpack. A custom Buildpack will enable you to set up the software +you need, though you may not be able to install it using `apt-get` +(which is how `systempackages` items get installed). You might need to +include the source code or binaries as part of your Buildpack. For this +you want to create a [custom Buildpack](https://www.cloudcontrol.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). +Depending on your application's language download the accordingly Buildpack from [github cloudControl](https://github.com/cloudControl?query=buildpack) +and change the `bin/compile` script according to your needs (keep in mind +that only the `/app` folder is writeable so `apt-get install` will fail). +Upload the Buildpack to a public non-ssh git repository, and create your +application with the apptype `custom --buildpack BUILDPACK_URL` + +## config + +There are a couple of replacements for a dotCloud `config` section, +depending on what needs configuring. Some configuration options may be +handled explicitly by the type of service -- you should read the +documentation for the Buildpack you're using. The cloudControl +buildpacks are [available on +GitHub](https://github.com/cloudcontrol?query=buildpack). For example, +you can specify the Python version to use by creating a `runtime.txt` +file to replace your `dotcloud.yml config: python_version`. + +If your configuration could be replaced by setting an environment +variable, you can do that with the CLI: `dcapp APP_NAME config.add`. Please read +[the +Add-on documentation](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) +and our [dedicated guide](TODO-ADD-ENVS-GUIDE) on this topic. + +## ports + +If you have a `ports` section in your `dotcloud.yml` then hopefully +you only have one port listed, a single `http` type port. That is the +only kind of port allowed on the cloudControl PaaS. You can only have +one process which listens to an HTTP port. This is pretty common for +`custom` type apps on dotCloud. + +If you do have multiple services each with their own HTTP port, then +you should consider how to either separate these into different +applications or how to access each different function via a different +URL path (e.g. if you used to have an "admin" interface as well as a +public interface, move your "admin" interface to be part of your +public interface on another path, like "www.example.com/admin"). + +Note that cloudControl containers do not expose an SSH port. See the +[Secure Shell docs](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#secure-shell-ssh). + +## environment + +If you were setting environment variables in your `dotcloud.yml` then +you should instead set these via `dcapp APP_NAME config.add`. Please read +[the +Add-on documentation](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) +and our [dedicated guide](TODO-ADD-ENVS-GUIDE) on this topic. + +Note that the same variables get set in all your services (web and worker) -- you +cannot specify that a variable should only be set on one service (as +you could in a `dotcloud.yml` file). + +## process + +If your `dotcloud.yml` file includes a `process` or `processes` +section, you will probably need to install `supervisor` so that you +can run multiple processes. Other process managers are usable too, +like foreman (written in Ruby), but if you're coming from the dotCloud +environment, you're probably already familiar with `supervisor` +(written in Python). + +Each service on the dotCloud platform could generally rely on the +presence of [`supervisord`](http://supervisord.org/) so it can start +up multiple processes in the same service. Typical cloudControl apps +only run one process per service. **But you can install supervisord** +yourself. This is especially easy on `python` type applications, +though you could add `python` and `pip` with your own Buildpack if +necessary. On a `python` type application, you can install supervisor +by adding this to your `requirements.txt` file: + +``` +supervisor +supervisor-stdout +``` + +Then you'll need to add a `supervisor.conf` file which lists each of the +processes you had in your `dotcloud.yml`. + +Note that the dotCloud PaaS code services often ran both `supervisor` +and `nginx`. `nginx` was typically started by `init.d` and so was not +explicitly controllable by you, but on cloudControl you can run nginx +as another process under `supervisor` if you wish. This gets you +pretty close to a dotCloud environment on cloudControl. + +## requirements + +On the dotCloud platform, a `requirements` section can help install +additional dependencies of your application during build time (after +`dotcloud push`). On cloudControl you should use the mechanism +provided by your Buildpack. + +### Python + +The Python Buildpack expects a `requirements.txt` file in your root +directory (same level as the `Procfile`). This file contains all of +your deployment dependencies. + +This is how a `requirements.txt` file might look like: + +~~~ +tornado==3.2 +pymongo==2.6.3 +suds==0.4 +newrelic==2.16.0.12 +logentries==0.2.1 +~~~ + +You can generate this file automatically by using the `pip freeze` command. +This will read the installed packages in the current environments and +print them out. You can store this output directly into your `requirements.txt` +file with: + +~~~bash +$ pip freeze > requirements.txt +~~~ + +### Other buildpacks + +Buildpack| Required file +--------:|-------------- +Ruby | `Gemfile` +PHP | `composer.json` +Node.js | `package.json` +Java | `pom.xml` + +For more information on all supported languages, please check our [Guides](TODO-ADD-LINK-TO-GUIDES). From 0be07aad8eb3d1a4cfce8b3d5777a5f2c7aeaffc Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 5 Nov 2014 17:10:39 +0100 Subject: [PATCH 04/84] [dotcloud-cctrl-migration] First version of python guide --- .../dotCloud-cloudControl migration/Python.md | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Guides/dotCloud-cloudControl migration/Python.md diff --git a/Guides/dotCloud-cloudControl migration/Python.md b/Guides/dotCloud-cloudControl migration/Python.md new file mode 100644 index 0000000..515389e --- /dev/null +++ b/Guides/dotCloud-cloudControl migration/Python.md @@ -0,0 +1,28 @@ +# Migrating Python Applications from dotCloud to cloudControl + +Before you read this document, you should read the document on *Converting dotcloud.yml* first. It provides a framework for porting your application as a whole over to cloudControl. Please return here to learn how to port your Python services. + +## dotCloud Features + +The first task is to determine what dotCloud features your Python service is using. + +### Nginx + +Please check your Python service's `approot` to see if you have an `nginx.conf` file. The most common use for this is to define redirections and error handlers for the Nginx web server. If you have this, then your first migration will probably require Nginx in your cloudControl application as well. Later you may find other ways to work around your use of Nginx, but for now we can install Nginx in your cloudControl application. + +### Supervisord + +Does your `approot` contain `supervisord.conf`? Or does your `dotcloud.yml` include a `process` or `processes` section in your Python service definition? If so, then you will also require `supervisord` on cloudControl. + +### uWSGI + +Does your `approot` contain uWSGI configuration information (`*uwsgi.conf`) or does your `dotcloud.yml` define environment variables for `UWSGI_*`? If so, then you'll need to run `uwsgi` on your cloudControl application. + +## Choose Your Path + +If you're not using Nginx, Supervisord, or uWSGI, then you can definitely use the standard cloudControl Python service! +For all the other cases, you can use a custom buildpack instead of the default Python service: https://github.com/metalivedev/buildpack-python-cloudcontrol.git#dotcloud + +**TODO:** Update that URL to cloudControl GitHub repo once merged. + +The basic information about how to use that buildpack is in the buildpack's Readme.md. From e55906ce74aa9ef7089a43f164d42e9642d6f66e Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Thu, 6 Nov 2014 12:08:02 +0100 Subject: [PATCH 05/84] [dotcloud-cctrl-migration] First version of environment.yml guide --- .../Converting dotcloud.yml.md | 44 +++++ .../Migrating environment.md | 167 ++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 Guides/dotCloud-cloudControl migration/Migrating environment.md diff --git a/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md b/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md index 418a0f4..c2fb49f 100644 --- a/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md +++ b/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md @@ -1,5 +1,48 @@ # Converting dotcloud.yml to cloudControl +### App structure on dotCloud +~~~text ++--------------------------------------------------------------------------------------------------+ +| dotCloud application | ++---------------------+-+---------------------+-+--------------------------+-+---------------------+ ++---------------------+ +---------------------+ +--------------------------+ +---------------------+ +| service web | | service support | | service worker | | service storage | +| | | | | | | | +| type: ruby | | type: python | | type: python+worker | | type: mysql | +| port: 80 | | port: 8300 | | port: None | | port: 3306 | +| | | | | | | | +| | | | | | | | +| | | | | | | | ++---------------------+ +---------------------+ +--------------------------+ +---------------------+ +~~~ + + +### App structure on cloudControl +~~~text ++---------------------+ +--------------------------------------------------+ +| cloudControl app | | cloudControl app | ++---------------------+ +--------------------------------------------------+ ++---------------------+ +--------------------------------------------------+ +| name: web | | name: support | +| | | | +| buildpack: ruby | | buildpack: python | +| port: 80 | | port: 80 | +| | | | +| | | additional: python-worker | +| | | | +| | | | ++-----------+---------+ +-----------------------------------------+--------+ + | | + | automatically connected to web app | + | when Add-on is added | + | | ++-----------+---------+ | +| +-------------------------------------------+ +| Add-on: MySQL | manually connected to python app +| | via custom config ++---------------------+ +~~~ + For a better general understanding, an essential difference between an application on dotcloud and an application on cloudControl should be emphasized first. @@ -389,3 +432,4 @@ Node.js | `package.json` Java | `pom.xml` For more information on all supported languages, please check our [Guides](TODO-ADD-LINK-TO-GUIDES). + diff --git a/Guides/dotCloud-cloudControl migration/Migrating environment.md b/Guides/dotCloud-cloudControl migration/Migrating environment.md new file mode 100644 index 0000000..cd4b78f --- /dev/null +++ b/Guides/dotCloud-cloudControl migration/Migrating environment.md @@ -0,0 +1,167 @@ +# Migrating the dotCloud environment to dotCloudNext + +## What is the Environment File in dotCloud? + +When you create an application on dotCloud, a file named `environment.json` +is created in the home directory of each of your services. + +This file contains a JSON-formatted dictionary with most of the configuration information +of the services in your application. You can use it to retrieve data or +credentials by reading the file. + +## How does it work on dotCloudNext? + +dotCloudNext stores config variables for each deployment in a single file called `creds.json`. It looks like this: + +~~~json +{ + "CONFIG":{ + "CONFIG_VARS": { + "KEY": "VALUE" + } + }, + "ADDON_NAME": { + "ADDON_KEY1": "ADDON_VAR1", + "ADDON_KEY2": "ADDON_VAR2", + ... + "ADDON_KEYN": "ADDON_VARN" + } +} +~~~ + +You can obtain the path to this file by reading the `CRED_FILE` environment variable. The file consists +of two main elements: user-defined environment variables and Add-on (third party services) configuration +variables. User-defined variables are always stored under the `CONFIG_VARS` element. You can add variables using the [Custom Config Add-on](http://next.dotcloud.com/add-ons/config): + +~~~bash +$ dcapp APP_NAME/DEP_NAME config.add KEY1=VALUE1 KEY2=VALUE2 ... +~~~ + +You can easily export all content in the `creds.json` file to the system environment variables by setting `SET_ENV_VARS`: + +~~~bash +$ dcapp APP_NAME/DEP_NAME config.add SET_ENV_VARS +~~~ + +Each change to the config variables, either user-defined or forced through an Add-on upgrade, will prompt a redeploy with the most current config so your container always has up-to-date configuration. + +Environment variables set for the deployment are also available in all workers belonging +to this deployment. + +If you want to define specific variables for web deployment and workers you can always export +them into the Procfile with commands like these: + +~~~ +web: export WEB_SPECIFIC_VAR1=val1 WEB_SPECIFIC_VAR2=val2; start_web_cmd.sh +worker1: export WORKER1_SPECIFIC_VAR1=val1 WORKER1_SPECIFIC_VAR2=val2; start_worker1_cmd.sh +worker2: export WORKER2_SPECIFIC_VAR1=val1 WORKER2_SPECIFIC_VAR2=val2; start_worker2_cmd.sh +~~~ + +Please keep in mind that these variables will not be present in `creds.json` file. + +## Migration + +### Services & Add-ons credentials + +* If you're using a dotCloud service like MySQL, you'll have an environment file that looks like this: + + ~~~json + { + "DOTCLOUD_ENVIRONMENT": "default", + "DOTCLOUD_DB_MYSQL_LOGIN": "root", + "DOTCLOUD_DB_MYSQL_URL": "mysql://root:pass@7a96f954.dotcloud.com:7780", + "DOTCLOUD_DB_MYSQL_PASSWORD": "B61J14)]U4^L}.najnyE", + "DOTCLOUD_PROJECT": "demodcapp", + "DOTCLOUD_SERVICE_NAME": "www", + "DOTCLOUD_DB_MYSQL_PORT": "7780", + "DOTCLOUD_DB_MYSQL_HOST": "7a96f954.dotcloud.com", + "DOTCLOUD_SERVICE_ID": "0" + } + ~~~ + + You are probably reading the variables in a code snippet that looks like this: + + ~~~python + import json + + with open('/home/dotcloud/environment.json') as f: + env = json.load(f) + + print 'MySQL Host: {0}'.format(env['DOTCLOUD_DB_MYSQL_HOST']) + ~~~ + +* On dotCloudNext, you can add a [MySQLd Add-on](http://next.dotcloud.com/add-ons/mysqld) (or alternately MySQLS) with: + + ~~~bash + $ dcapp APP_NAME/DEP_NAME addon.add mysqld.OPTION + ~~~ + + Then you'll have a `creds.json` file that looks like this: + + ~~~json + { + "MYSQLD": { + "MYSQLD_DATABASE": "...", + "MYSQLD_HOST": "...", + "MYSQLD_PASSWORD": "...", + "MYSQLD_PORT": "3306", + "MYSQLD_URL": "...", + "MYSQLD_USER": "..." + } + } + ~~~ + + And you can read the variables with: + + ~~~python + import os + import json + + with open(os.environ['CRED_FILE']) as f: + creds = json.load(f) + + print 'MySQL Host: {0}'.format(creds['MYSQLD']['MYSQLD_HOST']) + ~~~ + +### Custom configuration variables + +* Add all the custom configuration variables (those not injected by dotCloud) from all your custom services and processes to your deployment using the `Custom Config Add-on`: + + ~~~bash + # List dotCloud env variables + $ dotcloud env list + KEY1=VALUE1 + KEY2=VALUE2 + ... + + # Add them to your deployment in dotCloudNext + $ dcapp APP_NAME/DEP_NAME config.add KEY1=VALUE1 KEY2=VALUE2 ... SET_ENV_VARS + ~~~ + + Then you'll have a `creds.json` file that looks like this: + + ~~~json + { + "CONFIG":{ + "CONFIG_VARS": { + "KEY1": "VALUE1", + "KEY2": "VALUE2" + } + } + } + ~~~ + + You can then read the variables by opening the file or by reading them directly from the environment: + + ~~~python + import os + import json + + with open(os.environ['CRED_FILE']) as f: + creds = json.load(f) + + print 'Key 1: {0}'.format(creds['CONFIG']['CONFIG_VARS']['KEY1']) + print 'Key 2: {0}'.format(os.getenv('KEY2')) + ~~~ + + From fbf8cde2178c5e4e89294f54684ea1979b466237 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Tue, 11 Nov 2014 17:56:40 +0100 Subject: [PATCH 06/84] [dotcloud-cctrl-migration] First version of dotcloud.yml to Procfile migration guide --- .../Converting dotcloud.yml.md | 373 +++++------------- 1 file changed, 90 insertions(+), 283 deletions(-) diff --git a/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md b/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md index c2fb49f..f4efa00 100644 --- a/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md +++ b/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md @@ -1,4 +1,20 @@ -# Converting dotcloud.yml to cloudControl +# Converting dotcloud.yml to a cloudControl Procfile +Your dotcloud.yml build file is a good place to start when converting your dotCloud application to run on cloudControl. This is where you've defined what services you need and sometimes their settings as well. + +This document will show you what you need to know to convert a dotcloud.yml file to a Procfile on cloudControl. We’ll start with the most important differences between the two, then walk you through each section of a dotcloud.yml file with considerations for how to convert to cloudControl configurations. + +The structure of this document will mostly follow the [Build file documentation](http://docs.dotcloud.com/guides/build-file/) in the dotCloud docs. You should be familiar with that document (or all the parts of your dotcloud.yml file) to use this document. **It may help to have your dotcloud.yml file open while reading this so you can follow along**. + +## Services on dotCloud versus processes on cloudControl +To better understand the differences between the dotcloud.yml file and the Procfile on cloudControl, let’s back up a bit and talk about where the differences come from. + +dotCloud applications are built around several service types which you can define in the dotcloud.yml file. Each service runs different a process and has a different end point. This means that a single dotCloud application can combine, for example, a Ruby on Rails and a Python Flask implementation as two services in the same app. + +On cloudControl, each application runs one main process – a web process. Each app also has only one type that you define when you create the app – this depends on which language the app is written in, and determines which [buildpack](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile) will create the image for your deployments on the platform. + +To port apps with several different languages onto cloudControl, you’ll need to create several applications – one for each type. However, many dotCloud services that aren’t related to the code itself, such as databases, are handled as [Add-ons](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation) on cloudControl. These integrate directly with your application and don’t require you to create multiple applications. + +You can run several [workers](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) within a single application on cloudControl. These are handled as background processes of the application and use exactly the same runtime environment as the app. ### App structure on dotCloud ~~~text @@ -16,7 +32,6 @@ +---------------------+ +---------------------+ +--------------------------+ +---------------------+ ~~~ - ### App structure on cloudControl ~~~text +---------------------+ +--------------------------------------------------+ @@ -43,71 +58,17 @@ +---------------------+ ~~~ -For a better general understanding, an essential difference between -an application on dotcloud and an application on cloudControl should -be emphasized first. -In an application on dotcloud several service types can be defined with -different endpoints. Thus, for example, a dotcloud application can combine -a Ruby on Rails and a Python Flask implementation as two services. -In an application on cloudControl you can have multiple deployments of one -service type. And you can define only one web service per deployment. -To achieve the same on cloudControl you have to create several applications -for several service types. - -Your `dotcloud.yml` build file is a good place to start when -converting your dotCloud application to run on cloudControl. This is -where you've defined what services you need and sometimes their -settings as well. This document will walk you through each section of -a `dotcloud.yml` file with considerations for how to convert to -cloudControl configurations. The structure of this document will -mostly follow the [Build file -documentation](http://docs.dotcloud.com/guides/build-file/) in the -dotCloud docs. You should be familiar with that document (or all the -parts of your `dotcloud.yml` file) to use this document. - -Since the `dotcloud.yml` file also defines some of the build time -behavior, we will also compare the dotCloud and cloudControl build -processes. - -In the below document we will use the term "process" to refer to dotcloud "service", -since in a Procfile you can only define the command to start the -web process and multiple worker processes. - - -## Location - -Your `dotcloud.yml` file is located in the root of your source -tree. For example: - -``` -myapp/ -├── dotcloud.yml -├── admin/ (source code for adminstration backend) -└── frontend/ (source code for frontend) -``` - -You should open that file and read through it as you read through this -document. - -The corresponding file on cloudControl is the `Procfile`. The format -of the Procfile is much simpler than `dotcloud.yml` because most of -the configuration is handled through the `dcapp` CLI and -Buildpacks, but the basic idea is the same: list web and worker -processes in the deployment and define some behavior. - -You should create a new `Procfile` at the same level as your -`dotcloud.yml`. We'll talk about what to add to this file below. - - -## `dotcloud.yml` format - -Here is the example `dotcloud.yml` from the dotCloud -documentation. We'll walk through each section below. The sections of -your own `dotcloud.yml` may appear in a different order. - -``` +## dotcloud.yml versus the Procfile +The dotcloud.yml file corresponds to the Procfile on cloudControl. Just like the dotcloud.yml, it will be located in the root of your repository. The format of the Procfile is much simpler than dotcloud.yml because most of the configuration is handled through the dcapp CLI and the Buildpacks. The Procfile in a cloudControl application is simply used to determine how to start the actual application in the container – both the web and worker processes. + +You should create a new Procfile at the same level as your dotcloud.yml (in the root of your reposity). We'll talk about what to add to this file in the following sections. + +## dotcloud.yml format +Here is the example dotcloud.yml from the dotCloud documentation. We'll walk through each section below. The sections of your own dotcloud.yml may appear in a different order. + +~~~yaml # Required parameters for a service: service name and type -servicename1: # Any name up to 16 characters using a-z, 0-9 and _ +servicename1: # Any name up to 16 characters using a-z, 0-9 and _ type: ruby # Must be valid service type. servicename2: @@ -158,59 +119,50 @@ servicename2: requirements: # Defaults to empty list. - dependency_package_name_1 - dependency_package_2 -``` - -This shows two services, `servicename1` and `servicename2`. Each has a -type, and `servicename2` has a lot of other parameters related to it. +~~~ -For contrast, here is a similar `Procfile` with two Python services -instead of a mix of Ruby and Python. We'll talk about why that is -important in the *type* section below. +This shows two services, servicename1 and servicename2. Each has a type, and servicename2 has a lot of other parameters related to it. -Python celery example: +## Procfile format +For contrast, here is a sample Procfile for a Python Celery app: -``` +~~~bash web: celery flower --port=$PORT --broker=$CLOUDAMQP_URL --auth=$FLOWER_AUTH_EMAIL -worker: celery -A tasks worker --loglevel=info -``` +worker_a: celery -A tasks worker --loglevel=info +worker_b: python otherworker.py +~~~ + +Note that in the Procfile, only the web and worker processes are defined. Each line in the Procfile is actually a shell command that will run just like you define it. This means you can customize the start options for your processes here. + +## servicename and type +Your application on dotCloud can have multiple services, each with its own unique name that you define. On dotCloud, service names are fairly arbitrary. On cloudControl, services are handled quite differently because of how the platform is built. There are two types of processes on cloudControl, each of which is specifically defined: web processes, and worker processes. All other services are handled via [Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) and are not defined in the Procfile. + +### Type: (language) / web process +On cloudControl, each application is based around one main, language-specific web process. This is because the cloudControl platform uses Buildpacks – a language-specific set of scripts that builds the images for your apps based on the language you specify. + +As a result of this, **all the processes in a Procfile run in the same environment**. That means you can’t create servicename1 as a ruby type and servicename2 as a python type. **That's a big difference from a dotcloud.yml file**. If you need multiple languages in your project, you may need to create multiple applications. -## servicename, processes and names: A Little Magic +On cloudControl, you specify the language when you `dcapp APP_NAME create` the application. You can specify one of the predefined types (buildpacks): java, nodejs, php, python, ruby or custom. This will define the environment for the entire app. -Your application on dotCloud can have multiple services, each with its own -unique name. The same is true on cloudControl, where these are also known -as "processes". Where the service names on dotCloud are fairly arbitrary, on -cloudControl there is one magic name, `web`. +Once you’ve created the application, you need to set the web process and specify how it will be started by the shell. In the Procfile, this is an actual shell command. **The process with the name web will be the one which gets HTTP traffic**. -**A process with the name `web` will be the one which gets HTTP traffic.** -See the *ports* section below for more information. +### Type: (language)-worker / worker process +On cloudControl, you can define multiple workers in the Procfile that will run as background processes in that application. They use the exact same runtime environment as the web process. -Non-http services are treated as worker and the names can be arbitrary. +To use this functionality, you need to add the [Worker Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) to your app. -## type: Very Different on cloudControl +### Non-code services / Add-ons +In the dotcloud.yml file, you can define many different kinds of services within the app, including databases like MySQL, or other services like Redis. A Procfile on cloudControl only specifies your web and worker processes. This is very different from a dotcloud.yml file. -cloudControl does not provide services as we know them in dotCloud. -Since there is only one type for an entire Procfile, you -specify the type when you `dcapp create` the application. -You can specify one of the predefined types (buildpacks): -`java`, `nodejs`, `php`, `python`, `ruby` or `custom`. +On cloudControl, "Data Services" like MySQL and Redis, as well as many other types of services like logging, monitoring and even SSL, are handled outside of the Procfile with [Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons). You can simply add them to your web app in the CLI with `dcapp addon.add`. This automatically connects the services to your app. -In a `Procfile` the service name is actually called a "process type" -because the name can affect its behavior in the special case of -`web`. Procfiles don't actually have the idea of a `type` of service -**because all the services in a Procfile run in the same type of -environment**. That is, you cannot create `servicename1` as a `ruby` -type and `servicename2` as a `python` type. **That's a big difference -from a `dotcloud.yml` file.** If you need multiple languages in your -project, you may need to create multiple applications. +To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config). -### Running Code -In a `Procfile`, both `servicename1` and `servicename2` run in the -same language type and on the same code base. -If you only have one web process and the rest are workers, then -converting to a Procfile is trivial: +### Example dotcloud.yml to Procfile migration +In a Procfile, all processes run in the same language type and on the same code base. If the services in your dotCloud app only include one web process and one or more workers, then converting to a Procfile is trivial: -``` +~~~yaml servicename1: type: python @@ -219,217 +171,72 @@ servicename2: servicename3: type: rabbitmq -``` - +~~~ becomes (for a Python Celery app with a CloudAMQP Add-on for RabbitMQ): -``` +~~~yaml web: celery flower --port=$PORT --broker=$CLOUDAMQP_URL --auth=$FLOWER_AUTH_EMAIL worker: celery -A tasks worker --loglevel=info -``` - -The entry for the web or worker process will be executed as a shell commandline. - -> For more specific details, please see the porting guide specific to -Python or your language of choice. - -If you need to run some code in a mix of languages, e.g. Ruby and -Python (as in the example `dotcloud.yml` file above), then you will -need to create multiple applications with a different type or a single -application with a custom buildpack to install the languages you need. - -### Non-code services - -But what if some of your `type`s in your dotcloud.yml are not -programming languages? What if they are services like MySQL or Redis? +~~~ -**A `Procfile` only specifies the "code services" of your -application. This is very different from a `dotcloud.yml` file.** +The entry for the web or worker process will be executed as a shell command. -"Data Services" like MySQL and Redis, as well as many other types of -services like logging, monitoring, and even SSL are handled outside of -the `Procfile` with -[Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) -via `dcapp addon.add`. +For more specific details, please see the [porting guides](https://github.com/cloudControl/documentation/tree/master/Guides/dotCloud-cloudControl%20migration) specific to your language of choice. Please note that we will continually update these guides to include all of the languages officially supported on cloudControl. ## approot - -You may have used the `approot` directive in `dotcloud.yml` to tell -the platform where to find the code to run, but the cloudControl -`Procfile` lets you set this first command explicitly, so **you don't -need an `approot`**. If you need to change directory before running -your first statement, you can do that in the command of the -`Procfile`: - -``` +You may have used the approot directive in dotcloud.yml to tell the platform where to find the code to run, but the cloudControl Procfile lets you set this first command explicitly, so you don't need an approot. If you need to change directory before running your first statement, you can do that in the command of the Procfile: +~~~yaml web: cd myapproot; sh startapp.sh -``` - -(*myapproot* and *startapp.sh* are arbitrary names, just for example) - -For php based applications you have to change the approot in another way. -Since the php-scripts are executed by php-fpm you have to set the apache's -`DocumentRoot`, see [Manually Setting the DocumentRoot](https://github.com/cloudControl/buildpack-php#manually-setting-the-documentroot). +~~~ +(myapproot and startapp.sh are arbitrary names, just for example) -cloudControl processes do not have any magically-created directories -like the dotCloud services. There are neither `code` nor `current` -symbolic links. The root of your home directory has the same format -and contents as the directory which contained your `Procfile`. +If you want to change the approot for PHP-based applications, the process is slightly different. In this case, you’ll need to [manually set the Apache’s DocumentRoot](https://github.com/cloudControl/buildpack-php#manually-setting-the-documentroot). +cloudControl processes do not have any magically created directories like the dotCloud services. There are neither code nor current symbolic links. The root of your home directory has the same format and contents as the directory which contains your Procfile. ## prebuild, postbuild, postinstall: Build Hooks +### prebuild and postbuild scripts +The officially supported Buildpacks on cloudControl consist of a standard set of scripts that are run when the deployment image is being built. Because of this, prebuild and postbuild hooks are not natively supported. -If you are using a `prebuild` or `postbuild` script in your -`dotcloud.yml`, that could mean you need to create [your own -Buildpack](https://www.cloudcontrol.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). -You can write a Buildpack from scratch, or you can compose multiple -Buildpacks together (using [a third party meta-buildpack](https://github.com/ddollar/heroku-buildpack-multi)). In -any case, a Buildpack will enable you to create your own custom -service type with the software you want pre-installed (like a -`prebuild` script) and any build and post-build compilation steps you -need (like your `postbuild` script). +If you have applications on dotCloud that use prebuild and postbuild hooks, it’s worthwhile to try pushing and deploying them using one of the officially supported Buildpacks first. The stack may already have the components you need installed and it may work out of the box. -If you have a `postinstall` script, you can run the same step as part -of your Procfile command, e.g. Procfile: +If not, you may need make modifications to a standard buildpack and use it as a [custom Buildpack](https://www.cloudcontrol.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). First download the Buildpack for your app’s language type from [cloudControl’s public Github repo](https://github.com/cloudControl?query=buildpack) and modify the `bin/compile` script according to your needs. (Keep in mind that only the `/app` folder is writeable, so you can’t use the Ubuntu package manager to install libraries.) Upload your new custom Buildpack to a public non-ssh git repository, and create your application with the apptype `custom --buildpack BUILDPACK_URL`. -``` -web: cd myapproot; postinstall.sh; sh startapp.sh -``` +### postinstall scripts +If you have a postinstall script, you can run the same step as part of your Procfile command, e.g. Procfile: +~~~yaml +web: sh postinstall.sh; sh startapp.sh +~~~ ## systempackages - -Like `prebuild` and `postbuild` scripts, a `systempackages` section in -your `dotcloud.yml` file probably means you need to create your own -Buildpack. A custom Buildpack will enable you to set up the software -you need, though you may not be able to install it using `apt-get` -(which is how `systempackages` items get installed). You might need to -include the source code or binaries as part of your Buildpack. For this -you want to create a [custom Buildpack](https://www.cloudcontrol.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). -Depending on your application's language download the accordingly Buildpack from [github cloudControl](https://github.com/cloudControl?query=buildpack) -and change the `bin/compile` script according to your needs (keep in mind -that only the `/app` folder is writeable so `apt-get install` will fail). -Upload the Buildpack to a public non-ssh git repository, and create your -application with the apptype `custom --buildpack BUILDPACK_URL` +Like prebuild and postbuild scripts, a systempackages section in your dotcloud.yml file may mean you need to modify a buildpack. See the above section on prebuild and postbuild scripts on how to create a custom buildpack. ## config +There are a couple of ways to migrate your dotcloud.yml config section, depending on what you are configuring. -There are a couple of replacements for a dotCloud `config` section, -depending on what needs configuring. Some configuration options may be -handled explicitly by the type of service -- you should read the -documentation for the Buildpack you're using. The cloudControl -buildpacks are [available on -GitHub](https://github.com/cloudcontrol?query=buildpack). For example, -you can specify the Python version to use by creating a `runtime.txt` -file to replace your `dotcloud.yml config: python_version`. - -If your configuration could be replaced by setting an environment -variable, you can do that with the CLI: `dcapp APP_NAME config.add`. Please read -[the -Add-on documentation](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) -and our [dedicated guide](TODO-ADD-ENVS-GUIDE) on this topic. +If you’re using the config section to specify an interpreter version (e.g. Python 2.6 vs. Python 2.7), check the [cloudControl buildpack documentation on Github](https://github.com/cloudcontrol?query=buildpack) for how to do this with your specific buildpack. For example, you can specify the Python version by creating a runtime.txt file to replace your dotcloud.yml config: python_version. -## ports +If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on cloudControl using the [Custom Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. -If you have a `ports` section in your `dotcloud.yml` then hopefully -you only have one port listed, a single `http` type port. That is the -only kind of port allowed on the cloudControl PaaS. You can only have -one process which listens to an HTTP port. This is pretty common for -`custom` type apps on dotCloud. +For more information, read our guide on [migrating environment variables](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) from dotCloud to cloudControl. -If you do have multiple services each with their own HTTP port, then -you should consider how to either separate these into different -applications or how to access each different function via a different -URL path (e.g. if you used to have an "admin" interface as well as a -public interface, move your "admin" interface to be part of your -public interface on another path, like "www.example.com/admin"). +## ports +If you have a ports section in your dotcloud.yml then you should only have one port listed, a single http type port. That is the only kind of port allowed on the cloudControl PaaS. You can only have one process which listens to an HTTP port. + +If you do have multiple services each with their own HTTP port, then you should consider how to either separate these into different applications or how to access each different function via a different URL path (e.g. if you used to have an "admin" interface as well as a public interface, move your "admin" interface to be part of your public interface on another path, like "www.example.com/admin"). -Note that cloudControl containers do not expose an SSH port. See the -[Secure Shell docs](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#secure-shell-ssh). +Note that cloudControl containers do not expose an SSH port. See the [Secure Shell docs](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#secure-shell-ssh). ## environment +If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on cloudControl. Please read the [Add-on documentation](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and our [dedicated guide](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) on this topic. -If you were setting environment variables in your `dotcloud.yml` then -you should instead set these via `dcapp APP_NAME config.add`. Please read -[the -Add-on documentation](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) -and our [dedicated guide](TODO-ADD-ENVS-GUIDE) on this topic. - -Note that the same variables get set in all your services (web and worker) -- you -cannot specify that a variable should only be set on one service (as -you could in a `dotcloud.yml` file). - -## process - -If your `dotcloud.yml` file includes a `process` or `processes` -section, you will probably need to install `supervisor` so that you -can run multiple processes. Other process managers are usable too, -like foreman (written in Ruby), but if you're coming from the dotCloud -environment, you're probably already familiar with `supervisor` -(written in Python). - -Each service on the dotCloud platform could generally rely on the -presence of [`supervisord`](http://supervisord.org/) so it can start -up multiple processes in the same service. Typical cloudControl apps -only run one process per service. **But you can install supervisord** -yourself. This is especially easy on `python` type applications, -though you could add `python` and `pip` with your own Buildpack if -necessary. On a `python` type application, you can install supervisor -by adding this to your `requirements.txt` file: - -``` -supervisor -supervisor-stdout -``` - -Then you'll need to add a `supervisor.conf` file which lists each of the -processes you had in your `dotcloud.yml`. - -Note that the dotCloud PaaS code services often ran both `supervisor` -and `nginx`. `nginx` was typically started by `init.d` and so was not -explicitly controllable by you, but on cloudControl you can run nginx -as another process under `supervisor` if you wish. This gets you -pretty close to a dotCloud environment on cloudControl. +Note that the same variables are set in all your application processes (web and worker) -- you cannot specify that a variable should only be set on one process (as you could in a dotcloud.yml file). ## requirements - On the dotCloud platform, a `requirements` section can help install additional dependencies of your application during build time (after `dotcloud push`). On cloudControl you should use the mechanism provided by your Buildpack. -### Python - -The Python Buildpack expects a `requirements.txt` file in your root -directory (same level as the `Procfile`). This file contains all of -your deployment dependencies. - -This is how a `requirements.txt` file might look like: - -~~~ -tornado==3.2 -pymongo==2.6.3 -suds==0.4 -newrelic==2.16.0.12 -logentries==0.2.1 -~~~ - -You can generate this file automatically by using the `pip freeze` command. -This will read the installed packages in the current environments and -print them out. You can store this output directly into your `requirements.txt` -file with: - -~~~bash -$ pip freeze > requirements.txt -~~~ - -### Other buildpacks - -Buildpack| Required file ---------:|-------------- -Ruby | `Gemfile` -PHP | `composer.json` -Node.js | `package.json` -Java | `pom.xml` - -For more information on all supported languages, please check our [Guides](TODO-ADD-LINK-TO-GUIDES). +For more information on all supported languages, please check our [Guides](https://github.com/cloudControl/documentation/tree/master/Guides). From b6ced237f279ded6158c8369dba77066e2a32a2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 27 Nov 2014 14:47:28 +0100 Subject: [PATCH 07/84] Remove references to Bazaar --- Platform Documentation.md | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index 67d159d..c62f372 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -91,7 +91,7 @@ You can [reset your password], in case you forgot it. * Applications (apps) have a repository, deployments and users. * The repository is where your code lives, organized in branches. - * A deployment is a running version of your application, based on the branch with the same name. Exception: the default deployment is based on the master (Git) / trunk (Bazaar). + * A deployment is a running version of your application, based on the branch with the same name. Exception: the default deployment is based on the master branch. * Users can be added to apps to gain access to the repository, branches and deployments. cloudControl PaaS uses a distinct set of naming conventions. To understand how to work with the platform effectively, it's important to understand the following few basic concepts. @@ -189,7 +189,7 @@ $ cctrluser key.remove Dohyoonuf7 ### Deployments A deployment is the running version of one of your branches made accessible via a [provided subdomain](#provided-subdomains-and-custom-domains). -It is based on the branch of the same name. Exception: the default deployment is based on the master (Git) / trunk (Bazaar). +It is based on the branch of the same name. Exception: the default deployment is based on the master branch. Deployments run independently from each other, including separate runtime environments, file system storage and Add-ons (e.g. databases and caches). This allows you to have different versions of your app running at the same time without interfering with each other. @@ -216,29 +216,10 @@ App **TL;DR:** - * Git and Bazaar are supported. + * Git is the supported VCS. * When you push an updated branch, an image of your code gets built, ready to be deployed. * Image sizes are limited to 200MB (compressed). Use a `.cctrlignore` file to exclude development assets. -### Supported Version Control Systems - -The platform supports Git ([quick Git tutorial]) and Bazaar ([Bazaar in five minutes]). When you create an app we try to determine if the current working directory has a .git or .bzr directory. If it does, we create the app with the detected version control system. If we can't determine this based on the current working directory, Git is used as the default. You can always overwrite this with the --repo command line switch. - -~~~ -$ cctrlapp APP_NAME create php [--repo [git,bzr]] -~~~ - -It's easy to tell what version control system an existing app uses based on the repository URL provided as part of the app details. - -~~~ -$ cctrlapp APP_NAME details -App - Name: APP_NAME Type: php Owner: user1 - Repository: ssh://APP_NAME@cloudcontrolled.com/repository.git - [...] -~~~ -If yours starts with `ssh://` and ends with `.git` then Git is being used. If it starts with `bzr+ssh://`, Bazaar is being used. - ### Image Building Whenever you push an updated branch, a deployment image is built automatically. @@ -256,9 +237,6 @@ $ cctrlapp APP_NAME/dev push # with git: $ git remote add cctrl REPO_URL $ git push cctrl dev - -# with bzr: -$ bzr push --remember REPO_URL ~~~ The repositories support all other remote operations like pulling and cloning as well. @@ -306,7 +284,7 @@ The cloudControl platform supports zero downtime deploys for all deployments. To $ cctrlapp APP_NAME/DEP_NAME deploy ~~~ -To deploy a specific version, append your version control systems identifier (full commit-SHA1 for Git or an integer for Bazaar). +To deploy a specific version, append your version control systems identifier (full commit-SHA1). If not specified, the version to be deployed defaults to the latest image available (the one built during the last successful push). For every deploy, the image is downloaded to as many of the platform’s nodes as required by the [--containers setting](#scaling) and started according to the buildpack’s default or the [Procfile](#buildpacks-and-the-procfile). @@ -381,7 +359,7 @@ Sometimes you have environment specific configuration, e.g. to enable debugging * **TMPDIR**: The path to the tmp directory. * **CRED_FILE**: The path of the creds.json file containing the Add-on credentials. - * **DEP_VERSION**: The Git or Bazaar version the image was built from. + * **DEP_VERSION**: The Git version the image was built from. * **DEP_NAME**: The deployment name in the same format as used by the command line client. E.g. myapp/default. This one stays the same even when undeploying and creating a new deployment with the same name. * **DEP_ID**: The internal deployment ID. This one stays the same for the deployments lifetime but changes when undeploying and creating a new deployment with the same name. * **WRK_ID**: The internal worker ID. Only set for worker containers. @@ -877,7 +855,6 @@ $ cctrlapp APP_NAME/DEP_NAME deploy --stack [luigi,pinky] [Python 2.6+]: http://python.org/download/ [reset your password]: https://api.cloudcontrol.com/reset_password/ [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ -[Bazaar in five minutes]: http://doc.bazaar.canonical.com/latest/en/mini-tutorial/ [Heroku buildpack API]: https://devcenter.heroku.com/articles/buildpack-api [guides]: https://www.cloudcontrol.com/dev-center/Guides [MongoLab Add-on]: https://www.cloudcontrol.com/add-ons/mongolab From 1d0c3ae62297a783e775597c98a0132c1f9a4908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 27 Nov 2014 14:59:18 +0100 Subject: [PATCH 08/84] Remove references to Luigi --- Add-on Documentation/Data Processing/Worker.md | 2 +- Guides/PHP/Kohana 3.2.0.md | 3 +-- Guides/PHP/Symfony 1.4.md | 4 +--- Guides/PHP/Yii 1.1.10.md | 9 ++++----- Guides/PHP/Zend Framework 1.11.md | 8 ++++---- Platform Documentation.md | 12 +++--------- 6 files changed, 14 insertions(+), 24 deletions(-) diff --git a/Add-on Documentation/Data Processing/Worker.md b/Add-on Documentation/Data Processing/Worker.md index f09f866..7e1a883 100644 --- a/Add-on Documentation/Data Processing/Worker.md +++ b/Add-on Documentation/Data Processing/Worker.md @@ -30,7 +30,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.add worker.single Workers can be started via the command line client's worker.add command. -For the Luigi stack (only supporting PHP), use the PHP filename as the `WORKER_NAME`. But for apps on the Pinky stack, first specifiy how to start the worker by adding a new line to your app's `Procfile` and then use that as the `WORKER_NAME`. +To specify how to start the worker by adding a new line to your app's `Procfile` and then use that as the `WORKER_NAME`. ~~~ $ cctrlapp APP_NAME/DEP_NAME worker.add WORKER_NAME [WORKER_PARAMS] diff --git a/Guides/PHP/Kohana 3.2.0.md b/Guides/PHP/Kohana 3.2.0.md index b3ae78c..c7c2f90 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -117,8 +117,7 @@ Note the following lines: INFO: Kohana Framework detected INFO: Required directory missing, creating 'application/cache'. - -Beginning with the **luigi** stack, a number of PHP frameworks, including Kohana, are auto-detected handling some of the deployment work for us, such as clearing/creating the cache directory. + ##4. Initialise the Required Addons diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index b5f6419..881d99b 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -121,9 +121,7 @@ In the previous version of the cloudControl platform, you would have had to have BaseConfig: WebContent: /web - -However, beginning with the **luigi** stack, that's a thing of the past for a number of PHP frameworks, including Symfony 1.x because it auto-detects it and handles this for us. - + ##4. Initialise the Required Add-ons Now that that's done, we need to configure two add-ons, config and mysqls. The config Add-on is required for determining the active environment and mysqls for storing our session and logging information. diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index 4aae5f4..26f6392 100644 --- a/Guides/PHP/Yii 1.1.10.md +++ b/Guides/PHP/Yii 1.1.10.md @@ -89,12 +89,11 @@ Now, we need to make our first deployment of both branches to the cloudControl p // deploy the default branch cctrlapp cloudcontroldlyii/default push - cctrlapp cloudcontroldlyii/default deploy --stack luigi + cctrlapp cloudcontroldlyii/default deploy // deploy the testing branch cctrlapp cloudcontroldlyii/testing push - cctrlapp cloudcontroldlyii/testing deploy --stack luigi - + cctrlapp cloudcontroldlyii/testing deploy You should see output as below: $ cctrlapp cloudcontroldlyii/default push @@ -316,14 +315,14 @@ Now that that's done, commit the changes we made earlier and push and deploy bot // deploy the default branch cctrlapp cloudcontroldlyii/default push - cctrlapp cloudcontroldlyii/default deploy --stack luigi + cctrlapp cloudcontroldlyii/default deploy git checkout testing git merge master // deploy the testing branch cctrlapp cloudcontroldlyii/testing push - cctrlapp cloudcontroldlyii/testing deploy --stack luigi + cctrlapp cloudcontroldlyii/testing deploy ##7. Review the Deployment diff --git a/Guides/PHP/Zend Framework 1.11.md b/Guides/PHP/Zend Framework 1.11.md index dafec51..41a38df 100644 --- a/Guides/PHP/Zend Framework 1.11.md +++ b/Guides/PHP/Zend Framework 1.11.md @@ -94,11 +94,11 @@ Now, we need to make our first deployment of both branches to the cloudControl p // deploy the default branch cctrlapp cloudcontroldlzf/default push - cctrlapp cloudcontroldlzf/default deploy --stack luigi + cctrlapp cloudcontroldlzf/default deploy // deploy the testing branch cctrlapp cloudcontroldlzf/testing push - cctrlapp cloudcontroldlzf/testing deploy --stack luigi + cctrlapp cloudcontroldlzf/testing deploy You'll see output similar to the following: @@ -455,14 +455,14 @@ Now that that's done, commit the changes we made earlier and push and deploy bot // deploy the default branch cctrlapp cloudcontroldlzf/default push - cctrlapp cloudcontroldlzf/default deploy --stack luigi + cctrlapp cloudcontroldlzf/default deploy git checkout testing git merge master // deploy the testing branch cctrlapp cloudcontroldlzf/testing push - cctrlapp cloudcontroldlzf/testing deploy --stack luigi + cctrlapp cloudcontroldlzf/testing deploy ##7. Review the Deployment diff --git a/Platform Documentation.md b/Platform Documentation.md index c62f372..de76f6f 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -822,7 +822,7 @@ Connection to ssh.cloudcontrolled.net closed. * Stacks define the common runtime environment. * They are based on Ubuntu and stack names match the Ubuntu release's first letter. - * Luigi supports only PHP. Pinky supports multiple languages according to the available [buildpacks](#buildpacks-and-the-procfile). + * Pinky is the current stack and supports multiple languages according to the available [buildpacks](#buildpacks-and-the-procfile). A stack defines the common runtime environment for all deployments using it. By choosing the same stack for all your deployments, it's guaranteed that all your deployments find the same version of all OS components as well as all preinstalled libraries. @@ -830,22 +830,16 @@ Stacks are based on Ubuntu releases and have the same first letter as the releas ### Available Stacks - * **Luigi** based on [Ubuntu 10.04 LTS Lucid Lynx] * **Pinky** based on [Ubuntu 12.04 LTS Precise Pangolin] -You can change the stack per deployment. This is handy for testing new stacks before migrating the production deployment. Details are available via the `cctrlapp` command line interface. +Details about the current stack are available via the `cctrlapp` command line interface. ~~~ $ cctrlapp APP_NAME/DEP_NAME details name: APP_NAME/DEP_NAME - stack: luigi + stack: pinky [...] ~~~ -To change the stack of a deployment simply append the --stack command line option to the `deploy` command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME deploy --stack [luigi,pinky] -~~~ [generating SSH keys]: https://help.github.com/articles/generating-ssh-keys [Custom Config Add-on]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config From b0339d00590ac5dd4365befd8ee5ae7bac7c7b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 27 Nov 2014 15:48:20 +0100 Subject: [PATCH 09/84] Remove references to caching loadbalancer --- Platform Documentation.md | 168 +++++++++++++++++++++----------------- 1 file changed, 91 insertions(+), 77 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index de76f6f..5ea8fef 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -13,7 +13,7 @@
  • Provided Subdomains and Custom Domains
  • Routing Tier
  • Scaling
  • -
  • Performance & Caching
  • +
  • Performance
  • WebSockets
  • Scheduled Jobs and Background Workers
  • Secure Shell (SSH)
  • @@ -522,16 +522,26 @@ From now on all the new logs should be visible in your custom syslog remote. **TL;DR:** - * Each deployment is provided with both a `*.cloudcontrolled.com` and `*.cloudcontrolapp.com` subdomain. + * Each deployment is provided with a `cloudcontrolapp.com` subdomain. * Custom domains are supported via the Alias Add-on. -Each deployment is provided per default with both a `*.cloudcontrolled.com` and `*.cloudcontrolapp.com` subdomain. The `APP_NAME.cloudcontrolled.com` or `APP_NAME.cloudcontrolapp.com` will point to the `default` deployment while any additional deployment can be accessed with a prefixed subdomain: `DEP_NAME-APP_NAME.cloudcontrolled.com` or `DEP_NAME-APP_NAME.cloudcontrolapp.com`. +Each deployment is provided per default with a `*.cloudcontrolapp.com` subdomain. +The `APP_NAME.cloudcontrolapp.com` will point to the `default` deployment while +any additional deployment can be accessed with a prefixed subdomain: `DEP_NAME-APP_NAME.app.exo.io`. -You can also use custom domains to access your deployments. To add a domain like `www.example.com`, `app.example.com` or `secure.example.com` to one of your deployments, simply add each one as an alias and add a CNAME for each pointing to your deployment's subdomain. So to point `www.example.com` to the default deployment of the app called *awesomeapp*, add a CNAME for `www.example.com` pointing to `awesomeapp.cloudcontrolled.com` or `awesomeapp.cloudcontrolapp.com`. The [Alias Add-on] also supports mapping wildcard domains like `*.example.com` to one of your deployments. +You can also use custom domains to access your deployments. To add a domain +like `www.example.com`, `app.example.com` or `secure.example.com` to one of your +deployments, simply add each one as an alias and add a CNAME for each pointing to +your deployment's subdomain. So to point `www.example.com` to the default deployment +of the app called *awesomeapp*, add a CNAME for `www.example.com` pointing to `awesomeapp.cloudcontrolapp.com`. +The [Alias Add-on] also supports mapping wildcard domains like `*.example.com` to one +of your deployments. -All custom domains need to be verified before they start working. To verify a domain, it is required to also add the cloudControl verification code as a TXT record. +All custom domains need to be verified before they start working. To verify a domain, +it is required to also add the exoscale verification code as a TXT record. -Changes to DNS can take up to 24 hours until they have effect. Please refer to the Alias Add-on Documentation for detailed instructions on how to setup CNAME and TXT records. +Changes to DNS can take up to 24 hours until they have effect. Please refer to the +Alias Add-on Documentation for detailed instructions on how to setup CNAME and TXT records. ### Root Domains @@ -555,26 +565,31 @@ root to the configured subdomain (e.g. example.org -> www.example.org). **TL;DR:** * All HTTP requests are routed via our routing tier. - * Within the routing tier, you can choose to route requests via the `*.cloudcontrolled.com` or `*.cloudcontrolapp.com` subdomains. - * The `*.cloudcontrolled.com` subdomain provides support for HTTP caching via Varnish. + * Within the routing tier, requests are routed via the `*.cloudcontrolapp.com` subdomain. * The `*.cloudcontrolapp.com` subdomain provides WebSocket support. * Requests are routed based on the `Host` header. * Use the `X-Forwarded-For` header to get the client IP. -All HTTP requests made to apps on the platform are routed via our routing tier. The routing tier is designed as a cluster of reverse proxy loadbalancers which orchestrate the forwarding of user requests to your applications. It takes care of routing the request to one of the application's containers based on matching the `Host` header against the list of the deployment's aliases. This is accomplished via the `*.cloudcontrolled.com` or `*.cloudcontrolapp.com` subdomains. +All HTTP requests made to apps on the platform are routed via our routing tier. +The routing tier is designed as a cluster of reverse proxy loadbalancers which +orchestrate the forwarding of user requests to your applications. It takes care +of routing the request to one of the application's containers based on matching +the `Host` header against the list of the deployment's aliases. This is accomplished +via the `*.cloudcontrolapp.com` subdomain. -The routing tier is designed to be robust against single node and even complete datacenter failures while still keeping the added latency as low as possible. +The routing tier is designed to be robust against single node and even complete +datacenter failures while still keeping the added latency as low as possible. ### SSL Transport Layer Security (TLS / SSL) is available to encrypt traffic between users and applications. -As part of the provided `.cloudcontrolled.com` subdomain, all deployments have -access to piggyback SSL using a `*.cloudcontrolled.com` wildcard certificate. +As part of the provided `.cloudcontrolapp.com` subdomain, all deployments have +access to piggyback SSL using a `*.cloudcontrolapp.com` wildcard certificate. To use this, simply point your browser to: -* `https://APP_NAME.cloudcontrolled.com` for the default deployment -* `https://DEP_NAME-APP_NAME.cloudcontrolled.com` for non-default deployments +* `https://APP_NAME.cloudcontrolapp.com` for the default deployment +* `https://DEP_NAME-APP_NAME.cloudcontrolapp.com` for non-default deployments Please note the **dash** between DEP_NAME and APP_NAME. @@ -586,27 +601,34 @@ found in the [SSL add-on documentation](https://www.cloudcontrol.com/dev-center/ ### Elastic Addresses -Because of the elastic nature of the routing tier, the list of routing tier addresses can change at any time. It is therefore highly discouraged to point custom domains directly to any of the routing tier IP addresses. Please use a CNAME instead. Refer to the [custom domain section](#provided-subdomains-and-custom-domains) for more details on the correct DNS configuration. +Because of the elastic nature of the routing tier, the list of routing tier addresses +can change at any time. It is therefore highly discouraged to point custom domains +directly to any of the routing tier IP addresses. Please use a CNAME instead. Refer to +the [custom domain section](#provided-subdomains-and-custom-domains) for more details +on the correct DNS configuration. ### Remote Address -Given that client requests don't hit your application directly, but are forwarded via the routing tier, you can't access the client's IP by reading the remote address. The remote address will always be the internal IP of one of the routing nodes. To make the origin remote address available, the routing tier sets the `X-Forwarded-For` header to the original client's IP. +Given that client requests don't hit your application directly, but are forwarded via +the routing tier, you can't access the client's IP by reading the remote address. The +remote address will always be the internal IP of one of the routing nodes. To make the +origin remote address available, the routing tier sets the `X-Forwarded-For` header to +the original client's IP. ### Reverse Proxy timeouts -Our routing tier uses a cluster of reverse proxy loadbalancers to manage the acceptance and forwarding of user requests to your applications. To do this in an efficient way, we set strict timeouts to the read/ write operations. The values differ slightly between the `*.cloudcontrolled.com` and `*.cloudcontrolapp.com` subdomains. You can find them below. +Our routing tier uses a cluster of reverse proxy loadbalancers to manage the acceptance and +forwarding of user requests to your applications. To do this in an efficient way, we set +strict timeouts to the read/ write operations. You can find them below. - * __Connect timeout__ - time within a connection to your application has to be established. If your containers are up, but hanging, then this timeout will not apply as the connection to the endpoints has already been made. - * __Send timeout__ - maximum time between two write operations of a request. If your application does not take new data within this time, the routing tier will shut down the connection. - * __Read timeout__ - time to retrieve a response from your application. It determines how long the routing tier will wait to get the response to a request. The timeout is established not for an entire response, but only between two operations of reading. - -#### Timeouts for `*.cloudcontrolled.com` subdomain: - -|Parameter|Value [s]| -|:---------|:----------:| -|Connect timeout|60| -|Send timeout|60| -|Read timeout|120| + * __Connect timeout__ - time within a connection to your application has to be established. + If your containers are up, but hanging, then this timeout will not apply as the connection to + the endpoints has already been made. + * __Read timeout__ - time to retrieve a response from your application. It determines how long + the routing tier will wait to get the response to a request. The timeout is established not + for an entire response, but only between two operations of reading. + * __Send timeout__ - maximum time between two write operations of a request. If your application + does not take new data within this time, the routing tier will shut down the connection. #### Timeouts for `*.cloudcontrolapp.com` subdomain: @@ -618,23 +640,36 @@ Our routing tier uses a cluster of reverse proxy loadbalancers to manage the acc ### Requests distribution -Our smart [DNS](https://en.wikipedia.org/wiki/Domain_Name_System) provides a fast and reliable service resolving domain names in a round robin fashion. All nodes are equally distributed to the three different availability zones but can route requests to any container in any other availability zone. To keep latency low, the routing tier tries to route requests to containers in the same availability zone unless none are available. Deployments running on --containers 1 (see the [scaling section](#scaling) for details) only run on one container and therefore are only hosted in one availability zone. +Our smart [DNS](https://en.wikipedia.org/wiki/Domain_Name_System) provides a fast and reliable +service resolving domain names in a round robin fashion. All nodes are equally distributed to +the three different availability zones but can route requests to any container in any other +availability zone. To keep latency low, the routing tier tries to route requests to containers +in the same availability zone unless none are available. Deployments running on --containers 1 +(see the [scaling section](#scaling) for details) only run on one container and therefore are +only hosted in one availability zone. ### High Availability -The routing tier provides two mechanisms to ensure high availability, depending on the provided subdomain. These are Failover (for the `*.cloudcontrolled.com` subdomain) and Health Checker (for the `*.cloudcontrolapp.com` subdomain). Because these mechanisms depend on having multiple containers available to route requests, only deployments with more than one container running (see the [scaling section](#scaling) for details) can take advantage of high availability. - -In the event of a single node or container failure, the platform will start a replacement container. Deployments running on --containers 1 will be unavailable for a few minutes while the platform starts the replacement. To avoid even short downtimes, set the --containers option to at least 2. +The routing tier provides a Health Checker to ensure high availability. Because this mechanism +depends on having multiple containers available to route requests, only deployments with more +than one container running (see the [scaling section](#scaling) for details) can take advantage +of high availability. -#### `*.cloudcontrolled.com` subdomain +In the event of a single node or container failure, the platform will start a replacement container. +Deployments running on --containers 1 will be unavailable for a few minutes while the platform starts +the replacement. To avoid even short downtimes, set the --containers option to at least 2. -For the `*.cloudcontrolled.com` subdomain, failed requests are automatically re-routed to alternate containers via a failover mechanism. Requests will be retried with a different container within the set timeouts. It will also ensure the next request is not sent to the slow/faulty container for a given amount of time. +#### Health Checker -#### `*.cloudcontrolapp.com` subdomain +For the `*.cloudcontrolapp.com` subdomain, failed requests will cause an error message to be returned to +the user once, but the "unhealthy" container will be actively monitored by a health checker. This signals +the routing tier to temporarily remove the unhealthy container from the list of containers receiving requests. +Subsequent requests are routed to an available container of the deployment. Once the health checker notices +that the container has recovered, the container will be re-included in the list to receive requests. -For the `*.cloudcontrolapp.com` subdomain, failed requests will cause an error message to be returned to the user once, but the "unhealthy" container will be actively monitored by a health checker. This signals the routing tier to temporarily remove the unhealthy container from the list of containers receiving requests. Subsequent requests are routed to an available container of the deployment. Once the health checker notices that the container has recovered, the container will be re-included in the list to receive requests. - -Because the health checker actively monitors containers where an application is running into timeouts or returning [http error codes](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5) `501`, `502` or `greater 503`, you may see requests to `/CloudHealthCheck` coming from a `cloudControl-HealthCheck` agent. +Because the health checker actively monitors containers where an application is running into timeouts or +returning [http error codes](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5) `501`, `502` +or `greater 503`, you may see requests to `/CloudHealthCheck` coming from a `cloudControl-HealthCheck` agent. ## Scaling @@ -662,47 +697,18 @@ In addition to controlling the number of containers you can also specify the mem You can use the [Blitz.io] and [New Relic Add-ons] to run synthetic load tests against your deployments and analyze how well they perform with the current --containers and --memory settings under expected load to determine the optimal scaling settings and adjust accordingly. We have a [tutorial] that explains this in more detail. -## Performance & Caching +## Performance **TL;DR:** * Reduce the total number of requests that make up a page view. - * Cache as far away from your database as possible. - * Try to rely on cache breakers instead of flushing. ### Reducing the Number of Requests -Perceived web application performance is mostly influenced by the frontend. It's very common that the highest optimization potential lies in reducing the overall number of requests per page view. One common technique to accomplish this is combining and minimizing javascript and css files into one file each and using sprites for images. - -### Caching Early - -After you have reduced the total number of requests, it's recommended to cache as far away from your database as possible. Using far-future `expires` headers avoids that browsers request resources at all. The next best way of reducing the number of requests that hit your containers is to cache complete responses in the loadbalancer. For this we offer caching directly in the routing tier. - -#### Caching Proxy - -The routing tier that is in front of all deployments includes a [Varnish] caching proxy. To use this feature, it is necessary to use the `*.cloudcontrolled.com` subdomain. To have your requests cached directly in Varnish and speed up the response time through this, ensure you have set correct [cache control headers](http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html) (`Cache-Control`, `Expires`, `Age`) for the request. Also, ensure that the request does not include a cookie. Cookies are often used to keep state across requests (e.g. if a user is logged in). To avoid caching responses for logged-in users and returning them to other users, Varnish is configured to never cache requests with cookies. - -To be able to cache requests in Varnish for apps that rely on cookies, we recommend using a [cookieless domain](http://www.ravelrumba.com/blog/static-cookieless-domain/). In this case, you have to register a new domain and configure your DNS database with a `CNAME` record that points to your `APP_NAME.cloudcontrolled.com` subdomain `A` record. Then you can update your web application's configuration to serve static resources from your new domain. - -You can check if a request was cached in Varnish by checking the response's *X-varnish-cache* header. The value HIT means the respons was answered directly from the cache, and MISS means it was not. - -#### In-Memory Caching - -To speed up requests that can't use a cookieless domain, you can use in-memory caching to store arbitrary data from database query results to complete http responses. Since the cloudControl routing tier distributes requests across all available containers, it is recommended to cache data in a way that the cache is also available for requests that are routed to different containers. A battle-tested solution for this is Memcached, which is available via the [MemCachier Add-on]. Refer to the [managing Add-ons](#managing-add-ons) section on how to add it. In addition the [MemCachier Documentation] has detailed instructions on how to use it for your language and framework of choice. - -### Cache Breakers - -When caching requests on client side or in a caching proxy, the URL is usually used as the cache identifier. As long as the URL stays the same and the cached response has not expired, the request is answered from cache. As part of every deployment, all containers are started from a clean image. This ensures that all containers have the latest app code including templates, css, image and javascript files. However, when using far-future `expires` headers as recommended above, this doesn't change anything if the response was cached at client or loadbalancer level. To ensure clients get the latest and greatest version, it is recommend to include a changing parameter into the URL. This is commonly referred to as a cache breaker. - -The [environment variables](#environment-variables) of the deployment runtime environment contain the DEP_VERSION of the app. If you want to force a refresh of the cache when a new version is deployed you can use the DEP_VERSION to accomplish this. - -This technique works for URLs as well as for the keys in in-memory caches like `Memcached`. -Imagine you have cached values in Memcached that you want to keep between deploys and have values in Memcached that you want refreshed for each new version. Since Memcached only allows flushing the complete cache, you would lose all cached values. -Including the DEP_VERSION in the key is an easy way to ensure that the cache is clear for a new version without flushing. - -### Caching in cloudcontrolapp.com subdomain - -Requests via the `*.cloudcontrolapp.com` subdomain cannot be cached in the routing tier. However, it is still possible to provide caching for static assets by utilizing a separate cookieless domain as a CNAME of the `*.cloudcontrolled.com`subdomain. For example, you can serve the dynamic requests of your application via www.example.com (a CNAME FOR `example.cloudcontrolapp.com`) and serve the static assets like CSS, JS and images via `static.example.com` (a CNAME for `example.cloudcontrolled.com`). +Perceived web application performance is mostly influenced by the frontend. It's very common +that the highest optimization potential lies in reducing the overall number of requests per +page view. One common technique to accomplish this is combining and minimizing javascript and +css files into one file each and using sprites for images. ## WebSockets @@ -741,19 +747,28 @@ Please note that Secure WebSockets connections can only be established using `*. **TL;DR:** - * Web requests are subject to a time limit of 120s. + * Web requests are subject to a time limit of 55s. * Scheduled jobs are supported through different Add-ons. * Background workers are the recommended way of handling long running or asynchronous tasks. -Since a web request taking longer than 120s is killed by the routing tier, longer running tasks have to be handled asyncronously. +Since a web request taking longer than 55s is killed by the routing tier, longer +running tasks have to be handled asyncronously. ### Cron -For tasks that are guaranteed to finish within the time limit, the [Cron add-on] is a simple solution to call a predefined URL daily or hourly and have that task called periodically. For a more detailed documentation on the Cron Add-on, please refer to the [Cron Add-on documentation]. +For tasks that are guaranteed to finish within the time limit, the [Cron add-on] is a +simple solution to call a predefined URL daily or hourly and have that task called periodically. +For a more detailed documentation on the Cron Add-on, please refer to the [Cron Add-on documentation]. ### Workers -Tasks that will take longer than 120s to execute, or that are triggered by a user request and should be handled asyncronously to not keep the user waiting, are best handled by the [Worker add-on]. Workers are long-running processes started in containers. Just like the web processes but they are not listening on any port and therefore do not receive http requests. You can use workers, for example, to poll a queue and execute tasks in the background or handle long-running periodical calculations. More details on usage scenarios and available queuing Add-ons are available as part of the [Worker Add-on documentation]. +Tasks that will take longer than 55s to execute, or that are triggered by a user +request and should be handled asyncronously to not keep the user waiting, are best +handled by the [Worker add-on]. Workers are long-running processes started in containers. +Just like the web processes but they are not listening on any port and therefore do not +receive http requests. You can use workers, for example, to poll a queue and execute tasks +in the background or handle long-running periodical calculations. More details on usage +scenarios and available queuing Add-ons are available as part of the [Worker Add-on documentation]. ## Secure Shell (SSH) @@ -859,7 +874,6 @@ $ cctrlapp APP_NAME/DEP_NAME details [Alias Add-on]: https://www.cloudcontrol.com/add-ons/alias [Blitz.io]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Performance%20&%20Monitoring/Blitz.io [MemCachier Add-on]: https://www.cloudcontrol.com/add-ons/memcachier -[Varnish]: https://www.varnish-cache.org/ [MemCachier Documentation]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/MemCachier [New Relic Add-ons]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Performance%20&%20Monitoring/New%20Relic [tutorial]: https://www.cloudcontrol.com/blog/best-practice-running-and-analyzing-load-tests-on-your-cloudcontrol-app From f566adc82a3c326b2d0c15bd527af444695a7d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 27 Nov 2014 16:00:15 +0100 Subject: [PATCH 10/84] Change references for MongoLab to MongoSoup --- Guides/NodeJS/Express.md | 13 ++++++------- Platform Documentation.md | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Guides/NodeJS/Express.md b/Guides/NodeJS/Express.md index 1cb13cc..f80c655 100644 --- a/Guides/NodeJS/Express.md +++ b/Guides/NodeJS/Express.md @@ -55,11 +55,11 @@ Left of the colon, we specified the **required** process type called `web` follo Node.js and MongoDB are an excellent combination because JSON (JavaScript Object Notation) is a subset of JavaScript, making storage and -retrieval of the objects very simple. MongoDB is provided by [MongoSoup] and -[MongoLab] which can be found in cloudControl's Add-on Marketplace under the +retrieval of the objects very simple. MongoDB is provided by [MongoSoup] +which can be found in cloudControl's Add-on Marketplace under the category [Data Storage]. -This example uses the MongoLab Add-on. In the +This example uses the MongoSoup Add-on. In the `employeeprovider.js` file, you can find how the connection to the database is established: @@ -78,7 +78,7 @@ var Db = require('mongodb').Db, EmployeeProvider = function() { var that = this; - mongodbUri = process.env.MONGOLAB_URI || 'mongodb://localhost'; + mongodbUri = process.env.MONGOSOUP_URL || 'mongodb://localhost'; MongoClient.connect(mongodbUri, function(err, db){ if(err) { return console.dir(err); } that.db = db; @@ -134,11 +134,11 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Finally, don’t forget to add the MongoLab Add-on for cloudControl and deploy the +Finally, don’t forget to add the MongoSoup Add-on for cloudControl and deploy the latest version of the app: ~~~bash -$ cctrlapp APP_NAME/default addon.add mongolab.free +$ cctrlapp APP_NAME/default addon.add mongosoup.sandbox $ cctrlapp APP_NAME/default deploy ~~~ @@ -161,5 +161,4 @@ applications. [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [platform documentation]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation [Data Storage]: https://www.cloudcontrol.com/add-ons?c=1 -[MongoLab]: https://www.cloudcontrol.com/add-ons/mongolab [MongoSoup]: https://www.cloudcontrol.com/add-ons/mongosoup diff --git a/Platform Documentation.md b/Platform Documentation.md index 5ea8fef..ca6b2f3 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -338,7 +338,7 @@ $ cctrlapp APP_NAME/DEP_NAME deploy THE_LAST_WORKING_VERSION_HASH Deployments on the cloudControl platform have access to a writable filesystem. This filesystem however is not persistent. Data written may or may not be accessible again in future requests, depending on how the [routing tier](#routing-tier) routes requests across available containers, and is deleted after each deploy. This does include deploys you trigger manually, but also re-deploys done by the platform itself during normal operation. -For customer uploads (e.g. user profile pictures) we recommend object stores like Amazon S3 or the GridFS feature available as part of the [MongoLab Add-on]. +For customer uploads (e.g. user profile pictures) we recommend object stores like Amazon S3 or the GridFS feature available as part of the [MongoSoup Add-on]. ## Development, Staging and Production Environments @@ -866,7 +866,7 @@ $ cctrlapp APP_NAME/DEP_NAME details [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ [Heroku buildpack API]: https://devcenter.heroku.com/articles/buildpack-api [guides]: https://www.cloudcontrol.com/dev-center/Guides -[MongoLab Add-on]: https://www.cloudcontrol.com/add-ons/mongolab +[MongoSoup Add-on]: https://next.dotcloud.com/add-ons/mongosoup [Add-on marketplace]: https://www.cloudcontrol.com/add-ons [Deployment category]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment [rsyslog]: http://www.rsyslog.com/ From 3a86c756bebbe44ccb3e7ba8d328ffd1cc1488e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 27 Nov 2014 16:03:57 +0100 Subject: [PATCH 11/84] Remove references to Blitz.io and NewRelic add-ons --- Platform Documentation.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index ca6b2f3..d668548 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -690,11 +690,7 @@ Deployments with --containers 1 (the default) are unavailable for a few minutes ### Vertical Scaling -In addition to controlling the number of containers you can also specify the memory size of a container. Container sizes are specified using the --memory parameter, being possible to choose from 128MB to 1024MB. To determine the optimal --memory value for your deployment you can use the New Relic Add-on to analyze the memory consumption of your app. - -### Choosing Optimal Settings - -You can use the [Blitz.io] and [New Relic Add-ons] to run synthetic load tests against your deployments and analyze how well they perform with the current --containers and --memory settings under expected load to determine the optimal scaling settings and adjust accordingly. We have a [tutorial] that explains this in more detail. +In addition to controlling the number of containers you can also specify the memory size of a container. Container sizes are specified using the --memory parameter, being possible to choose from 128MB to 1024MB. ## Performance @@ -872,10 +868,8 @@ $ cctrlapp APP_NAME/DEP_NAME details [rsyslog]: http://www.rsyslog.com/ [TLS]: http://en.wikipedia.org/wiki/Transport_Layer_Security [Alias Add-on]: https://www.cloudcontrol.com/add-ons/alias -[Blitz.io]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Performance%20&%20Monitoring/Blitz.io [MemCachier Add-on]: https://www.cloudcontrol.com/add-ons/memcachier [MemCachier Documentation]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/MemCachier -[New Relic Add-ons]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Performance%20&%20Monitoring/New%20Relic [tutorial]: https://www.cloudcontrol.com/blog/best-practice-running-and-analyzing-load-tests-on-your-cloudcontrol-app [Cron Add-on]: https://www.cloudcontrol.com/add-ons/cron [Cron Add-on documentation]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Cron From a298c4409ab98c0a838da631396e9c14445f3daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 27 Nov 2014 16:13:09 +0100 Subject: [PATCH 12/84] Change links for Windows installers --- Platform Documentation.md | 4 ++-- Quickstart.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index d668548..d21a4fe 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -39,7 +39,7 @@ Installing *cctrl* is easy and works on Mac/Linux as well as on Windows. #### Quick Installation Windows -For Windows we offer an installer. Please download [the latest version] of the installer from S3. The file is named cctrl-x.x-setup.exe. +For Windows we offer an installer. Please download [the latest version] of the installer from Cloud Storage. The file is named cctrl-x.x-setup.exe. #### Quick Installation Linux/Mac @@ -856,7 +856,7 @@ $ cctrlapp APP_NAME/DEP_NAME details [Custom Config Add-on]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config [web console]: https://www.cloudcontrol.com/console [API libraries]: https://github.com/cloudControl -[the latest version]: http://cctrl.s3-website-eu-west-1.amazonaws.com/#windows/ +[the latest version]: https://download.dotcloudapp.com/windows [Python 2.6+]: http://python.org/download/ [reset your password]: https://api.cloudcontrol.com/reset_password/ [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ diff --git a/Quickstart.md b/Quickstart.md index 6121784..cedbe7f 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -25,7 +25,7 @@ $ sudo easy_install pip $ sudo pip install cctrl ~~~ -**Windows:** Please download the provided [installer](https://www.cloudcontrol.com/download/win). +**Windows:** Please download the provided [installer](https://download.dotcloudapp.com/windows). ## Create a User Account (if you haven't already) From b823f8394c9fa47082cc7f968a31ab5b9eb27ad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 27 Nov 2014 17:25:06 +0100 Subject: [PATCH 13/84] Migration guides: rebrand to Next dotCloud --- .../An Introduction.md | 38 ++++++------ .../CLI Cheatsheet.md | 6 +- .../Converting dotcloud.yml.md | 58 +++++++++---------- .../Migrating environment.md | 10 ++-- .../dotCloud-cloudControl migration/Python.md | 14 ++--- 5 files changed, 62 insertions(+), 64 deletions(-) diff --git a/Guides/dotCloud-cloudControl migration/An Introduction.md b/Guides/dotCloud-cloudControl migration/An Introduction.md index 77c89f8..b7e08c7 100644 --- a/Guides/dotCloud-cloudControl migration/An Introduction.md +++ b/Guides/dotCloud-cloudControl migration/An Introduction.md @@ -1,13 +1,13 @@ -# An Introduction to cloudControl for dotCloud Developers +# An Introduction to Next dotCloud for dotCloud Developers -Welcome to cloudControl! You'll find a lot of similarities here to +Welcome to Next dotCloud! You'll find a lot of similarities here to dotCloud, but some important differences too. We'll try to cover the biggest differences here and we'll also provide more specific information for each programming language and dotCloud service type. ## Can I still use my favorite language? -Yes, cloudControl is even more flexible than dotCloud on language +Yes, Next dotCloud is even more flexible than dotCloud on language support. You'll find up to date versions of Python, PHP, NodeJS, Ruby, Java, Scala, Clojure, Play and Gradle here, and custom buildpacks can give you access to even more languages like Go, Erlang, Lisp, Lua, @@ -19,9 +19,9 @@ expanding these guides to include all dotCloud services. ## Do I still have access to my favorite databases? -Yes, but on cloudControl, all stateful services are provided as -"Add-on" services. Some of them are run by cloudControl and some are -third party services, but cloudControl will be your single point of +Yes, but on Next dotCloud, all stateful services are provided as +"Add-on" services. Some of them are run by Next dotCloud and some are +third party services, but Next dotCloud will be your single point of contact for billing and support. More information about the specifics of porting Add-ons like MySQL, @@ -30,7 +30,7 @@ Note that we will continually expand these guides to include all dotCloud services. ## Can I still create multiple services for my application? -Yes, but in a different way. cloudControl does not provide services +Yes, but in a different way. Next dotCloud does not provide services as we know them in dotCloud. Instead, each application can have multiple deployments, which run one separate web process each. Furthermore, each deployment can serve multiple worker processes using the @@ -38,7 +38,7 @@ Furthermore, each deployment can serve multiple worker processes using the services. ## Can I keep using the same Version Control System for my code? -It depends. You can only push code on cloudControl when it's +It depends. You can only push code on Next dotCloud when it's version-controlled by Git. So if you are using Mercurial, Subversion or no VCS at all, a migration to Git is required. For more information on how to migrate, see these resources on converting from [Mercurial to Git](http://hivelogic.com/articles/converting-from-mercurial-to-git/), @@ -46,37 +46,37 @@ and from [Subversion to Git](http://www.subgit.com/). ## Do I still get loadbalancing, scaling, SSL, seamless deployment... -Yes! cloudControl still behaves in all the ways you'd expect. +Yes! Next dotCloud still behaves in all the ways you'd expect. # Where should I begin? A good place to start is to read the [Quickstart](https://www.cloudcontrol.com/dev-center/Quickstart) and [Platform Documentation](https://www.cloudcontrol.com/dev-center/Platform%20Documentation) -to get familiar with the cloudControl PaaS. +to get familiar with the Next dotCloud PaaS. -Then read the docs [here](TODO-add-link) comparing the dotCloud -CLI to the cloudControl CLI and `dotcloud.yml` to a `Procfile` (including +Then read the docs [here](https://next.dotcloud.com/dev-center/dotcloud-cloudcontrol-migration/cli-cheatsheet) comparing the dotCloud +CLI to the Next dotCloud CLI and `dotcloud.yml` to a `Procfile` (including a comparison of build/deploy processes in general). ## Missing Pieces -When you're familiar with all that cloudControl offers, you should +When you're familiar with all that Next dotCloud offers, you should consider if you're using any of the following features of dotCloud, because these will require some important changes to your application: -* `~/data` for persistent data. cloudControl does not persist data +* `~/data` for persistent data. Next dotCloud does not persist data between deployments, so you need to use a database or other persistent - file service like Google Cloud Storage. Whatever you push to cloudControl + file service like Google Cloud Storage. Whatever you push to Next dotCloud needs to be stateless. * `nginx.conf` to create redirects, URL rewrites, basic auth, or serving static assets. While it is possible to run *nginx* in a - cloudControl deployment, it is not typical. The strategy to work around + Next dotCloud deployment, it is not typical. The strategy to work around this will depend on the language and framework you're using. * `supervisord.conf` to run additional processes. While it is possible - to install and run *supervisord* in a cloudControl deployment, it is + to install and run *supervisord* in a Next dotCloud deployment, it is not typical. Most deployments run only one process. * `ssh` to manually tweak your running application. You can get - something like *ssh* on cloudControl, but it is limited to a new + something like *ssh* on Next dotCloud, but it is limited to a new instance which has been created just for your interactive session. You can't directly interact with an instance you've previously deployed. You can, however, run the same code in a new @@ -85,7 +85,7 @@ these will require some important changes to your application: * *older versions*: On dotCloud the OS and most of the software runs on Ubuntu 10.04LTS (circa 2010). You may find that you need to update your code to use newer versions of your libraries and other - dependencies on cloudControl, which runs on Ubuntu 12.04. + dependencies on Next dotCloud, which runs on Ubuntu 12.04. If you have mission-critical applications that are affected by some of these “missing pieces”, please contact us at support@dotcloud.com and we will do our diff --git a/Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md b/Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md index 2aa9c13..0b9558a 100644 --- a/Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md +++ b/Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md @@ -1,7 +1,7 @@ -# dotCloud to cloudControl CLI Cheat Sheet +# dotCloud to Next dotCloud CLI Cheat Sheet Here are the dotCloud CLI commands translated to their equivalents in -the cloudControl CLI, listed in the same order as they appear in +the Next dotCloud CLI, listed in the same order as they appear in `dotcloud -h`. ## User specific commands @@ -47,4 +47,4 @@ the cloudControl CLI, listed in the same order as they appear in `revisions` | N/A. You can `deploy` any of your last 10 pushed git hashes. `upgrade` | `deploy --stack STACK_NAME` `--debug, -D` | N/A -`--assume-yes, --assume-no` | N/A. Use the API if you need full scriptability. cloudControl's API is fully supported. +`--assume-yes, --assume-no` | N/A. Use the API if you need full scriptability. Next dotCloud's API is fully supported. diff --git a/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md b/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md index f4efa00..e5e632d 100644 --- a/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md +++ b/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md @@ -1,20 +1,20 @@ -# Converting dotcloud.yml to a cloudControl Procfile -Your dotcloud.yml build file is a good place to start when converting your dotCloud application to run on cloudControl. This is where you've defined what services you need and sometimes their settings as well. +# Converting dotcloud.yml to a Next dotCloud Procfile +Your dotcloud.yml build file is a good place to start when converting your dotCloud application to run on Next dotCloud. This is where you've defined what services you need and sometimes their settings as well. -This document will show you what you need to know to convert a dotcloud.yml file to a Procfile on cloudControl. We’ll start with the most important differences between the two, then walk you through each section of a dotcloud.yml file with considerations for how to convert to cloudControl configurations. +This document will show you what you need to know to convert a dotcloud.yml file to a Procfile on Next dotCloud. We’ll start with the most important differences between the two, then walk you through each section of a dotcloud.yml file with considerations for how to convert to Next dotCloud configurations. The structure of this document will mostly follow the [Build file documentation](http://docs.dotcloud.com/guides/build-file/) in the dotCloud docs. You should be familiar with that document (or all the parts of your dotcloud.yml file) to use this document. **It may help to have your dotcloud.yml file open while reading this so you can follow along**. -## Services on dotCloud versus processes on cloudControl -To better understand the differences between the dotcloud.yml file and the Procfile on cloudControl, let’s back up a bit and talk about where the differences come from. +## Services on dotCloud versus processes on Next dotCloud +To better understand the differences between the dotcloud.yml file and the Procfile on Next dotCloud, let’s back up a bit and talk about where the differences come from. dotCloud applications are built around several service types which you can define in the dotcloud.yml file. Each service runs different a process and has a different end point. This means that a single dotCloud application can combine, for example, a Ruby on Rails and a Python Flask implementation as two services in the same app. -On cloudControl, each application runs one main process – a web process. Each app also has only one type that you define when you create the app – this depends on which language the app is written in, and determines which [buildpack](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile) will create the image for your deployments on the platform. +On Next dotCloud, each application runs one main process – a web process. Each app also has only one type that you define when you create the app – this depends on which language the app is written in, and determines which [buildpack](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile) will create the image for your deployments on the platform. -To port apps with several different languages onto cloudControl, you’ll need to create several applications – one for each type. However, many dotCloud services that aren’t related to the code itself, such as databases, are handled as [Add-ons](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation) on cloudControl. These integrate directly with your application and don’t require you to create multiple applications. +To port apps with several different languages onto Next dotCloud, you’ll need to create several applications – one for each type. However, many dotCloud services that aren’t related to the code itself, such as databases, are handled as [Add-ons](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation) on Next dotCloud. These integrate directly with your application and don’t require you to create multiple applications. -You can run several [workers](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) within a single application on cloudControl. These are handled as background processes of the application and use exactly the same runtime environment as the app. +You can run several [workers](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) within a single application on Next dotCloud. These are handled as background processes of the application and use exactly the same runtime environment as the app. ### App structure on dotCloud ~~~text @@ -32,10 +32,10 @@ You can run several [workers](https://www.cloudcontrol.com/dev-center/Add-on%20D +---------------------+ +---------------------+ +--------------------------+ +---------------------+ ~~~ -### App structure on cloudControl +### App structure on Next dotCloud ~~~text +---------------------+ +--------------------------------------------------+ -| cloudControl app | | cloudControl app | +| Next dotCloud app | | Next dotCloud app | +---------------------+ +--------------------------------------------------+ +---------------------+ +--------------------------------------------------+ | name: web | | name: support | @@ -59,7 +59,7 @@ You can run several [workers](https://www.cloudcontrol.com/dev-center/Add-on%20D ~~~ ## dotcloud.yml versus the Procfile -The dotcloud.yml file corresponds to the Procfile on cloudControl. Just like the dotcloud.yml, it will be located in the root of your repository. The format of the Procfile is much simpler than dotcloud.yml because most of the configuration is handled through the dcapp CLI and the Buildpacks. The Procfile in a cloudControl application is simply used to determine how to start the actual application in the container – both the web and worker processes. +The dotcloud.yml file corresponds to the Procfile on Next dotCloud. Just like the dotcloud.yml, it will be located in the root of your repository. The format of the Procfile is much simpler than dotcloud.yml because most of the configuration is handled through the dcapp CLI and the Buildpacks. The Procfile in a Next dotCloud application is simply used to determine how to start the actual application in the container – both the web and worker processes. You should create a new Procfile at the same level as your dotcloud.yml (in the root of your reposity). We'll talk about what to add to this file in the following sections. @@ -135,26 +135,26 @@ worker_b: python otherworker.py Note that in the Procfile, only the web and worker processes are defined. Each line in the Procfile is actually a shell command that will run just like you define it. This means you can customize the start options for your processes here. ## servicename and type -Your application on dotCloud can have multiple services, each with its own unique name that you define. On dotCloud, service names are fairly arbitrary. On cloudControl, services are handled quite differently because of how the platform is built. There are two types of processes on cloudControl, each of which is specifically defined: web processes, and worker processes. All other services are handled via [Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) and are not defined in the Procfile. +Your application on dotCloud can have multiple services, each with its own unique name that you define. On dotCloud, service names are fairly arbitrary. On Next dotCloud, services are handled quite differently because of how the platform is built. There are two types of processes on Next dotCloud, each of which is specifically defined: web processes, and worker processes. All other services are handled via [Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) and are not defined in the Procfile. ### Type: (language) / web process -On cloudControl, each application is based around one main, language-specific web process. This is because the cloudControl platform uses Buildpacks – a language-specific set of scripts that builds the images for your apps based on the language you specify. +On Next dotCloud, each application is based around one main, language-specific web process. This is because the Next dotCloud platform uses Buildpacks – a language-specific set of scripts that builds the images for your apps based on the language you specify. As a result of this, **all the processes in a Procfile run in the same environment**. That means you can’t create servicename1 as a ruby type and servicename2 as a python type. **That's a big difference from a dotcloud.yml file**. If you need multiple languages in your project, you may need to create multiple applications. -On cloudControl, you specify the language when you `dcapp APP_NAME create` the application. You can specify one of the predefined types (buildpacks): java, nodejs, php, python, ruby or custom. This will define the environment for the entire app. +On Next dotCloud, you specify the language when you `dcapp APP_NAME create` the application. You can specify one of the predefined types (buildpacks): java, nodejs, php, python, ruby or custom. This will define the environment for the entire app. Once you’ve created the application, you need to set the web process and specify how it will be started by the shell. In the Procfile, this is an actual shell command. **The process with the name web will be the one which gets HTTP traffic**. ### Type: (language)-worker / worker process -On cloudControl, you can define multiple workers in the Procfile that will run as background processes in that application. They use the exact same runtime environment as the web process. +On Next dotCloud, you can define multiple workers in the Procfile that will run as background processes in that application. They use the exact same runtime environment as the web process. To use this functionality, you need to add the [Worker Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) to your app. ### Non-code services / Add-ons -In the dotcloud.yml file, you can define many different kinds of services within the app, including databases like MySQL, or other services like Redis. A Procfile on cloudControl only specifies your web and worker processes. This is very different from a dotcloud.yml file. +In the dotcloud.yml file, you can define many different kinds of services within the app, including databases like MySQL, or other services like Redis. A Procfile on Next dotCloud only specifies your web and worker processes. This is very different from a dotcloud.yml file. -On cloudControl, "Data Services" like MySQL and Redis, as well as many other types of services like logging, monitoring and even SSL, are handled outside of the Procfile with [Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons). You can simply add them to your web app in the CLI with `dcapp addon.add`. This automatically connects the services to your app. +On Next dotCloud, "Data Services" like MySQL and Redis, as well as many other types of services like logging, monitoring and even SSL, are handled outside of the Procfile with [Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons). You can simply add them to your web app in the CLI with `dcapp addon.add`. This automatically connects the services to your app. To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config). @@ -181,10 +181,10 @@ worker: celery -A tasks worker --loglevel=info The entry for the web or worker process will be executed as a shell command. -For more specific details, please see the [porting guides](https://github.com/cloudControl/documentation/tree/master/Guides/dotCloud-cloudControl%20migration) specific to your language of choice. Please note that we will continually update these guides to include all of the languages officially supported on cloudControl. +For more specific details, please see the [porting guides](https://github.com/cloudControl/documentation/tree/master/Guides/dotCloud-cloudControl%20migration) specific to your language of choice. Please note that we will continually update these guides to include all of the languages officially supported on Next dotCloud. ## approot -You may have used the approot directive in dotcloud.yml to tell the platform where to find the code to run, but the cloudControl Procfile lets you set this first command explicitly, so you don't need an approot. If you need to change directory before running your first statement, you can do that in the command of the Procfile: +You may have used the approot directive in dotcloud.yml to tell the platform where to find the code to run, but the Next dotCloud Procfile lets you set this first command explicitly, so you don't need an approot. If you need to change directory before running your first statement, you can do that in the command of the Procfile: ~~~yaml web: cd myapproot; sh startapp.sh ~~~ @@ -192,15 +192,15 @@ web: cd myapproot; sh startapp.sh If you want to change the approot for PHP-based applications, the process is slightly different. In this case, you’ll need to [manually set the Apache’s DocumentRoot](https://github.com/cloudControl/buildpack-php#manually-setting-the-documentroot). -cloudControl processes do not have any magically created directories like the dotCloud services. There are neither code nor current symbolic links. The root of your home directory has the same format and contents as the directory which contains your Procfile. +Next dotCloud processes do not have any magically created directories like the dotCloud services. There are neither code nor current symbolic links. The root of your home directory has the same format and contents as the directory which contains your Procfile. ## prebuild, postbuild, postinstall: Build Hooks ### prebuild and postbuild scripts -The officially supported Buildpacks on cloudControl consist of a standard set of scripts that are run when the deployment image is being built. Because of this, prebuild and postbuild hooks are not natively supported. +The officially supported Buildpacks on Next dotCloud consist of a standard set of scripts that are run when the deployment image is being built. Because of this, prebuild and postbuild hooks are not natively supported. If you have applications on dotCloud that use prebuild and postbuild hooks, it’s worthwhile to try pushing and deploying them using one of the officially supported Buildpacks first. The stack may already have the components you need installed and it may work out of the box. -If not, you may need make modifications to a standard buildpack and use it as a [custom Buildpack](https://www.cloudcontrol.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). First download the Buildpack for your app’s language type from [cloudControl’s public Github repo](https://github.com/cloudControl?query=buildpack) and modify the `bin/compile` script according to your needs. (Keep in mind that only the `/app` folder is writeable, so you can’t use the Ubuntu package manager to install libraries.) Upload your new custom Buildpack to a public non-ssh git repository, and create your application with the apptype `custom --buildpack BUILDPACK_URL`. +If not, you may need make modifications to a standard buildpack and use it as a [custom Buildpack](https://www.cloudcontrol.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). First download the Buildpack for your app’s language type from [Next dotCloud’s public Github repo](https://github.com/cloudControl?query=buildpack) and modify the `bin/compile` script according to your needs. (Keep in mind that only the `/app` folder is writeable, so you can’t use the Ubuntu package manager to install libraries.) Upload your new custom Buildpack to a public non-ssh git repository, and create your application with the apptype `custom --buildpack BUILDPACK_URL`. ### postinstall scripts If you have a postinstall script, you can run the same step as part of your Procfile command, e.g. Procfile: @@ -214,28 +214,28 @@ Like prebuild and postbuild scripts, a systempackages section in your dotcloud.y ## config There are a couple of ways to migrate your dotcloud.yml config section, depending on what you are configuring. -If you’re using the config section to specify an interpreter version (e.g. Python 2.6 vs. Python 2.7), check the [cloudControl buildpack documentation on Github](https://github.com/cloudcontrol?query=buildpack) for how to do this with your specific buildpack. For example, you can specify the Python version by creating a runtime.txt file to replace your dotcloud.yml config: python_version. +If you’re using the config section to specify an interpreter version (e.g. Python 2.6 vs. Python 2.7), check the [Next dotCloud buildpack documentation on Github](https://github.com/cloudcontrol?query=buildpack) for how to do this with your specific buildpack. For example, you can specify the Python version by creating a runtime.txt file to replace your dotcloud.yml config: python_version. -If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on cloudControl using the [Custom Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. +If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. -For more information, read our guide on [migrating environment variables](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) from dotCloud to cloudControl. +For more information, read our guide on [migrating environment variables](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) from dotCloud to Next dotCloud. ## ports -If you have a ports section in your dotcloud.yml then you should only have one port listed, a single http type port. That is the only kind of port allowed on the cloudControl PaaS. You can only have one process which listens to an HTTP port. +If you have a ports section in your dotcloud.yml then you should only have one port listed, a single http type port. That is the only kind of port allowed on the Next dotCloud PaaS. You can only have one process which listens to an HTTP port. If you do have multiple services each with their own HTTP port, then you should consider how to either separate these into different applications or how to access each different function via a different URL path (e.g. if you used to have an "admin" interface as well as a public interface, move your "admin" interface to be part of your public interface on another path, like "www.example.com/admin"). -Note that cloudControl containers do not expose an SSH port. See the [Secure Shell docs](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#secure-shell-ssh). +Note that Next dotCloud containers do not expose an SSH port. See the [Secure Shell docs](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#secure-shell-ssh). ## environment -If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on cloudControl. Please read the [Add-on documentation](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and our [dedicated guide](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) on this topic. +If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and our [dedicated guide](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) on this topic. Note that the same variables are set in all your application processes (web and worker) -- you cannot specify that a variable should only be set on one process (as you could in a dotcloud.yml file). ## requirements On the dotCloud platform, a `requirements` section can help install additional dependencies of your application during build time (after -`dotcloud push`). On cloudControl you should use the mechanism +`dotcloud push`). On Next dotCloud you should use the mechanism provided by your Buildpack. For more information on all supported languages, please check our [Guides](https://github.com/cloudControl/documentation/tree/master/Guides). diff --git a/Guides/dotCloud-cloudControl migration/Migrating environment.md b/Guides/dotCloud-cloudControl migration/Migrating environment.md index cd4b78f..96f501b 100644 --- a/Guides/dotCloud-cloudControl migration/Migrating environment.md +++ b/Guides/dotCloud-cloudControl migration/Migrating environment.md @@ -1,4 +1,4 @@ -# Migrating the dotCloud environment to dotCloudNext +# Migrating the dotCloud environment to Next dotCloud ## What is the Environment File in dotCloud? @@ -9,9 +9,9 @@ This file contains a JSON-formatted dictionary with most of the configuration in of the services in your application. You can use it to retrieve data or credentials by reading the file. -## How does it work on dotCloudNext? +## How does it work on Next dotCloud? -dotCloudNext stores config variables for each deployment in a single file called `creds.json`. It looks like this: +Next dotCloud stores config variables for each deployment in a single file called `creds.json`. It looks like this: ~~~json { @@ -90,7 +90,7 @@ Please keep in mind that these variables will not be present in `creds.json` fil print 'MySQL Host: {0}'.format(env['DOTCLOUD_DB_MYSQL_HOST']) ~~~ -* On dotCloudNext, you can add a [MySQLd Add-on](http://next.dotcloud.com/add-ons/mysqld) (or alternately MySQLS) with: +* On Next dotCloud, you can add a [MySQLd Add-on](http://next.dotcloud.com/add-ons/mysqld) (or alternately MySQLS) with: ~~~bash $ dcapp APP_NAME/DEP_NAME addon.add mysqld.OPTION @@ -134,7 +134,7 @@ Please keep in mind that these variables will not be present in `creds.json` fil KEY2=VALUE2 ... - # Add them to your deployment in dotCloudNext + # Add them to your deployment in Next dotCloud $ dcapp APP_NAME/DEP_NAME config.add KEY1=VALUE1 KEY2=VALUE2 ... SET_ENV_VARS ~~~ diff --git a/Guides/dotCloud-cloudControl migration/Python.md b/Guides/dotCloud-cloudControl migration/Python.md index 515389e..8830534 100644 --- a/Guides/dotCloud-cloudControl migration/Python.md +++ b/Guides/dotCloud-cloudControl migration/Python.md @@ -1,6 +1,6 @@ -# Migrating Python Applications from dotCloud to cloudControl +# Migrating Python Applications from dotCloud to Next dotCloud -Before you read this document, you should read the document on *Converting dotcloud.yml* first. It provides a framework for porting your application as a whole over to cloudControl. Please return here to learn how to port your Python services. +Before you read this document, you should read the document on *Converting dotcloud.yml* first. It provides a framework for porting your application as a whole over to Next dotCloud. Please return here to learn how to port your Python services. ## dotCloud Features @@ -8,21 +8,19 @@ The first task is to determine what dotCloud features your Python service is usi ### Nginx -Please check your Python service's `approot` to see if you have an `nginx.conf` file. The most common use for this is to define redirections and error handlers for the Nginx web server. If you have this, then your first migration will probably require Nginx in your cloudControl application as well. Later you may find other ways to work around your use of Nginx, but for now we can install Nginx in your cloudControl application. +Please check your Python service's `approot` to see if you have an `nginx.conf` file. The most common use for this is to define redirections and error handlers for the Nginx web server. If you have this, then your first migration will probably require Nginx in your Next dotCloud application as well. Later you may find other ways to work around your use of Nginx, but for now we can install Nginx in your Next dotCloud application. ### Supervisord -Does your `approot` contain `supervisord.conf`? Or does your `dotcloud.yml` include a `process` or `processes` section in your Python service definition? If so, then you will also require `supervisord` on cloudControl. +Does your `approot` contain `supervisord.conf`? Or does your `dotcloud.yml` include a `process` or `processes` section in your Python service definition? If so, then you will also require `supervisord` on Next dotCloud. ### uWSGI -Does your `approot` contain uWSGI configuration information (`*uwsgi.conf`) or does your `dotcloud.yml` define environment variables for `UWSGI_*`? If so, then you'll need to run `uwsgi` on your cloudControl application. +Does your `approot` contain uWSGI configuration information (`*uwsgi.conf`) or does your `dotcloud.yml` define environment variables for `UWSGI_*`? If so, then you'll need to run `uwsgi` on your Next dotCloud application. ## Choose Your Path -If you're not using Nginx, Supervisord, or uWSGI, then you can definitely use the standard cloudControl Python service! +If you're not using Nginx, Supervisord, or uWSGI, then you can definitely use the standard Next dotCloud Python service! For all the other cases, you can use a custom buildpack instead of the default Python service: https://github.com/metalivedev/buildpack-python-cloudcontrol.git#dotcloud -**TODO:** Update that URL to cloudControl GitHub repo once merged. - The basic information about how to use that buildpack is in the buildpack's Readme.md. From e3b18f1e8bb08c1669cabdbe56389dfbd01133a9 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 27 Nov 2014 17:25:24 +0100 Subject: [PATCH 14/84] Memcached cloud addon documentation --- .../Data Storage/MemcachedCloud.md | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Add-on Documentation/Data Storage/MemcachedCloud.md diff --git a/Add-on Documentation/Data Storage/MemcachedCloud.md b/Add-on Documentation/Data Storage/MemcachedCloud.md new file mode 100644 index 0000000..d74d902 --- /dev/null +++ b/Add-on Documentation/Data Storage/MemcachedCloud.md @@ -0,0 +1,51 @@ +# Memcached Cloud +[Memcached Cloud] is a fully-managed service for hosting and running your Memcached +in a reliable and fail-safe manner. + +## Adding the Memcached Cloud Add-on + +To add the Memcached Cloud Add-on use the addon.add command. + +~~~ +$ dcapp APP_NAME/DEP_NAME addon.add memcachedcloud.OPTION +~~~ +Replace `memcachedcloud.OPTION` with a valid option, e.g. `memcachedcloud.25mb`. + +When added, Memcached Cloud automatically creates a new user account with your email address. You can +manage the Add-on within the [web console](/console) (go to the specific deployment and click the link "memcachedcloud.OPTION"). + +## Upgrading the Memcached Cloud Add-on + +To upgrade from a smaller to a more powerful plan use the addon.upgrade command. + +~~~ +$ dcapp APP_NAME/DEP_NAME addon.upgrade memcachedcloud.OPTION_OLD memcachedcloud.OPTION_NEW +~~~ + +## Downgrading the Memcached Cloud Add-on + +To downgrade to a smaller plan use the addon.downgrade command. + +~~~ +$ dcapp APP_NAME/DEP_NAME addon.downgrade memcachedcloud.OPTION_OLD memcachedcloud.OPTION_NEW +~~~ + +## Removing the Memcached Cloud Add-on + +The Memcached Cloud Add-on can be removed from the deployment by using the addon.remove command. + +~~~ +$ dcapp APP_NAME/DEP_NAME addon.remove memcachedcloud.OPTION +~~~ + +### Internal Access + +It's recommended to the read database credentials from the *creds.json* file. The location of the +file is available in the `CRED_FILE` environment variable. Reading the credentials from the +*creds.json* file ensures your app is always using the correct credentials. For detailed +instructions on how to use the *creds.json* file please refer to the section about +[Add-on Credentials] in the general documentation. + + +[Memcached Cloud]: https://redislabs.com/memcached-cloud +[Add-on Credentials]: /dev-center/platform-documentation#add-ons From fb462fbcd6ca3973d03c93a71956ff68b9f13fd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 27 Nov 2014 17:27:07 +0100 Subject: [PATCH 15/84] Migration guides: rename directory --- .../An Introduction.md | 6 ++--- .../CLI Cheatsheet.md | 0 .../Converting dotcloud.yml.md | 26 +++++++++---------- .../Migrating environment.md | 2 -- .../Python.md | 4 +-- 5 files changed, 18 insertions(+), 20 deletions(-) rename Guides/{dotCloud-cloudControl migration => dotCloud-NextdotCloud migration}/An Introduction.md (97%) rename Guides/{dotCloud-cloudControl migration => dotCloud-NextdotCloud migration}/CLI Cheatsheet.md (100%) rename Guides/{dotCloud-cloudControl migration => dotCloud-NextdotCloud migration}/Converting dotcloud.yml.md (97%) rename Guides/{dotCloud-cloudControl migration => dotCloud-NextdotCloud migration}/Migrating environment.md (99%) rename Guides/{dotCloud-cloudControl migration => dotCloud-NextdotCloud migration}/Python.md (95%) diff --git a/Guides/dotCloud-cloudControl migration/An Introduction.md b/Guides/dotCloud-NextdotCloud migration/An Introduction.md similarity index 97% rename from Guides/dotCloud-cloudControl migration/An Introduction.md rename to Guides/dotCloud-NextdotCloud migration/An Introduction.md index b7e08c7..4e1bf08 100644 --- a/Guides/dotCloud-cloudControl migration/An Introduction.md +++ b/Guides/dotCloud-NextdotCloud migration/An Introduction.md @@ -22,7 +22,7 @@ expanding these guides to include all dotCloud services. Yes, but on Next dotCloud, all stateful services are provided as "Add-on" services. Some of them are run by Next dotCloud and some are third party services, but Next dotCloud will be your single point of -contact for billing and support. +contact for billing and support. More information about the specifics of porting Add-ons like MySQL, Redis, MongoDB, Postgre/PostGIS are in the relevant guides here. @@ -52,9 +52,9 @@ Yes! Next dotCloud still behaves in all the ways you'd expect. A good place to start is to read the [Quickstart](https://www.cloudcontrol.com/dev-center/Quickstart) and [Platform Documentation](https://www.cloudcontrol.com/dev-center/Platform%20Documentation) -to get familiar with the Next dotCloud PaaS. +to get familiar with the Next dotCloud PaaS. -Then read the docs [here](https://next.dotcloud.com/dev-center/dotcloud-cloudcontrol-migration/cli-cheatsheet) comparing the dotCloud +Then read the docs [here](https://next.dotcloud.com/dev-center/dotcloud-nextdotcloud-migration/cli-cheatsheet) comparing the dotCloud CLI to the Next dotCloud CLI and `dotcloud.yml` to a `Procfile` (including a comparison of build/deploy processes in general). diff --git a/Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md b/Guides/dotCloud-NextdotCloud migration/CLI Cheatsheet.md similarity index 100% rename from Guides/dotCloud-cloudControl migration/CLI Cheatsheet.md rename to Guides/dotCloud-NextdotCloud migration/CLI Cheatsheet.md diff --git a/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md b/Guides/dotCloud-NextdotCloud migration/Converting dotcloud.yml.md similarity index 97% rename from Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md rename to Guides/dotCloud-NextdotCloud migration/Converting dotcloud.yml.md index e5e632d..f6a5b41 100644 --- a/Guides/dotCloud-cloudControl migration/Converting dotcloud.yml.md +++ b/Guides/dotCloud-NextdotCloud migration/Converting dotcloud.yml.md @@ -1,14 +1,14 @@ # Converting dotcloud.yml to a Next dotCloud Procfile -Your dotcloud.yml build file is a good place to start when converting your dotCloud application to run on Next dotCloud. This is where you've defined what services you need and sometimes their settings as well. +Your dotcloud.yml build file is a good place to start when converting your dotCloud application to run on Next dotCloud. This is where you've defined what services you need and sometimes their settings as well. -This document will show you what you need to know to convert a dotcloud.yml file to a Procfile on Next dotCloud. We’ll start with the most important differences between the two, then walk you through each section of a dotcloud.yml file with considerations for how to convert to Next dotCloud configurations. +This document will show you what you need to know to convert a dotcloud.yml file to a Procfile on Next dotCloud. We’ll start with the most important differences between the two, then walk you through each section of a dotcloud.yml file with considerations for how to convert to Next dotCloud configurations. The structure of this document will mostly follow the [Build file documentation](http://docs.dotcloud.com/guides/build-file/) in the dotCloud docs. You should be familiar with that document (or all the parts of your dotcloud.yml file) to use this document. **It may help to have your dotcloud.yml file open while reading this so you can follow along**. ## Services on dotCloud versus processes on Next dotCloud -To better understand the differences between the dotcloud.yml file and the Procfile on Next dotCloud, let’s back up a bit and talk about where the differences come from. +To better understand the differences between the dotcloud.yml file and the Procfile on Next dotCloud, let’s back up a bit and talk about where the differences come from. -dotCloud applications are built around several service types which you can define in the dotcloud.yml file. Each service runs different a process and has a different end point. This means that a single dotCloud application can combine, for example, a Ruby on Rails and a Python Flask implementation as two services in the same app. +dotCloud applications are built around several service types which you can define in the dotcloud.yml file. Each service runs different a process and has a different end point. This means that a single dotCloud application can combine, for example, a Ruby on Rails and a Python Flask implementation as two services in the same app. On Next dotCloud, each application runs one main process – a web process. Each app also has only one type that you define when you create the app – this depends on which language the app is written in, and determines which [buildpack](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile) will create the image for your deployments on the platform. @@ -31,7 +31,7 @@ You can run several [workers](https://www.cloudcontrol.com/dev-center/Add-on%20D | | | | | | | | +---------------------+ +---------------------+ +--------------------------+ +---------------------+ ~~~ - + ### App structure on Next dotCloud ~~~text +---------------------+ +--------------------------------------------------+ @@ -59,7 +59,7 @@ You can run several [workers](https://www.cloudcontrol.com/dev-center/Add-on%20D ~~~ ## dotcloud.yml versus the Procfile -The dotcloud.yml file corresponds to the Procfile on Next dotCloud. Just like the dotcloud.yml, it will be located in the root of your repository. The format of the Procfile is much simpler than dotcloud.yml because most of the configuration is handled through the dcapp CLI and the Buildpacks. The Procfile in a Next dotCloud application is simply used to determine how to start the actual application in the container – both the web and worker processes. +The dotcloud.yml file corresponds to the Procfile on Next dotCloud. Just like the dotcloud.yml, it will be located in the root of your repository. The format of the Procfile is much simpler than dotcloud.yml because most of the configuration is handled through the dcapp CLI and the Buildpacks. The Procfile in a Next dotCloud application is simply used to determine how to start the actual application in the container – both the web and worker processes. You should create a new Procfile at the same level as your dotcloud.yml (in the root of your reposity). We'll talk about what to add to this file in the following sections. @@ -138,16 +138,16 @@ Note that in the Procfile, only the web and worker processes are defined. Each l Your application on dotCloud can have multiple services, each with its own unique name that you define. On dotCloud, service names are fairly arbitrary. On Next dotCloud, services are handled quite differently because of how the platform is built. There are two types of processes on Next dotCloud, each of which is specifically defined: web processes, and worker processes. All other services are handled via [Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) and are not defined in the Procfile. ### Type: (language) / web process -On Next dotCloud, each application is based around one main, language-specific web process. This is because the Next dotCloud platform uses Buildpacks – a language-specific set of scripts that builds the images for your apps based on the language you specify. +On Next dotCloud, each application is based around one main, language-specific web process. This is because the Next dotCloud platform uses Buildpacks – a language-specific set of scripts that builds the images for your apps based on the language you specify. As a result of this, **all the processes in a Procfile run in the same environment**. That means you can’t create servicename1 as a ruby type and servicename2 as a python type. **That's a big difference from a dotcloud.yml file**. If you need multiple languages in your project, you may need to create multiple applications. On Next dotCloud, you specify the language when you `dcapp APP_NAME create` the application. You can specify one of the predefined types (buildpacks): java, nodejs, php, python, ruby or custom. This will define the environment for the entire app. -Once you’ve created the application, you need to set the web process and specify how it will be started by the shell. In the Procfile, this is an actual shell command. **The process with the name web will be the one which gets HTTP traffic**. +Once you’ve created the application, you need to set the web process and specify how it will be started by the shell. In the Procfile, this is an actual shell command. **The process with the name web will be the one which gets HTTP traffic**. ### Type: (language)-worker / worker process -On Next dotCloud, you can define multiple workers in the Procfile that will run as background processes in that application. They use the exact same runtime environment as the web process. +On Next dotCloud, you can define multiple workers in the Procfile that will run as background processes in that application. They use the exact same runtime environment as the web process. To use this functionality, you need to add the [Worker Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) to your app. @@ -190,13 +190,13 @@ web: cd myapproot; sh startapp.sh ~~~ (myapproot and startapp.sh are arbitrary names, just for example) -If you want to change the approot for PHP-based applications, the process is slightly different. In this case, you’ll need to [manually set the Apache’s DocumentRoot](https://github.com/cloudControl/buildpack-php#manually-setting-the-documentroot). +If you want to change the approot for PHP-based applications, the process is slightly different. In this case, you’ll need to [manually set the Apache’s DocumentRoot](https://github.com/cloudControl/buildpack-php#manually-setting-the-documentroot). Next dotCloud processes do not have any magically created directories like the dotCloud services. There are neither code nor current symbolic links. The root of your home directory has the same format and contents as the directory which contains your Procfile. ## prebuild, postbuild, postinstall: Build Hooks ### prebuild and postbuild scripts -The officially supported Buildpacks on Next dotCloud consist of a standard set of scripts that are run when the deployment image is being built. Because of this, prebuild and postbuild hooks are not natively supported. +The officially supported Buildpacks on Next dotCloud consist of a standard set of scripts that are run when the deployment image is being built. Because of this, prebuild and postbuild hooks are not natively supported. If you have applications on dotCloud that use prebuild and postbuild hooks, it’s worthwhile to try pushing and deploying them using one of the officially supported Buildpacks first. The stack may already have the components you need installed and it may work out of the box. @@ -216,12 +216,12 @@ There are a couple of ways to migrate your dotcloud.yml config section, dependin If you’re using the config section to specify an interpreter version (e.g. Python 2.6 vs. Python 2.7), check the [Next dotCloud buildpack documentation on Github](https://github.com/cloudcontrol?query=buildpack) for how to do this with your specific buildpack. For example, you can specify the Python version by creating a runtime.txt file to replace your dotcloud.yml config: python_version. -If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. +If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. For more information, read our guide on [migrating environment variables](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) from dotCloud to Next dotCloud. ## ports -If you have a ports section in your dotcloud.yml then you should only have one port listed, a single http type port. That is the only kind of port allowed on the Next dotCloud PaaS. You can only have one process which listens to an HTTP port. +If you have a ports section in your dotcloud.yml then you should only have one port listed, a single http type port. That is the only kind of port allowed on the Next dotCloud PaaS. You can only have one process which listens to an HTTP port. If you do have multiple services each with their own HTTP port, then you should consider how to either separate these into different applications or how to access each different function via a different URL path (e.g. if you used to have an "admin" interface as well as a public interface, move your "admin" interface to be part of your public interface on another path, like "www.example.com/admin"). diff --git a/Guides/dotCloud-cloudControl migration/Migrating environment.md b/Guides/dotCloud-NextdotCloud migration/Migrating environment.md similarity index 99% rename from Guides/dotCloud-cloudControl migration/Migrating environment.md rename to Guides/dotCloud-NextdotCloud migration/Migrating environment.md index 96f501b..3691b60 100644 --- a/Guides/dotCloud-cloudControl migration/Migrating environment.md +++ b/Guides/dotCloud-NextdotCloud migration/Migrating environment.md @@ -163,5 +163,3 @@ Please keep in mind that these variables will not be present in `creds.json` fil print 'Key 1: {0}'.format(creds['CONFIG']['CONFIG_VARS']['KEY1']) print 'Key 2: {0}'.format(os.getenv('KEY2')) ~~~ - - diff --git a/Guides/dotCloud-cloudControl migration/Python.md b/Guides/dotCloud-NextdotCloud migration/Python.md similarity index 95% rename from Guides/dotCloud-cloudControl migration/Python.md rename to Guides/dotCloud-NextdotCloud migration/Python.md index 8830534..a5db245 100644 --- a/Guides/dotCloud-cloudControl migration/Python.md +++ b/Guides/dotCloud-NextdotCloud migration/Python.md @@ -4,7 +4,7 @@ Before you read this document, you should read the document on *Converting dotcl ## dotCloud Features -The first task is to determine what dotCloud features your Python service is using. +The first task is to determine what dotCloud features your Python service is using. ### Nginx @@ -20,7 +20,7 @@ Does your `approot` contain uWSGI configuration information (`*uwsgi.conf`) or d ## Choose Your Path -If you're not using Nginx, Supervisord, or uWSGI, then you can definitely use the standard Next dotCloud Python service! +If you're not using Nginx, Supervisord, or uWSGI, then you can definitely use the standard Next dotCloud Python service! For all the other cases, you can use a custom buildpack instead of the default Python service: https://github.com/metalivedev/buildpack-python-cloudcontrol.git#dotcloud The basic information about how to use that buildpack is in the buildpack's Readme.md. From 67895771051ee1b7c82e509e4eef4dd6ab594f6a Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 27 Nov 2014 16:44:59 +0100 Subject: [PATCH 16/84] Redis cloud addon documentation --- .../Data Storage/RedisCloud.md | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Add-on Documentation/Data Storage/RedisCloud.md diff --git a/Add-on Documentation/Data Storage/RedisCloud.md b/Add-on Documentation/Data Storage/RedisCloud.md new file mode 100644 index 0000000..6f7c993 --- /dev/null +++ b/Add-on Documentation/Data Storage/RedisCloud.md @@ -0,0 +1,51 @@ +# Redis Cloud +[Redis Cloud] is a fully-managed cloud service for hosting and running your Redis dataset in a +highly-available and scalable manner, with predictable and stable top performance. + +## Adding the Redis Cloud Add-on + +To add the Redis Cloud Add-on use the addon.add command. + +~~~ +$ dcapp APP_NAME/DEP_NAME addon.add rediscloud.OPTION +~~~ +Replace `rediscloud.OPTION` with a valid option, e.g. `rediscloud.25mb`. + +When added, Redis Cloud automatically creates a new user account with your email address. You can +manage the Add-on within the [web console](/console) (go to the specific deployment and click the link "rediscloud.OPTION"). + +## Upgrading the Redis Cloud Add-on + +To upgrade from a smaller to a more powerful plan use the addon.upgrade command. + +~~~ +$ dcapp APP_NAME/DEP_NAME addon.upgrade rediscloud.OPTION_OLD rediscloud.OPTION_NEW +~~~ + +## Downgrading the Redis Cloud Add-on + +To downgrade to a smaller plan use the addon.downgrade command. + +~~~ +$ dcapp APP_NAME/DEP_NAME addon.downgrade rediscloud.OPTION_OLD rediscloud.OPTION_NEW +~~~ + +## Removing the Redis Cloud Add-on + +The Redis Cloud Add-on can be removed from the deployment by using the addon.remove command. + +~~~ +$ dcapp APP_NAME/DEP_NAME addon.remove rediscloud.OPTION +~~~ + +### Internal Access + +It's recommended to the read database credentials from the *creds.json* file. The location of the +file is available in the `CRED_FILE` environment variable. Reading the credentials from the +*creds.json* file ensures your app is always using the correct credentials. For detailed +instructions on how to use the *creds.json* file please refer to the section about +[Add-on Credentials] in the general documentation. + + +[Redis Cloud]: https://redislabs.com/redis-cloud +[Add-on Credentials]: /dev-center/platform-documentation#add-ons From 402c5dd65ac3cc0a761be1c73941ae08efb373d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 27 Nov 2014 18:26:05 +0100 Subject: [PATCH 17/84] Update output from examples --- Platform Documentation.md | 44 ++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index d21a4fe..3fe1df4 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -785,8 +785,7 @@ u25832@DEP_ID-25832:~/www$ echo "interactive commands work as well" interactive commands work as well u25832@DEP_ID-25832:~/www$ exit exit -Connection to 10.62.45.100 closed. -Connection to ssh.cloudcontrolled.net closed. +Connection to sshforwarder.dotcloudapp.com closed. ~~~ It's also possible to execute a command directly and have the container shutdown after the command is finished. This is very useful for database migrations and other one-time tasks. @@ -795,36 +794,39 @@ For example, passing the `"env | sort"` command will list the environment variab ~~~ $ cctrlapp APP_NAME/DEP_NAME run "env | sort" Connecting... -Warning: Permanently added '[10.250.134.126]:10346' (RSA) to the list of known hosts. CRED_FILE=/srv/creds/creds.json DEP_ID=DEP_ID DEP_NAME=APP_NAME/DEP_NAME -DEP_VERSION=9d5ada800eff9fc57849b3102a2f27ff43ec141f -DOMAIN=cloudcontrolled.com -GEM_PATH=vendor/bundle/ruby/1.9.1 -HOME=/srv -HOSTNAME=DEP_ID-10346 +DEP_VERSION=91bd71fdb33e3609292660c83956e02d0af65819 +DOMAIN=dotcloudapp.com +HOME=/srv/www +HOSTNAME=depxt6zv82r-10680 LANG=en_US.UTF-8 -LOGNAME=u10346 -MAIL=/var/mail/u10346 -OLDPWD=/srv +LD_LIBRARY_PATH=/app/.paasprovider/vendor/lib +LIBRARY_PATH=/app/.paasprovider/vendor/lib +LOGNAME=u10680 +MAIL=/var/mail/u10680 PAAS_VENDOR=cloudControl -PATH=bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin -PORT=10346 +PATH=/app/.paasprovider/python/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games +PORT=10680 +PS1='[\$DEP_NAME]:\w\$ ' PWD=/srv/www -RACK_ENV=production -RAILS_ENV=production +PYTHONHASHSEED=random +PYTHONHOME=/app/.paasprovider/python +PYTHONPATH=/app/ +PYTHONUNBUFFERED=True SHELL=/bin/sh -SSH_CLIENT=10.32.47.197 59378 10346 -SSH_CONNECTION=10.32.47.197 59378 10.250.134.126 10346 +SIZE=1 +SSH_CLIENT=10.240.134.154 35844 10680 +SSH_CONNECTION=10.240.134.154 35844 10.240.84.84 10680 SSH_TTY=/dev/pts/0 -TERM=xterm +TERM=xterm-256color TMP_DIR=/srv/tmp TMPDIR=/srv/tmp -USER=u10346 +USER=u10680 WRK_ID=WRK_ID -Connection to 10.250.134.126 closed. -Connection to ssh.cloudcontrolled.net closed. +Connection to sshforwarder.dotcloudapp.com closed. + ~~~ ## Stacks From f8ce9b5fc5d1fc34e722a286a3146c8c620e8cfe Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Tue, 2 Dec 2014 10:39:31 +0100 Subject: [PATCH 18/84] Rebraned cheatsheet for dotcloudapp --- Quickstart.md | 2 +- ...heatsheet.pdf => dotcloudng_cheatsheet.pdf | Bin 575374 -> 532839 bytes 2 files changed, 1 insertion(+), 1 deletion(-) rename cctrl_cheatsheet.pdf => dotcloudng_cheatsheet.pdf (75%) diff --git a/Quickstart.md b/Quickstart.md index 6121784..568326f 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -119,7 +119,7 @@ http[s]://APP_NAME.cloudcontrolled.com ## Cheatsheet -Grab [our cheatsheet (PDF)](https://www.cloudcontrol.com/dev-center/cctrl_cheatsheet.pdf) to have the most important command line client commands handy at all times. +Grab [our cheatsheet (PDF)](/dev-center/dotcloudng_cheatsheet.pdf) to have the most important command line client commands handy at all times. ## Documentation diff --git a/cctrl_cheatsheet.pdf b/dotcloudng_cheatsheet.pdf similarity index 75% rename from cctrl_cheatsheet.pdf rename to dotcloudng_cheatsheet.pdf index 9fd8b530c4e794143e4ff24d5e50b08fceab0dca..151066eaae56dd70f5dd632d1545611400dd0c4d 100644 GIT binary patch delta 90540 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 z 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

      pQ@FP18U#4|7B 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

      j1aZd@*DJ!7!A$U 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%0DccKK%E+{7? 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 From acdf98996fac102a8a1b0a1d7f187ae406479c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Tue, 9 Sep 2014 13:54:06 +0200 Subject: [PATCH 19/84] Adapt mysqld addon guide for Google SQL implementation --- Add-on Documentation/Data Storage/MySQLd.md | 62 ++++++++++----------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/Add-on Documentation/Data Storage/MySQLd.md b/Add-on Documentation/Data Storage/MySQLd.md index a31457b..60cd791 100644 --- a/Add-on Documentation/Data Storage/MySQLd.md +++ b/Add-on Documentation/Data Storage/MySQLd.md @@ -2,13 +2,9 @@ High-availability, dedicated MySQL databases are available for mission-critical production deployments. The dedicated MySQL Add-on is -based on [Amazon RDS] and uses master-slave replicated Multi-AZ instances. Read -slaves or reserved instances are currently not supported via the Add-on, but -you can always create a custom RDS instance in the EU region and connect your -app to it. We recommend using the [Config Add-on] to make the credentials -of the self-managed RDS instance available to your app. +based on [Google Cloud SQL] and synchronous replication in multiple zones. -## Features of the cloudControl MySQLd Add-on +## Features of the dotCloud MySQLd Add-on The MySQLd Add-on comes with the following features: @@ -26,33 +22,37 @@ The MySQLd Add-on comes with the following features: - DB Snapshots - DB Snapshots are available. [Email us] for more details. 3. High Availability - - Multi-AZ Deployments - Once you create or modify your DB Instance, we - will automatically provision and manage a “standby” replica in a - different Availability Zone (independent infrastructure in a physically - separate location). Database updates are made concurrently on the primary - and standby resources to prevent replication lag. + - Multiple Zones Data Replication - Your data is replicated in many geographic locations + as standard. Failover between them is handled automatically by us. Your data is + safe and your database is available even in the event of a major failure in one location. 4. Dashboard - - View key operational metrics like CPU/ Memory/ Storage/ Connections/ Upgrade status for your DB Instance deployments via [Webconsole]. + - View key operational metrics like Storage or Connections for your DB Instance deployments via [Webconsole]. + - Download the SSL Certificate for encrypted external connections. + +5. Security + - All data is encrypted when on internal networks and when stored in database + tables and temporary files. + - Connections can be encrypted using SSL. ## Adding the MySQLd Add-on To add the MySQLd Add-on use the `addon.add` command: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add mysqld.OPTION +$ dcapp APP_NAME/DEP_NAME addon.add mysqld.OPTION ~~~ -Replace `mysqld.OPTION` with a valid option, e.g. `mysqld.small`. See +Replace `mysqld.OPTION` with a valid option, e.g. `mysqld.d0`. See [MySQLd] in the Add-on Marketplace for pricing and options. -Please note: After adding a dedicated MySQL database, it can take up to 30 minutes before the instance is available. Also the credentials will only be available after the instance is up and running. +Please note: After adding a dedicated MySQL database, it can take up to 5 minutes before the instance is available. Also the credentials will only be available after the instance is up and running. ## Upgrading the MySQLd Add-on To upgrade from a smaller to a more powerful plan use the `addon.upgrade` command: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade mysqld.OPTION_OLD mysqld.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.upgrade mysqld.OPTION_OLD mysqld.OPTION_NEW ~~~ Please note: Upgrading the instance types is a multi step process that first upgrades the secondary, then promotes the secondary to the new master and after that upgrades also the old master and makes it the new secondary. This process can take up to 65 minutes and can involve a 3 to 10 minute downtime. @@ -62,7 +62,7 @@ Please note: Upgrading the instance types is a multi step process that first upg To downgrade to a smaller plan, use the `addon.downgrade` command: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade mysqld.OPTION_OLD mysqld.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.downgrade mysqld.OPTION_OLD mysqld.OPTION_NEW ~~~ Please note: It is only possible to downgrade to plans with matching storage @@ -74,17 +74,18 @@ sizes. The MySQLd Add-on can be removed from the deployment by using the `addon.remove` command: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove mysqld.OPTION +$ dcapp APP_NAME/DEP_NAME addon.remove mysqld.OPTION ~~~ **Attention:** Removing the MySQLd Add-on deletes all data in the database. ## Replication and Failover -All instances are master-slave replicated across two different availability -zones. In case of a failure of the master, an automatic failover to the slave -will trigger to restore availability. This failover process takes usually -between 3 and 10 minutes. +All instances replicated in multiple zones. In the unlikely event of a zone outage, +instances fail over to another, available, zone automatically. Failover is designed to +be transparent to your applications, so that after failover, an instance has the same +instance name, IP address, and firewall rules. During the failover there will typically +be a few seconds downtime as the instance starts up in a new zone. ## Database Credentials @@ -101,24 +102,24 @@ general documentation. External access to the MySQLd Add-on is available through an SSL-encrypted connection by following these simple steps: - 1. Download the [certificate file] to your local machine. + 1. Download the SSL certificate file from the Dashboard via [Webconsole]. 1. Connect to the database using an SSL encrypted connection. The following example uses the MySQL command line tool: ~~~ -$ mysql -u MYSQLD_USERNAME -p --host=MYSQLD_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/mysql-ssl-ca-cert.pem +$ mysql -u MYSQLD_USERNAME -p --host=MYSQLD_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/ca-cert.pem ~~~ Replace the uppercase variables with the corresponding values shown by the `addon` command: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon mysqld.OPTION -Addon : mysqld.small +$ dcapp APP_NAME/DEP_NAME addon mysqld.OPTION +Addon : mysqld.d0 Settings MYSQLD_PASSWORD : SOME_SECRET_PASSWORD MYSQLD_USER : SOME_SECRET_USER - MYSQLD_HOST : SOME_HOST.eu-west-1.rds.amazonaws.com + MYSQLD_HOST : SOME_HOST MYSQLD_DATABASE : SOME_DATABASE_NAME MYSQLD_PORT : 3306 MYSQLD_URL : SOME_DATABASE_URL @@ -128,19 +129,18 @@ Similarly, imports and exports are equally simple. To **export** your data use the `mysqldump` command: ~~~ -$ mysqldump -u MYSQLD_USERNAME -p --host=MYSQLD_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/mysql-ssl-ca-cert.pem MYSQLD_DATABASE > MYSQLD_DATABASE.sql +$ mysqldump -u MYSQLD_USERNAME -p --host=MYSQLD_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/ca-cert.pem MYSQLD_DATABASE > MYSQLD_DATABASE.sql ~~~ To **import** an sql file into a MySQL database use the following command: ~~~ -$ mysql -u MYSQLD_USER -p --host=MYSQLD_SERVER --ssl-ca=PATH_TO_CERTIFICATE/mysql-ssl-ca-cert.pem MYSQLD_DATABASE < MYSQLD_DATABASE.sql +$ mysql -u MYSQLD_USER -p --host=MYSQLD_SERVER --ssl-ca=PATH_TO_CERTIFICATE/ca-cert.pem MYSQLD_DATABASE < MYSQLD_DATABASE.sql ~~~ -[Amazon RDS]: http://aws.amazon.com/rds/ +[Google Cloud SQL]: https://developers.google.com/cloud-sql/ [Config Add-on]: https://www.cloudcontrol.com/add-ons/config [MySQLd]: https://www.cloudcontrol.com/add-ons/mysqld [Add-on Credentials]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons [Email us]: mailto:support@cloudcontrol.de -[certificate file]: http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem [Webconsole]: https://www.cloudcontrol.com/console/login From 05406860a447e7d7a8fc295aa390cc5f2cb386d2 Mon Sep 17 00:00:00 2001 From: Dimitris Verraros Date: Tue, 11 Nov 2014 16:50:24 +0100 Subject: [PATCH 20/84] Add Django Celery migration guide Add new guide in order to describe the migration path from a Django Celery app on dotCloud to cloudControl, as part of the launch of the new website. --- .../Python/Django Celery migration guide.md | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 Guides/dotCloud-cloudControl migration/Python/Django Celery migration guide.md diff --git a/Guides/dotCloud-cloudControl migration/Python/Django Celery migration guide.md b/Guides/dotCloud-cloudControl migration/Python/Django Celery migration guide.md new file mode 100644 index 0000000..f67af32 --- /dev/null +++ b/Guides/dotCloud-cloudControl migration/Python/Django Celery migration guide.md @@ -0,0 +1,147 @@ +Migrating a Django Celery app from dotCloud to Next dotCloud +=========================================================== + +This guide is intended to help migrating a [Django] app, using [Celery], and is +deployed on [dotCloud], to the [Next dotCloud] PaaS. + +# Getting Started + +First you need to clone the transformed application from +https://github.com/cloudControl/django-celery-migration-app to your local +machine: +~~~ +$ git clone https://github.com/cloudControl/django-celery-migration-app +$ cd django-celery-migration-app +~~~ + +Looking at the commit history of this application you can see the +transformations needed in order to get the application deployed on Next dotCloud. +Those are summed up in the following paragraphs. + +## Add a Procfile + +The [Procfile] is an important part of your Next dotCloud application since it +describes the way to execute your application. It can be compared to the +`dotcloud.yml`. + +In there we define the command to run the django application but also the +commands to start the workers: +~~~ +web: gunicorn -b 0.0.0.0:$PORT --log-file - minestrone.wsgi +celerycam: python manage.py celerycam +celeryd: python manage.py celeryd -E -l info -c 2 +~~~ + +## Update the Django settings + +The Django settings needed to be updated in order to match the Next dotCloud +services, including the database and message queue configuration, alongside the +serving of static files and templates. + +## Update requirements.txt + +The requirements are also updated in order to include [gunicorn] – the in use +`wsgi` server – `MySQL-python` since we use MySQL as a database and a python +plugin for serving static assets. + +## General code changes + +The application included code improvements and changes in order to match the +latest versions of its dependencies, plus a basic restructure in respect to +those changes. + +# Deploy your app on Next dotCloud + +After having these changes in place you can migrate your app to Next dotCloud. +The first step is about creating your application. In this case you need to pick +a name and define the application type which in our case is python: +~~~ +$ dcapp APP_NAME create python +~~~ + +After the app is successfully created you can push your code on the platform: +~~~ +$ dcapp APP_NAME push +~~~ + +Then you will need to choose the services needed for your application. In +Next dotCloud those are called [add-ons] and in this case we will need a database +add-on and a RabbitMQ add-on. In this example we will use the [MySQLd] and the +[CloudAMQP] add-ons: +~~~ +$ dcapp APP_NAME addon.add mysqld.micro +$ dcapp APP_NAME addon.add cloudamqp.tiger +~~~ + +MySQLd takes a few minutes until the instance is up. To check its status you can +use the `addon` command: +~~~ +$ dcapp APP_NAME addon +~~~ + +After the service are in place you can finally deploy your application: +~~~ +$ dcapp APP_NAME deploy +~~~ + +Django needs an initial database setup. For that you can use the [run] command +which swaps an instance of your application and allows you to execute code in +it. In order to run `syncdb` you can execute the following: +~~~ +$ dcapp APP_NAME run 'python manage.py syncdb' +~~~ + +Follow the instructions to create your admin user. When this is done you can +finally add your background workers which execute the jobs published in the +message queue. Add the [Worker] add-on: +~~~ +$ dcapp APP_NAME addon.add worker.single +~~~ + +Then add the workers defined into your Procfile like this: +~~~ +$ dcapp APP_NAME worker.add celeryd +$ dcapp APP_NAME worker.add celerycam +~~~ + +Your app should be now fully set up. You can open it in your browser with the +`open` command: +~~~ +$ dcapp APP_NAME open +~~~ + +Now you can add jobs and the workers will execute them. To monitor the worker +activity you can check the [logs]: +~~~ +$ dcapp APP_NAME log worker +~~~ + +In the end the finished jobs are put into the task table. You can see that by +logging into the admin interface of your application using the credentials you +defined on the syncdb step. Login at https://APP_NAME.dotcloudapp.com/admin to +proceed into the django admin panel. + +Finally, you can always monitor your application by checking the error log with: +~~~ +$ dcapp APP_NAME log error +~~~ + +# Conclusion + +With a few transformations in order to match the Next dotCloud platform +requirements and some steps to create and set up your application, you can +easily move from dotCloud without missing any services and most importantly +having everything under control. + +[Django]: https://www.djangoproject.com/ +[Celery]: http://www.celeryproject.org/ +[dotCloud]: https://www.dotcloud.com/ +[Next dotCloud]: https://www.next.dotcloud.com/ +[Procfile]: https://www.next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile +[gunicorn]: http://gunicorn.org/ +[add-ons]: https://www.next.dotcloud.com/add-ons +[MySQLd]: https://www.next.dotcloud.com/add-ons/mysqld +[CloudAMQP]: https://www.next.dotcloud.com/add-ons/cloudamqp +[run]: https://www.next.dotcloud.com/dev-center/platform-documentation#secure-shell-ssh +[Worker]: https://www.next.dotcloud.com/add-ons/worker +[logs]: https://www.next.dotcloud.com/dev-center/platform-documentation#logging From 94a8e997aea953de6fb85766fb29ce94ee193abf Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 27 Nov 2014 14:49:47 +0100 Subject: [PATCH 21/84] Remove unsupported addons --- .../Big Data & Analytics/DBInsights.md | 50 --- .../Big Data & Analytics/IndexDepot.md | 150 -------- .../Data Processing/Cloudinary.md | 45 --- .../Data Processing/Found Elasticsearch.md | 261 -------------- .../Data Processing/GroupDocs.md | 39 -- .../Data Processing/IronMQ.md | 53 --- .../Data Processing/IronWorker.md | 53 --- .../Data Processing/QuotaGuard.md | 107 ------ .../Data Processing/QuotaGuardStatic.md | 322 ----------------- .../Data Processing/RabbitMQBigwig.md | 192 ---------- .../Data Processing/Searchify.md | 44 --- .../Data Processing/Searchly.md | 319 ----------------- Add-on Documentation/Data Storage/Cloudant.md | 57 --- .../Data Storage/Flying Sphinx.md | 42 --- Add-on Documentation/Data Storage/MongoLab.md | 81 ----- .../Data Storage/OpenRedis.md | 44 --- .../Data Storage/PostgreSQLd.md | 172 --------- Add-on Documentation/Deployment/Codeship.md | 42 --- Add-on Documentation/Deployment/Logentries.md | 33 -- Add-on Documentation/Deployment/Phrase.md | 192 ---------- Add-on Documentation/Deployment/Userbin.md | 333 ------------------ Add-on Documentation/Deployment/Usersnap.md | 264 -------------- .../Messaging & Mobile/46elks.md | 28 -- .../Messaging & Mobile/CloudMailin.md | 55 --- .../Messaging & Mobile/Mailgun.md | 197 ----------- .../Performance & Monitoring/Blitz.io.md | 43 --- .../Performance & Monitoring/Exceptiontrap.md | 50 --- .../Hosted Graphite.md | 136 ------- .../Performance & Monitoring/Loader.io.md | 34 -- .../Performance & Monitoring/New Relic.md | 47 --- .../Performance & Monitoring/StillAlive.md | 23 -- 31 files changed, 3508 deletions(-) delete mode 100644 Add-on Documentation/Big Data & Analytics/DBInsights.md delete mode 100644 Add-on Documentation/Big Data & Analytics/IndexDepot.md delete mode 100644 Add-on Documentation/Data Processing/Cloudinary.md delete mode 100644 Add-on Documentation/Data Processing/Found Elasticsearch.md delete mode 100644 Add-on Documentation/Data Processing/GroupDocs.md delete mode 100644 Add-on Documentation/Data Processing/IronMQ.md delete mode 100644 Add-on Documentation/Data Processing/IronWorker.md delete mode 100644 Add-on Documentation/Data Processing/QuotaGuard.md delete mode 100644 Add-on Documentation/Data Processing/QuotaGuardStatic.md delete mode 100644 Add-on Documentation/Data Processing/RabbitMQBigwig.md delete mode 100644 Add-on Documentation/Data Processing/Searchify.md delete mode 100644 Add-on Documentation/Data Processing/Searchly.md delete mode 100644 Add-on Documentation/Data Storage/Cloudant.md delete mode 100644 Add-on Documentation/Data Storage/Flying Sphinx.md delete mode 100644 Add-on Documentation/Data Storage/MongoLab.md delete mode 100644 Add-on Documentation/Data Storage/OpenRedis.md delete mode 100644 Add-on Documentation/Data Storage/PostgreSQLd.md delete mode 100644 Add-on Documentation/Deployment/Codeship.md delete mode 100644 Add-on Documentation/Deployment/Logentries.md delete mode 100644 Add-on Documentation/Deployment/Phrase.md delete mode 100644 Add-on Documentation/Deployment/Userbin.md delete mode 100644 Add-on Documentation/Deployment/Usersnap.md delete mode 100644 Add-on Documentation/Messaging & Mobile/46elks.md delete mode 100644 Add-on Documentation/Messaging & Mobile/CloudMailin.md delete mode 100644 Add-on Documentation/Messaging & Mobile/Mailgun.md delete mode 100644 Add-on Documentation/Performance & Monitoring/Blitz.io.md delete mode 100644 Add-on Documentation/Performance & Monitoring/Exceptiontrap.md delete mode 100644 Add-on Documentation/Performance & Monitoring/Hosted Graphite.md delete mode 100644 Add-on Documentation/Performance & Monitoring/Loader.io.md delete mode 100644 Add-on Documentation/Performance & Monitoring/New Relic.md delete mode 100644 Add-on Documentation/Performance & Monitoring/StillAlive.md diff --git a/Add-on Documentation/Big Data & Analytics/DBInsights.md b/Add-on Documentation/Big Data & Analytics/DBInsights.md deleted file mode 100644 index 3b55c90..0000000 --- a/Add-on Documentation/Big Data & Analytics/DBInsights.md +++ /dev/null @@ -1,50 +0,0 @@ -# DBInsights - -DbInsights provides you with business intelligence insights and database analytics with minimum efforts on your part. - -## Adding DBInsights - -The DBInsights Add-on can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add dbinsights.PLAN -~~~ - -When added, DBInsights automatically creates a new user account with your email adress. You can access the insights for the database within the [web console](https://www.cloudcontrol.com/console) (go to the specific deployment and click the link "dbinsights.OPTION"). - -## Upgrade DBInsights - -Upgrading to another version of DBInsights is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade dbinsights.OPTION_OLD dbinsights.OPTION_NEW -~~~ - -## Downgrade DBInsights - -Downgrading to another version of DBInsights is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade dbinsights.OPTION_OLD dbinsights.OPTION_NEW -~~~ - -## Removing DBInsights - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove dbinsights.OPTION -~~~ - -## Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -The JSON file has the following structure: - -~~~ -{ - "DBINSIGHTS":{ - "DBINSIGHTS_URL":"https://dbinsights.com/accounts/youraccount", - } -} -~~~ - diff --git a/Add-on Documentation/Big Data & Analytics/IndexDepot.md b/Add-on Documentation/Big Data & Analytics/IndexDepot.md deleted file mode 100644 index da390b4..0000000 --- a/Add-on Documentation/Big Data & Analytics/IndexDepot.md +++ /dev/null @@ -1,150 +0,0 @@ -# IndexDepot - -IndexDepot furnishes search solutions for numerous applications based on the latest technologies. Benefit from the advantages of the Apache Solr and ElasticSearch search server in the cloud. - -## Adding IndexDepot - -The IndexDepot Add-on can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add indexdepot.OPTION -~~~ -When added, Indexdepot automatically creates a new user account with a default search index. You can manage your IndexDepot Add-on easily within the web console (go to the specific deployment and click the link "Login" next to "indexdepot.OPTION"). - -## Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -The JSON file has the following structure: - -~~~ -{ - "INDEXDEPOT":{ - "INDEXDEPOT_URL:"https://USERNAME:PASSWORD@www.indexdepot.com/solr/INDEX_ID/,-%20%20%7D-%7D-~~~--##%20Upgrade%20IndexDepot--Upgrading%20to%20another%20version%20of%20IndexDepot%20is%20easily%20done:--~~~-$%20cctrlapp%20APP_NAME/DEP_NAME%20addon.upgrade%20indexdepot.OPTION_OLD%20indexdepot.OPTION_NEW%20-~~~--##%20Downgrade%20IndexDepot--Downgrading%20to%20another%20version%20of%20IndexDepot%20is%20easily%20done:--~~~-$%20cctrlapp%20APP_NAME/DEP_NAME%20addon.downgrade%20indexdepot.OPTION_OLD%20indexdepot.OPTION_NEW%20-~~~--##%20Removing%20IndexDepot--~~~-$%20cctrlapp%20APP_NAME/DEP_NAME%20addon.remove%20indexdepot.OPTION-~~~--##%20IndexDepot%20Apache%20Solr%20Code%20Example--Here%20is%20an%20example%20on%20how%20to%20use%20an%20IndexDepot%20Apache%20Solr%20search%20index%20with%20PHP.%20The%20example%20uses%20the%20Zend%20HTTP%20client.%20There%20is%20another%20library%20[solr-php-client](http://code.google.com/p/solr-php-client/),%20but%20it%20didn't support SSL and HTTP authentication for secured search indexes. If you like to use [solr-php- client](http://code.google.com/p/solr-php-client/) for secured indexes, please contact [support@indexdepot.com](http://support@indexdepot.com/) for further information. - -## Step 1: Loading Data into Apache Solr - -Before indexing some sample data into Apache Solr make sure to configure new fields in schema.xml. When the add-on is added to your deployment, IndexDepot automatically creates a new user account and Solr search index in an Amazon EC2 cloud. You can manage your search index easily from the [web console](https://www.cloudcontrol.com/console) by clicking the IndexDepot add-on entry on your app's deployment page, and you gain immediate access to IndexDepot control panel. Then you can configure new fields for indexing by clicking on *Edit configuration files*. Add a new field name to schema.xml. - -~~~ - - - - -~~~ - -Don\92t forget to reload your search index in the control panel after adding the new field. - -## Step 2: Installing Zend - -Let's use the Zend Framework to index and search our first documents. This example assumes that you've downloaded and extracted it to the vendor folder inside the main directory of the cloudControl tutorial app - so you should get similar output if you use *nix: - -~~~ -$ cd ~/cctrl_tutorial_app/ $ ~/cctrl_tutorial_app: ls vendor/Zend/ Acl Crypt Form Log.php Pdf Test -~~~ - -To make the Zend Framework usable, we need to add the vendor folder to the PHP include path of our application: - -~~~ - -~~~ - -## Step 3: Getting access to IndexDepot Apache Solr credentials - -When you install the add-on, IndexDepot populates your app environment with the access credentials. Here's how you access them from the source code: - -~~~ - -~~~ - -## Step 4: Index documents - -~~~ - - -1 -cloudControl - - -2 -IndexDepot - - -EOD; -$solrHttpClient->setUri($creds['INDEXDEPOT']['INDEXDEPOT_URL'] . 'update'); -$solrHttpClient->setParameterPost(array('commit' => 'true')) -->setRawData($xml) -->setEncType('text/xml'); -$response = $solrHttpClient->request('POST'); -?> -~~~ - -## Step 5: Search documents - -~~~ -setUri($creds['INDEXDEPOT']['INDEXDEPOT_URL'] . 'select'); -$solrHttpClient->setParameter(array('q' => 'IndexDepot')); -$response = $solrHttpClient->request('GET'); -?> -~~~ - -## Step 6: Delete documents - -~~~ -*:*'; -$solrHttpClient->setUri($creds['INDEXDEPOT']['INDEXDEPOT_URL'] . 'update'); -$solrHttpClient->setParameterPost(array('commit' => 'true')) -->setRawData($xml) -->setEncType('text/xml'); -$response = $solrHttpClient->request('POST'); -?> -~~~ - -Read more on indexing and search in [Solr documentation](http://wiki.apache.org/solr/) and [Solr Tutorial](http://lucene.apache.org/solr/api/doc-files/tutorial.html). - diff --git a/Add-on Documentation/Data Processing/Cloudinary.md b/Add-on Documentation/Data Processing/Cloudinary.md deleted file mode 100644 index 26927ec..0000000 --- a/Add-on Documentation/Data Processing/Cloudinary.md +++ /dev/null @@ -1,45 +0,0 @@ -# Cloudinary (Beta) - -Cloudinary is a cloud service that offers a solution to an applications's entire image management pipeline. - -## Adding or removing the Cloudinary Add-on - -The Add-on comes in different sizes and prices. It can be added by executing the command addon.add: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add cloudinary.OPTION -~~~ -*.option* represents the plan size, e.g. cloudinary.test - - -## Upgrade the Cloudinary Add-on - -Upgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade cloudinary.OPTION_OLD cloudinary.OPTION_NEW -~~~ - -##Downgrade the Cloudinary Add-on - -Downgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade cloudinary.OPTION_OLD cloudinary.OPTION_NEW -~~~ - -## Removing the Cloudinary Add-on - -Similarily, an Add-on can also be removed from the deployment easily. The costs only apply for the time the Add-on was active: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove cloudinary.OPTION -~~~ - -## Add-on credentials - -Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -For more detailed information please refer to the [documentation on Cloudinary](http://cloudinary.com/documentation/cloudcontrol_integration). \ No newline at end of file diff --git a/Add-on Documentation/Data Processing/Found Elasticsearch.md b/Add-on Documentation/Data Processing/Found Elasticsearch.md deleted file mode 100644 index 5c92623..0000000 --- a/Add-on Documentation/Data Processing/Found Elasticsearch.md +++ /dev/null @@ -1,261 +0,0 @@ -# Found Elasticsearch - -[Elasticsearch](http://www.elasticsearch.org) is an open source, distributed, REST-ful search engine. In addition to being an excellent search engine, it is also great for analytics, storing logs, etc. — a general "NoSQL" store. - -[Found Elasticsearch](http://www.found.no/) provides dedicated clusters with reserved memory and storage, ensuring predictable performance. You can easily scale your search cluster up or down using the web console, with no downtime. We provide replication and automatic failover for production and mission critical environments, protecting your cluster against unplanned downtime. - -## Installing the add-on - -To use Found Elasticsearch on cloudControl, install the add-on using the `cctrlapp` command: - - $ cctrlapp APP_NAME/DEP_NAME addon.add foundelasticsearch.option - -Replace `option` with a valid plan name, such as `dachs`. A list of all plans available can be found [here](https://www.cloudcontrol.com/add-ons/foundelasticsearch). - -Once Found Elasticsearch has been added, a `FOUNDELASTICSEARCH_URL` setting will be available in the app configuration and will contain the canonical URL used to access the newly provisioned cluster. - -### Specifying version and plugins - -We provide many Elasticsearch versions and plugins. - -After the addon has been added, version upgrades and plugin changes can be done through the add-on dashboard. - -### Supported versions and plugins - -* 0.19.12: analysis-icu, analysis-smartcn, analysis-stempel, analysis-phonetic, analysis-morphology, river-couchdb, river-jdbc, river-rabbitmq, rssriver -* 0.20.4 to 0.20.6: analysis-icu, analysis-morphology, analysis-smartcn, analysis-stempel, analysis-phonetic, river-couchdb, river-jdbc, river-rabbitmq, rssriver -* 0.90.0 to 0.90.5: analysis-icu, analysis-morphology, analysis-smartcn, analysis-stempel, analysis-phonetic, inquisitor, mapper-attachments, river-couchdb, river-jdbc, river-rabbit - -New versions are made available for provisioning soon after they're released. - -Contact [support@found.no](mailto:support@found.no) if you want the ["attachments"-plugin](http://www.elasticsearch.org/guide/reference/mapping/attachment-type/) enabled. - -## Accessing the add-on dashboard - -The Found Elasticsearch dashboard allows you to manage the cluster, like upgrading versions, enabling plugins, editing the access control lists (ACLs), and viewing the logs emitted from the nodes. - -![Found Elasticsearch Dashboard](https://s3.amazonaws.com/heroku.devcenter/heroku_assets/images/167-original.jpg "Found Elasticsearch Dashboard") - -You can access the dashboard through the [cloudControl console](https://www.cloudcontrol.com/console/). - -## Access control - -With the default configuration, since not all Elasticsearch clients support basic authentication, **anyone knowing the cluster-ID has full access to your cluster**. - -We highly recommend using the access control feature to at least require authentication. Authentication uses HTTP Basic-authentication. Most, but not all, HTTP- and Elasticsearch-libraries support this. - -You can limit access based on path, source IP, method, username/password and whether SSL is used. The access control-section of the dashboard has annotated samples to use as templates for your own ACLs. - -## Using the add-on - -In this section, we will briefly go through the indexing, updating, retrieving, searching and deleting documents in an Elasticsearch cluster. We will use [curl](http://curl.haxx.se/) as our client from the command line. - -### Indexing - -To index documents, simply `POST` documents to Elasticsearch: - - $ curl http://.foundcluster.com:9200/my_index/my_type -XPOST -d '{ - "title": "One", "tags": ["ruby"] - }' - {"ok":true,"_index":"my_index","_type":"my_type","_id":"HAJppjLLTROm8i35IJEQWQ","_version":1} - -In the above example, the index `my_index` is created dynamically when the first document is inserted into it. -All documents in Elasticsearch have a `type` and an `id`, which is echoed as `_type` and `_id` in the JSON responses. -If no `id` is specified during indexing, a random `id` is generated. - -#### Bulk indexing - -To achieve the best possible performance, using the Bulk API is highly recommended. So let us index a couple more documents using the bulk API: - - $ curl http://.foundcluster.com:9200/my_index/my_type/_bulk -XPOST -d ' - {"index": {}} - {"title": "Two", "tags": ["ruby", "python"] } - {"index": {}} - {"title": "Three", "tags": ["java"] } - {"index": {}} - {"title": "Four", "tags": ["ruby", "php"] } - ' - -Elasticsearch should then give us output similar to this: - - {"took":10, "items": [ - {"create":{"_index":"my_index","_type":"my_type","_id":"v7ufoXxSSuOTckcyL7hg4Q","_version":1,"ok":true}}, - {"create":{"_index":"my_index","_type":"my_type","_id":"wOzT31EnTPiOw1ICTGX-qA","_version":1,"ok":true}}, - {"create":{"_index":"my_index","_type":"my_type","_id":"_b-kbI1MREmi9SeixFNEVw","_version":1,"ok":true}} - ]} - - -### Updating - -To update an existing document in Elasticsearch, simply `POST` the updated document to `http://.foundcluster.com:9200/my_index/my_type/`, where `` is the `id` of the document. For example, to update the last document indexed above: - - - $ curl http://.foundcluster.com:9200/my_index/my_type/_b-kbI1MREmi9SeixFNEVw -XPOST -d '{ - "title": "Four updated", "tags": ["ruby", "php"] - }' - {"ok":true,"_index":"my_index","_type":"my_type","_id":"_b-kbI1MREmi9SeixFNEVw","_version":2} - - -As you can see, the document is updated and the `_version` counter is automatically incremented. - - -### Retrieving documents - -We can take a look at the data we indexed by simply issuing a `GET` request to the document: - - $ curl http://.foundcluster.com:9200/my_index/my_type/_b-kbI1MREmi9SeixFNEVw - {"exists":true,"_index":"my_index","_type":"my_type","_id":"_b-kbI1MREmi9SeixFNEVw","_version":2,"_source":{"title": "Four updated", "tags": ["ruby", "php"]}} - -If Elasticsearch find the document, it returns a HTTP status code of `200 OK` and sets `exists: true` in the result. Otherwise, a HTTP status code of `404 Not Found` is used and the result will contain `exists: false`. - -### Searching - -Search requests may be sent to the following Elasticsearch endpoints: - -1. `http://.foundcluster.com:9200/_search` -1. `http://.foundcluster.com:9200/{index_name}/_search` -1. `http://.foundcluster.com:9200/{index_name}/{type_name}/_search` - -We can search using a `HTTP GET` or `HTTP POST` requests. To search using a `HTTP GET` request, we use URI parameters to specify our query: - - $ curl http://.foundcluster.com:9200/my_index/my_type/_search?q=title:T* - -A full explanation of allowed parameters is found in the [Elasticsearch URI Request documentation](http://www.elasticsearch.org/guide/reference/api/search/uri-request.html) - -In order to perform more complicated queries, we have to use `HTTP POST` requests to search. In the next example, we create a facet on the `tags` field: - -

      Note that we added `?pretty=true` to the request, which makes Elasticsearch return a more human readable JSON response. Due to performance reasons, this is not recommended in production.
      - - $ curl http://.foundcluster.com:9200/my_index/my_type/_search?pretty=true -XPOST -d '{ - "query": { - "query_string": {"query": "*"} - }, - "facets": { - "tags": { - "terms": {"field": "tags"} - } - } - }' - -A full explanation of how the request body is structured is found in the [Elasticsearch Request Body documentation](http://www.elasticsearch.org/guide/reference/api/search/request-body.html) - -To execute multiple queries in one request, use the [Multi Search API](http://www.elasticsearch.org/guide/reference/api/multi-search.html). - -### Deleting - -Documents are deleted from Elasticsearch by sending `HTTP DELETE` requests. - -1. Delete a single document: - - $ curl http://.foundcluster.com:9200/{index}/{type}/{id} -XDELETE - -1. Delete all documents of a given type: - - $ curl http://.foundcluster.com:9200/{index}/{type} -XDELETE - -1. Delete a whole index: - - $ curl http://.foundcluster.com:9200/{index} -XDELETE - -1. Delete all documents matching a query: - - For example, to delete all documents whose title starts with `T`: - - $ curl http://.foundcluster.com:9200/{index}/{type}/_query -XDELETE -d '{ - "query_string" : { "query" : "title:T*" } - } - - See [Elasticsearch Delete By Query](http://www.elasticsearch.org/guide/reference/api/delete-by-query.html) for a complete overview of this functionality. - - -## Elasticsearch clients - -Elasticsearch comes with a REST API, which can be used directly via any HTTP client. - -Many higher-level clients have been built on top of this API in various programmling languages. A large list of Elasticsearch clients and integrations are found [here](http://www.elasticsearch.org/guide/appendix/clients.html). - - -## Tire client (Ruby) - -[Tire](http://karmi.github.com/tire/) is a rich and comfortable Ruby API on top of the REST API, with built-in support for Rails. - -### Configuring Tire - - require 'rubygems' - require 'tire' - - Tire::Configuration.url ENV['FOUNDELASTICSEARCH_URL'] - -Remember to update application dependencies with bundler. - - $ bundle install - -### Indexing documents - -We start by indexing a couple of documents: - - Tire.index 'articles' do - delete - create - - store :title => 'One', :tags => ['ruby'] - store :title => 'Two', :tags => ['ruby', 'python'] - store :title => 'Three', :tags => ['java'] - store :title => 'Four', :tags => ['ruby', 'php'] - - refresh - end - - -### Searching - -After indexing the documents, we search for articles that has a title starting with "T": - - s = Tire.search 'articles' do - query do - string 'title:T*' - end - end - - s.results.each do |document| - puts "* #{ document.title } [tags: #{document.tags.join(', ')}]" - end - - # * Two [tags: ruby, python] - - -### ActiveModel integration - -See the [Tire documentation](http://karmi.github.com/tire/) for more examples and in-depth explanations on how to use Tire to integrate with ActiveModel. - -## Removing the add-on - -Found Elasticsearch can be removed via the CLI. This will destroy all associated data and cannot be undone! - - $ cctrlapp APP_NAME/DEP_NAME addon.remove foundelasticsearch.option - - -## Migrating between plans - -Available memory is a very important factor when sizing your Elasticsearch cluster, and replicating across multiple data centers is important for the resilience of production applications. Our plans are differentiated on the available reserved memory and disk quota, as well as on the number of data centers. - -Use the `cctrlapp addon.upgrade` command to migrate to a new plan: - - $ cctrlapp APP_NAME/DEP_NAME addon.upgrade foundelasticsearch.newplan - - -Upgrading to a new plan is done by extending the existing cluster with new nodes and migrating data from the old nodes to the new nodes. When the migration is finished, the old nodes are shut down and removed from the cluster. - -## Support - -Please mail [support@found.no](mailto:support@found.no) if you have any problems. - - -## Additional resources - -Found Elasticsearch exposes the majority of the Elasticsearch REST API, which means that most valid Elasticsearch API requests will work with your provisioned instance. Please refer to the [Elasticsearch guide](http://www.elasticsearch.org/guide/) for more in-depth explanations of all the possibilities. - -* [Foundation – articles on all things Elasticsearch](http://www.found.no/foundation/) -* [Elasticsearch Official Guide](http://www.elasticsearch.org/guide/) -* [Elasticsearch Official Google Groups](http://groups.google.com/forum/#!forum/elasticsearch) -* [Elasticsearch source code on GitHub](https://github.com/elasticsearch/elasticsearch) diff --git a/Add-on Documentation/Data Processing/GroupDocs.md b/Add-on Documentation/Data Processing/GroupDocs.md deleted file mode 100644 index 8f63d9d..0000000 --- a/Add-on Documentation/Data Processing/GroupDocs.md +++ /dev/null @@ -1,39 +0,0 @@ -#GroupDocs - -GroupDocs is a one-stop-shop for your document management requirements. - -## Adding GroupDocs - -GroupDocs can be added by executing the command addon.add: - - $ cctrlapp APP_NAME/DEPLOYMENT addon.add groupdocs.PLAN_NAME - -## Removing GroupDocs - -Similarly, the Add-on can be removed from the deployment easily using addon.remove: - - $ cctrlapp APP_NAME/DEPLOYMENT addon.remove groupdocs.PLAN_NAME - -## Sample GroupDocs app - -If you just want to try GroupDocs out but haven't got any app running yet, you can clone the GroupDocs sample app: - - $ git clone git://github.com/groupdocs/groupdocs-cloudcontrol-examples-for-python.git - -Store the app on Git: - - $ cd groupdocs-cloudcontrol-examples-for-python - $ git init - $ git add . - $ git commit -m "init" - -Create your app on the Python cloudControl stack: - - $ cctrlapp APP_NAME create python - -Push and deploy the code: - - $ cctrlapp APP_NAME push - $ cctrlapp APP_NAME deploy - -This sample app is also running live on cloudControl. To view and try, please open [http://groupdocspython.cloudcontrolapp.com/](http://groupdocspython.cloudcontrolapp.com/). diff --git a/Add-on Documentation/Data Processing/IronMQ.md b/Add-on Documentation/Data Processing/IronMQ.md deleted file mode 100644 index 82a2ada..0000000 --- a/Add-on Documentation/Data Processing/IronMQ.md +++ /dev/null @@ -1,53 +0,0 @@ -# IronMQ - -IronMQ is an elastic message queue for managing data and event flow within cloud applications and between systems. - -## Adding IronMQ - -IronMQ can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add iron_mq.OPTION -~~~ - -## Upgrade IronMQ - -Upgrading to another version of IronMQ is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade iron_mq.OPTION_OLD iron_mq.OPTION_NEW -~~~ - -## Downgrade IronMQ - -Downgrading to another version of IronMQ is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade iron_mq.OPTION_OLD iron_mq.OPTION_NEW -~~~ - -## Removing IronMQ - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove iron_mq.OPTION -~~~ - -## Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -The JSON file has the following structure: - -~~~ -{ - "IRON_MQ":{ - "IRON_MQ_TOKEN":"13371234ASDFasdffdsaqwetrt12334", - "IRON_MQ_PROJECT_ID":"123345678899900asdf1233" - } -} -~~~ - -## IronMQ Code Examples - -You will find examples on how to use IronMQ within your app at [Github](https://github.com/iron-io/iron_mq_php) with support for Ruby, PHP, Python, and more. - diff --git a/Add-on Documentation/Data Processing/IronWorker.md b/Add-on Documentation/Data Processing/IronWorker.md deleted file mode 100644 index 2b024a5..0000000 --- a/Add-on Documentation/Data Processing/IronWorker.md +++ /dev/null @@ -1,53 +0,0 @@ -# IronWorker - -IronWorker is a fully featured worker system that runs elastically on the cloud. Massive scale computing with no servers. - -## Adding IronWorker - -IronWorker can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add iron_worker.OPTION -~~~ - -## Upgrade IronWorker - -Upgrading to another version of IronWorker is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade iron_worker.OPTION_OLD iron_worker.OPTION_NEW -~~~ - -## Downgrade IronWorker - -Downgrading to another version of IronWorker is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade iron_worker.OPTION_OLD iron_worker.OPTION_NEW -~~~ - -## Removing IronWorker - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove iron_worker.OPTION -~~~ - -## Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -The JSON file has the following structure: - -~~~ -{ - "IRON_WORKER":{ - "IRON_WORKER_TOKEN":"AsdfASDFSasddffassddfssd", - "IRON_WORKER_PROJECT_ID":"1337asdf1337ASDF1337" - } -} -~~~ - -## IronWorker Code Examples - -You will find examples on how to use IronWorker within your app at [Github](https://github.com/iron-io/iron_worker_examples/tree/master/php) with support for Ruby, PHP, Python, and more. - diff --git a/Add-on Documentation/Data Processing/QuotaGuard.md b/Add-on Documentation/Data Processing/QuotaGuard.md deleted file mode 100644 index 12729db..0000000 --- a/Add-on Documentation/Data Processing/QuotaGuard.md +++ /dev/null @@ -1,107 +0,0 @@ -# QuotaGuard - -QuotaGuard is a proxy service for outgoing API calls. By routing your calls through our distributed proxy network we guarantee that your quotas with any IP limiting services are not shared with other cloudControl users and you get consistent, reliable access to critical third party APIs like Google Maps Geocoding. - -## Adding QuotaGuard - -QuotaGuard can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add quotaguard.OPTION -~~~ - -## Upgrade QuotaGuard - -Upgrading to another version of QuotaGuard is easy and instant: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade quotaguard.OPTION_OLD quotaguard.OPTION_NEW -~~~ - -## Downgrade QuotaGuard - -Downgrading to another version of QuotaGuard is easy and instant: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade quotaguard.OPTION_OLD quotaguard.OPTION_NEW -~~~ - -## Removing QuotaGuard - -Removing QuotaGuard will instantly prevent you from accessing our proxy so use with caution: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove quotaguard.OPTION -~~~ - -## Using QuotaGuard - -QuotaGuard provisioning provides you with a unique login to our proxy service exposed via a QUOTAGUARD_URL environment variable. How you use this depends on how you are accessing your external APIs but most HTTP libraries include a way of specifying a proxy server. For Ruby on Rails applications we recommend accessing the QuotaGuard credentials via the ENV variable. This allows you to easily set your proxy server in an initializer statement. For example with the Ruby Geocoder gem: -~~~ruby -# config/initializers/geocoder.rb -Geocoder.configure( - ... - :http_proxy => ENV['QUOTAGUARD_URL'].sub(/^http:\/\//, ''), - :timeout => 5 -) -~~~ - -Alternatively you can read the QuotaGuard credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -The JSON file has the following structure: - -~~~ -{ - "QUOTAGUARD":{ - "QUOTAGUARD_URL":"http://username:password@proxy.quotaguard.com:9292/" - } -} -~~~ -## Monitoring QuotaGuard - -Most of our plans include analytics via our dashboard. Access this by logging in to your cloudControl console and clicking on the QuotaGuard add-on from within one of your deployments. This will take you to our dashboard on QuotaGuard.com where you will be able to see your real-time and historic usage data. - -## QuotaGuard Code Examples -### Using with Rails -Geocoding is the most common usage for QuotaGuard so this tutorial will focus on that use case. - -To add geocoding to your Rails project we recommend the [Ruby Geocoder gem](http://www.rubygeocoder.com/). - -Once you have completed the standard setup of Ruby Geocoder you can use QuotaGuard by adding the following to your geocoder initializer: - -~~~ruby -# config/initializers/geocoder.rb -Geocoder.configure( - ... - :http_proxy => ENV['QUOTAGUARD_URL'].sub(/^http:\/\//, ''), - :timeout => 5 -) -~~~ -_RubyGeoder currently expects no protocol in the URL hence why we have to strip it. This restriction will be removed in an upcoming gem release._ - -### Using with Python/Django -There are many geocoding libraries available for Python but the most used is [geopy](https://github.com/geopy/geopy) which uses [urllib2 environment variables](http://docs.python.org/2.4/lib/urllib2-examples.html) to set a proxy service. - -In your application initialization you should set the `http_proxy` variable to match the `QUOTAGUARD_URL`. - -~~~python -# Assign QuotaGuard to your environment's http_proxy variable -os.environ['http_proxy'] = os.environ['QUOTAGUARD_URL'] -~~~ - -To test in the Python interpreter - -~~~python -import urllib2 -os.environ['http_proxy'] = os.environ['QUOTAGUARD_URL'] -url = 'http://ip.jsontest.com/' -proxy = urllib2.ProxyHandler() -opener = urllib2.build_opener(proxy) -in_ = opener.open(url) -in_.read() -~~~ -## Support -Please email [support@teachmatic.com](mailto:support@teachmatic.com) if you have any problems. - -## Additional Resources -More information may be available on our [documentation page](https://www.quotaguard.com/docs). diff --git a/Add-on Documentation/Data Processing/QuotaGuardStatic.md b/Add-on Documentation/Data Processing/QuotaGuardStatic.md deleted file mode 100644 index ffe8705..0000000 --- a/Add-on Documentation/Data Processing/QuotaGuardStatic.md +++ /dev/null @@ -1,322 +0,0 @@ -# QuotaGuard Static - -QuotaGuard Static is an Add-on that allows you to route outbound traffic through a static IP address on cloudControl. You can provide this IP address to an API partner for IP based whitelisting and open your own firewall to access internal resources. - -QuotaGuard Static is accessible as an HTTP or SOCKS5 proxy so is language and platform agnostic. There is native support across Ruby, Python, Node.js, Scala, Java and every other mainstream language. - -## Adding QuotaGuard Static - -QuotaGuard Static can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add quotaguardstatic.OPTION -~~~ - -## Upgrade QuotaGuard Static - -Upgrading to another version of QuotaGuard Static is easy and instant: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade quotaguardstatic.OPTION_OLD quotaguardstatic.OPTION_NEW -~~~ - -## Downgrade QuotaGuard Static - -Downgrading to another version of QuotaGuard Static is easy and instant and will not change your IP address: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade quotaguardstatic.OPTION_OLD quotaguardstatic.OPTION_NEW -~~~ - -## Removing QuotaGuard Static - -Removing QuotaGuard Static will instantly prevent you from accessing our proxy so use with caution. If you re-add the Add-On then you may be assigned a different IP address: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove quotaguardstatic.OPTION -~~~ - -## Using QuotaGuard Static - -QuotaGuard Static provisioning provides you with a unique login to our proxy service exposed via a QUOTAGUARDSTATIC_URL environment variable. How you use this depends on how you are accessing your external APIs but most HTTP libraries include a way of specifying a proxy server. For Ruby on Rails applications we recommend accessing the QuotaGuard credentials via the ENV variable. This allows you to easily set your proxy server in an initializer statement. For example with the Ruby RestClient gem: -~~~ruby -require "rest-client" - -RestClient.proxy = ENV["QUOTAGUARDSTATIC_URL"] - -res = RestClient.get("http://ip.jsontest.com/") - -puts "Your Static IP is: #{res.body}" -~~~ - -Alternatively you can read the QuotaGuard Static credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#Add-Ons) in the general documentation. - -The JSON file has the following structure: - -~~~ -{ - "QUOTAGUARDSTATIC_URL":{ - "QUOTAGUARDSTATIC_URL":"http://username:password@static.quotaguard.com:9293/" - } -} -~~~ -## Monitoring QuotaGuard Static - -All our plans include real-time analytics and log access via our dashboard. Access this by logging in to your cloudControl console and clicking on the QuotaGuard Static Add-On from within one of your deployments. This will take you to your dashboard on QuotaGuard.com where you will be able to see your real-time and historic usage data. - -## HTTP vs. SOCKS5 proxy - -The first decision you must make is whether to target our HTTP or SOCKS proxy. SOCKS is more versatile as it handles TCP level traffic but the setup is more involved than the HTTP proxy. Our general rule of thumb is use HTTP if accessing a web service otherwise use SOCKS. - -Example use cases -1. Accessing an HTTP or HTTPS API (e.g. https://api.github.com/users/octocat/orgs) ==> **HTTP Proxy** -2. Accessing a MySQL database ==> **SOCKS Proxy** - -## QuotaGuard Static Code Examples - -###Ruby/Rails -Ruby has an excellent REST client that easily allows you to specify an HTTP proxy. You can run the below example in an irb session and verify that the final IP returned is one of your two static IPs. - -~~~ruby -require "rest-client" - -RestClient.proxy = ENV["QUOTAGUARDSTATIC_URL"] - -res = RestClient.get("http://ip.jsontest.com/") - -puts "Your Static IP is: #{res.body}" -~~~ - -### Python/Django -#### Using with the Requests library -[Requests](http://docs.python-requests.org/en/latest/) is a great HTTP library for Python. It allows you to specify an authenticated proxy on a per request basis so you can pick and choose when to route through your static IP. - -~~~python -import requests -import os - -proxies = { -"http": os.environ['QUOTAGUARDSTATIC_URL'] -} - -res = requests.get("http://ip.jsontest.com/", proxies=proxies) -print res.text -~~~ -#### Using with the urllib2 -urllib2 is a more basic library used for HTTP communication in Python and uses environment variables to set a proxy service. - -In your application initialization you should set the `http_proxy` variable to match the `QUOTAGUARDSTATIC_URL`. - -~~~python -# Assign QuotaGuard to your environment's http_proxy variable -os.environ['http_proxy'] = os.environ['QUOTAGUARDSTATIC_URL'] -~~~ - -To test in the Python interpreter - -~~~python -import urllib2, os -os.environ['http_proxy'] = os.environ['QUOTAGUARDSTATIC_URL'] -url = 'http://ip.jsontest.com/' -proxy = urllib2.ProxyHandler() -opener = urllib2.build_opener(proxy) -in_ = opener.open(url) -res = in_.read() -print res -~~~ - -###Node.js -####Accessing an HTTP API with Node.js -To access an HTTP API you can use the standard HTTP library in Node.js but must ensure you correctly set the “Host” header to your target hostname, not the proxy hostname. - -~~~javascript -var http, options, proxy, url; - -http = require("http"); - -url = require("url"); - -proxy = url.parse(process.env.QUOTAGUARDSTATIC_URL); -target = url.parse("http://ip.jsontest.com/"); - -options = { - hostname: proxy.hostname, - port: proxy.port || 80, - path: target.href, - headers: { - "Proxy-Authorization": "Basic " + (new Buffer(proxy.auth).toString("base64")), - "Host" : target.hostname - } -}; - -http.get(options, function(res) { - res.pipe(process.stdout); - return console.log("status code", res.statusCode); -}); -~~~ -####Accessing an HTTPS API with Node.js -The standard Node.js HTTPS module does not handle making requests through a proxy very well. If you need to access an HTTPS API we recommend using the Request module (npm install request). - -~~~javascript -var request = require('request'); - -var options = { - proxy: process.env.QUOTAGUARDSTATIC_URL, - url: 'https://api.github.com/repos/joyent/node', - headers: { - 'User-Agent': 'node.js' - } -}; - -function callback(error, response, body) { - if (!error && response.statusCode == 200) { - console.log(body); - } -} - -request(options, callback); -~~~ -####Accessing a MySQL Database using SOCKS Proxy in Node.js -To use a SOCKS proxy for any reason in Node.js we recommend socksjs as this is one of the only Node.js SOCKS modules to support authentication. -~~~bash -npm install socksjs -~~~ -This sample creates a connection to a SOCKS connection to our proxy and uses that for all MySQL requests. -~~~javascript -var mysql = require('mysql2'); -var url = require("url"); -var SocksConnection = require('socksjs'); -var remote_options = { -host:'mysql.db.hostname', -port: 3306 -}; -var proxy = url.parse(process.env.QUOTAGUARDSTATIC_URL); -var auth = proxy.auth; -var username = auth.split(":")[0] -var pass = auth.split(":")[1] - -var sock_options = { -host: proxy.hostname, -port: 1080, -user: username, -pass: pass -} -var sockConn = new SocksConnection(remote_options, sock_options) -var dbConnection = mysql.createConnection({ -user: 'test', -database: 'test', -password: 'testpw', -stream: sockConn -}); -dbConnection.query('SELECT 1+1 as test1;', function(err, rows, fields) { -if (err) throw err; - -console.log('Result: ', rows); -sockConn.dispose(); -}); -dbConnection.end(); -~~~ -###Using with PHP -PHP cURL is the easiest way to make HTTP requests via QuotaGuard Static. This example assumes that you have set the QUOTAGUARDSTATIC_URL environment variable which is automatically set for you when you provision the Add-On. - -The IP address printed on screen will be one of your two static IP addresses, run it a couple of times and you’ll probably see the other one too - -~~~php - -~~~ -###SOCKS proxy setup -QuotaGuard Static provides a wrapper script that transparently forwards all outbound TCP traffic through your Static IP. This is language independent but there are known issues with certain Node.js connections hanging so please contact us if you have any issues. - -####Installing the QuotaGuard Static socksify wrapper -Download and extract the wrapper in your app directory: - -~~~bash -$ curl https://s3.amazonaws.com/quotaguard/quotaguard-socksify-latest.tar.gz | tar xz -~~~ - -Now modify your app Procfile to prepend the wrapper to your standard commands: - -~~~bash - web: bin/qgsocksify bundle exec unicorn -p $PORT -c ./config/unicorn.rb -~~~ - -You should add all extracted files to your git repo except QUOTAGUARD-LICENSE.txt which can be gitignored. - -~~~bash -$ echo "QUOTAGUARD-LICENSE.txt" >> .gitignore -$ git add bin/qgsocksify vendor/dante -$ git commit -m "Add QuotaGuard Static socksify" -~~~ - -####Controlling what traffic goes through proxy -You can provide a standard subnet mask to only route traffic to certain IP subnets via the QUOTAGUARDSTATIC_MASK environment variable. - -~~~bash -$ cctrlapp app_name/dep_name config.add QUOTAGUARDSTATIC_MASK="100.30.68.0/24" -~~~ - -All outbound traffic to 100.30.68.* would be routed via your Static IPs. Multiple masks can be provided by comma separating the mask values: - -~~~bash -$ cctrlapp app_name/dep_name config.add QUOTAGUARDSTATIC_MASK="100.30.68.0/24,99.29.68.0/24" -~~~ - -###FAQs - -####Is the HTTP proxy secure when accessing HTTPS services? -Yes. You can access HTTPS services via the HTTP proxy whilst still getting full SSL/TLS security. When you make a request via the proxy to an HTTPS endpoint your client should transparently issue a CONNECT request rather than a basic GET request. - -On receipt of this CONNECT request the proxy will open a tunnel between your client and the endpoint, allowing your client to negotiate a standard SSL session with the endpoint. Once negotiated all traffic sent between your client and the endpoint will be encrypted as if you had connected directly with them. - -####What happens when I reach my usage limit? -To make sure we grow in harmony with your application QuotaGuard Static operates initially with a soft limit. When you reach your plan’s monthly usage limit your requests will continue going through but we will reach out to you via e-mail to ask that you upgrade your plan. - -If you repeatedly exceed your limits without upgrading then hard limits may be placed on your account but this is a very last resort. - -####I’ve forgotten what my Static IPs are! -Both IPs are shown on your QuotaGuard Static Dashboard which you can access by logging in to your cloudControl console and clicking on the QuotaGuard Static Add-On from within one of your deployments. - -####Why have you given me two Static IP addresses? -We believe all apps should be built for scalability and high availability. Our commitment to this means we only provide load balanced, high availability services. Load balancing our nodes allows one node to fail or be brought down for maintenance with no impact to your application. Each IP you are given represents one proxy node that is running behind a load balancer. - -####Can I access MySQL or Postgres through this? -Yes we have many users doing this. The easiest way for most languages is to use our SOCKS proxy wrapper(installation details higher up the page). If you are using Node.js you can also configure the SOCKS proxy in your Javascript code without using the wrapper (details also on this page). - -###QuotaGuard vs. QuotaGuard Static -We offer two products on cloudControl, QuotaGuard and QuotaGuard Static. - -QuotaGuard routes your traffic through a dynamic set of IP addresses that may change at any time and is intended for accessing APIs like Google Maps that restrict usage based on your IP address. It should be used if you want to access these APIs without your limit being shared with other cloudControl apps. - -QuotaGuard Static routes your traffic through a pair of static IP addresses that never change. It should be used if you need your traffic to pass through a known IP address for the purpose of firewall ingress rules or application whitelisting with a third party. - -Please [send us a mail](mailto:support@teachmatic.com) if you’d like more guidance on what service fits your needs best. - -## Support -Please email [support@teachmatic.com](mailto:support@teachmatic.com) if you have any problems. - -## Additional Resources -More information may be available on our [documentation page](https://www.quotaguard.com/docs). diff --git a/Add-on Documentation/Data Processing/RabbitMQBigwig.md b/Add-on Documentation/Data Processing/RabbitMQBigwig.md deleted file mode 100644 index 6ef08b4..0000000 --- a/Add-on Documentation/Data Processing/RabbitMQBigwig.md +++ /dev/null @@ -1,192 +0,0 @@ -#RabbitMQ Bigwig - -[RabbitMQ Bigwig](http://www.cloudcontrol.com/add-ons/rabbitmq-bigwig) is an [Add-on](http://www.cloudcontrol.com/add-ons/) for adding an AMQP message broker to your application. - -RabbitMQ provides robust messaging for applications. It is easy to use and supported on all major operating systems and developer platforms. - -Messaging enables software applications to connect and scale. Applications can connect to each other, as components of a larger application, or to user devices and data. Messaging is asynchronous, decoupling applications by separating the sending and receiving of data. - -The RabbitMQ Bigwig add-on is brought to you by LShift. We are a software development company with expertise in VMware's vFabric RabbitMQ and a VMware partner. We were also one of the founding companies behind the original development of RabbitMQ. - -RabbitMQ was built from the ground up to interoperate with other technologies: it is the leading implementation of AMQP, the open standard for business messaging. - -RabbitMQ can carry any type of message and there are many [design patterns](http://www.rabbitmq.com/getstarted.html) you can use to fulfil your use case. - -RabbitMQ Bigwig is accessible via an API and has supported client libraries for Ruby, Java, Python, Clojure, Erlang and C#. - -## Provisioning the add-on - -You can attach RabbitMQ Bigwig to a cloudControl application via the CLI: - -
      -You can find a list of all plans available here. -
      - - :::term - $ cctrlapp bigwigrailssample/default addon.add rabbitmq_bigwig.pipkin - -Once you have added RabbitMQ Bigwig you will find `RABBITMQ_BIGWIG_TX_URL` and `RABBITMQ_BIGWIG_RX_URL` settings in the app configuration. These contain the canonical URLs used to access the newly provisioned RabbitMQ Bigwig service instance. You will find these settings in your cloudControl console, at `https://www.cloudcontrol.com/console/app//dep//addons`. - -We give you two URLs to ease separating your producers from your consumers. Producers connect to the URL in `RABBITMQ_BIGWIG_TX_URL`, and we shape this connection to provide consistent throughput. Consumers connect to the URL in `RABBITMQ_BIGWIG_RX_URL`. We optimise connections to this URL for the consumer case. This separation of producers and consumers follows [RabbitMQ best practice](http://www.rabbitmq.com/memory.html). You can read more about how and why we shape [here](http://bigwig.lshift.net/message-throughput). - -After installing RabbitMQ Bigwig you should configure the application to fully integrate with the add-on. - -## Using with Rails 3.x - -Two popular AMQP client libraries for Ruby are the `bunny` and `amqp` gems. The `amqp` gem uses the asynchronous [`EventMachine`](http://rubyeventmachine.com/) framework, and so is not a good fit for a Rails application. Thus, use the `bunny` gem. Add it to your `Gemfile`: - - :::ruby - source 'https://rubygems.org/' - - gem 'rails', '3.0.10' - gem 'sqlite3' - gem 'bunny' - - [...] - -After modifying `Gemfile`, run `bundle install` to update `Gemfile.lock`: - - :::term - $ bundle install - Fetching source index for https://rubygems.org/ - Using rake (0.9.2) - [...] - Using rails (3.0.10) - Your bundle is complete! Use `bundle show [gemname]` to see where - a bundled gem is installed. - -For a full example of using Bigwig and the Bunny gem with Rails, please check out our [example rails application](https://github.com/lshift/rabbitmq-service-rails-sample). Once that's checked out, you'll be able to deploy that to cloudControl by running the following shell commands: - - $ git clone https://github.com/lshift/rabbitmq-service-rails-sample.git - ... - $ cd rabbitmq-service-rails-sample - $ cctrlapp bigwigrailssample/default create ruby - $ cctrlapp bigwigrailssample/default addon.add rabbitmq_bigwig.pipkin - $ cctrlapp bigwigrailssample/default open - -The command `cctrlapp bigwigrailssample/default open` should open the sample application in your web-browser. If it can't figure out how to open a browser on your platform, then visiting the URL previously output by `cctrlapp bigwigrailssample/default create ruby` with any browser will work fine. - -## Using with Ruby (more generally) - -The `amqp` gem is especially appropriate when running on a worker dyno, as it supports writing software that reacts to external events. For example, the following example will listen for messages on the `amqpgem.examples.hello_world` queue, and exit 60 seconds after it receives the first message. - - :::ruby - require "rubygems" - require 'amqp' - require "amqp/extensions/rabbitmq" - - EventMachine.run do - connection = AMQP.connect(:host => '127.0.0.1', :port => 5672, :vhost => 'a') - puts "Connecting to AMQP broker. Running #{AMQP::VERSION} version of the gem..." - - channel = AMQP::Channel.new(connection) - channel.queue("amqpgem.examples.hello_world", :auto_delete => true, :nowait => true) do |queue| - exchange = channel.default_exchange - - queue.subscribe do |payload| - puts "Received a message: #{payload}. Disconnecting..." - - EventMachine::Timer.new(60) do - connection.close { - EventMachine.stop { exit } - } - end - end - - exchange.publish "Hello, world!", :routing_key => queue.name - end - end - -### Development environment - -You can install RabbitMQ Bigwig for use in a local development environment. Typically this entails installing RabbitMQ and pointing the `RABBITMQ_BIGWIG_TX_URL` and `RABBITMQ_BIGWIG_RX_URL` URLs to this local service via `export RABBITMQ_BIGWIG_TX_URL=amqp://guest:guest@localhost/ RABBITMQ_BIGWIG_RX_URL=amqp://guest:guest@localhost/`. - -RabbitMQ Bigwig uses version 3.1.5. In order to rule out possible differences in behaviour between RabbitMQ versions, you should install version 3.1.5. - - - - - - - - - - - - - - - - - - - - - - -
      If you have...Install with...
      Mac OS X
      cd /usr/local/
      -git checkout 181e445c5701070adb63ac3365c68040f26f6a6a Library/Formula/rabbitmq.rb
      -brew install rabbitmq
      Windowshttp://www.rabbitmq.com/install-windows.html but use this installer instead: http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.5/rabbitmq-server-3.1.5.exe
      Debian-like Linux (Debian, Ubuntu, ...)Run as root:
      $ export DEBIAN_FRONTEND=noninteractive
      -$ wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc -O /tmp/rabbitmq-signing-key-public.asc
      -$ apt-key add /tmp/rabbitmq-signing-key-public.asc
      -$ rm /tmp/rabbitmq-signing-key-public.asc
      -$ apt-get -y update # Report any bad checksums
      -$ apt-get -y install erlang-nox=1:14.b.4-dfsg-1ubuntu1
      -$ wget -O /tmp/package-rmq.deb http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.5/rabbitmq-server_3.1.5-1_all.deb
      -$ dpkg -i /tmp/package-rmq.deb
      -$ rm /tmp/package-rmq.deb
      -Note that Lucid Lynx's latest Erlang version is `1:13.b.3-dfsg-2ubuntu2.1`. -
      Other (BSD, Solaris)http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.5/rabbitmq-server-generic-unix-3.1.5.tar.gz
      - -While RabbitMQ will run on Erlang version R12 or above, following RabbitMQ's advice on [which Erlang](http://www.rabbitmq.com/which-erlang.html) to use, we strongly suggest using R15 or R16. If you're running a recent Linux distribution (e.g., Ubuntu Oneiric Ocelot or Precise Pangolin), you shouldn't have any trouble here, nor should you encounter problems using the installers for either Windows or Mac OS X. - -## Dashboard - -
      -For more information on the features available within the RabbitMQ Bigwig dashboard please see the docs on RabbitMQ's management plugin. -
      - -The RabbitMQ Bigwig dashboard allows you to keep close watch over your broker, controlling your exchanges, queues, bindings, users, and so on. - -![RabbitMQ Bigwig Dashboard](https://www.rabbitmq.com/img/management/overview.png "RabbitMQ Bigwig Dashboard") - -You can access the dashboard via the CLI: - - :::term - $ cctrlapp bigwigrailssample/default open - Opening rabbitmq-bigwig for sharp-mountain-4005... [[[FIXME]]] - -or by visiting the [cloudControl apps web interface](https://www.cloudcontrol.com/console) and selecting the application in question. Select RabbitMQ Bigwig from the Add-ons menu. - -## Migrating between plans - -
      Application owners should carefully manage the migration timing to ensure proper application function during the migration process.
      - -We will publish details on how to migrate between plans with plan details. - -Use the `cctlapp bigwigrailssample/default addons.upgrade` command to migrate to a new plan. - - :::term - $ cctlapp bigwigrailssample/default addons.upgrade rabbitmq_bigwig.speedwell - -## Removing the add-on - -You can remove RabbitMQ Bigwig via the CLI. - -
      This will destroy all associated data and cannot be undone!
      - - :::term - $ cctlapp bigwigrailssample/default addons.remove rabbitmq_bigwig.pipkin - -Please consume all your messages from your queues before removing the add-on as removal will destroy all data and cannot be undone. Use the web dashboard to confirm. - -## Support - -Please submit all RabbitMQ Bigwig support and runtime issues via one of the [cloudControl Support channels](https://www.cloudcontrol.com/dev-center/support). Any non-support related issues or product feedback is welcome at rabbitmq-bigwig@lshift.net. - -## Additional resources - -Additional resources are available at: - -* [RabbitMQ website](http://www.rabbitmq.com/) -* [Bigwig documentation](http://bigwig.io/) diff --git a/Add-on Documentation/Data Processing/Searchify.md b/Add-on Documentation/Data Processing/Searchify.md deleted file mode 100644 index d42edcc..0000000 --- a/Add-on Documentation/Data Processing/Searchify.md +++ /dev/null @@ -1,44 +0,0 @@ -# Searchify - -Searchify is a hosted search Add-on that provides full-text search to your application, without the hassle of managing your own search infrastructure. Searchify makes it easy to tune your search results ranking using powerful custom scoring functions. And Searchify is fast - most search queries are answered in less than 100 milliseconds. - -Searchify is 100% IndexTank-compatible, and is a drop-in replacement for IndexTank users - -## Adding the Searchify Add-on - -To add the Searchify Add-on use the addon.add command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add searchify.OPTION -~~~ -Replace `searchify.OPTION` with a valid option, e.g. `searchify.small`. - -When added, Searchify automatically creates a new user account with your email adress. You can manage the Add-on within the [web console](https://www.cloudcontrol.com/console) (go to the specific deployment and click the link "searchify.OPTION"). - -## Upgrading the Searchify Add-on - -To upgrade from a smaller to a more powerful plan use the addon.upgrade command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade searchify.OPTION_OLD searchify.OPTION_NEW -~~~ - -## Downgrading the Searchify Add-on - -To downgrade to a smaller plan use the addon.downgrade command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade searchify.OPTION_OLD searchify.OPTION_NEW -~~~ - -## Removing the Searchify Add-on - -The Searchify Add-on can be removed from the deployment by using the addon.remove command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove searchify.OPTION -~~~ - -### Internal Access - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. diff --git a/Add-on Documentation/Data Processing/Searchly.md b/Add-on Documentation/Data Processing/Searchly.md deleted file mode 100644 index 4c87a65..0000000 --- a/Add-on Documentation/Data Processing/Searchly.md +++ /dev/null @@ -1,319 +0,0 @@ -#Searchly ElasticSearch - -Don't bother with the administrative operations or reliability issues of a search platform. Searchly is a hosted, managed and scalable search as a service powered by ElasticSearch, the final frontier of search engines. - -##Adding the Searchly ElasticSearch Add-on -To add the Searchly ElasticSearch Add-on use the addon.add command. - -``` -$ cctrlapp APP_NAME/DEP_NAME addon.add searchly.OPTION -``` -Replace searchly.OPTION with a valid option, e.g. searchly.micro. - -When added, Searchly ElasticSearch automatically creates a new user account. You can manage the Add-on within the web console (go to the specific deployment and click the link "searchly.OPTION"). - -## Getting Started With ElasticSearch Clients - -### Using Tire with Rails - -[Tire](https://github.com/karmi/tire) is a Ruby client for the ElasticSearch search engine. It provides Ruby-like API for fluent communication with the ElasticSearch server and blends with ActiveModel class for convenient usage in Rails applications. -It allows to delete and create indices, define mapping for them, supports the bulk API, and presents an easy-to-use DSL for constructing your queries. -It has full ActiveRecord/ActiveModel compatibility, allowing you to index your models (incrementally upon saving, or in bulk), searching and paginating the results. - -#### Configuration - -Ruby on Rails applications will need to add the following entry into their `Gemfile`. - -```ruby -gem 'tire' -``` -Update application dependencies with bundler. -```shell -$ bundle install -``` -Configure Tire in `configure/application.rb` or `configure/environment/production.rb` - -```ruby -Tire.configure do - url ENV['SEARCHLY_URL'] -end -``` - -#### Search - -Make your model searchable: - -```ruby -class Document < ActiveRecord::Base - include Tire::Model::Search - include Tire::Model::Callbacks -end -``` - -When you now save a record: - -```ruby -Document.create :name => "Cost", - :text => "Cost is claimed to be reduced and in a public cloud delivery model capital expenditure is converted." -```` - -The included callbacks automatically add the document to a `documents` index, making the record searchable: - -```ruby -@documents = Document.search 'Cost' -``` - -Tire has very detailed documentation at it's [github page](https://github.com/karmi/tire). - -### Using Jest with Java - -[Jest](https://github.com/searchbox-io/Jest) is a Java HTTP Rest client for ElasticSearch.It is actively developed and tested by Searchly. - -#### Configuration - -Ensure you have added Sonatype repository to your pom.xml - - - . - . - - sonatype - Sonatype Groups - https://oss.sonatype.org/content/groups/public/ - - . - . - - - -With Maven add Jest dependency to your pom.xml - - - io.searchbox - jest - 0.0.5 - - -Install Jest via Maven - -```term -$ mvn clean install -``` -#### Configuration - -Create a Jest Client: - -```java -// Configuration -ClientConfig clientConfig = new ClientConfig.Builder("SEARCHLY_URL") -.multiThreaded(true).build(); - -// Construct a new Jest client according to configuration via factory -JestClientFactory factory = new JestClientFactory(); -factory.setClientConfig(clientConfig); -JestClient client = factory.getObject(); -``` - -#### Indexing - -Create an index via Jest with ease; - -```java -client.execute(new CreateIndex.Builder("articles").build()); -``` -Create new document. - -```java -Article source = new Article(); -source.setAuthor("John Ronald Reuel Tolkien"); -source.setContent("The Lord of the Rings is an epic high fantasy novel"); -``` - -Index article to "articles" index with "article" type. - -```java -Index index = new Index.Builder(source).index("articles").type("article").build(); -client.execute(index); -``` - -#### Searching - -Search queries can be either JSON String or ElasticSearch SearchSourceBuilder object -(You need to add ElasticSearch dependency for SearchSourceBuilder). - -```java -String query = "{\n" + - " \"query\": {\n" + - " \"filtered\" : {\n" + - " \"query\" : {\n" + - " \"query_string\" : {\n" + - " \"query\" : \"Lord\"\n" + - " }\n" + - " }\n"+ - " }\n" + - " }\n" + - "}"; - -Search search = (Search) new Search.Builder(query) -// multiple index or types can be added. -.addIndexName("articles") -.addIndexType("article") -.build(); - -List
      result = client.getSourceAsObjectList(Article.class); -``` - -Jest has very detailed documentation at it's github [page](https://raw.github.com/searchbox-io/Jest). - -### Using Haystack with Django - -[Haystack](http://haystacksearch.org/) provides modular search for Django. It features a unified, familiar API that allows you to plug in different search backends -without having to modify your code. Currently Haystack 2.0.0-beta can be integrated to SearchBox.io ElasticSearch. - -#### Configuration - -Under the hood Haystack uses [pyelasticsearch](https://github.com/rhec/pyelasticsearch) (A Lightweight ElasticSearch client) to integrate with ElasticSearch. - -Django applications will need to add following entries into their `requirements.txt`; - -```shell -pyelasticsearch==0.2 --e git+https://github.com/toastdriven/django-haystack.git#egg=django_haystack-dev -``` -or install via pip; - -```shell -pip install pyelasticsearch==0.2 -pip install -e git+https://github.com/toastdriven/django-haystack.git@master#egg=django-haystack -``` - -As with most Django applications, you should add Haystack to the INSTALLED_APPS within your `settings.py`. - -```python -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.sites', - - # Added. - 'haystack', - - # Then your usual apps... -] -``` - -Add Haystack connection string to integrate with Searchly into `settings.py` and set a default index name. - -```python -import os - -HAYSTACK_CONNECTIONS = { - 'default': { - 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', - 'URL': os.environ['SEARCHLY_URL'], - 'INDEX_NAME': 'documents', - }, - } -``` - -#### Creating SearchIndexes - -SearchIndex objects are the way Haystack determines what data should be placed in the search index and handles the flow of data in. -You can think of them as being similar to Django Models or Forms in that they are field-based and manipulate/store data. - -To build a SearchIndex, all that’s necessary is to subclass both `indexes.RealTimeSearchIndex` & `indexes.Indexable`, define the fields you want to store data with and define a `get_model` method. We’ll create the following `DocumentIndex` to correspond to our `Document` model. This code generally goes in a `search_indexes.py` file within the app it applies to, though that is not required. This allows Haystack to automatically pick it up. The `DocumentIndex` should look like: - -```python -from haystack import indexes -from myapp.models import DocumentIndex - -class DocumentIndex (indexes.RealTimeSearchIndex, indexes.Indexable): - text = indexes.CharField(document=True, use_template=True) - - def get_model(self): - return Document -``` -Additionally, we’re providing use_template=True on the text field. This allows us to use a data template (rather than error prone concatenation) to build the document the search engine will use in searching. -You’ll need to create a new template inside your `template` directory called `search/indexes/myapp/document_text.txt` and place the following inside: - -```python -{{ object.name }} -{{ object.body }} -``` -Also to integrate Haystack with Django admin, create `search_sites.py` inside your application; - - ```python -import haystack - -haystack.autodiscover() -``` - -#### Setup views - -Add the `SearchView` To Your `URLconf` - -```python -(r'^search/', include('haystack.urls')), -``` -#### Search template sample - -Your search template with default url configuration is should be placed under your `template` directory and called `search/search.html`. - -```python -{% for result in page.object_list %} -

      {{ result.object.name }}

      -

      {{ result.object.body }}

      -{% empty %} -

      No results found.

      -{% endfor %} -``` -#### Searching - -With default url configuration you need to make a get request with parameter named `q` to action `/search`. - -```html -
      - -
      -``` -The [Haystack home page](http://haystacksearch.org/) is great resource for additional documentation. - - -##Upgrading the Searchly ElasticSearch Add-on -To upgrade from a smaller to a more powerful plan use the addon.upgrade command. - -``` -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade searchly.OPTION_OLD searchly.OPTION_NEW -``` - -##Downgrading the Searchly ElasticSearch Add-on -To downgrade to a smaller plan use the addon.downgrade command. - -``` -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade searchly.OPTION_OLD searchly.OPTION_NEW -``` - -##Removing the Searchly ElasticSearch Add-on -The Searchly ElasticSearch Add-on can be removed from the deployment by using the addon.remove command. - -``` -$ cctrlapp APP_NAME/DEP_NAME addon.remove searchly.OPTION -``` - -## Searchly Dashboard - -You can find usefull information about your indices and access analytics information about your search queries. - -![Dashboard](https://s3.amazonaws.com/searchly-wordpress/assets/dashboard.png) - -##Internal Access -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the CRED_FILE environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about Add-on Credentials in the general documentation. - -##Searchly ElasticSearch Code Examples -Please ensure to check our [Searchly Github](https://github.com/searchbox-io) account for sample applications with various languages and frameworks. - -##Support -All Searchly support and runtime issues should be submitted via one of the cloudControl Support channels](https://www.cloudcontrol.com/dev-center/support). -Any non-support related issues or product feedback is welcome via email at: support@searchly.com diff --git a/Add-on Documentation/Data Storage/Cloudant.md b/Add-on Documentation/Data Storage/Cloudant.md deleted file mode 100644 index adbf236..0000000 --- a/Add-on Documentation/Data Storage/Cloudant.md +++ /dev/null @@ -1,57 +0,0 @@ -# Cloudant - -With cloudControl, every deployment can feature a highly available hosted CouchDB provided by [Cloudant](https://cloudant.com/). - -## Adding or removing the Cloudant Add-on - -The database comes in different sizes and prices. It can be added by executing the command addon.add: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add cloudant.OPTION -~~~ -*.option* represents the plan size, e.g. cloudant.basic - - -## Upgrade the Cloudant Add-on - -Upgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade cloudant.OPTION_OLD cloudant.OPTION_NEW -~~~ - -##Downgrade the Cloudant Add-on - -Downgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade cloudant.OPTION_OLD cloudant.OPTION_NEW -~~~ - -##Removing the Cloudant add-on - -Similarily, an add-on can also be removed from the deployment easily. The costs only apply for the time the add-on was active: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove cloudant.OPTION -~~~ -#Database credentials - -##Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -The JSON file has the following structure: - -~~~ -{ - "CLOUDANT":{ - "CLOUDANT_DATABASE":"depx11xxx22", - "CLOUDANT_PASSWORD":"asdfasdfasdf", - "CLOUDANT_PORT":"3306", - "CLOUDANT_HOSTNAME":"cloudantdb.asdf.eu-1.rds.amazonaws.com", - "CLOUDANT_USERNAME":"depx11xxx22" - } -} -~~~ - diff --git a/Add-on Documentation/Data Storage/Flying Sphinx.md b/Add-on Documentation/Data Storage/Flying Sphinx.md deleted file mode 100644 index 19fe87a..0000000 --- a/Add-on Documentation/Data Storage/Flying Sphinx.md +++ /dev/null @@ -1,42 +0,0 @@ -# Flying Sphinx (Alpha) - -Flying Sphinx is an Add-on for cloudControl which lets you use Thinking Sphinx (and thus, Sphinx) for all your search needs. - -## Adding or removing the Flying Sphinx Add-on - -The Add-on comes in different sizes and prices. It can be added by executing the command addon.add: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add flying_sphinx.OPTION -~~~ -".option" represents the plan size, e.g. flying_sphinx.wooden - -## Upgrade the Flying Sphinx Add-on - -Upgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade flying_sphinx.OPTION_OLD flying_sphinx.OPTION_NEW -~~~ -## Downgrade the Flying Sphinx Add-on - -Downgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade flying_sphinx.OPTION_OLD flying_sphinx.OPTION_NEW -~~~ - -## Removing the Flying Sphinx Add-on - -Similarily, an Add-on can also be removed from the deployment easily. The costs only apply for the time the Add-on was active: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove flying_sphinx.OPTION -~~~ - -# Add-on Credentials - -## Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - diff --git a/Add-on Documentation/Data Storage/MongoLab.md b/Add-on Documentation/Data Storage/MongoLab.md deleted file mode 100644 index e060afc..0000000 --- a/Add-on Documentation/Data Storage/MongoLab.md +++ /dev/null @@ -1,81 +0,0 @@ -# MongoLab - -MongoLab is the cloud-hosted MongoDB solution you've been looking for! MongoLab provides everything you need to make managing your database and data remarkable easy. - -## Adding MongoLab - -The MongoLab Add-on can be added to any deployment from the cctrlapp command line: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add mongolab.OPTION -~~~ - -For your OPTION, select one of MongoLab's plan offerings: free, small, medium, large, xlarge. For more information, click [here](https://www.cloudcontrol.com/add-ons/mongolab). - -## For example: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add mongolab.large -~~~ - -When added, MongoLab automatically creates a new user account and database in an Amazon EC2 cloud. You can manage your database and data easily from the [web console](https://www.cloudcontrol.com/console) by clicking the MongoLab add-on entry on your app's deployment page, and you gain immediate access to MongoLab customer support. Email [support@mongolab.com](mailto:support@mongolab.com) with any questions. - -## Internal access credentials - -Your MongoLab database connection URI is provided in the CRED_FILE environment variable, a JSON document that stores credentials from your add-on providers. This allows you to avoid hard-coding. - -Note: In the event that MongoLab must update your MONGOLAB_URI, you will be notified through the email address you\92ve provided to CloudControl. - -MongoLab's entry in your application CRED_FILE looks like this: - -~~~ -{ - "MONGOLAB":{ - "MONGOLAB_URI":"mongodb://APP_NAME:PASSWORD@ds031947.mongolab.com:31947//DBNAME", - } -} -~~~ - -Your app-name, password and db-name are all automatically generated by cloudControl and MongoLab. - -## Sample - -Here's a snippet of code to get you started: - -~~~ -selectDB(myDbName); -$col = new MongoCollection($db, myCollection); -$cursor = $col->find(); -foreach ($cursor as $doc) { echo $doc, "
      "; } -?> -~~~ - -## Upgrading to a larger MongoLab plan - -Currently, automatic plan changes are not supported by MongoLab. - -There are steps to follow if you've outgrown or anticipate outgrowing your current plan. First, stop your app and any other processes running against your database. Then: - -* Backup your database -* Remove your existing Add-on -* Add a new Add-on (see available plans here) -* Restore your database -* Redeploy your app - -Providing you're using the MONGOLAB_URI from your CRED_FILE, no application changes are required. - -## Removing MongoLab - -If you'd like to remove the MongoLab add-on, use the cctrlapp command line: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove mongolab.OPTION -~~~ - -Note: All data in your database will be lost if you remove the MongoLab add-on. - diff --git a/Add-on Documentation/Data Storage/OpenRedis.md b/Add-on Documentation/Data Storage/OpenRedis.md deleted file mode 100644 index 82d6e17..0000000 --- a/Add-on Documentation/Data Storage/OpenRedis.md +++ /dev/null @@ -1,44 +0,0 @@ -# OpenRedis (Beta) - -OpenRedis provides hosted Redis services available to all cloudControl apps. - -## Adding or removing the OpenRedis Add-on - -The Add-on comes in different sizes and prices. It can be added by executing the command addon.add: - - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add openredis.OPTION -~~~ -".option" represents the plan size, e.g. openredis.test - -## Upgrade the OpenRedis Add-on - -Upgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade openredis.OPTION_OLD openredis.OPTION_NEW -~~~ - -## Downgrade the OpenRedis Add-on - -Downgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade openredis.OPTION_OLD openredis.OPTION_NEW -~~~ - -## Removing the OpenRedis Add-on - -Similarily, an Add-on can also be removed from the deployment easily. The costs only apply for the time the Add-on was active: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove openredis.OPTION -~~~ - -# Add-on credentials - -## Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - diff --git a/Add-on Documentation/Data Storage/PostgreSQLd.md b/Add-on Documentation/Data Storage/PostgreSQLd.md deleted file mode 100644 index ae5b779..0000000 --- a/Add-on Documentation/Data Storage/PostgreSQLd.md +++ /dev/null @@ -1,172 +0,0 @@ -# PostgreSQLd: Dedicated PostgreSQL Add-on - -High-availability, dedicated PostgreSQL databases are available for -mission-critical production deployments. The dedicated PostgreSQL Add-on is -based on [Amazon RDS] and uses master-slave replicated Multi-AZ instances. Read -slaves or reserved instances are currently not supported via the Add-on, but -you can always create a custom RDS instance in the EU region and connect your -app to it. We recommend using the [Config Add-on] to make the credentials of -the self-managed RDS instance available to your app. - -## Features of the cloudControl PostgreSQLd Add-on - -The PostgreSQLd Add-on comes with the following features: - -1. Easy, Managed Deployments - - Pre-configured Parameters - You can simply launch a PostgreSQL Instance - and connect your application within minutes without additional - configuration. - - Automatic Software Patching - cloudControl will make sure that the - PostgreSQL software powering your deployment stays up-to-date with the - latest patches. - -2. Backup & Recovery - - Automated Backups - Turned on by default, the automated backup feature - enables point-in-time recovery for your instance. - - DB Snapshots - DB Snapshots are available. [Email us] for more details. - -3. High Availability - - Multi-AZ Deployments - Once you create or modify your DB Instance, we - will automatically provision and manage a “standby” replica in a - different Availability Zone (independent infrastructure in a physically - separate location). Database updates are made concurrently on the primary - and standby resources to prevent replication lag. - -4. PostgreSQL Features Supported - - PostGIS - PostGIS is a spatial database extender for PostgreSQL - object-relational database. It adds support for geographic objects - allowing you to run location queries to be run in SQL. - - Language Extensions - PostgreSQL allows procedural languages to be loaded - into the database through extensions. Three language extensions are - included with PostgreSQL to support Perl, pgSQL and Tcl. - - Full Text Search Dictionaries - PostgreSQL supports Full Text Searching - that provides the capability to identify natural-language documents that - satisfy a query, and optionally to sort them by relevance to the query. - Dictionaries, besides improving search quality, normalization and removal - of stop words also improve performance of queries. - - HStore, JSON Data Types - PostgreSQL includes support for ‘JSON’ data - type and two JSON functions. These allow return of JSON directly from the - database server. PostgreSQL has an extension that implements the ‘hstore’ - data type for storing sets of key/value pairs within a single PostgreSQL - value. - - Core PostgreSQL engine features - For a detailed list of PostgreSQL core - engine features, please refer here. - -5. Dashboard - - View key operational metrics like CPU/ Memory/ Storage/ Connections/ Upgrade status for your DB Instance deployments via [Webconsole]. - -## Adding the PostgreSQLd Add-on - -To add the PostgreSQLd Add-on, use the `addon.add` command: -~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.add postgresqld.OPTION -~~~ -Replace `postgresqld.OPTION` with a valid option, e.g. `postgresqld.small`. See -[PostgreSQLd] in the Add-on Marketplace for pricing and options. - -Please note: After adding a dedicated PostgreSQL database, it can take up to 30 -minutes before the instance is available. Also, the credentials will only be -available after the instance is up and running. - -## Upgrading the PostgreSQLd Add-on - -To upgrade from a smaller to a more powerful plan, use the `addon.upgrade` command: -~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade postgresqld.OPTION_OLD postgresqld.OPTION_NEW -~~~ - -Please note: Upgrading the instance types is a multi-step process that first -upgrades the secondary, then promotes the secondary to the new master. After -this, the old master is updated and becomes the new secondary. This process -can take up to 65 minutes and can involve a 3 to 10 minute downtime. - -## Downgrading the PostgreSQLd Add-on - -To downgrade to a smaller plan, use the `addon.downgrade` command: -~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade postgresqld.OPTION_OLD postgresqld.OPTION_NEW -~~~ - -Please note: It is only possible to downgrade to plans with matching storage -sizes. - -## Removing the PostgreSQLd Add-on - -The PostgreSQLd Add-on can be removed from the deployment by using the -`addon.remove` command: -~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.remove postgresqld.OPTION -~~~ - -**Attention:** Removing the PostgreSQLd Add-on deletes all data in the database. - -## Replication and Failover - -All instances are master-slave replicated across two different availability -zones. In case of a failure of the master, an automatic failover to the slave -will trigger to restore availability. This failover process takes usually -between 3 and 10 minutes. - -## Database Credentials - -### Internal Access - -It's recommended to the read database credentials from the creds.json file. The -location of the file is available in the `CRED_FILE` environment variable. -Reading the credentials from the creds.json file ensures your app is always -using the correct credentials. For detailed instructions on how to use the -creds.json file, please refer to the section about [Add-on Credentials] in the -general documentation. - -### External Access - -External access to the PostgreSQLd Add-on is available through an SSL encrypted -connection by using the `psql` command line client: -~~~bash -$ psql "host=POSTGRESQLD_HOST dbname=POSTGRESQLD_DATABASE sslmode=require" -U POSTGRESQLD_USERNAME -~~~ - -Or alternatively using URL: -~~~bash -$ psql POSTGRESQLD_URL -~~~ - -Replace the uppercase variables with the corresponding values shown by the `addon` command: -~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon postgresqld.OPTION -Addon : postgresqld.small - Settings - POSTGRESQLD_PASSWORD : SOME_SECRET_PASSWORD - POSTGRESQLD_USER : SOME_SECRET_USER - POSTGRESQLD_HOST : SOME_HOST.eu-west-1.rds.amazonaws.com - POSTGRESQLD_DATABASE : SOME_DATABASE_NAME - POSTGRESQLD_PORT : 5432 - POSTGRESQLD_URL : SOME_DATABASE_URL -~~~ - -Similarly, imports and exports are equally simple. - -To **export** your data use the `pg_dump` command: -~~~bash -$ pg_dump "host=POSTGRESQLD_HOST dbname=POSTGRESQLD_DATABASE sslmode=require" -U POSTGRESQLD_USERNAME > PG_DUMP -~~~ -Or export your data using URL: -~~~bash -$ pg_dump POSTGRESQLD_URL > PG_DUMP -~~~ - -To **import** an sql file into a PostgreSQL database use the following command: -~~~bash -$ psql "host=POSTGRESQLD_HOST dbname=POSTGRESQLD_DATABASE sslmode=require" -U POSTGRESQLD_USERNAME < PG_DUMP -~~~ -Or import your data using URL: -~~~bash -$ psql POSTGRESQLD_URL < PG_DUMP -~~~ - -[Amazon RDS]: http://aws.amazon.com/rds/ -[Config Add-on]: https://www.cloudcontrol.com/add-ons/config -[PostgreSQLd]: https://www.cloudcontrol.com/add-ons/postgresqld -[Add-on Credentials]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons -[Email us]: mailto:support@cloudcontrol.de -[Webconsole]: https://www.cloudcontrol.com/console/login \ No newline at end of file diff --git a/Add-on Documentation/Deployment/Codeship.md b/Add-on Documentation/Deployment/Codeship.md deleted file mode 100644 index 5f9aaef..0000000 --- a/Add-on Documentation/Deployment/Codeship.md +++ /dev/null @@ -1,42 +0,0 @@ -# Codeship: Codeship is a simple to use Continuous Integration and Deployment service. - -Whenever you make changes to your application and push your Code we take the latest version of your code, run all your tests and, if you want, push to your staging and/or production application. Test and deploy your applications without the headache of setting up your own test server. Getting started takes less than two minutes and is fully integrated with cloudControl. - -## Adding the Codeship Add-on - -To add the Codeship Add-on use the addon.add command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add codeship.OPTION -~~~ -Replace `codeship.OPTION` with a valid option, e.g. `codeship.test`. - -When added, Codeship automatically creates a new user account with your email adress. You can manage the Add-on within the [web console](https://www.cloudcontrol.com/console) (go to the specific deployment and click the link "codeship.OPTION"). - -## Upgrading the Codeship Add-on - -To upgrade from a smaller to a more powerful plan use the addon.upgrade command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade codeship.OPTION_OLD codeship.OPTION_NEW -~~~ - -## Downgrading the Codeship Add-on - -To downgrade to a smaller plan use the addon.downgrade command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade codeship.OPTION_OLD codeship.OPTION_NEW -~~~ - -## Removing the Codeship Add-on - -The Codeship Add-on can be removed from the deployment by using the addon.remove command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove codeship.OPTION -~~~ - -### Internal Access - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. diff --git a/Add-on Documentation/Deployment/Logentries.md b/Add-on Documentation/Deployment/Logentries.md deleted file mode 100644 index 5d012ac..0000000 --- a/Add-on Documentation/Deployment/Logentries.md +++ /dev/null @@ -1,33 +0,0 @@ -# Logentries - -[Logentries](https://logentries.com) provides logs collection, analysis, storage and presentation in a professional and meaningful way. - -## Adding Logentries -The Logentries Add-On can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add logentries.PLAN -~~~ - -When added, Logentries automatically creates a new account and log configuration including access token. After Add-on creation all stdout, stderr and syslog output within the container will be available in Logentries. You can access Logentries for your deployment within the [web console](https://www.cloudcontrol.com/console) (go to the specific deployment, choose "Add-Ons" tab and click Logentries login). - -## Removing Logentries - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove logentries.PLAN -~~~ - -## Internal access credentials - -You can view Logentries token via: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon logentries.PLAN -~~~ - -~~~ -Addon : logentries.PLAN - - Settings - LOGENTRIES_TOKEN : 10af1a9e-112c-4075-88c9-e06412f0cd8e -~~~ \ No newline at end of file diff --git a/Add-on Documentation/Deployment/Phrase.md b/Add-on Documentation/Deployment/Phrase.md deleted file mode 100644 index ee260ad..0000000 --- a/Add-on Documentation/Deployment/Phrase.md +++ /dev/null @@ -1,192 +0,0 @@ -# Phrase # - -phrase allows you to edit your translations directly on your site without having to manually edit localization files. This makes your whole translation process easy as pie. Use the in-place editor to translate content directly on your site or manage your translations with the powerful phrase Translation Center. - - -## Provisioning the add-on - -phrase can be attached to CloudControl via the command line client: - - $ cctrlapp APP_NAME/DEP_NAME addon.add phrase.PLAN - - -Once the add-on has been provisioned the `PHRASE_AUTH_TOKEN` will be available within your list of credentials. It contains your authentication token that lets you connect to the phrase service: - - $ cctrlapp APP_NAME/DEP_NAME addon | grep PHRASE_AUTH_TOKEN - PHRASE_AUTH_TOKEN: d219d3abcgcxBahs72K1 - - -## Installation and Usage - -phrase should be integrated in an own staging environment. If you haven't done so already, we recommend you set up a staging environment as explained in the [CloudControl Documentation](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#development-staging-and-production-environments). The staging environment will be the place for your translators to edit your website content. -Of course, you can use your local development environment for integration as well. If you decide to do so, simply replace the staging with your development environment in the following steps. - -If you have any questions, contact us at [info@phraseapp.com](info@phraseapp.com) and we will be happy to guide you through the installation process. - - -### phrase command line tool ### - -Developers typically access phrase with the [phrase ruby gem](https://rubygems.org/gems/phrase) via command line: - - gem install phrase - -You are now able to use phrase to upload translations to the API and export new translation files form phrase as described in the next sections. - - -### Using with Symfony2 - -Simply follow the instructions from our documentation: [phraseapp.com/docs/installation/symfony2](https://phraseapp.com/docs/installation/symfony2) - - -### Using with Ruby / Rails / Sinatra - -*The following integration guide assumes your application uses bundler for gem dependency management.* - - -#### Add the gem - -Add the phrase gem to your staging environment: - - group :development, :staging do - gem 'phrase' - end - -and install the gem with the bundle command: - - $ bundle install - - -#### Initialize phrase - -First you need to enable phrase within your application and provide the authentication token. You can do this by adding the following two lines to an initializer (Rails) or in your main application file: - - Phrase.enabled = true - Phrase.auth_token = ENV['PHRASE_AUTH_TOKEN'] - -If you are using Sinatra, you might have to require phrase in your app file: - - if ENV['RACK_ENV'] == 'staging' - require "phrase" - end - -This will load phrase when you start your application in staging environment. - -Now initialize phrase with the auth token you received after adding the phrase add-on to your application: - - $ bundle exec phrase init --secret=YOUR_AUTH_TOKEN --default-locale=en - -This will generate a .phrase config file in your project root that includes your secret key. We recommend adding it to your .gitignore file. - -Next, upload the existing locale files from your app: - - $ bundle exec phrase push ./config/locales/ - -phrase now knows about your locales and the keys in your application. To enable the phrase in-place editor, simply add the javascript to your application layout file: - - - -In order to tell the i18n gem about the new locales that should be used in production you have to configure the load path as well. When using Rails you can set the load path in your production.rb: - - config.i18n.load_path = Dir[Rails.root.join('phrase', 'locales', '*.yml').to_s] - -If you're using Sinatra or something similar, you probably want to set it in the config.ru file: - - if ENV['RACK_ENV'] == 'production' - I18n.load_path = Dir[File.join(File.dirname(__FILE__), 'phrase', 'locales', '*.yml').to_s] - else - I18n.load_path = Dir[File.join(File.dirname(__FILE__), 'config', 'locales', '*.yml').to_s] - end - - -#### Deploy application to staging environment - -To finally get a look at phrase you simply have to deploy the application to your staging system and open it in the browser. - -You now should see your application with the phrase in-place editor on top of it. To create your first user with translation privileges, you have to log into phrase by following the "Login" link in your add-on management panel. - -After logging in, you can access the user management under the "Account" menu. Simply create a user with an email address and password of your choice. You can now edit your text content right on the site! - - -#### Deploy translations - -After you have finished translating your site, you will need to push the new translation files to production. In order to do so, you will first have to download them from phrase and add them to your project: - - $ bundle exec phrase pull - $ git add ./phrase/locales - $ git commit -m "added new translations" - -Now you can push the changes to your production repository: - - $ cctrlapp APP_NAME/DEP_NAME push - $ cctrlapp APP_NAME/DEP_NAME deploy - -The production system will now use the new locale files including your latest translations! - - -### Using with other platforms - -If you need support for a platform or language that is not yet supported just contact us at [info@phraseapp.com](info@phraseapp.com) - - -## Workflow - -With phrase your translation workflow will get much easier: - -1. Add a new feature to your app that requires translation -2. Add the new keys to phrase by uploading the locale files to phrase or creating them manually within the translation center -3. Deploy your new code to your staging environment and let your translators do their work -4. Download the new locale files from phrase and deploy them to production - - -## Translation Center - -Translation Center lets you manage: - -* Locales -* Keys -* Translations -* Users -* etc. - -To log in to Translation Center, view your add-on settings within your CloudControl console and follow the "Login" link next to the phrase addon. This will perform the sign in to phrase where you can manage your account, users, locales and more. - -*For more information on the features available within the phrase translation center please see the feature tour at [phraseapp.com/features](https://phraseapp.com/features).* - - -## Removing the add-on - -phrase can be removed via the command line client: - - $ cctrlapp APP_NAME/DEP_NAME addon.remove phrase.PLAN - -**Warning:** This will destroy all data associated with your phrase account and cannot be undone! - - -## Other platforms and languages - -phrase supports all common localization formats, including YAML, JSON, Gettext (.po), Properties, XLIFF, Android, iOS, ResX etc. - -You can always access your localization files and translations from within Translation Center. - -If you need support for a platform or language that is not yet supported just contact us at [info@phraseapp.com](info@phraseapp.com) - - -## Support - -If you have any questions regarding phrase, feel free to contact us at [phraseapp.com/support](https://phraseapp.com/support). - - -## Additional resources - -Additional resources are available at: - -* [Example application using Sinatra](https://github.com/phrase/phrase_example_cloudcontrol_app) -* [Support](https://phraseapp.com/support) -* [Full documentation](https://phraseapp.com/docs) diff --git a/Add-on Documentation/Deployment/Userbin.md b/Add-on Documentation/Deployment/Userbin.md deleted file mode 100644 index 27eaef0..0000000 --- a/Add-on Documentation/Deployment/Userbin.md +++ /dev/null @@ -1,333 +0,0 @@ -# Userbin - - -[Userbin](https://userbin.com) is the easiest way to setup, use and maintain a secure user authentication system for both your web and mobile apps, while keeping the users in your own database. - -Userbin provides a set of login, signup, and password reset forms that drop right into your application without any need of styling or writing markup. Connect your users via traditional logins or third party social networks. We take care of linking accounts across networks, resetting passwords and sending out necessary emails, while keeping everything safe and secure. - - - -## Adding the Userbin add-on -To add the Userbin add-on use the addon.add command. - -```bash -$ cctrlapp APP_NAME/DEP_NAME addon.add userbin.PLAN -``` - -Replace `userbin.PLAN` with a valid plan, e.g. `userbin.free`. - -When added, Userbin automatically creates a new account for you. You can access Userbin for your deployment within the [web console](https://www.cloudcontrol.com/console) (go to the specific deployment, choose "Add-Ons" tab and click Userbin login). - - -## Using with Ruby on Rails - - -### Installation and configuration - -Add the `userbin` gem to your `Gemfile` - -```ruby -gem "userbin" -``` - -Install the gem - -```bash -bundle install -``` - -Create `config/initializers/userbin.rb` and configure your credentials. - -```ruby -Userbin.configure do |config| - config.app_id = "YOUR_APP_ID" - config.api_secret = "YOUR_API_SECRET" -end -``` - -> If you don't configure the `app_id` and `api_secret`, the Userbin module will read the `USERBIN_APP_ID` and `USERBIN_API_SECRET` environment variables. - -Implement getter and setter for your user model. For more information about the available attributes in the profile see the [Userbin profile](https://userbin.com/docs/profile) documentation. - -```ruby -config.find_user = -> (userbin_id) do - User.find_by_userbin_id(userbin_id) -end - -# will be called when a user signs up -config.create_user = -> (profile) do - User.create! do |user| - user.userbin_id = profile.id - user.email = profile.email - user.photo = profile.image - end -end -``` - -Migrate your users to include a reference to the Userbin profile: - -```bash -rails g migration AddUserbinIdToUsers userbin_id:integer:index -rake db:migrate -``` - - -### Authenticating users - -Userbin keeps track of the currently logged in user which can be accessed through `current_user` in controllers, views, and helpers. This automatically taps into libraries such as the authorization library [CanCan](https://github.com/ryanb/cancan). - -```erb -<% if current_user %> - <%= current_user.email %> -<% else %> - Not logged in -<% end %> -``` - -To set up a controller with user authentication, just add this `before_filter`: - -```ruby -class ArticlesController < ApplicationController - before_filter :authorize! - - def index - current_user.articles - end -end -``` - -> You can always access the [Userbin profile](https://userbin.com/docs/profile) for the logged in user as `current_profile` when you need to access information that you haven't persisted in your user model. - - - -## Using with Node.js - -### Installation and configuration - -Install the `userbin` package. - -```bash -$ npm install userbin -``` - -Include the Userbin node packages in your app.js or server.js. - -```javascript -var userbin = require('userbin'); -``` - -Configure the Userbin module with the credentials you got from signing up. - -```javascript -userbin.config({ - appId: 'YOUR_APP_ID', - apiSecret: 'YOUR_API_SECRET' -}); -``` - -> If you don't configure the `appId` and `apiSecret`, the Userbin module will read the `USERBIN_APP_ID` and `USERBIN_API_SECRET` environment variables. - -Insert the Userbin authentication middleware after the cookieParser (and add the cookieParser if not present): - -```javascript -app.use(connect.cookieParser()); // or express.cookieParser() -app.use(userbin.authenticate()); -``` - -Implement getter and setter for your user model. For more information about the available attributes in the profile see the [Userbin profile](https://userbin.com/docs/profile) documentation. - -```javascript -userbin.config({ - findUser: function(userbinId, done) { - User.findOne({ userbinId: userbinId }, function(err, user) { - done(user); - }); - }, - - createUser: function(profile, done) { - var user = User.new({ - userbinId : profile.id, - email : profile.email, - photo : profile.image - }); - user.save(function(err, user) { - done(user); - }); - } -}) -``` - - -### Authenticating users - -Userbin keeps track of the currently logged in user which can be accessed in your controllers and views through the `req.currentUser` property which needs to be explicitly passed to your views. - -Insert the `userbin.authorize()` middleware to protect a route fron non-logged in users. - -```javascript -app.get('/account', userbin.authorize(), function(req, res) { - res.render('account', {currentUser: req.currentUser}); -}); -``` - -> You can always access the [Userbin profile](https://userbin.com/docs/profile) for the logged in user as `req.currentProfile` when you need to access information that you haven't persisted in your user model. - - - -## Using with PHP - -### Installation and configuration - -Download Userbin into your project: - -```bash -$ curl -O https://raw.github.com/userbin/userbin-php/master/userbin.php -``` - -All you need to is to include `userbin.php` at the top of your files, configure it with you App ID and API secret, and finally run the Userbin authentication sync. The `authenticate` method will make sure that the user session is refreshed when it expires. - -> If you're not using [output buffering](http://php.net/manual/en/book.outcontrol.php) this needs to be done before any output has been written since Userbin will modify headers. - -```php - -``` - -Include [Userbin.js](https://userbin.com/js/v0) at the bottom of all your web pages to enable form helpers and session handling. - -```php - ... - - - -``` - - -### Authenticating users - -Userbin keeps track of the currently logged in user: - -```php - - - Welcome to your account, - - Not logged in - -``` - -Put the `authorize` method at the top of a file to halt the execution and render a login page if the user is not logged in: - -```php - -``` - -> You can always access the [Userbin profile](https://userbin.com/docs/profile) for the logged in user as `Userbin::current_profile()` when you need to access information that you haven't persisted in your user model. - - -## Using with mobile - -Please see the documentation for [iOS](https://userbin.com/docs/ios) and [Android](https://userbin.com/docs/android) on how to get started with Userbin in mobile apps. - -## Forms - -Once you have set up authentication it's time to choose among the different ways of integrating Userbin into your application. - -### Ready-made forms - -The easiest and fastest way to integrate login and signup forms is to use the Userbin Widget, which provides a set of ready-made views which can be customized to blend in with your current user interface. These views open up in a popup, and on mobile browsers they open up a new window tailored for smaller devices. - -`rel` specifies action; possible options are `login` and `logout`. - -```html -Log in -Sign up -``` - -### Social buttons - -Instead of signing up your users with a username and password, you can offer them to connect with a social identity like Facebook or LinkedIn. To use these button you must first configure your social identiy providers from the [dashboard](https://userbin.com/dashboard). It is also possible to connect a social identity to an already logged in user and the two accounts will be automatically linked. - -`rel` determines action. If the user didn't exist before, it's created, otherwise it's logged in. - -```html -Connect with Facebook -Connect with LinkedIn -``` - -### Custom forms - -The ready-made forms are fairly high level, so you might prefer to use Userbin with your own markup to get full control over looks and behavior. - -If you create a form with `name` set to `login` or `signup`, the user will be sent to the URL specified by `action` after being successfully processed at Userbin. - -Inputs with name `email` and `password` are processed, others are ignored. - -If you add an element with the class `error-messages`, it will be automatically set to `display: block` and populated with a an error message when something goes wrong. So make sure to it is `display: hidden` by default. - -```html -
      - -
      - - -
      -
      - - -
      - -
      -``` - -### Log out - -Clears the session and redirects the user to the specified URL. - -```html -Log out -``` - - -## Dashboard - -With Userbin you get an admin dashboard out of the box. - -- Invite, update, remove and ban users -- Log in as any of your users for debugging -- Configure user validation, access rights and login methods -- See who is using your web or mobile app in real-time. -- Customize copy and appearance of your transactional emails. - - -## Removing Userbin - -```bash -$ cctrlapp APP_NAME/DEP_NAME addon.remove userbin.PLAN -``` - -## Internal access credentials - -You can view your Userbin crendentials via: - -```bash -$ cctrlapp APP_NAME/DEP_NAME addon userbin.PLAN -``` - -```bash -Addon : userbin.PLAN - - Settings - USERBIN_APP_ID : 689751686362727 - USERBIN_API_SECRET : P1pBdtjAJvQP7qsqz5zrLC1pDCxBJqFw -``` - -## Support & feedback - -Any non-support related issues or product feedback is welcome by [email](mailto:support@userbin.com). diff --git a/Add-on Documentation/Deployment/Usersnap.md b/Add-on Documentation/Deployment/Usersnap.md deleted file mode 100644 index b0e4053..0000000 --- a/Add-on Documentation/Deployment/Usersnap.md +++ /dev/null @@ -1,264 +0,0 @@ -# Usersnap -[Usersnap](https://usersnap.com/?gat=cloudcontrol) is an [add-on](https://www.cloudcontrol.com/add-ons/usersnap) -to allow your users to give visual feedback in a comfortable and easy way: -directly in their browser. - -Stop wasting time trying to understand unclear bug reports. Screenshots with -comments from your users and testers delivered directly to your bug tracker -help you to fix problems faster and speed up your development cycle. -Understand the reported issues immediately by seeing it. Usersnap -reduces expensive communication overhead significantly. - -Usersnap integrates seamlessly with your existing Bug Tracker and causes -no switching costs. Connect Usersnap with one of our supported tools and -you will get issue reports in a familiar place. - -[Learn more about all supported tools](https://usersnap.com/doc/connect) -Usersnap provides simple and yet powerful tools which allow anybody to -report bugs and issues. All bug reports contain additional information -such as the used browser and the source URL of the screenshot making it -easy to reproduce the reported issues. -[Learn more about Usersnap's features](https://usersnap.com/support/docs/javascript#tools). - -## Adding or removing the Usersnap Add-on -The Add-on comes in different sizes and prices. It can be added by -executing the command addon.add: -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add usersnap.OPTION -~~~ - -".option" represents the plan size, e.g. usersnap.premium. - -You can add initial settings during this process using optional command line parameters: -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add usersnap.OPTION \ - [--targeturls=http://your-website.com,http://your-website-alias.com] \ - [--targetmails=contact@your-mail.com,user1@your-mail.com] \ - [--senderemail=noreply@usersnap.com] \ - [--subject="[Usersnap] New Usersnap feedback"] -~~~ - + __targeturls__ (comma-separated, optional - default: configured domains for your cloud control app): Specify the list of URLs on which you intend to use Usersnap. - + __targetmails__ (comma-separated, optional - default: cloud control account owner email): You can add one or more email addresses as recipients for Usersnap screenshots. - + __senderemail__ (optional - default: "noreply@usersnap.com"): If you plan to deliver Usersnap reports to a ticketing system via email, you can change the sender address to your needs. - + __subject__ (optional - default: "[Usersnap] New Usersnap feedback"): Particularly useful if you want to create an email filter to organize your screenshots. - - -Once Usersnap has been added, a `USERSNAP_APIKEY` setting will be available inside the `CRED_FILE` under the `USERSNAP` key. This will contain the API key to be used in the [Usersnap snippet](https://usersnap.com/support/docs/install). - -You can confirm a valid setup using: -~~~ -cctrlapp APPNAME/DEPLOYMENTNAME addon.creds -~~~ - -After installing Usersnap the application should be configured to fully integrate with the addon. - -## Upgrade the Usersnap Add-on -Upgrading to another option can easily be done: -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade usersnap.OPTION_OLD usersnap.OPTION_NEW -~~~ -## Downgrade the Usersnap Add-on -Downgrading to another option can easily be done: -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade usersnap.OPTION_OLD usersnap.OPTION_NEW -~~~ -## Removing the Usersnap Add-on -Similarily, an Add-on can also be removed from the deployment easily. The costs only apply for the time the Add-on was active: -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove usersnap.OPTION -~~~ -## Add-on credentials -The access credentials for the Usersnap snippet are stored in the key `USERSNAP` / `USERSNAP_APIKEY` inside the `CRED_FILE`. - -It's recommended to read the Usersnap API key from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about Add-on Credentials in the general documentation. - -Usersnap can be integrated easily to any type of web page. The Usersnap [support page](https://usersnap.com/support) offers an overview of [how to integrate Usersnap](https://usersnap.com/support/docs/install) in your site via a simple JavaScript snippet. - -On CloudControl, one even doesn't have to take care of the API key because it is accessible via the `CRED_FILE` as mentioned above. - -Provisioning Usersnap sets up a default email subscription for screenshots. To set up more advanced delivery methods just use the add-on's administration interface. You can open it in the resources view of your app. One single click on the Usersnap add-on opens the configuration view. - -## Install Usersnap to your Web App -Usersnap works with every web project, regardless of the backend language. -All you need to do is include the [Usersnap JavaScript code](https://usersnap.com/configurator) right before -the closing `` tag of your main template. - - -### Example for PHP web sites -Include this snippet in your base template, right before the closing `` -tag (you can easily configure the snippet to your needs with the -[Usersnap Configurator](https://usersnap.com/configurator)): - -```php - - - - - -``` -You can learn more about getting addon credentials with PHP in the -[cloudControl Add-On-Credentials Doc](https://www.cloudcontrol.com/dev-center/Guides/PHP/Add-on%20credentials). - -### Example for Python web sites (Example for mako templates) -Include this snippet in your base template, right before the closing `` -tag (you can easily configure the snippet to your needs with the -[Usersnap Configurator](https://usersnap.com/configurator)): - -```python -<% -import os -import json - -apikey = "" -try: - cred_file = open(os.environ['CRED_FILE']) - creds = json.load(cred_file) - apikey = creds.get("USERSNAP", {}).get("USERSNAP_APIKEY", ""); -except IOError: - print "Could not open the creds.json file!" - -%> - - - - -``` - -You can learn more about getting addon credentials with Python in the -[cloudControl Add-On-Credentials Doc](https://www.cloudcontrol.com/dev-center/Guides/Python/Add-on%20credentials). - -### Example for Ruby on Rails websites -Include this snippet in your base template, right before the closing `` -tag (you can easily configure the snippet to your needs with the -[Usersnap Configurator](https://usersnap.com/configurator)): - -```ruby -<% -require 'json' -apikey = "" -begin - cred_file = File.open(ENV["CRED_FILE"]).read - creds = JSON.parse(cred_file)["USERSNAP"] - apikey = creds["USERSNAP_APIKEY"] -rescue - puts "Could not open the creds.json file" -end -%> - - - - -``` - -Tip: Save this snippet in a file named `_usersnap.html.erb` and you can include -it in other templates by adding this line to your main template: - -```ruby -<%= render :partial => "usersnap" %> -``` - - -You can learn more about getting addon credentials with Ruby in the -[cloudControl Add-On-Credentials Doc](https://www.cloudcontrol.com/dev-center/Guides/Ruby/Add-on%20credentials). - -### Example for Java, NodeJS and all other web languages -Include this snippet in your base template, right before the closing `` tag -(you can easily configure the snippet to your needs with the -[Usersnap Configurator](https://usersnap.com/configurator)): - -```html - - - -``` - -Make sure to replace `YOUR-APIKEY-HERE` with the addon credential value stored in the `USERSNAP.USERSNAP_APIKEY` -option. [How to get add on credentials in cloudControl](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons). - -## Support -If you need help installing the [Usersnap addon](https://www.cloudcontrol.com/add-ons/usersnap) -or you have further questions, please get in touch with the [Usersnap team](https://usersnap.com/support). - diff --git a/Add-on Documentation/Messaging & Mobile/46elks.md b/Add-on Documentation/Messaging & Mobile/46elks.md deleted file mode 100644 index eeb9943..0000000 --- a/Add-on Documentation/Messaging & Mobile/46elks.md +++ /dev/null @@ -1,28 +0,0 @@ -# 46elks (Beta) - -46elks is a cloud communications platform. Use it to integrate SMS and phone call features into your applications. - -## Adding the 46elks Add-on - -The 46elks Add-on can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add 46elks.free -~~~ - -## Getting started - -In order to use the 46elks addon, you need to create a [46elks account](http://www.46elks.com/registration). - -Then, head over to the [46elks documentation](http://www.46elks.com/docs) and read about how you can send SMS, make automated phone calls, build IVR menus and more! - -## Examples - -Check out the [46elks samples](http://www.46elks.com/samples). - -## Removing 46elks Add-on - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove 46elks.free -~~~ - diff --git a/Add-on Documentation/Messaging & Mobile/CloudMailin.md b/Add-on Documentation/Messaging & Mobile/CloudMailin.md deleted file mode 100644 index 2114a44..0000000 --- a/Add-on Documentation/Messaging & Mobile/CloudMailin.md +++ /dev/null @@ -1,55 +0,0 @@ -# CloudMailin - -CloudMailIn allows you to receive any volume of incoming email via a Webhook. You are given an email address that will forward any incoming message to your app, as an HTTP POST request, within milliseconds. You can also seamlessly check the delivery status of each of your incoming emails via the dashboard, bounce emails that you do not wish to receive and use your own domain name. - -## Adding CloudMailin - -CloudMailin can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add cloudmailin.OPTION -~~~ - -## Upgrade CloudMailin - -Upgrading to another version of CloudMailin is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade cloudmailin.OPTION_OLD cloudmailin.OPTION_NEW -~~~ - -## Downgrade CloudMailin - -Downgrading to another version of CloudMailin is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade cloudmailin.OPTION_OLD cloudmailin.OPTION_NEW -~~~ - -## Removing CloudMailin - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove cloudmailin.OPTION -~~~ - -## Internal Access Credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -The JSON file has the following structure: - -~~~ -{ - "CLOUDMAILIN":{ - "CLOUDMAILIN_SECRET":"12341337asdf1335asdfqwert", - "CLOUDMAILIN_USERNAME":"depxasdfqwert@cloudcontrolled.com", - "CLOUDMAILIN_PASSWORD":"1337asdf1234", - "CLOUDMAILIN_FORWARD_ADDRESS":"12345asdf73@cloudmailin.net" - } -} -~~~ - -## CloudMailin Code Example - -You will find an example on how to use CloudMailIn within your app at [Github](https://github.com/cloudControl/CloudMailInAddonUsage). - diff --git a/Add-on Documentation/Messaging & Mobile/Mailgun.md b/Add-on Documentation/Messaging & Mobile/Mailgun.md deleted file mode 100644 index 8c0bf40..0000000 --- a/Add-on Documentation/Messaging & Mobile/Mailgun.md +++ /dev/null @@ -1,197 +0,0 @@ -# Mailgun - -Mailgun is a complete email platform: optimized outbound message delivery, inbound email push into your app, real time email analytics and more. - -## Adding Mailgun - -Mailgun can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add mailgun.OPTION -~~~ - -## Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -The JSON file has the following structure: - -~~~ -{ - "MAILGUN":{ - "MAILGUN_SMTP_LOGIN":"postmaster@cloud.mailgun.org", - "MAILGUN_SMTP_SERVER":"smtp.mailgun.org", - "MAILGUN_SMTP_PORT":"587", - "MAILGUN_SMTP_PASSWORD":"1337asdf1337ASDF", - "MAILGUN_API_KEY":"key-12341337ASDF345567-qwert13373" - } -} -~~~ - -## Upgrade Mailgun - -Upgrading to another version of Mailgun is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade mailgun.OPTION_OLD mailgun.OPTION_NEW -~~~ - -## Downgrade Mailgun - -Downgrading to another version of Mailgun is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade mailgun.OPTION_OLD mailgun.OPTION_NEW -~~~ - -## Removing Mailgun - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove mailgun.OPTION -~~~ - -## Mailgun Code Example - -Here is an example on how to use Mailgun in a Zend setup. - -## Step 1: Installing Zend - -Let's use the [Zend framework](http://framework.zend.com/download/latest) to send our first mail. This example assumes that you've downloaded and extracted it to the vendor folder inside the main directory - so you should get similar output if you use *nix: - -~~~ -$ cd ~/cctrl_tutorial_app/ -$ ~/cctrl_tutorial_app: ls vendor/Zend/ -Acl Cache Crypt Dojo Form Layout Log.php Mime.php Pdf Search Test Validate -~~~ - -To make Zend usable, we need to add the vendor folder to the PHP search path of our application: - -~~~ - -~~~ - -## Step 2: Getting access to Mailgun credentials - -When you install the addon, Mailgun populates your app environment with the access credentials. Here's how you access them from the source code: - -~~~ -< -// Parse the json file with ADDONS credentials -$string = file_get_contents($_ENV['CRED_FILE'], false); -if ($string == false) { - die('FATAL: Could not read credentials file'); -} - -$creds = json_decode($string, true); -> -~~~ - -## Step 3: Configure Zend to use Mailgun by default - -~~~ - 'tls', - 'port' => $creds['MAILGUN']['MAILGUN_SMTP_PORT'], - 'auth' => 'login', - 'username' => $creds['MAILGUN']['MAILGUN_SMTP_LOGIN'], - 'password' => $creds['MAILGUN']['MAILGUN_SMTP_PASSWORD']); - -$transport = new Zend_Mail_Transport_Smtp($creds['MAILGUN']['MAILGUN_SMTP_SERVER'], $config); -Zend_Mail::setDefaultTransport($transport); -?> -~~~ - -## Step 4: Send! - -~~~ -setBodyText('This is the text of the mail.'); -$mail->setFrom('somebody@yourdomain.com', 'Some Sender'); -$mail->addTo('klizhentas@gmail.com', 'Some Recipient'); -$mail->setSubject('TestSubject'); -$mail->send(); -?> -~~~ - -## Putting it all together - -~~~ - 'tls', - 'port' => $creds['MAILGUN']['MAILGUN_SMTP_PORT'], - 'auth' => 'login', - 'username' => $creds['MAILGUN']['MAILGUN_SMTP_LOGIN'], - 'password' => $creds['MAILGUN']['MAILGUN_SMTP_PASSWORD']); - -$transport = new Zend_Mail_Transport_Smtp($creds['MAILGUN']['MAILGUN_SMTP_SERVER'], $config); -Zend_Mail::setDefaultTransport($transport); - -// Here we go, now you can send -$mail = new Zend_Mail(); -$mail->setBodyText('This is the text of the mail.'); -$mail->setFrom('somebody@yourdomain.com', 'Some Sender'); -$mail->addTo('klizhentas@gmail.com', 'Some Recipient'); -$mail->setSubject('TestSubject'); -$mail->send(); -?> -~~~ - -Read more on sending in Mailguns [documentation](http://documentation.mailgun.net/user_manual.html#sending-messages). - -## Receiving Emails -There are two ways to handle incoming messages using Mailgun: - -* Forward incoming messages using Routes to a URL or to another email address. -* Store incoming messages in Mailboxes. - -In other words, Mailgun can POST each incoming message to your application as if someone submitted a form with email contents. This is particularly appealing because message content comes in as UTF-8, signature and quoted content are extracted, attachments arrive as file uploads. - -Here's the simple script in PHP that shows how to process an incoming message posted by Mailgun: - -~~~ - -~~~ - -Read more on receiving messages [here](http://documentation.mailgun.net/user_manual.html#receiving-messages). - diff --git a/Add-on Documentation/Performance & Monitoring/Blitz.io.md b/Add-on Documentation/Performance & Monitoring/Blitz.io.md deleted file mode 100644 index 26957d7..0000000 --- a/Add-on Documentation/Performance & Monitoring/Blitz.io.md +++ /dev/null @@ -1,43 +0,0 @@ -# Blitz.io: Performance Testing - -Blitz makes load and performance testing of your web site, API, iPhone and Android and Facebook apps a fun sport. Instantly launch 1,000,000 users from around the world against your app to see if it can hold up. Integrate blitz into your continuous deployment with their Ruby Gem. Can you take the hits? - -## Adding the Blitz.io Add-on - -To add the Blitz.io Add-on use the addon.add command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add blitz.OPTION -~~~ -Replace `blitz.OPTION` with a valid option, e.g. `blitz.250`. - -When added, Blitz.io automatically creates a new user account with your email adress. You can manage the load tests for your deployment within the [web console](https://www.cloudcontrol.com/console) (go to the specific deployment and click the link "blitz.OPTION"). - -## Upgrading the Blitz.io Add-on - -To upgrade from a smaller to a more powerful plan use the addon.upgrade command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade blitz.OPTION_OLD blitz.OPTION_NEW -~~~ - -## Downgrading the Blitz.io Add-on - -To downgrade to a smaller plan use the addon.downgrade command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade blitz.OPTION_OLD blitz.OPTION_NEW -~~~ - -## Removing the Blitz.io Add-on - -The Blitz.io Add-on can be removed from the deployment by using the addon.remove command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove blitz.OPTION -~~~ - -### Internal Access - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - diff --git a/Add-on Documentation/Performance & Monitoring/Exceptiontrap.md b/Add-on Documentation/Performance & Monitoring/Exceptiontrap.md deleted file mode 100644 index b6bfd87..0000000 --- a/Add-on Documentation/Performance & Monitoring/Exceptiontrap.md +++ /dev/null @@ -1,50 +0,0 @@ -# Exceptiontrap - -Exceptiontrap is an Add-on for providing exception and error tracking to your Ruby on Rails and PHP applications. - -Exceptiontrap catches occuring errors and exceptions in your application and notifies you about them in real-time. The errors are sent to the Exceptiontrap service that groups the incoming errors automatically and provides you with all the information (request params, environment variables, stacktrace, etc.) you need to resolve them. - -For example: If your email provider is down and your application crashes while users are trying to sign up, Exceptiontrap informs you of it immediately. - -## Adding Exceptiontrap - -The Exceptiontrap Add-on can be added to every deployment with: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add exceptiontrap.OPTION -~~~ - -When added, cloudControl automatically creates a new user account with your email address at New Relic. You will be notified by New Relic via email and can log on to New Relic's console to monitor your deployment's performance. It might take a little while until New Relic has collected enough data to show you the first statistics. - -## Using with Rails 2.3+, Rails 3 and Rails 4 - -You can find the documentation on our [Exceptiontrap Gem](https://github.com/itmLABS/exceptiontrap) GitHub page. The API key is already set in the cloudControl environment. So you can just use "cloudcontrol" as the API key string while generating the Exceptiontrap config file. - -## Using with PHP, Zend Framework & other frameworks - -You can find the documentation on our [Exceptiontrap Library](https://github.com/itmLABS/exceptiontrap-php) GitHub page. -The easiest way to get the API key automatically set by cloudControl and our library is to set the variable `SET_ENV_VARS` to `true` for your application using the `Custom Config Add-on`, which is desribed [here](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) under "Add-on Credentials". - -If you don't want to do this, use the following code snippet to "manually" extract the Exceptiontrap API key from the cloudControl environment variables file. - -~~~php - -~~~ - -## Removing Exceptiontrap - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove exceptiontrap.OPTION -~~~ - -## Further Information - -Visit [Exceptiontrap](https://exceptiontrap.com) or [write us a message](mailto:info@exceptiontrap.com) diff --git a/Add-on Documentation/Performance & Monitoring/Hosted Graphite.md b/Add-on Documentation/Performance & Monitoring/Hosted Graphite.md deleted file mode 100644 index 613bc06..0000000 --- a/Add-on Documentation/Performance & Monitoring/Hosted Graphite.md +++ /dev/null @@ -1,136 +0,0 @@ -# Hosted Graphite: Graphic metrics made scalable - -Graphite is the leading open-source metrics collection, retrieval, and visualization service. Collect thousands of metrics from your application and graph them on easily-readable dashboards. Find the pulse of your application and ensure you see the really important things happening in your technology in real-time. - -## Adding the Hosted Graphite Add-on - -To add the Hosted Graphite Add-on use the addon.add command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add hostedgraphite.OPTION -~~~ -Replace `hostedgraphite.OPTION` with a valid option, e.g. `hostedgraphite.free`. - -When added, Hosted Graphite automatically creates a new user account with your email adress. You can manage the Add-on within the [web console](https://www.cloudcontrol.com/console) (go to the specific deployment and click the link "hostedgraphite.OPTION"). - -## Upgrading the Hosted Graphite Add-on - -To upgrade from a smaller to a more powerful plan use the addon.upgrade command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade hostedgraphite.OPTION_OLD hostedgraphite.OPTION_NEW -~~~ - -## Downgrading the Hosted Graphite Add-on - -To downgrade to a smaller plan use the addon.downgrade command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade hostedgraphite.OPTION_OLD hostedgraphite.OPTION_NEW -~~~ - -## Removing the Hosted Graphite Add-on - -The Hosted Graphite Add-on can be removed from the deployment by using the addon.remove command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove hostedgraphite.OPTION -~~~ - -## Internal Access - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -## Code Snippets - -## Using with Ruby / Rails -### TCP Connection - -~~~ - require 'socket' - - apikey = ENV['HOSTEDGRAPHITE_APIKEY'] - conn = TCPSocket.new 'carbon.hostedgraphite.com', 2003 - conn.puts apikey + ".request.time 1444\n" - conn.close -~~~ - -### UDP Connection - -~~~ - require 'socket' - - apikey = ENV['HOSTEDGRAPHITE_APIKEY'] - sock = UDPSocket.new - sock.send apikey + ".request.time 1444\n", 0, "carbon.hostedgraphite.com", 2003 -~~~ - -## Using with Python -### TCP Connection - -~~~ - import socket - import os - - apikey = os.environ['HOSTEDGRAPHITE_APIKEY'] - conn = socket.create_connection(("carbon.hostedgraphite.com", 2003)) - conn.send("%s.request.time 1444\n" % apikey) - conn.close() -~~~ - -### UDP Connection - -~~~ - import socket - import os - - apikey = os.environ['HOSTEDGRAPHITE_APIKEY'] - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - sock.sendto("%s.request.time 1444\n" % apikey, ("carbon.hostedgraphite.com", 2003)) -~~~ - -## Using with PHP -### TCP Connection - -~~~ - -~~~ - -### UDP Connection - -~~~ - -~~~ - -## Using with Java -### TCP Connection - -~~~ - String apikey = System.getenv("HOSTEDGRAPHITE_APIKEY"); - Socket conn = new Socket("carbon.hostedgraphite.com", 2003); - DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); - dos.writeBytes(apikey + ".request.time 1444\n"); - conn.close(); -~~~ - -### UDP Connection - -~~~ - String apikey = System.getenv("HOSTEDGRAPHITE_APIKEY"); - DatagramSocket sock = new DatagramSocket(); - InetAddress addr = InetAddress.getByName("carbon.hostedgraphite.com"); - byte[] message = apikey + ".request.time 1444\n".getBytes() - DatagramPacket packet = new DatagramPacket(message, message.length, addr, 2003); - sock.send(packet); - sock.close(); -~~~ \ No newline at end of file diff --git a/Add-on Documentation/Performance & Monitoring/Loader.io.md b/Add-on Documentation/Performance & Monitoring/Loader.io.md deleted file mode 100644 index 594e451..0000000 --- a/Add-on Documentation/Performance & Monitoring/Loader.io.md +++ /dev/null @@ -1,34 +0,0 @@ -# Loader.io - -Loader.io is a simple cloud-based load testing tool for your apps - by SendGrid -Labs. It allows you to stress test your web-apps/apis with thousands of -concurrent connections. - -## Adding or removing the Loader.io Add-on - -The Add-on is free. It can be added by executing the command addon.add: -~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.add loaderio.test -~~~ - -When added, Loader.io automatically creates a new account and login -configuration including access token. You can access Loader.io for your -deployment within the [web console](https://www.cloudcontrol.com/console) (go to -the specific deployment, choose "Add-Ons" tab and click Loader.io login). - -## Removing the Loader.io Add-on - -Similarily, an Add-on can also be removed from the deployment easily: -~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.remove loaderio.test -~~~ - -### Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The -location of the file is available in the `CRED_FILE` environment variable. -Reading the credentials from the creds.json file ensures your app is always -using the correct credentials. For detailed instructions on how to use the -creds.json file please refer to the section about -[Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) -in the general documentation. diff --git a/Add-on Documentation/Performance & Monitoring/New Relic.md b/Add-on Documentation/Performance & Monitoring/New Relic.md deleted file mode 100644 index 574af14..0000000 --- a/Add-on Documentation/Performance & Monitoring/New Relic.md +++ /dev/null @@ -1,47 +0,0 @@ -# New Relic - -New Relic is an on-demand performance management solution for PHP web applications. The New Relic plugin is seamlesly integrated in the cloudControl platform, enabling immediate and automatic access to comprehensive capabilities for monitoring, troubleshooting and tuning web applications. A complete list of features is displayed on [New Relic's feature overview](http://www.newrelic.com/web-app-monitoring-features.html). - -## Adding New Relic - -The New Relic add-on can be added to every deployment with: - - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add newrelic.OPTION -~~~ - -When added, NewRelic automatically creates a new account and login configuration including an -access token. You can access NewRelic for your deployment in the web console via Single Sign-On (SSO). -Navigate to the specific deployment, choose "Add-Ons" tab, click on "Settings" link and "Login to dashboard". -It might take a little while until New Relic has collected enough data to show you the first statistics. - -With Single Sign-On, you are connecting to NewRelic as the deployment user. -If you prefer to login directly with your personal account, or you need to add more users, -simply create additional credentials once you have accessed NewRelic via SSO. - -## Upgrade New Relic - -Upgrading to another version of New Relic is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade newrelic.OPTION_OLD newrelic.OPTION_NEW -~~~ - -## Downgrade New Relic - -Downgrading to another version of New Relic is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade newrelic.OPTION_OLD newrelic.OPTION_NEW -~~~ -## Removing New Relic - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove newrelic.OPTION -~~~ - -## PHP API - -cloudControl takes care of the whole installation and settings process. Therefore, some settings can't be edited by you. However, you can optionally use a set of PHP functions for influencing its data collection and recording for an even better integration. A detailed description of the available methods that can be used is listed in [New Relic's PHP documentation](https://newrelic.com/docs/php/the-php-api). - diff --git a/Add-on Documentation/Performance & Monitoring/StillAlive.md b/Add-on Documentation/Performance & Monitoring/StillAlive.md deleted file mode 100644 index 230f8bc..0000000 --- a/Add-on Documentation/Performance & Monitoring/StillAlive.md +++ /dev/null @@ -1,23 +0,0 @@ -# StillAlive - -Stillalive is the best way to monitor the live functionality of your web application. -## Adding or removing StillAlive -StillAlive can be added by executing the command addon.add: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add stillalive.developer -~~~ -When added, StillAlive automatically creates a new account and login configuration including access token. You can access StillAlive for your deployment within the [web console](https://console.cloudcontrolled.com) (go to the specific deployment, choose "Add-Ons" tab and click StillAlive login). -## Removing StillAlive -Similarily, an Add-on can also be removed from the deployment easily: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove stillalive.developer - -~~~ - -# Add-on Credentials - -## Internal access credentials - -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. From b712123631b2158a8a59c579875e1af07cf43e24 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Tue, 2 Dec 2014 16:04:08 +0100 Subject: [PATCH 22/84] cloudControl to dotCloud --- .../Data Storage/MemCachier.md | 10 +- .../Data Storage/MongoSoup.md | 2 +- Add-on Documentation/Data Storage/MySQLd.md | 2 +- Add-on Documentation/Deployment/Cron.md | 4 +- Guides/Java/Add-on credentials.md | 6 +- Guides/Java/Auto-Detection.md | 2 +- Guides/Java/Clojure - HelloWorld.md | 12 +- Guides/Java/Gradle - HelloWorld.md | 14 +- Guides/Java/Grails.md | 16 +- Guides/Java/Java - HelloWorld.md | 10 +- Guides/Java/Java - Play 2.md | 10 +- Guides/Java/Java - Spring-Boot.md | 10 +- Guides/Java/Java - Spring.md | 8 +- Guides/Java/Java - Tomcat.md | 12 +- Guides/Java/Play - HelloWorld.md | 10 +- Guides/Java/Scala - HelloWorld.md | 10 +- Guides/NodeJS/Add-on credentials.md | 2 +- Guides/NodeJS/Express.md | 12 +- Guides/NodeJS/HelloWorld.md | 10 +- Guides/NodeJS/Sailsjs.md | 14 +- Guides/PHP/Add-on credentials.md | 2 +- Guides/PHP/CakePHP 2.2.1.md | 164 +++++++-------- Guides/PHP/Drupal 7.md | 6 +- Guides/PHP/HelloWorld.md | 14 +- Guides/PHP/Joomla 2.5.md | 78 +++---- Guides/PHP/Kohana 3.2.0.md | 178 ++++++++-------- Guides/PHP/Symfony 1.4.md | 106 +++++----- Guides/PHP/Yii 1.1.10.md | 119 ++++++----- Guides/PHP/Zend 2.md | 10 +- Guides/PHP/Zend Framework 1.11.md | 194 +++++++++--------- Guides/Python/Add-on credentials.md | 2 +- Guides/Python/Celery.md | 29 ++- Guides/Python/Django notes.md | 6 +- Guides/Python/Django.md | 16 +- Guides/Python/HelloWorld.md | 8 +- Guides/Python/Tornado.md | 8 +- Guides/Ruby/Add-on credentials.md | 2 +- Guides/Ruby/HelloWorld.md | 12 +- Guides/Ruby/Ruby on Rails.md | 12 +- Guides/Ruby/RubyNotes.md | 2 +- .../Third-Party Buildpacks/Go HelloWorld.md | 10 +- Guides/Third-Party Buildpacks/Go Martini.md | 12 +- Guides/Third-Party Buildpacks/Go Revel.md | 8 +- .../Third-Party Buildpacks.md | 6 +- Platform Documentation.md | 18 +- Quickstart.md | 12 +- README | 4 +- 47 files changed, 606 insertions(+), 608 deletions(-) diff --git a/Add-on Documentation/Data Storage/MemCachier.md b/Add-on Documentation/Data Storage/MemCachier.md index e0c75ff..8a9eb2e 100644 --- a/Add-on Documentation/Data Storage/MemCachier.md +++ b/Add-on Documentation/Data Storage/MemCachier.md @@ -2,7 +2,7 @@ [MemCachier](http://www.memcachier.com) is an implementation of the [Memcached](http://memcached.org) in-memory key/value store used for caching data. It is a key technology in modern web applications for scaling and reducing server loads. The MemCachier Add-on manages and scales clusters of Memcached servers so you can focus on your app. Tell us how much memory you need and get started for free instantly. Add capacity later as you need it. -The information below will quickly get you up and running with the MemCachier Add-on for cloudControl. For information on the benefits of MemCachier and how it works, please refer to the more extensive [User Guide](http://www.memcachier.com/documentation/memcache-user-guide/). +The information below will quickly get you up and running with the MemCachier Add-on for dotCloud. For information on the benefits of MemCachier and how it works, please refer to the more extensive [User Guide](http://www.memcachier.com/documentation/memcache-user-guide/). Getting started ----- @@ -226,7 +226,7 @@ Memcached provided by MemCachier can be used like this: ~~~ -More information on how to use php-memcached can be found on [php.net](http://php.net/manual/en/book.memcached.php). The php-memcached extension is part of the cloudControl stacks. +More information on how to use php-memcached can be found on [php.net](http://php.net/manual/en/book.memcached.php). The php-memcached extension is part of the dotCloud stacks. Java ---- @@ -349,9 +349,9 @@ MemCachier will work with any Memcached binding that supports [SASL authenticati Local setup ----- -To test against your cloudControl application locally, you will need to run a local Memcached process. MemCachier can only run on cloudControl but because MemCachier and Memcached speak the same protocol, you shouldn't have any issues testing it locally. Installation depends on your platform. +To test against your dotCloud application locally, you will need to run a local Memcached process. MemCachier can only run on dotCloud but because MemCachier and Memcached speak the same protocol, you shouldn't have any issues testing it locally. Installation depends on your platform. -This will install Memcached without SASL authentication support. This is generally what you want as client code can still try to use SASL auth and Memcached will simply ignore the requests which is the same as allowing any credentials. So your client code can run without modification locally and on cloudControl. +This will install Memcached without SASL authentication support. This is generally what you want as client code can still try to use SASL auth and Memcached will simply ignore the requests which is the same as allowing any credentials. So your client code can run without modification locally and on dotCloud. On Ubuntu: @@ -398,7 +398,7 @@ Changing your plan, either by upgrading or downgrading, requires no code changes Support ------- -All Memcachier support and runtime issues should be submitted via one of the cloudControl Support channels](https://www.cloudcontrol.com/dev-center/support). Any non-support related issues or product feedback is welcome via email at: [support@memcachier.com](mailto:support@memcachier.com) +All Memcachier support and runtime issues should be submitted via one of the dotCloud Support channels](https://www.cloudcontrol.com/dev-center/support). Any non-support related issues or product feedback is welcome via email at: [support@memcachier.com](mailto:support@memcachier.com) Any issues related to Memcachier service are reported at [Memcachier Status](http://status.memcachier.com/). diff --git a/Add-on Documentation/Data Storage/MongoSoup.md b/Add-on Documentation/Data Storage/MongoSoup.md index 0be03a0..930e441 100644 --- a/Add-on Documentation/Data Storage/MongoSoup.md +++ b/Add-on Documentation/Data Storage/MongoSoup.md @@ -47,7 +47,7 @@ MongoSoup's entry in your application CRED_FILE looks like this: } ~~~ -Your app-name, password and db-name are all automatically generated by cloudControl and MongoSoup. +Your app-name, password and db-name are all automatically generated by dotCloud and MongoSoup. ## Samples diff --git a/Add-on Documentation/Data Storage/MySQLd.md b/Add-on Documentation/Data Storage/MySQLd.md index 60cd791..c8f2d9e 100644 --- a/Add-on Documentation/Data Storage/MySQLd.md +++ b/Add-on Documentation/Data Storage/MySQLd.md @@ -12,7 +12,7 @@ The MySQLd Add-on comes with the following features: - Pre-configured Parameters - You can simply launch a MySQL Instance and connect your application within minutes without additional configuration. - - Automatic Software Patching - cloudControl will make sure that the + - Automatic Software Patching - dotCloud will make sure that the MySQL software powering your deployment stays up-to-date with the latest patches. diff --git a/Add-on Documentation/Deployment/Cron.md b/Add-on Documentation/Deployment/Cron.md index bd1d551..068c5e9 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -3,8 +3,8 @@ ## What are cronjobs? On UNIX systems [cronjobs](http://en.wikipedia.org/wiki/Cron) are commands that -are periodically executed. On cloudControl however, there is no one node that -the cronjob can run on. Therefore cronjobs on cloudControl are periodical calls +are periodically executed. On dotCloud however, there is no one node that +the cronjob can run on. Therefore cronjobs on dotCloud are periodical calls to a URL you specify. ## How does it work? diff --git a/Guides/Java/Add-on credentials.md b/Guides/Java/Add-on credentials.md index 0fc7851..61c6431 100644 --- a/Guides/Java/Add-on credentials.md +++ b/Guides/Java/Add-on credentials.md @@ -34,7 +34,7 @@ is exposed in the `CRED_FILE` environment variable. You can see the format of th $ cctrlapp APP_NAME/DEP_NAME addon.creds ~~~ -We provide a small [cloudControl credentials helper class] to get the Add-on credentials from the file. +We provide a small [dotCloud credentials helper class] to get the Add-on credentials from the file. It requires [json-simple], a simple Java toolkit to encode or decode JSON text easily. To use it in your project, add it as a maven dependency: ~~~xml @@ -56,7 +56,7 @@ String database = (String)cr.getCredential("MYSQLS_DATABASE", "MYSQLS"); # Examples -cloudControl offers a number of data storage solutions via the [Add-on Marketplace]. +dotCloud offers a number of data storage solutions via the [Add-on Marketplace]. Below you can find examples on how to access the Add-on credentials for MySQL and PostgreSQL. @@ -100,7 +100,7 @@ String password = credentials[1]; [Add-on credentials]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-on-credentials [cred-env-vars]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#enabling-disabling-credentials-environment-variables [json-simple]: http://code.google.com/p/json-simple/ -[cloudControl credentials helper class]: https://gist.github.com/b350762c61fcc069b427 +[dotCloud credentials helper class]: https://gist.github.com/b350762c61fcc069b427 [MySQL Dedicated Add-on]: https://www.cloudcontrol.com/add-ons/mysqld [MySQL Shared Add-on]: https://www.cloudcontrol.com/add-ons/mysqls [ElephantSQL Add-on]: https://www.cloudcontrol.com/add-ons/elephantsql diff --git a/Guides/Java/Auto-Detection.md b/Guides/Java/Auto-Detection.md index e244a05..b3405f8 100644 --- a/Guides/Java/Auto-Detection.md +++ b/Guides/Java/Auto-Detection.md @@ -1,6 +1,6 @@ # Autodetection for JVM-Based Applications -For most officially supported languages on the cloudControl platform, the application type defines exactly which buildpack is used, and thus which runtime is created. Due to the diversity of JVM-based applications and the mix of languages used, these types of apps are an exception to this rule. +For most officially supported languages on the dotCloud platform, the application type defines exactly which buildpack is used, and thus which runtime is created. Due to the diversity of JVM-based applications and the mix of languages used, these types of apps are an exception to this rule. To determine the right buildpack to use for JVM-based applications, each of the Java buildpacks defines a "detect" script. In order for the platform to determine the correct buildpack, your application must follow these conventions: diff --git a/Guides/Java/Clojure - HelloWorld.md b/Guides/Java/Clojure - HelloWorld.md index c1c08b8..405478e 100644 --- a/Guides/Java/Clojure - HelloWorld.md +++ b/Guides/Java/Clojure - HelloWorld.md @@ -1,6 +1,6 @@ # Deploying a Clojure application -In this tutorial we're going to show you how to deploy a Clojure application on [cloudControl]. You can find the [source code on Github](https://github.com/cloudControl/clojure-example-app) and check out the [Clojure buildpack] for supported features. +In this tutorial we're going to show you how to deploy a Clojure application on [dotCloud]. You can find the [source code on Github](https://github.com/cloudControl/clojure-example-app) and check out the [Clojure buildpack] for supported features. ## The Clojure Application Explained ### Get the App @@ -14,7 +14,7 @@ $ cd clojure-example-app Now you have a small, but fully functional Clojure application. ### Dependency Tracking -Clojure tracks your dependencies with the help of [Leiningen]. They are defined in the `project.clj` file which needs to be located in the root of your repository. The one you cloned as part of the example app looks like this: +Clojure tracks your dependencies with the help of [Leiningen]. They are defined in the `project.clj` file which needs to be located in the root of your repository. The one you cloned as part of the example app looks like this: ~~~clojure (defproject clojure-sample "1.1.0" :description "Hello World Clojure Web App" @@ -26,7 +26,7 @@ Clojure tracks your dependencies with the help of [Leiningen]. They are defined ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes the `Procfile` at the top level of your repository. It looks like this: @@ -38,7 +38,7 @@ The `web` process type is required and specifies the command that will be execut ## Pushing and Deploying your App Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the -cloudControl platform: +dotCloud platform: ~~~bash $ cctrlapp APP_NAME create java @@ -76,9 +76,9 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Clojure application running at `http[s]://APP_NAME.cloudcontrolled.com`. -[cloudControl]: https://www.cloudcontrol.com/ +[dotCloud]: https://www.cloudcontrol.com/ [Clojure buildpack]: https://github.com/cloudControl/buildpack-clojure -[cloudControl-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [Leiningen]: http://leiningen.org/ diff --git a/Guides/Java/Gradle - HelloWorld.md b/Guides/Java/Gradle - HelloWorld.md index 80e5294..5ee7847 100644 --- a/Guides/Java/Gradle - HelloWorld.md +++ b/Guides/Java/Gradle - HelloWorld.md @@ -1,6 +1,6 @@ # Deploying a Gradle application -In this tutorial we're going to show you how to deploy a Gradle Application on [cloudControl]. You can find the [source code on Github](https://github.com/cloudControl/gradle-example-app) and check out the [Gradle buildpack] for supported features. +In this tutorial we're going to show you how to deploy a Gradle Application on [dotCloud]. You can find the [source code on Github](https://github.com/cloudControl/gradle-example-app) and check out the [Gradle buildpack] for supported features. ## The Gradle Application Explained ### Get the App @@ -36,7 +36,7 @@ task stage(dependsOn: ['clean', 'installApp']) ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes the `Procfile` at the root of your repository. It looks like this: @@ -44,10 +44,10 @@ The example code already includes the `Procfile` at the root of your repository. web: ./build/install/app/bin/app ~~~ -The `web` process type is required and specifies the command that will be executed when the app is deployed. +The `web` process type is required and specifies the command that will be executed when the app is deployed. ## Pushing and Deploying your Gradle App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create java @@ -59,7 +59,7 @@ Push your code to the application's repository, which triggers the deployment im $ cctrlapp APP_NAME/default push [...] -----> Receiving push ------> Installing OpenJDK 1.6... +-----> Installing OpenJDK 1.6... -----> Installing OpenJDK 1.6(openjdk6.b27.tar.gz)... done -----> Installing gradle-1.0-milestone-5..... done -----> Building Gradle app... @@ -91,8 +91,8 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Gradle application running at `http[s]://APP_NAME.cloudcontrolled.com`. -[cloudControl]: https://www.cloudcontrol.com/ +[dotCloud]: https://www.cloudcontrol.com/ [Gradle buildpack]: https://github.com/cloudControl/buildpack-gradle -[cloudControl-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Grails.md b/Guides/Java/Grails.md index 6c2c6b4..c722012 100644 --- a/Guides/Java/Grails.md +++ b/Guides/Java/Grails.md @@ -1,6 +1,6 @@ # Deploying a Grails application -In this tutorial we're going to show you how to deploy a Grails application on [cloudControl]. You can find the [source code on Github](https://github.com/cloudControl/grails-example-app) and check out the [Grails buildpack] for supported features. +In this tutorial we're going to show you how to deploy a Grails application on [dotCloud]. You can find the [source code on Github](https://github.com/cloudControl/grails-example-app) and check out the [Grails buildpack] for supported features. ## The Grails Application Explained ### Get the App @@ -17,18 +17,18 @@ Now you have a small, but fully functional Grails application. Dependencies in Grails applications are resolved using [Ivy]. The dependency requirements are defined in the `grails-app/conf/BuildConfig.groovy` file which needs to be located in the root of your repository. The one you cloned as part of the example app looks like this: ~~~groovy -grails.servlet.version = "2.5" +grails.servlet.version = "2.5" grails.project.target.level = 1.6 grails.project.source.level = 1.6 grails.project.dependency.resolution = { inherits("global") { } - log "error" + log "error" checksums true legacyResolve false repositories { - inherits true + inherits true grailsPlugins() grailsHome() grailsCentral() @@ -52,7 +52,7 @@ grails.project.dependency.resolution = { ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes the `Procfile` at the top level of your repository. It looks like this: @@ -63,7 +63,7 @@ web: java $JAVA_OPTS -jar server/webapp-runner.jar --port $PORT target/*.war The `web` process type is required and specifies the command that will be executed when the app is deployed. The environment variable `$PORT` defines the port the application-server should listen to. ## Pushing and Deploying your App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create java @@ -100,9 +100,9 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Grails application running at `http[s]://APP_NAME.cloudcontrolled.com`. -[cloudControl]: https://www.cloudcontrol.com/ +[dotCloud]: https://www.cloudcontrol.com/ [Grails buildpack]: https://github.com/cloudControl/buildpack-grails -[cloudControl-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [Ivy]: http://ant.apache.org/ivy/ diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index 0c2582e..61298c9 100644 --- a/Guides/Java/Java - HelloWorld.md +++ b/Guides/Java/Java - HelloWorld.md @@ -2,7 +2,7 @@ If you're looking for a fast and lightweight Java web server / Servlet container for your projects, you definitely have to try [Jetty]. -In this tutorial we're going to show you how to deploy a Jetty application on [cloudControl]. You can find the [source code on Github](https://github.com/cloudControl/java-jetty-example-app) and check out the [Java buildpack] for supported features. +In this tutorial we're going to show you how to deploy a Jetty application on [dotCloud]. You can find the [source code on Github](https://github.com/cloudControl/java-jetty-example-app) and check out the [Java buildpack] for supported features. ## The Jetty Application Explained @@ -50,7 +50,7 @@ To create this application we had to provide Jetty server and Servlet library as ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes the `Procfile` at the top level of your repository. It looks like this: @@ -62,7 +62,7 @@ The `web` process type is required and specifies the command that will be execut The java command starts the 'com.cloudcontrolled.sample.jetty.App' with the classpath set to the compiled Java classes and dependencies. ## Pushing and Deploying your App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create java @@ -107,9 +107,9 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.cloudcontrolled.com`. [Jetty]: http://jetty.codehaus.org/jetty/ -[cloudControl]: https://www.cloudcontrol.com/ +[dotCloud]: https://www.cloudcontrol.com/ [Java buildpack]: https://github.com/cloudControl/buildpack-java -[cloudControl-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Maven dependency plugin]: http://maven.apache.org/plugins/maven-dependency-plugin/ [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Java - Play 2.md b/Guides/Java/Java - Play 2.md index 26f3e4c..d3e1692 100644 --- a/Guides/Java/Java - Play 2.md +++ b/Guides/Java/Java - Play 2.md @@ -1,7 +1,7 @@ # Deploying a Play 2 application In this tutorial we're going to show you how to deploy a [Play 2.3.x] application on -[cloudControl]. You can find the [source code on Github](https://github.com/cloudControl/java-play2-example-app) +[dotCloud]. You can find the [source code on Github](https://github.com/cloudControl/java-play2-example-app) and check out the [Scala buildpack] for supported features. The application comes from the official Play framework templates that can be found at https://github.com/playframework/playframework/tree/2.3.x/templates/play-java-intro, @@ -46,7 +46,7 @@ addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.0.0") ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes the `Procfile` at the top level of your repository. It looks like this: @@ -61,7 +61,7 @@ the required database magritions to happen. ## Pushing and Deploying your App Choose a unique name to replace the `APP_NAME` placeholder for your application -and create it on the cloudControl platform: +and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create java @@ -107,9 +107,9 @@ redeploy all changes will be lost. If you want a production database you should use one of our available [Data Storage Add-ons]. [Play 2.3.x]: https://www.playframework.com/documentation/2.3.x/Home -[cloudControl]: https://www.cloudcontrol.com/ +[dotCloud]: https://www.cloudcontrol.com/ [Scala buildpack]: https://github.com/cloudControl/buildpack-scala -[cloudControl-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [sbt]: http://www.scala-sbt.org/ diff --git a/Guides/Java/Java - Spring-Boot.md b/Guides/Java/Java - Spring-Boot.md index d5be53c..94c9895 100644 --- a/Guides/Java/Java - Spring-Boot.md +++ b/Guides/Java/Java - Spring-Boot.md @@ -2,7 +2,7 @@ With [Spring Boot] you can create stand-alone, Spring based applications without most of the boilerplate configuration that was needed before. -In this guide we are going to show you how to deploy a Spring/Hibernate/MySQL/Jetty application on [cloudControl]. The example app is a ready to deploy project based on the Spring-Boot [examples]. +In this guide we are going to show you how to deploy a Spring/Hibernate/MySQL/Jetty application on [dotCloud]. The example app is a ready to deploy project based on the Spring-Boot [examples]. ## The Spring-Boot Application Explained @@ -30,7 +30,7 @@ Spring-Boot can be easily configured to start with an embedded [Jetty server]. W ... ~~~ -The server port is provided by the cloudControl platform via environment variable and is configured in `src/main/resources/application.properties`: +The server port is provided by the dotCloud platform via environment variable and is configured in `src/main/resources/application.properties`: ~~~ server.port = ${PORT} @@ -71,7 +71,7 @@ spring.datasource.driverClassName=com.mysql.jdbc.Driver ### Process Type Definition -cloudControl uses the `Procfile` to start the application. The `Procfile` in the project root therefore specifies the command which executes the Spring-Boot app: +dotCloud uses the `Procfile` to start the application. The `Procfile` in the project root therefore specifies the command which executes the Spring-Boot app: ~~~ web: java -jar target/spring-boot-example-app-*.jar @@ -79,7 +79,7 @@ web: java -jar target/spring-boot-example-app-*.jar ## Pushing and Deploying your App -Choose a unique name (from now on called APP_NAME) for your application and create it on the cloudControl platform: +Choose a unique name (from now on called APP_NAME) for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create java @@ -139,6 +139,6 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.cloudcontrolled.c [Spring Boot]: http://projects.spring.io/spring-boot/ [examples]: https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples [Database credentials]: Add-on%20credentials -[cloudControl]: / +[dotCloud]: / [MySQLs Add-on]: ../../Add-on%20Documentation/Data%20Storage/MySQLs [hsqlDB]: http://hsqldb.org/ diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index c1f4e32..788fbd4 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -1,6 +1,6 @@ #Deploying a Spring Application -In this tutorial we're going to show you how to deploy a Spring/MVC/Hibernate application on [cloudControl]. The example app is a ready to deploy project based on the [Spring Roo petclinic] example. +In this tutorial we're going to show you how to deploy a Spring/MVC/Hibernate application on [dotCloud]. The example app is a ready to deploy project based on the [Spring Roo petclinic] example. ## The Spring Application Explained @@ -74,7 +74,7 @@ log4j.appender.stdout.layout.ConversionPattern=%p [%t] (%c) - %m%n% ### Process Type Definition -cloudControl uses the `Procfile` to start the application. The `Procfile` in the project root therefore specifies the command which executes the Jetty Runner: +dotCloud uses the `Procfile` to start the application. The `Procfile` in the project root therefore specifies the command which executes the Jetty Runner: ~~~ web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target/*.war @@ -83,7 +83,7 @@ web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target ## Pushing and Deploying your App -Choose a unique name (from now on called APP_NAME) for your application and create it on the cloudControl platform: +Choose a unique name (from now on called APP_NAME) for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create java @@ -149,7 +149,7 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.cloudcontrolled.c [Spring Roo petclinic]: http://static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sample [Database credentials]: Add-on%20credentials [Jetty Runner]: http://wiki.eclipse.org/Jetty/Howto/Using_Jetty_Runner -[cloudControl]: / +[dotCloud]: / [file system]: ../../Platform%20Documentation#non-persistent-filesystem [log command]: ../../Platform%20Documentation#logging [Shared MySQL Add-on]: ../../Add-on%20Documentation/Data%20Storage/MySQLs diff --git a/Guides/Java/Java - Tomcat.md b/Guides/Java/Java - Tomcat.md index 0bd920a..79ce17f 100644 --- a/Guides/Java/Java - Tomcat.md +++ b/Guides/Java/Java - Tomcat.md @@ -5,7 +5,7 @@ you definitely have heard of [Tomcat]. Tomcat offers an implementation of the Java Servlet and JavaServer Pages (JSP) technologies. In this tutorial we're going to show you how to deploy a JSP application running on embedded Tomcat on -[cloudControl]. You can find the [source code on Github](https://github.com/cloudControl/java-tomcat-example-app) +[dotCloud]. You can find the [source code on Github](https://github.com/cloudControl/java-tomcat-example-app) and check out the [Java buildpack] for supported features. @@ -93,14 +93,14 @@ the `pom.xml`: ### Java Version We are using the latest version of Apache Tomcat 8 which requires Java 7+ in -order to run. The default Java version on cloudControl is 7 but you can +order to run. The default Java version on dotCloud is 7 but you can explicitly define it in the `system.properties` file like this: ~~~ java.runtime.version=1.7 ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes the `Procfile` at the top level of your repository. It looks like this: @@ -114,7 +114,7 @@ commands to start your servlet using the built classes. ## Pushing and Deploying your App Choose a unique name to replace the `APP_NAME` placeholder for your application -and create it on the cloudControl platform: +and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create java ~~~ @@ -165,9 +165,9 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your JSP Application running on Tomcat at `http[s]://APP_NAME.cloudcontrolled.com`. [Tomcat]: https://tomcat.apache.org/ -[cloudControl]: https://www.cloudcontrol.com/ +[dotCloud]: https://www.cloudcontrol.com/ [Java buildpack]: https://github.com/cloudControl/buildpack-java -[cloudControl-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Application Assembler Maven Plugin]: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/ [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Play - HelloWorld.md b/Guides/Java/Play - HelloWorld.md index 31f97ee..666e1d6 100644 --- a/Guides/Java/Play - HelloWorld.md +++ b/Guides/Java/Play - HelloWorld.md @@ -1,6 +1,6 @@ # Deploying a Play! V1 application -In this tutorial we're going to show you how to deploy a Play! application on [cloudControl]. You can find the [source code on Github](https://github.com/cloudControl/play-example-app) and check out the [Play buildpack] for supported features. +In this tutorial we're going to show you how to deploy a Play! application on [dotCloud]. You can find the [source code on Github](https://github.com/cloudControl/play-example-app) and check out the [Play buildpack] for supported features. If you want to deploy a Play! V2 application, see the [Play 2 Tutorial]. @@ -24,7 +24,7 @@ require: ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes the `Procfile` at the top level of your repository. It looks like this: @@ -35,7 +35,7 @@ web: play run --http.port=$PORT $PLAY_OPTS The `web` process type is required and specifies the command that will be executed when the app is deployed. The environment variable `$PORT` defines the port the application-server should listen to. ## Pushing and Deploying your App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create java @@ -78,10 +78,10 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Play! application running at `http[s]://APP_NAME.cloudcontrolled.com`. -[cloudControl]: https://www.cloudcontrol.com/ +[dotCloud]: https://www.cloudcontrol.com/ [Play buildpack]: https://github.com/cloudControl/buildpack-play [Play 2 tutorial]: https://www.cloudcontrol.com/dev-center/Guides/Java/Java%20-%20Play%202 -[cloudControl-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [Ivy]: http://ant.apache.org/ivy/ diff --git a/Guides/Java/Scala - HelloWorld.md b/Guides/Java/Scala - HelloWorld.md index 31ab403..0d0b83a 100644 --- a/Guides/Java/Scala - HelloWorld.md +++ b/Guides/Java/Scala - HelloWorld.md @@ -1,6 +1,6 @@ # Deploying a Scala application -In this tutorial we're going to show you how to deploy a Scala application on [cloudControl]. You can find the [source code on Github](https://github.com/cloudControl/scalatra-example-app) and check out the [Scala buildpack] for supported features. +In this tutorial we're going to show you how to deploy a Scala application on [dotCloud]. You can find the [source code on Github](https://github.com/cloudControl/scalatra-example-app) and check out the [Scala buildpack] for supported features. ## The Scala Application Explained ### Get the App @@ -45,7 +45,7 @@ resolvers += "Sonatype OSS Snapshots" at "http://oss.sonatype.org/content/reposi%20~~~%20%20###%20Process%20Type%20Definition-cloudControl%20uses%20a%20[Procfile]%20to%20know%20how%20to%20start%20your%20processes.+dotCloud%20uses%20a%20[Procfile]%20to%20know%20how%20to%20start%20your%20processes.%20%20The%20example%20code%20already%20includes%20the%20%60Procfile%60%20at%20the%20top%20level%20of%20your%20repository.%20It%20looks%20like%20this:%20@@%20-56,7%20+56,7%20@@%20web:%20target/start%20The%20%60web%60%20process%20type%20is%20required%20and%20specifies%20the%20command%20that%20will%20be%20executed%20when%20the%20app%20is%20deployed.%20%20##%20Pushing%20and%20Deploying%20your%20App-Choose%20a%20unique%20name%20to%20replace%20the%20%60APP_NAME%60%20placeholder%20for%20your%20application%20and%20create%20it%20on%20the%20cloudControl%20platform:%20+Choose%20a%20unique%20name%20to%20replace%20the%20%60APP_NAME%60%20placeholder%20for%20your%20application%20and%20create%20it%20on%20the%20dotCloud%20platform:%20%20%20~~~bash%20$%20cctrlapp%20APP_NAME%20create%20java@@%20-88,10%20+88,10%20@@%20$%20cctrlapp%20APP_NAME/default%20deploy%20%20Congratulations,%20you%20can%20now%20see%20your%20Scala%20application%20running%20at%20%60http[s]://APP_NAME.cloudcontrolled.com%60.%20-[cloudControl]:%20https://www.cloudcontrol.com/+[dotCloud]:%20https://www.cloudcontrol.com/%20[Scala%20buildpack]:%20https://github.com/cloudControl/buildpack-scala%20[sbt]:%20http://www.scala-sbt.org/-[cloudControl-command-line-client]:%20https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api+[dotCloud-command-line-client]:%20https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api%20[Git%20client]:%20http://git-scm.com/%20[Procfile]:%20https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile%20[sbt]:%20http://www.scala-sbt.org/diff%20--git%20a/Guides/NodeJS/Add-on%20credentials.md%20b/Guides/NodeJS/Add-on%20credentials.mdindex%208818889..d3fb9f5%20100644---%20a/Guides/NodeJS/Add-on%20credentials.md+++%20b/Guides/NodeJS/Add-on%20credentials.md@@%20-44,7%20+44,7%20@@%20var%20param3%20=%20creds.ADDON_NAME.ADDON_NAME_PARAMETER3;%20%20#%20Examples%20-cloudControl%20offers%20a%20number%20of%20data%20storage%20solutions%20via%20the%20[Add-on%20Marketplace].%20Below%20you%20can%20see%20how%20to%20access%20Add-on%20credentials%20on%20two%20examples,%20for%20MySQL%20and%20PostgreSQL.+dotCloud%20offers%20a%20number%20of%20data%20storage%20solutions%20via%20the%20[Add-on%20Marketplace].%20Below%20you%20can%20see%20how%20to%20access%20Add-on%20credentials%20on%20two%20examples,%20for%20MySQL%20and%20PostgreSQL.%20%20##MySQL%20To%20add%20a%20MySQL%20database,%20use%20the%20[MySQL%20Dedicated%20Add-on]%20or%20[MySQL%20Shared%20Add-on].diff%20--git%20a/Guides/NodeJS/Express.md%20b/Guides/NodeJS/Express.mdindex%20f80c655..111629e%20100644---%20a/Guides/NodeJS/Express.md+++%20b/Guides/NodeJS/Express.md@@%20-1,6%20+1,6%20@@%20#%20Deploying%20an%20Express%20Application%20-This%20example%20demonstrates%20how%20to%20build%20a%20simple%20Express%20app%20on%20[cloudControl].%20The+This%20example%20demonstrates%20how%20to%20build%20a%20simple%20Express%20app%20on%20[dotCloud].%20The%20app%20uses%20[Express],%20which%20is%20a%20[Node.js]%20web%20framework,%20and%20MongoDB%20as%20the%20backend%20database.%20@@%20-41,7%20+41,7%20@@%20in%20the%20root%20of%20your%20repository.%20The%20one%20you%20cloned%20as%20part%20of%20the%20example%20app%20lo%20%20###%20Process%20Type%20Definition%20-A%20[Procfile]%20is%20required%20to%20start%20processes%20on%20the%20cloudControl%20platform.%20There+A%20[Procfile]%20is%20required%20to%20start%20processes%20on%20the%20dotCloud%20platform.%20There%20must%20be%20a%20file%20called%20%60Procfile%60%20at%20the%20root%20of%20your%20repository.%20In%20the%20example%20code%20you%20already%20cloned%20it%20looks%20like%20this:%20@@%20-56,7%20+56,7%20@@%20Left%20of%20the%20colon,%20we%20specified%20the%20**required**%20process%20type%20called%20%60web%60%20follo%20Node.js%20and%20MongoDB%20are%20an%20excellent%20combination%20because%20JSON%20(JavaScript%20Object%20Notation)%20is%20a%20subset%20of%20JavaScript,%20making%20storage%20and%20retrieval%20of%20the%20objects%20very%20simple.%20MongoDB%20is%20provided%20by%20[MongoSoup]-which%20can%20be%20found%20in%20cloudControl's Add-on Marketplace under the +which can be found in dotCloud's Add-on Marketplace under the category [Data Storage]. This example uses the MongoSoup Add-on. In the @@ -93,7 +93,7 @@ can refer to the Node.js Add-on credentials [guide][get-conf]. ## Pushing and Deploying your Express App Choose a unique name to replace the `APP_NAME` placeholder for your application -and create it on the cloudControl platform: +and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create nodejs @@ -134,7 +134,7 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Finally, don’t forget to add the MongoSoup Add-on for cloudControl and deploy the +Finally, don’t forget to add the MongoSoup Add-on for dotCloud and deploy the latest version of the app: ~~~bash @@ -155,7 +155,7 @@ applications. [Node.js]: http://nodejs.org/ [Express]: http://expressjs.com/ [npm]: https://npmjs.org/ -[cloudControl]: http://www.cloudcontrol.com +[dotCloud]: http://www.cloudcontrol.com [Node.js buildpack]: https://github.com/cloudControl/buildpack-nodejs [get-conf]: https://www.cloudcontrol.com/dev-center/Guides/NodeJS/Add-on%20credentials [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index ad724bf..6e576ab 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -5,7 +5,7 @@ makes it a lightweight and efficient framework for building data-intensive real-time cloud apps. This tutorial demonstrates how to build and deploy a simple Hello World Node.js -application on [cloudControl]. Check out the [Node.js buildpack] for supported +application on [dotCloud]. Check out the [Node.js buildpack] for supported features. ## The Node.js App Explained @@ -47,7 +47,7 @@ builds to be reproducible and to prevent unexpected errors caused by version changes. ### Process Type Definition -A [Procfile] is required to start processes on the cloudControl platform. +A [Procfile] is required to start processes on the dotCloud platform. There must be a file called `Procfile` at the root of your repository. In the example code you already cloned it looks like this: @@ -60,7 +60,7 @@ followed by the command that starts the app. ## Pushing and Deploying your App Choose a unique name to replace the `APP_NAME` placeholder for your application -and create it on the cloudControl platform: +and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create nodejs @@ -130,13 +130,13 @@ Congratulations, you can now see your Node.js app running at ## Next Steps Building a data app with Node.js? Check out our next [example on how to use Node.js with MongoDB]. Read our [platform documentation] for a technical overview of the concepts you’ll encounter while writing, configuring, deploying and running your Node.js applications. -Good luck building your apps using Node.js and cloudControl. +Good luck building your apps using Node.js and dotCloud. [example on how to use Node.js with MongoDB]: https://www.cloudcontrol.com/dev-center/Guides/NodeJS/Express [Node.js]: http://nodejs.org/ [npm]: https://npmjs.org/ -[cloudControl]: http://www.cloudcontrol.com +[dotCloud]: http://www.cloudcontrol.com [Node.js buildpack]: https://github.com/cloudControl/buildpack-nodejs [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [platform documentation]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index 2065dd9..5e8d077 100644 --- a/Guides/NodeJS/Sailsjs.md +++ b/Guides/NodeJS/Sailsjs.md @@ -1,6 +1,6 @@ # Deploying a Sails.js Application -In this guide we're going to show you how to deploy a [Sails.js] application on [cloudControl]. Sails.js is a real-time [Node.js] MVC framework, designed to mimic the pattern of frameworks like [Ruby on Rails]. It allows you to easily create applications with Node.js using the Model-View-Controller pattern to organize your code so that it is easier to maintain. +In this guide we're going to show you how to deploy a [Sails.js] application on [dotCloud]. Sails.js is a real-time [Node.js] MVC framework, designed to mimic the pattern of frameworks like [Ruby on Rails]. It allows you to easily create applications with Node.js using the Model-View-Controller pattern to organize your code so that it is easier to maintain. If you are new to Sails.js, first, check out the [Sails getting started page] for more info on how to install Sails. @@ -48,7 +48,7 @@ The one you cloned as part of the example app looks like this: ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to start the application processes. The `Procfile` can be found at the root level of your repository. +dotCloud uses a [Procfile] to start the application processes. The `Procfile` can be found at the root level of your repository. To start the sails server, you need to use the `sails lift` command. This command is included in the procfile definition as shown below: @@ -59,7 +59,7 @@ web: export NODE_ENV=production; sails lift Left from the colon we specified the **required** process type called `web` for a web application and followed by the command that starts the Sails server. ### Connecting the Sails.js Application to a Database -Sails.js is database agnostic. It provides a simple data access layer that works, no matter what database you're using. All you have to do is plug in one of the adapters for your database. Here, we show you how to connect your Sails.js application to a MySQL database using the cloudControl [Shared MySQL Add-on]. +Sails.js is database agnostic. It provides a simple data access layer that works, no matter what database you're using. All you have to do is plug in one of the adapters for your database. Here, we show you how to connect your Sails.js application to a MySQL database using the dotCloud [Shared MySQL Add-on]. Have a look at the `config/adapter.js` file so you can find out how to [get the MySQL credentials] provided by MySQLs Add-on: @@ -94,10 +94,10 @@ module.exports.adapters = { ### Socket.io and Websocket Support -In Sails.js, client-backend communication is done using [websockets]. In order to use websockets, it is important to use `*.cloudcontrolapp.com` domain instead of `*.cloudcontrolled.com`. For more details, take a look at the [cloudControl websockets documentation]. +In Sails.js, client-backend communication is done using [websockets]. In order to use websockets, it is important to use `*.cloudcontrolapp.com` domain instead of `*.cloudcontrolled.com`. For more details, take a look at the [dotCloud websockets documentation]. ## Pushing and Deploying your Sails.js App -To deploy your Sails.js application, choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +To deploy your Sails.js application, choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create nodejs @@ -148,9 +148,9 @@ Congratulations, you can now see your Sails.js application running at [Sails getting started page]: http://sailsjs.org/#!getStarted [Ruby on Rails]: http://rubyonrails.org/ [npm]: https://npmjs.org/ -[cloudControl]: http://www.cloudcontrol.com +[dotCloud]: http://www.cloudcontrol.com [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [get the MySQL credentials]: https://www.cloudcontrol.com/dev-center/Guides/NodeJS/Add-on%20credentials [websockets]: http://socket.io/ -[cloudControl websockets documentation]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#websockets +[dotCloud websockets documentation]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#websockets [Shared MySQL Add-on]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs diff --git a/Guides/PHP/Add-on credentials.md b/Guides/PHP/Add-on credentials.md index 1d521b9..4db9a10 100644 --- a/Guides/PHP/Add-on credentials.md +++ b/Guides/PHP/Add-on credentials.md @@ -35,7 +35,7 @@ $var3_name = $creds['ADDON_NAME']['ADDON_NAME_PARAMETER3']; # Examples -cloudControl offers a number of data storage solutions via the [Add-on Marketplace]. +dotCloud offers a number of data storage solutions via the [Add-on Marketplace]. Below you can see how to access Add-on credentials on two examples for MySQL and PostgreSQL. ## MySQL diff --git a/Guides/PHP/CakePHP 2.2.1.md b/Guides/PHP/CakePHP 2.2.1.md index c237f33..91829ca 100644 --- a/Guides/PHP/CakePHP 2.2.1.md +++ b/Guides/PHP/CakePHP 2.2.1.md @@ -10,7 +10,7 @@ If you're looking for a fast, light and effective PHP Framework for your project * Loads of plugins and add-ons * Easy to read documentation -In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the cloudControl platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the dotCloud platform](http://www.cloudcontrol.com). ##Prerequisites @@ -19,9 +19,9 @@ You're going to need only a few things to following along with this tutorial. Th * A [Git client](http://git-scm.com/), whether command-line or GUI. * A MySQL client, whether command-line or GUI, such as [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) or the command-line tools. -##1. Grab a Copy of CakePHP +##1. Grab a Copy of CakePHP -So now that you have the prerequisites in place, download a copy of the latest, stable, release, 2.2.1 at the time or publishing. You can find it at: [https://github.com/cakephp/cakephp/zipball/2.2.1](https://github.com/cakephp/cakephp/zipball/2.2.1). After that, extract it to your local file sytem. +So now that you have the prerequisites in place, download a copy of the latest, stable, release, 2.2.1 at the time or publishing. You can find it at: [https://github.com/cakephp/cakephp/zipball/2.2.1](https://github.com/cakephp/cakephp/zipball/2.2.1). After that, extract it to your local file sytem. ![Source files](images/expanded-sourcefile.png) @@ -29,72 +29,72 @@ If you use an IDE, then it's best to open up the source as a project in it. In t ##2. Amend the Code -A few changes need to be made to the default CakePHP configuration and code to accommodate cloudControl deployment. These changes are as follows: +A few changes need to be made to the default CakePHP configuration and code to accommodate dotCloud deployment. These changes are as follows: * Store session and log files in a database, not on the filesystem * Auto-magically determine the environment and set the configuration ###2.1 Store session and log files in a database, not on the filesystem -We need to do this because CakePHP, by default, stores its session files on the filesystem. However, this approach isn’t recommended on cloud platforms like cloudControl. +We need to do this because CakePHP, by default, stores its session files on the filesystem. However, this approach isn’t recommended on cloud platforms like dotCloud. -What's more, storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store both the session and log files in a two-level cache, composed of MySQL and APC. +What's more, storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store both the session and log files in a two-level cache, composed of MySQL and APC. -Thankfully, CakePHP is written in a very straight-forward and configurable manner, so this is easy to do. What's more, the community around it is very healthy, so there's loads of options and support available. +Thankfully, CakePHP is written in a very straight-forward and configurable manner, so this is easy to do. What's more, the community around it is very healthy, so there's loads of options and support available. ###2.2 Auto-magically determine the environment and set the configuration -As each environment will, likely, have different configuration settings, we also need to be able to differentiate between them. CakePHP does do this out of the box, but it's done by using different bootstrap files, such as **index.php**, **index-test.php** and so on. +As each environment will, likely, have different configuration settings, we also need to be able to differentiate between them. CakePHP does do this out of the box, but it's done by using different bootstrap files, such as **index.php**, **index-test.php** and so on. -On cloudControl, an app should programmatically know where it is and set the appropriate configuration options. That way, your code will run in every environment. So we're going to be making additions to the code so this happens auto-magically. +On dotCloud, an app should programmatically know where it is and set the appropriate configuration options. That way, your code will run in every environment. So we're going to be making additions to the code so this happens auto-magically. ##3. Put the Code under Git Control Ok, now let's get started making these changes and deploying the application. We'll begin by putting it under Git control. So run the following command to do that: cd - + git init . - + git add -A - + git commit -m "First addition of the source files" - + Now that the code's under version control, we're going to create a testing branch as well, so that we have one to test with and one for production. Run the following command and it will be done: git checkout -b testing - + If you're not familiar with Git, the previous command will checkout a copy of our existing branch, into a new branch, called *testing*. You can confirm that you now have two branches, by running the following command: git branch - + That will show output similar to below: $ git branch master * testing -I am using the application name ``cloudcontrolledcakephp`` in this example. You will of course have to use some different name. -Now, we need to make our first deployment of both branches to the cloudControl platform. To do this we checkout the master branch, create the application in our cloudControl account and push and deploy both deployments. +I am using the application name ``cloudcontrolledcakephp`` in this example. You will of course have to use some different name. +Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master - + // create the application cctrlapp cloudcontrolledcakephp create php - + // deploy the default branch - cctrlapp cloudcontrolledcakephp/default push - cctrlapp cloudcontrolledcakephp/default deploy - + cctrlapp cloudcontrolledcakephp/default push + cctrlapp cloudcontrolledcakephp/default deploy + // deploy the testing branch - cctrlapp cloudcontrolledcakephp/testing push - cctrlapp cloudcontrolledcakephp/testing deploy + cctrlapp cloudcontrolledcakephp/testing push + cctrlapp cloudcontrolledcakephp/testing deploy ##4. Initialise the Required Add-ons -Now that that's done, we need to configure two add-ons, config and mysqls. The config add-on is required to determine the active environment and mysqls is used for storing our session and logging information. +Now that that's done, we need to configure two add-ons, config and mysqls. The config add-on is required to determine the active environment and mysqls is used for storing our session and logging information. ###4.1 Check the Add-on Configuration @@ -102,20 +102,20 @@ Now let's be sure that everything is in order by having a look at the add-on con // Initialise the mysqls.free addon for the default deployment cctrlapp cloudcontrolledcakephp/default addon.add mysql.free - + // Retrieve the settings cctrlapp cloudcontrolledcakephp/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment cctrlapp cloudcontrolledcakephp/testing addon.add mysql.free - + // Retrieve the settings cctrlapp cloudcontrolledcakephp/testing addon mysql.free The output of the commands will be similar to that below: Addon : mysqls.free - + Settings MYSQLS_DATABASE : MYSQLS_PASSWORD : @@ -130,10 +130,10 @@ Now we need to configure the config add-on and store the respective environment // Set the default environment setting cctrlapp cloudcontrolledcakephp/default config.add CAKE_ENV=production - // Set the testing environment setting + // Set the testing environment setting cctrlapp cloudcontrolledcakephp/testing config.add CAKE_ENV=testing -Now that this is done, we're ready to make some changes to our code to make use of the new configuration. +Now that this is done, we're ready to make some changes to our code to make use of the new configuration. ##5. Environment Configuration @@ -141,21 +141,21 @@ So firstly, we're going to extend the bootstrap process to be able to determine ###5.1 Lib/BaseConfig.php -We then create a new class, **BASE_CONFIG**, that the database config, will later inherit from, and indicate that we have 4 environments: **default, development, testing** and **production**. - +We then create a new class, **BASE_CONFIG**, that the database config, will later inherit from, and indicate that we have 4 environments: **default, development, testing** and **production**. + class BASE_CONFIG { - + var $environments = array('default', 'development', 'testing', 'production'); var $default = array(); -In the function, ``getEnvironmentName``, if we're not in a local, development, environment, as indicated by having '**localdomain**' in the URL, we retrieve [the credentials file](https://github.com/cloudControl/add_on_cred_file/blob/master/_config.php) from the environment, which is part of a standard cloudControl deployment. +In the function, ``getEnvironmentName``, if we're not in a local, development, environment, as indicated by having '**localdomain**' in the URL, we retrieve [the credentials file](https://github.com/cloudControl/add_on_cred_file/blob/master/_config.php) from the environment, which is part of a standard dotCloud deployment. We then look in there for a value called **CAKE_ENV**, which determines the active environment and we store that in an application environment setting and return the value determined. getEnvironmentName(); if ($environment && isset($this->{$environment})) { - + if ($environment !== 'development') { // read the credentials file $string = file_get_contents($_ENV['CRED_FILE'], false); @@ -207,9 +207,9 @@ When we configured the add ons earlier (*mysqls* and *config*) the settings were 'encoding' => 'utf8', ); } else { - $this->default = array_merge($this->default, $this->{$environment}); + $this->default = array_merge($this->default, $this->{$environment}); } - + if ($environment == 'testing') { Configure::write('debug', 2); } @@ -221,14 +221,14 @@ When we configured the add ons earlier (*mysqls* and *config*) the settings were Now, we need to configure the development environment database settings, using the settings. So open up ``app/Config/database.php`` and change the class to extend from our newly created **BASE_CONFIG** class. Then add in the database settings for your local development environment database. With these files in place, we have configurations for development and the running configurations. -An example is provided below: +An example is provided below: 'Database/Mysql', 'persistent' => false, @@ -244,7 +244,7 @@ An example is provided below: ###5.2 app/Config/bootstrap.php -The bootstrap file is the core file managing the bootstrap process in CakePHP. By default, caching is using the filesystem as storage. What we're going to do is to make use of the built-in APC module that comes with cloudControl and store the cache information there. We could use Memcache, but for the purposes of this tutorial, we'll be using APC. +The bootstrap file is the core file managing the bootstrap process in CakePHP. By default, caching is using the filesystem as storage. What we're going to do is to make use of the built-in APC module that comes with dotCloud and store the cache information there. We could use Memcache, but for the purposes of this tutorial, we'll be using APC. Go down in the file until you find a line similar to below: @@ -254,34 +254,34 @@ Go down in the file until you find a line similar to below: Then replace it with the configuration below Cache::config('default', array( - 'engine' => 'APC', - 'duration'=> 3600, - 'probability'=> 100, - 'prefix' => Inflector::slug(APP_DIR) . '_', + 'engine' => 'APC', + 'duration'=> 3600, + 'probability'=> 100, + 'prefix' => Inflector::slug(APP_DIR) . '_', )); - + After that, head on down further until you find a line similar to below: - CakeLog::config('default', + CakeLog::config('default', array( - 'engine' => 'File', + 'engine' => 'File', Change it so that it instead looks like the code below: - + /** * Configures default file logging options */ App::uses('CakeLog', 'Log'); - CakeLog::config('default', + CakeLog::config('default', array( - 'engine' => 'DatabaseLogger', + 'engine' => 'DatabaseLogger', 'model' => 'LogEntry' )); -This will tell it to use a class called DatabaseLogger and form the basis of telling it to store log information in the database. Now, clone a copy of the DatabaseLogger library by running the following commands: +This will tell it to use a class called DatabaseLogger and form the basis of telling it to store log information in the database. Now, clone a copy of the DatabaseLogger library by running the following commands: cd app/Plugin; - + git clone https://github.com/webtechnick/CakePHP-DatabaseLogger-Plugin database_logger Now you'll have a copy of the files, ready to go. @@ -298,27 +298,27 @@ To get the session information to be stored in the database, open up app/Config/ 'cache' => 'APC' ) )); - + // Make sure to add a APC cache config Cache::config('APC', array('Engine' => 'APC')); -What this does is to have a two-level cache. The information is stored in both APC and the database. This allows us to retrieve the information from APC, which is far faster than MySQL, but has less available space. If the information's not there, then we search for it in MySQL. +What this does is to have a two-level cache. The information is stored in both APC and the database. This allows us to retrieve the information from APC, which is far faster than MySQL, but has less available space. If the information's not there, then we search for it in MySQL. ###5.4 Model/Datasource/Session/ComboSession.php -Next, create the file ``ComboSession.php`` in ``Model/Datasource/Session``. And set it up as below. +Next, create the file ``ComboSession.php`` in ``Model/Datasource/Session``. And set it up as below. cacheKey = Configure::read('Session.handler.cache'); parent::__construct(); } - + // read data from the session. public function read($id) { $result = Cache::read($id, $this->cacheKey); @@ -327,7 +327,7 @@ Next, create the file ``ComboSession.php`` in ``Model/Datasource/Session``. And } return parent::read($id); } - + // write data into the session. public function write($id, $data) { $result = Cache::write($id, $data, $this->cacheKey); @@ -336,7 +336,7 @@ Next, create the file ``ComboSession.php`` in ``Model/Datasource/Session``. And } return false; } - + // destroy a session. public function destroy($id) { $result = Cache::delete($id, $this->cacheKey); @@ -345,18 +345,18 @@ Next, create the file ``ComboSession.php`` in ``Model/Datasource/Session``. And } return false; } - + // removes expired sessions. public function gc($expires = null) { return Cache::gc($this->cacheKey) && parent::gc($expires); } } -What this does is to extend the DatabaseSession class so that we can use both APC and MySQL to store session information. With these file amendments in place, we're just about ready to go. So in your Git client, stage the files ready to be committed. +What this does is to extend the DatabaseSession class so that we can use both APC and MySQL to store session information. With these file amendments in place, we're just about ready to go. So in your Git client, stage the files ready to be committed. ##6. Database Schema -Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``cakephp_cloudcontrol_init.sql``, ready to be used to initialise the database next. +Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``cakephp_cloudcontrol_init.sql``, ready to be used to initialise the database next. CREATE TABLE `cake_sessions` ( `id` varchar(255) NOT NULL DEFAULT '', @@ -364,7 +364,7 @@ Ok, next we need to create a basic database schema for storing both the session `expires` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; - + CREATE TABLE `log_entries` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `type` varchar(45) DEFAULT NULL, @@ -380,7 +380,7 @@ Ok, next we need to create a basic database schema for storing both the session KEY `time` (`time`), KEY `datetime` (`datetime`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; - + CREATE TABLE `logs` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `type` varchar(20) NOT NULL, @@ -400,10 +400,10 @@ In the command above, you can see a reference to a **.pem** file. This can be do mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ --ssl-ca=mysql-ssl-ca-cert.pem - + show tables; - -This will show you the tables from the SQL file. + +This will show you the tables from the SQL file. Now that that's done, commit the changes we made earlier and push and deploy both environments again so that the new information will be used. This can be done quickly with the following commands: @@ -411,19 +411,19 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontrolledcakephp/default push + cctrlapp cloudcontrolledcakephp/default push cctrlapp cloudcontrolledcakephp/default deploy - + git checkout testing git merge master - + // deploy the testing branch - cctrlapp cloudcontrolledcakephp/testing push + cctrlapp cloudcontrolledcakephp/testing push cctrlapp cloudcontrolledcakephp/testing deploy ##7. Review the Deployment -With that completed, then have a look at both your deployments to ensure that they're working. +With that completed, then have a look at both your deployments to ensure that they're working. You should see output similar to that below, in figure 2. @@ -438,7 +438,7 @@ If you see output similar to figure 3, then double check your database configura With that, you should be up and running, ready to create your next, amazing, PHP web application, using CakePHP. If you want to save yourself some time, you can clone a copy of the modified CakePHP source from the cloudControl Github repository. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). ##Links - + * [http://www.dereuromark.de/2010/08/17/development-vs-productive-setup/](http://www.dereuromark.de/2010/08/17/development-vs-productive-setup/) * [http://book.cakephp.org/2.0/en/development/sessions.html](http://book.cakephp.org/2.0/en/development/sessions.html) * [http://php.refulz.com/cakephp-error-the-requested-address-was-not-found-on-this-server/](http://php.refulz.com/cakephp-error-the-requested-address-was-not-found-on-this-server/) diff --git a/Guides/PHP/Drupal 7.md b/Guides/PHP/Drupal 7.md index 62f28d7..aeceb5c 100644 --- a/Guides/PHP/Drupal 7.md +++ b/Guides/PHP/Drupal 7.md @@ -9,7 +9,7 @@ If you're looking for a flexible, friendly and powerful content management platf * Auto-update notification * Easy to read documentation -In this tutorial, we're going to take you through deploying Drupal 7 to [the cloudControl platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying Drupal 7 to [the dotCloud platform](http://www.cloudcontrol.com). ##Prerequisites @@ -65,7 +65,7 @@ That will show output similar to below: * testing I am using the application name ``cloudcontroldldrupal`` in this example. You will of course have to use some different name. -Now, we need to make our first deployment of both branches to the cloudControl platform. To do this we checkout the master branch, create the application in our cloudControl account and *push* and *deploy* both deployments. By running the following commands, this will all be done: +Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and *push* and *deploy* both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master @@ -156,7 +156,7 @@ Have a look at it and we'll go through it together. Firstly, we set the environment to default to production. Then, if we're in a local development environment, as determined, rather simply, by having ``localdomain`` in the URL, then we set the environment to development. -Otherwise, we will retrieve the setting contained in the cloudControl credentials file setting, **APPLICATION_ENV**, that we set earlier with the config addon, which should be one of '**production**' or '**testing**'. +Otherwise, we will retrieve the setting contained in the dotCloud credentials file setting, **APPLICATION_ENV**, that we set earlier with the config addon, which should be one of '**production**' or '**testing**'. With this code in place, we can now bootstrap multiple environments. Following this, we need to configure the database,. diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 3e1c4cc..3c177a5 100644 --- a/Guides/PHP/HelloWorld.md +++ b/Guides/PHP/HelloWorld.md @@ -1,10 +1,10 @@ -#Deploying a Silex application on cloudControl +#Deploying a Silex application on dotCloud [Silex] is a PHP microframework for PHP 5.3. It is inspired by sinatra and built on the shoulders of Symfony2 and Pimple. In this tutorial we're going to show you how to deploy a Silex application on -[cloudControl]. You can find the [source code on Github][example-app] and check +[dotCloud]. You can find the [source code on Github][example-app] and check out the [php buildpack] for supported features. @@ -42,7 +42,7 @@ you should run the `composer.phar update` command to update the `composer.lock`. This file must be in your repository and ensures that all the developers always use the same versions of all the libraries. It also makes the changes visible in git. Also note that your `.gitignore` should contain -`vendor` as proposed in the +`vendor` as proposed in the [Composer documentation](http://getcomposer.org/doc/01-basic-usage.md#installing-dependencies), since you don't need all that code in your repository. @@ -67,7 +67,7 @@ DocumentRoot /app/www/web For more information check out [the buildpack documentation][php buildpack]. ## Pushing and Deploying the App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create php ~~~ @@ -112,9 +112,9 @@ Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.c [silex]: http://silex.sensiolabs.org/ -[cloudControl]: http://www.cloudcontrol.com -[cloudControl-doc-user]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#user-accounts -[cloudControl-doc-cmdline]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api "documentation of the cloudControl-command-line-client" +[dotCloud]: http://www.cloudcontrol.com +[dotCloud-doc-user]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#user-accounts +[dotCloud-doc-cmdline]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api "documentation of the dotCloud-command-line-client" [php buildpack]: https://github.com/cloudControl/buildpack-php [procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git diff --git a/Guides/PHP/Joomla 2.5.md b/Guides/PHP/Joomla 2.5.md index 0bd7a5c..4f0504c 100644 --- a/Guides/PHP/Joomla 2.5.md +++ b/Guides/PHP/Joomla 2.5.md @@ -1,4 +1,4 @@ -#Deploying Joomla 2.5 to cloudControl +#Deploying Joomla 2.5 to dotCloud ![Successful Deployment](images/joomla-logo.png) @@ -10,7 +10,7 @@ If you're looking for a fast, light and effective PHP Framework for your project * Loads of plugins and add-ons * Easy to read documentation -In this tutorial, we're going to take you through deploying Joomla v2.5 to [the cloudControl platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying Joomla v2.5 to [the dotCloud platform](http://www.cloudcontrol.com). ##Prerequisites @@ -19,20 +19,20 @@ You're going to need only a few things to following along with this tutorial. Th * A [Git client](http://git-scm.com/), whether command-line or GUI. * A MySQL client, whether command-line or GUI, such as [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) or the command-line tools. -##1. Grab a Copy of Joomla +##1. Grab a Copy of Joomla -So now that you have the prerequisites in place, download a copy of the latest, stable, release. You can find it at: [http://www.joomla.org/download.html](http://www.joomla.org/download.html). After that, extract it to your local file sytem. +So now that you have the prerequisites in place, download a copy of the latest, stable, release. You can find it at: [http://www.joomla.org/download.html](http://www.joomla.org/download.html). After that, extract it to your local file sytem. ![Successful Deployment](images/joomla-source.png) ##Create a Basic Application -Once you have a copy of the Joomla source available locally, setup a VHost (or equivalent) in your web server of choice and install a copy of it, accepting the default options and inserting your details as appropriate. If you're not that familiar with Joomla, the first time that you view it as a site it will run the installer. +Once you have a copy of the Joomla source available locally, setup a VHost (or equivalent) in your web server of choice and install a copy of it, accepting the default options and inserting your details as appropriate. If you're not that familiar with Joomla, the first time that you view it as a site it will run the installer. ##2. Update the Configuration -A few changes need to be made to the default Joomla configuration and code to accommodate cloudControl deployment. These changes are as follows: +A few changes need to be made to the default Joomla configuration and code to accommodate dotCloud deployment. These changes are as follows: * Store sessions in the database * Store Cache Information in APC @@ -44,7 +44,7 @@ Unless something goes awry, you won't have to do anything here as Joomla should * Under **Session Settings**: * ensure **Session Handler** is set to **Database** - + Click Save. ###2.2 Store Cache Information in APC @@ -55,13 +55,13 @@ By default, caching in Joomla is turned off. So from "Global Configuration" -> " * set **Cache** to **On** * set **Cache Handler** to **Alternative PHP Cache** -Click **Save & Close**. +Click **Save & Close**. ###2.3 Update the Configuration Code -Joomla's core configuration file, ``configuration.php``, is updated whenever the details are changed in the administration panel as we just did. So, to retrieve the information from the cloudControl environment becomes a, little, bit tricky. +Joomla's core configuration file, ``configuration.php``, is updated whenever the details are changed in the administration panel as we just did. So, to retrieve the information from the dotCloud environment becomes a, little, bit tricky. -What we can do, though an impermanent solution if we're upgrading our version of Joomla, is to update the file that is responsible for writing the configuration.php file, so that though a new constructor it can elect to return either the original information or the retrieve the database data from the environment and return that instead. +What we can do, though an impermanent solution if we're upgrading our version of Joomla, is to update the file that is responsible for writing the configuration.php file, so that though a new constructor it can elect to return either the original information or the retrieve the database data from the environment and return that instead. We do this by updating ``libraries/joomla/registry/format/php.php``. Have a look at the modified version of the file below: @@ -85,10 +85,10 @@ We do this by updating ``libraries/joomla/registry/format/php.php``. Have a look $vars .= "\tpublic $" . $k . " = " . $this->getArrayString((array) $v) . ";\n"; } } - + $str = "password = $creds["MYSQLS"]["MYSQLS_PASSWORD"]; } }' . "\n"; - + $str .= "}"; - + // Use the closing tag if it not set to false in parameters. if (!isset($params['closingtag']) || $params['closingtag'] !== false) { $str .= "\n?>"; } - + return $str; } - + ##3. Put the Code Under Git Control @@ -132,29 +132,29 @@ We do this by updating ``libraries/joomla/registry/format/php.php``. Have a look Ok, now let's get started making these changes and deploying the application. We'll begin by putting it under Git control. So run the following command to do that: cd - + git init . - + git add -A - + git commit -m "First addition of the source files" - + Now that the code's under version control, we're going to create a testing branch as well, so that we have one to test with and one for production. Run the following command and it will be done: git checkout -b testing - + If you're not familiar with Git, the previous command will checkout a copy of our existing branch, into a new branch, called *testing*. You can confirm that you now have two branches, by running the following command: git branch - + That will show output similar to below: $ git branch master * testing -I am using the application name ``cloudcontroldljoomla`` in this example. You will of course have to use some different name. -Now, we need to make our first deployment of both branches to the cloudControl platform. To do this we checkout the master branch, create the application in our cloudControl account and push and deploy both deployments. By running the following commands, this will all be done: +I am using the application name ``cloudcontroldljoomla`` in this example. You will of course have to use some different name. +Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master @@ -172,7 +172,7 @@ Now, we need to make our first deployment of both branches to the cloudControl p ##4. Initialise the Required Add-ons -Now that that's done, we need to configure two add-ons, config and mysqls. The config add-on's required for determining the active environment and mysqls for storing our session and logging information. +Now that that's done, we need to configure two add-ons, config and mysqls. The config add-on's required for determining the active environment and mysqls for storing our session and logging information. ###4.1 Check the Add-on Configuration @@ -211,7 +211,7 @@ Now we need to configure the config add-on and store the respective environment // Set the testing environment settings cctrlapp cloudcontroldljoomla/testing config.add APPLICATION_ENV=testing -Now that this is done, we're ready to make some changes to our code to make use of the new configuration. +Now that this is done, we're ready to make some changes to our code to make use of the new configuration. ##5. A Note About Logging & Temp Directories @@ -222,7 +222,7 @@ Where it may become interesting is if/when you start to use more than one clone Now, in the shell, we're going to dump the database that the install routine created and load it in to the remote mysql instance that we created earlier. To do so, run the following command, changing the respective options with your configuration settings, doing this for both default and testing: -- the database dump (SQL) file - mysqldump -u -p > joomla_cloudcontrol_init.sql + mysqldump -u -p > joomla_cloudcontrol_init.sql -- load the database dump (SQL) file in to the remote environment database mysql -u -p \ @@ -234,28 +234,28 @@ In the command above, you can see a reference to a **.pem** file. This can be do mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ --ssl-ca=mysql-ssl-ca-cert.pem - + show tables; - + This will show you the tables from the SQL file. Now that that's done, commit the changes we made earlier and push and deploy both environments again so that the new information will be used. This can be done quickly with the following commands: // commit the changes git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontroldljoomla/default push + cctrlapp cloudcontroldljoomla/default push cctrlapp cloudcontroldljoomla/default deploy - + git checkout testing git merge master - + // deploy the testing branch - cctrlapp cloudcontroldljoomla/testing push + cctrlapp cloudcontroldljoomla/testing push cctrlapp cloudcontroldljoomla/testing deploy ##7. Review the Deployment -With that completed, then have a look at both your deployments to ensure that they're working. +With that completed, then have a look at both your deployments to ensure that they're working. You should see output similar to that below, in figure 2. ![Successful Deployment](images/joomla-running.png) @@ -274,12 +274,12 @@ To view the information, run the following commands respectively: cctrlapp cloudcontroldljoomla/default log error -The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. +The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. ###7.2 Deployment Considerations As was mentioned earlier, this isn't the most perfect solution as when you upgrade Joomla, the changes made to php.php will be overwritten and JLog still writes to the filesystem. We are working on a more permanent solution to this situation. ##Links - + * [Joomla](http://www.joomla.org/) diff --git a/Guides/PHP/Kohana 3.2.0.md b/Guides/PHP/Kohana 3.2.0.md index c7c2f90..25b38d1 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -12,7 +12,7 @@ If you're looking for a very fast, light, highly configurable and effective PHP * The ability to add in 3rd party libraries, such as Zend Framework * Rich [HMVC](http://en.wikipedia.org/wiki/Hierarchical_model%E2%80%93view%E2%80%93controller) support -In this tutorial, we're going to take you through deploying Kohana 3.2.0 to [the cloudControl platform](http://www.cloudcontrol.com). If you need further information about Kohana, check out [the online user guide](http://kohanaframework.org/documentation) or jump in to [the IRC channel](irc://irc.freenode.net/kohana). Otherwise, let's get started. +In this tutorial, we're going to take you through deploying Kohana 3.2.0 to [the dotCloud platform](http://www.cloudcontrol.com). If you need further information about Kohana, check out [the online user guide](http://kohanaframework.org/documentation) or jump in to [the IRC channel](irc://irc.freenode.net/kohana). Otherwise, let's get started. ##Prerequisites @@ -21,9 +21,9 @@ You're going to need only a few things to following along with this tutorial. Th * A [Git client](http://git-scm.com/), whether command-line or GUI. * A MySQL client, whether command-line or GUI, such as [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) or the command-line tools. -##1. Grab a Copy of the Kohana code. +##1. Grab a Copy of the Kohana code. -Now that you have the prerequisites in place, download a copy of the latest, stable, release, 3.2.0 at the time or publishing. You can find it at: [http://dev.kohanaframework.org/attachments/download/1670/kohana-3.2.0.zip](http://dev.kohanaframework.org/attachments/download/1670/kohana-3.2.0.zip). After that, extract it to your local filesystem. +Now that you have the prerequisites in place, download a copy of the latest, stable, release, 3.2.0 at the time or publishing. You can find it at: [http://dev.kohanaframework.org/attachments/download/1670/kohana-3.2.0.zip](http://dev.kohanaframework.org/attachments/download/1670/kohana-3.2.0.zip). After that, extract it to your local filesystem. ![Source files](images/kohana-files.png) @@ -36,72 +36,72 @@ As I mentioned before, a few changes need to be made to the default Kohana confi ###2.1 Store Sessions in the Database -We need to do this because Kohana, by default, stores its session files on the filesystem. However, this approach isn't recommended on the cloudControl platform. +We need to do this because Kohana, by default, stores its session files on the filesystem. However, this approach isn't recommended on the dotCloud platform. -What's more, storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store them in a MySQL database. +What's more, storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store them in a MySQL database. -Thankfully, Kohana is written in a very straight-forward and configurable manner, so this isn't too hard to do. What's more, the community around it is very healthy, so there's loads of options and support available when needed. +Thankfully, Kohana is written in a very straight-forward and configurable manner, so this isn't too hard to do. What's more, the community around it is very healthy, so there's loads of options and support available when needed. ###2.2 Auto-Magically Determine the Environment and Set the Configuration -As each environment will, likely, have different configuration settings, we also need to be able to differentiate between them. Kohana does do this out of the box, but it's done by using different bootstrap files, such as **index.php**, **index-test.php** and so on. +As each environment will, likely, have different configuration settings, we also need to be able to differentiate between them. Kohana does do this out of the box, but it's done by using different bootstrap files, such as **index.php**, **index-test.php** and so on. -On cloudControl, an app should programmatically know where it is and set the appropriate configuration options. That way, your code will run in every environment. So we're going to be making additions to the code so this happens auto-magically. +On dotCloud, an app should programmatically know where it is and set the appropriate configuration options. That way, your code will run in every environment. So we're going to be making additions to the code so this happens auto-magically. ##3. Put the Code Under Git Control Ok, now let's get started making these changes to the application. We'll begin by putting it [under Git control](http://git-scm.com/). So run the following command to do that: cd - + git init . - + git add -A - + git commit -m "First addition of the source files" - + Now that the code's under version control, we're going to create a testing branch as well, so that we have one to test with and one for production. Run the following command and it will be done: git checkout -b testing - + If you're not familiar with Git, the previous command will checkout a copy of our existing branch, into a new branch, called *testing*. You can confirm that you now have two branches, by running the following command: git branch - + That will show output similar to below: $ git branch master * testing -I am using the application name ``cloudcontroldlkohana`` in this example. You will of course have to use some different name. -Now, we need to make our first deployment of both branches to the cloudControl platform. To do this we checkout the master branch, create the application in our cloudControl account and push and deploy both deployments. By running the following commands, this will all be done: +I am using the application name ``cloudcontroldlkohana`` in this example. You will of course have to use some different name. +Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master - + // create the application cctrlapp cloudcontroldlkohana create php - + // deploy the default branch - cctrlapp cloudcontroldlkohana/default push + cctrlapp cloudcontroldlkohana/default push cctrlapp cloudcontroldlkohana/default deploy - + // deploy the testing branch - cctrlapp cloudcontroldlkohana/testing push + cctrlapp cloudcontroldlkohana/testing push cctrlapp cloudcontroldlkohana/testing deploy - + ###3.1 Kohana Auto-Detected When you do this, you'll see output similar to the following: - + $ cctrlapp cloudcontroldlkohana/default push Counting objects: 9, done. Delta compression using up to 2 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (5/5), 489 bytes, done. Total 5 (delta 3), reused 0 (delta 0) - + >> Receiving push remote: No submodule mapping found in .gitmodules for path 'modules/kohana-cache' >> Compiling PHP @@ -109,7 +109,7 @@ When you do this, you'll see output similar to the following: INFO: Required directory missing, creating 'application/cache'. >> Building image >> Uploading image (772K) - + To ssh://cloudcontroldlkohana@cloudcontrolled.com/repository.git f98a87c..a685cd6 master -> master @@ -117,7 +117,7 @@ Note the following lines: INFO: Kohana Framework detected INFO: Required directory missing, creating 'application/cache'. - + ##4. Initialise the Required Addons @@ -140,30 +140,30 @@ Now we need to configure the config addon and store the respective environment s ###4.1 Check the Add-on Configuration Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: - + // Retrieve the settings cctrlapp cloudcontroldlkohana/testing addon mysqls.free The output of the commands will be similar to that below: Addon : alias.free - + Addon : mysqls.free - + Settings MYSQLS_DATABASE : MYSQLS_PASSWORD : MYSQLS_PORT : 3306 MYSQLS_HOSTNAME : mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com MYSQLS_USERNAME : - + Addon : config.free - + Settings CONFIG_VARS : {u'APPLICATION_ENV': u'testing'} -Now that this is done, we're ready to make some changes to our code to make use of the new configuration. +Now that this is done, we're ready to make some changes to our code to make use of the new configuration. ##5. Environment Configuration @@ -173,43 +173,43 @@ In ``application/bootstrap.php``, search for the following line: { Kohana::$environment = constant('Kohana::'.strtoupper($_SERVER['KOHANA_ENV'])); } - + After you've found it, replace them with the following. I'll go through the code afterwards. - $env = Kohana::DEVELOPMENT; - + $env = Kohana::DEVELOPMENT; + if (!empty($_SERVER['HTTP_HOST']) && strpos($_SERVER['HTTP_HOST'], 'localdomain') === FALSE) { // Parse the json file with ADDONS credentials $string = file_get_contents($_ENV['CRED_FILE'], false); - + if ($string == false) { die('FATAL: Could not read credentials file'); } - + $creds = json_decode($string, true); - + // Now getenv('APPLICATION_ENV') should work: $environment = $creds['CONFIG']['CONFIG_VARS']['APPLICATION_ENV']; - - switch($environment) + + switch($environment) { case ('testing'): - $env = Kohana::TESTING; + $env = Kohana::TESTING; break; - + case ('staging'): - $env = Kohana::STAGING; + $env = Kohana::STAGING; break; - + case ('production'): default: $env = Kohana::PRODUCTION; } } - + Kohana::$environment = $env; -What that the code's completed for replacing the original environment configuration with one that is based on looking at the setting contained in the cloudControl credentials file setting, *APPLICATION_ENV*, that we set earlier. +What that the code's completed for replacing the original environment configuration with one that is based on looking at the setting contained in the dotCloud credentials file setting, *APPLICATION_ENV*, that we set earlier. You'll notice that the we're using the Kohana environment constants, which you can find in ``/system/classes/kohana/core.php``. This way, the code can stay consistent throughout and we're not adding on any unnecessary complexity or reinventing the wheel. @@ -243,14 +243,14 @@ Basically, what this means is that none of the modules above are able to be used // 'userguide' => MODPATH.'userguide', // User guide and API documentation )); -Now we'll have both the cache and database modules available. As our example application is simple, this is all we'll need to enable. Leave everything else in the file as it is and let's move on to caching. +Now we'll have both the cache and database modules available. As our example application is simple, this is all we'll need to enable. Leave everything else in the file as it is and let's move on to caching. ###5.2 Configuring Caching Create a new file under ``application/config`` called ``cache.php``. In that file, add the following code: array @@ -325,7 +325,7 @@ When we configured the add ons earlier (*mysqls* and *config*) the settings were Create a new file under ``application/config`` called ``session.php``. In that file, add the following code: array( @@ -364,20 +364,20 @@ Ok, after all this is done, we need to load the database schema in to each of ou KEY `last_active` (`last_active`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; - + -- -- Dumping data for table `sessions` -- - + LOCK TABLES `sessions` WRITE; /*!40000 ALTER TABLE `sessions` DISABLE KEYS */; /*!40000 ALTER TABLE `sessions` ENABLE KEYS */; UNLOCK TABLES; - + -- -- Table structure for table `tblUsers` -- - + DROP TABLE IF EXISTS `tblUsers`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -389,18 +389,18 @@ Ok, after all this is done, we need to load the database schema in to each of ou PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; - + -- -- Dumping data for table `tblUsers` -- - + LOCK TABLES `tblUsers` WRITE; /*!40000 ALTER TABLE `tblUsers` DISABLE KEYS */; INSERT INTO `tblUsers` VALUES (1,'matthew','setter','ms@example.com'),(2,'don','bradman','db@example.com'),(3,'alan','border','ab@example.com'); /*!40000 ALTER TABLE `tblUsers` ENABLE KEYS */; UNLOCK TABLES; -What we have is a simple MySQL schema that creates two tables, one to store **session information** and one to store **users**, which we'll be using in our simple example application controller and view next. +What we have is a simple MySQL schema that creates two tables, one to store **session information** and one to store **users**, which we'll be using in our simple example application controller and view next. We also load in a few users in to the users table as we're not going to create and forms to manage the information there, but want to have something to look at to confirm it's working. So store the schema in a file called ``kohana_cloudcontrol_init.sql``. @@ -415,13 +415,13 @@ In the command above, you can see a reference to a **.pem** file. This can be do mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ --ssl-ca=mysql-ssl-ca-cert.pem - + show tables; - + This should show you output similar to below: Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. - + mysql> show tables; +-----------------------+ | Tables_in_dep5jrx8a9a | @@ -429,21 +429,21 @@ This should show you output similar to below: | sessions | | tblUsers | +-----------------------+ - 2 rows in set (0.06 sec) + 2 rows in set (0.06 sec) ##Commit and Push the Code After all these changes are done, we need to then commit them on the master branch and merge the changes to the testing branch, we created earlier. To keep it simple, you can run the commands below: - git add application/config/database.php + git add application/config/database.php git add application/config/cache.php git add application/config/session.php git add application/bootstrap.php git commit -m "Updated to enable cache, database & session and auto-determine the environment" git checkout testing git merge master - + // push the code to the default (production) branch cctrlapp cloudcontroldlkohana/default push cctrlapp cloudcontroldlkohana/default deploy @@ -451,61 +451,61 @@ After all these changes are done, we need to then commit them on the master bran // push the code to the testing branch cctrlapp cloudcontroldlkohana/testing push cctrlapp cloudcontroldlkohana/testing deploy - + ##A Simple Application Now we're going to build a very simple application to test our new configuration and deployment. It will have only one controller and view. In the controller we're going to: * Get a handle on our database and perform some basic SQL * Create, store and manipulate a simple object in the cache - + Under ``application/classes/controller`` create a new controller file called ``hello.php``, which contains the following code: template->message = 'hello, world!'; - + // Change the default cache driver to memcache Cache::$default = 'apc'; - + // Create a new instance of cache using the default group $cache = Cache::instance(); - + // Create a cachable object $object = new stdClass; - + // Set a property $object->foo = 'bar'; - + // Cache the object using default group (quick interface) with default time (3600 seconds) Cache::instance()->set('foo', $object); - + print "Stored item in cache"; - + // If the cache key is available (with default value set to FALSE) if ($object = Cache::instance()->get('foo', FALSE)) { print "
      Retrieved item from cache"; } else { print "
      Didn't retrieve item from cache"; } - + // If the cache entry for 'foo' is deleted if (Cache::instance()->delete('foo')) { print '
      Deleted the module'; } - + $results = DB::select('id', 'emailAddress')->from('tblUsers')->execute(); $this->template->users = $results->as_array(); } } - -What this does is to tell the controller that we're going to use a view template, called ``site.php`` that we'll create next. We then get a handle on the database configuration, based on the environment we've automatically determined and use the configured cache. + +What this does is to tell the controller that we're going to use a view template, called ``site.php`` that we'll create next. We then get a handle on the database configuration, based on the environment we've automatically determined and use the configured cache. After that, we create an object that we use to manipulate the cache and print out output showing how it worked, or not. After this, we select ``id`` and ``emailAddress`` from the table: ``tblUsers`` and return the information as a simple array and assign the value to a template variable called users. @@ -519,11 +519,11 @@ Now create a file called ``site.php`` under ``application/views/``. In it, add t -

      Welcome to Kohana on cloudControl

      +

      Welcome to Kohana on dotCloud

      @@ -534,18 +534,18 @@ Now create a file called ``site.php`` under ``application/views/``. In it, add t - +
      - + In this view file, we output some simple HTML and then iterate the value of the users that we retrieved in the controller before. All being well, you'll see output similar to that below. ![Successful Deployment](images/kohana-success-output.png) - + ##7. Review the Deployment -After this, add the files to git and commit them and push/deploy the changes out to both environments. From there you can review the testing and production deployments to ensure that they're working as well. +After this, add the files to git and commit them and push/deploy the changes out to both environments. From there you can review the testing and production deployments to ensure that they're working as well. -With that, you should be up and running, ready to create your next, amazing, PHP web application, using Kohana and cloudControl. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). +With that, you should be up and running, ready to create your next, amazing, PHP web application, using Kohana and dotCloud. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index 881d99b..dd57ae1 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -1,4 +1,4 @@ -#Deploying Symfony 1.4 to cloudControl +#Deploying Symfony 1.4 to dotCloud ![Successful Deployment](images/symfony1.4-homepage.png) @@ -12,7 +12,7 @@ If you're looking for a feature-rich, open source, PHP Framework for your projec * Factories, plug-ins, and mixins * Built-in unit and functional testing framework -In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the cloudControl platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the dotCloud platform](http://www.cloudcontrol.com). ##Prerequisites @@ -23,7 +23,7 @@ You're going to need only a few things to following along with this tutorial. Th ##1. Grab a Copy of Symfony -Now that you have the prerequisites in place, download a copy of the latest, stable, release of Symfony, **version 1.4** at the time or publishing. You can find it at: [http://www.symfony-project.org/installation/1_4](http://www.symfony-project.org/installation/1_4). After that, extract it to your local filesystem. +Now that you have the prerequisites in place, download a copy of the latest, stable, release of Symfony, **version 1.4** at the time or publishing. You can find it at: [http://www.symfony-project.org/installation/1_4](http://www.symfony-project.org/installation/1_4). After that, extract it to your local filesystem. ![Source files](images/symfony1-source.png) @@ -38,11 +38,11 @@ As I mentioned before, a few changes need to be made to the default Symfony conf ###2.1 Store Sessions in the Database & Disable Logging -We need to do this because Symfony, by default, logs to and stores its session files on the filesystem. However, this approach recommended on the cloudControl platform. +We need to do this because Symfony, by default, logs to and stores its session files on the filesystem. However, this approach recommended on the dotCloud platform. -What's more, storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store sessions in the database and disable logging. +What's more, storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store sessions in the database and disable logging. -Thankfully, Symfony is written in a very straight-forward and configurable manner, so this isn't too hard to do. What's more, the community around it is very healthy, so there's loads of options and support available. +Thankfully, Symfony is written in a very straight-forward and configurable manner, so this isn't too hard to do. What's more, the community around it is very healthy, so there's loads of options and support available. ###2.2 Auto-magically determine the environment and set the configuration @@ -53,42 +53,42 @@ As each environment will, likely, have different configuration settings, we also Ok, now let's get started making these changes and deploying the application. We'll begin by putting it under Git control. So run the following command to do that: cd - + git init . - + git add -A - + git commit -m "First addition of the source files" - + Now that the code's under version control, we're going to create a testing branch as well, so that we have one to test with and one for production. Run the following command and it will be done: git checkout -b testing - + If you're not familiar with Git, the previous command will checkout a copy of our existing branch, into a new branch, called ``testing``. You can confirm that you now have two branches, by running the following command: git branch - + That will show output similar to below: $ git branch master * testing -I am using the application name ``cloudcontroldlsymfony`` in this example. You will of course have to use some different name. -Now, we need to make our first deployment of both branches to the cloudControl platform. To do this we checkout the master branch, create the application in our cloudControl account and push and deploy both deployments. By running the following commands, this will all be done: +I am using the application name ``cloudcontroldlsymfony`` in this example. You will of course have to use some different name. +Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master - + // create the application cctrlapp cloudcontroldlsymfony create php - + // deploy the default branch - cctrlapp cloudcontroldlsymfony/default push + cctrlapp cloudcontroldlsymfony/default push cctrlapp cloudcontroldlsymfony/default deploy - + // deploy the testing branch - cctrlapp cloudcontroldlsymfony/testing push + cctrlapp cloudcontroldlsymfony/testing push cctrlapp cloudcontroldlsymfony/testing deploy ###3.1 Symfony Auto-Detected @@ -101,14 +101,14 @@ When you do this, you'll see output similar to the following: Compressing objects: 100% (7/7), done. Writing objects: 100% (8/8), 1.23 KiB, done. Total 8 (delta 4), reused 0 (delta 0) - + >> Receiving push >> Compiling PHP INFO: Symfony 1.x detected INFO: No '.ccconfig.yaml' found, setting web content to '/web'. >> Building image >> Uploading image (3.0M) - + To ssh://cloudcontroldlsymfony@cloudcontrolled.com/repository.git d90506c..4078c78 master -> master @@ -117,14 +117,14 @@ Note the following lines: INFO: Symfony 1.x detected INFO: No '.ccconfig.yaml' found, setting web content to '/web'. -In the previous version of the cloudControl platform, you would have had to have used a platform-specific config file called: ``.ccconfig.yaml`` and in it set the following: +In the previous version of the dotCloud platform, you would have had to have used a platform-specific config file called: ``.ccconfig.yaml`` and in it set the following: BaseConfig: WebContent: /web - + ##4. Initialise the Required Add-ons -Now that that's done, we need to configure two add-ons, config and mysqls. The config Add-on is required for determining the active environment and mysqls for storing our session and logging information. +Now that that's done, we need to configure two add-ons, config and mysqls. The config Add-on is required for determining the active environment and mysqls for storing our session and logging information. ###4.1 Initialising mysqls @@ -132,20 +132,20 @@ To initialise mysqls, run the following commands and make a note of the output: // Initialise the mysqls.free addon for the default deployment cctrlapp cloudcontroldlsymfony/default addon.add mysql.free - + // Retrieve the settings cctrlapp cloudcontroldlsymfony/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment cctrlapp cloudcontroldlsymfony/testing addon.add mysql.free - + // Retrieve the settings cctrlapp cloudcontroldlsymfony/testing addon mysql.free The output of the commands will be similar to that below: Addon : mysqls.free - + Settings MYSQLS_DATABASE : MYSQLS_PASSWORD : @@ -160,10 +160,10 @@ Now we need to configure the config addon and store the respective environment s // Set the default environment setting cctrlapp cloudcontroldlsymfony/default config.add APPLICATION_ENV=production - // Set the testing environment setting + // Set the testing environment setting cctrlapp cloudcontroldlsymfony/testing config.add APPLICATION_ENV=testing -Now that this is done, we're ready to make some changes to our code to make use of the new configuration. +Now that this is done, we're ready to make some changes to our code to make use of the new configuration. ##5. Environment Configuration @@ -185,7 +185,7 @@ Now you don't necessarily need to do this. I've done it because I'm more comfort In ``config/properties.ini``, look for the following line: orm=Doctrine - + Change it to: orm=Propel @@ -193,21 +193,21 @@ Change it to: ###5.3 Store Sessions in the Database Under ``apps/frontend/config`` open the file ``factories.yaml``. In that file, we need to adding in session configuration for both prod and test. These are identified by ``prod:`` and ``test:`` respectively. For each one, add in a configuration similar to that below, changing the respective details where necessary: - + storage: class: sfCacheSessionStorage param: session_name: symfony1_cloudcontrol - session_cookie_path: / + session_cookie_path: / session_cookie_domain: cloudcontroldlsymfony.cloudcontrolled.com session_cookie_lifetime: +30 days - session_cookie_secure: false + session_cookie_secure: false session_cookie_http_only: true cache: - class: sfAPCCache - param: ~ + class: sfAPCCache + param: ~ -What this has done is to tell Symfony to use the [sfCacheSessionStorage](http://www.symfony-project.org/api/1_4/sfCacheSessionStorage) to manage the session storage with the [sfAPCCache](http://www.symfony-project.org/api/1_4/sfAPCCache) class for physically storing the sessions. +What this has done is to tell Symfony to use the [sfCacheSessionStorage](http://www.symfony-project.org/api/1_4/sfCacheSessionStorage) to manage the session storage with the [sfAPCCache](http://www.symfony-project.org/api/1_4/sfAPCCache) class for physically storing the sessions. ###5.4 Disable Logging @@ -219,7 +219,7 @@ As we just did for session configuration, in factories.yaml, add in the followin level: err loggers: ~ -What this has done is to tell Symfony to use the [sfNoLogger](http://www.symfony-project.org/api/1_4/sfNoLogger) to manage logging, effectively throwing away the logs, like ``/dev/null`` on Linux/BSD. +What this has done is to tell Symfony to use the [sfNoLogger](http://www.symfony-project.org/api/1_4/sfNoLogger) to manage logging, effectively throwing away the logs, like ``/dev/null`` on Linux/BSD. ###5.5 Auto-Magically Determine the Environment and Set the Configuration @@ -233,30 +233,30 @@ And then replace it with the following $environment = 'prod'; $debug = false; - + if (!empty($_SERVER['HTTP_HOST']) && strpos($_SERVER['HTTP_HOST'], 'localdomain') === FALSE) { // Parse the json file with ADDONS credentials $string = file_get_contents($_ENV['CRED_FILE'], false); - + if ($string == false) { die('FATAL: Could not read credentials file'); } - + $creds = json_decode($string, true); $environment = $creds['CONFIG']['CONFIG_VARS']['CAKE_ENV']; } else { $environment = 'development'; } - + if ($environment == 'development') { $debug = true; } - + $configuration = ProjectConfiguration::getApplicationConfiguration( 'frontend', $environment, $debug ); -What that will do is, if we're not using the local development environment, determined by having ``localdomain`` in the url, then we will retrieve a copy of the credentials file from the environment settings, that comes with every cloudControl application deployment by default. +What that will do is, if we're not using the local development environment, determined by having ``localdomain`` in the url, then we will retrieve a copy of the credentials file from the environment settings, that comes with every dotCloud application deployment by default. In there, we'll look for what the value of the **APPLICATION_ENV** config var is. If it's set, then we set the environment to be that. If it's not set, then we'll set the environment to ``prod``, so that we have a safe and sane default at all times. @@ -267,9 +267,9 @@ In ``config/databases.yml`` by default, Symfony will have the following settings all: doctrine: class: sfDoctrineDatabase - + What we're going to do is change it to have the values from our initialised mysqls.free add-on. So take the settings that you took note of earlier and change the file so that, with your settings, it looks similar to the configuration below: - + dev: propel: class: sfPropelDatabase @@ -282,7 +282,7 @@ What we're going to do is change it to have the values from our initialised mysq encoding: utf8 persistent: true pooling: true - + test: propel: class: sfPropelDatabase @@ -295,7 +295,7 @@ What we're going to do is change it to have the values from our initialised mysq encoding: utf8 persistent: true pooling: true - + prod: propel: class: sfPropelDatabase @@ -308,7 +308,7 @@ What we're going to do is change it to have the values from our initialised mysq encoding: utf8 persistent: true pooling: true - + all: Please note that if you're using Doctrine, leave ``sfDoctrineDatabase`` in place instead of replacing it with ``sfPropelDatabase``. @@ -319,20 +319,20 @@ After this, stage all the files in Git and commit them with a suitable commit me git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontroldlsymfony/default push + cctrlapp cloudcontroldlsymfony/default push cctrlapp cloudcontroldlsymfony/default deploy - + git checkout testing git merge master - + // deploy the testing branch - cctrlapp cloudcontroldlsymfony/testing push + cctrlapp cloudcontroldlsymfony/testing push cctrlapp cloudcontroldlsymfony/testing deploy ##7. Review the Deployment -With that completed, then have a look at both your deployments to ensure that they're working. +With that completed, then have a look at both your deployments to ensure that they're working. You should see output similar to that below, in figure 2. ![Successful Deployment](images/symfony1.png) diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index 26f6392..201ab6f 100644 --- a/Guides/PHP/Yii 1.1.10.md +++ b/Guides/PHP/Yii 1.1.10.md @@ -1,4 +1,4 @@ -#Deploying Yii 1.1.10 to cloudControl +#Deploying Yii 1.1.10 to dotCloud ![Successful Deployment](images/yii-framework-logo.png) @@ -10,7 +10,7 @@ If you're looking for a lightning fast, light and effective PHP Framework for yo * Lots of plugins and add-ons * Easy to read documentation -In this tutorial, we're going to take you through deploying the Yii Framework v1.1.11 to [the cloudControl platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying the Yii Framework v1.1.11 to [the dotCloud platform](http://www.cloudcontrol.com). ##Prerequisites @@ -19,67 +19,67 @@ You're going to need only a few things to following along with this tutorial. Th * A [Git client](http://git-scm.com/), whether command-line or GUI. * A MySQL client, whether command-line or GUI, such as [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) or the command-line tools. -##1. Grab a Copy of the Yii Framework +##1. Grab a Copy of the Yii Framework -So now that you have the prerequisites in place, download a copy of the latest, stable, release. You can find it at: [http://yii.googlecode.com/files/yii-1.1.11.58da45.tar.gz](http://yii.googlecode.com/files/yii-1.1.11.58da45.tar.gz). After that, extract it to your local file sytem. +So now that you have the prerequisites in place, download a copy of the latest, stable, release. You can find it at: [http://yii.googlecode.com/files/yii-1.1.11.58da45.tar.gz](http://yii.googlecode.com/files/yii-1.1.11.58da45.tar.gz). After that, extract it to your local file sytem. ![Source files](images/yii-framework-source.png) ##Create a Basic Application -Ok, first things first, [follow the online tutorial](http://www.yiiframework.com/doc/guide/1.1/en/quickstart.installation) on the Yii site and create a simple application in your local development environment. Then, after you've done that, we're going to make a set of simple changes and you'll be ready to deploy your first application to cloudControl. +Ok, first things first, [follow the online tutorial](http://www.yiiframework.com/doc/guide/1.1/en/quickstart.installation) on the Yii site and create a simple application in your local development environment. Then, after you've done that, we're going to make a set of simple changes and you'll be ready to deploy your first application to dotCloud. ##2. Amend the Code Ok, now that you have your test application created and running, we need to modify a few parts of the code. These changes are as follows: - * Store session information in APC + * Store session information in APC * Log messages in the database, not on the filesystem * Auto-magically determine the environment and set the configuration ###2.1 Store Session in the Cache Log Files in a Database, Not on the Filesystem -We need to do this because Yii Framework, by default, logs to and stores its session files on the filesystem. However, this approach isn't recommended on the cloudControl platform. +We need to do this because Yii Framework, by default, logs to and stores its session files on the filesystem. However, this approach isn't recommended on the dotCloud platform. -What's more, storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store both the session and log files in a two-level cache, composed of MySQL and APC. +What's more, storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store both the session and log files in a two-level cache, composed of MySQL and APC. -Thankfully, Yii Framework is written in a very straight-forward and configurable manner, so this isn't too hard to do. What's more, the community around it is very healthy, so there's loads of options and support available. +Thankfully, Yii Framework is written in a very straight-forward and configurable manner, so this isn't too hard to do. What's more, the community around it is very healthy, so there's loads of options and support available. ###2.2 Auto-magically Determine the Environment and Set the Configuration -As each environment will, likely, have different configuration settings, we also need to be able to differentiate between them. Yii Framework does do this out of the box, but it's done by using different bootstrap files, such as ``index.php``, ``index-test.php`` and so on. +As each environment will, likely, have different configuration settings, we also need to be able to differentiate between them. Yii Framework does do this out of the box, but it's done by using different bootstrap files, such as ``index.php``, ``index-test.php`` and so on. -On cloudControl, an app should programmatically know where it is and set the appropriate configuration options. That way, your code will run in every environment. So we're going to be making additions to the code so this happens auto-magically. +On dotCloud, an app should programmatically know where it is and set the appropriate configuration options. That way, your code will run in every environment. So we're going to be making additions to the code so this happens auto-magically. ##3. Put the Code Under Git Control Ok, now let's get started making these changes and deploying the application. We'll begin by putting it under Git control. So run the following command to do that: cd - + git init . - + git add -A - + git commit -m "First addition of the source files" - + Now that the code's under version control, we're going to create a testing branch as well, so that we have one to test with and one for production. Run the following command and it will be done: git checkout -b testing - + If you're not familiar with Git, the previous command will checkout a copy of our existing branch, into a new branch, called *testing*. You can confirm that you now have two branches, by running the following command: git branch - + That will show output similar to below: $ git branch master * testing -I am using the application name ``cloudcontroldlyii`` in this example. You will of course have to use some different name. -Now, we need to make our first deployment of both branches to the cloudControl platform. To do this we checkout the master branch, create the application in our cloudControl account and push and deploy both deployments. By running the following commands, this will all be done: +I am using the application name ``cloudcontroldlyii`` in this example. You will of course have to use some different name. +Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master @@ -116,7 +116,7 @@ You should see output as below: ##4. Initialise the Required Add-ons -Now that that's done, we need to configure two add-ons, config and mysqls. The config Add-on is required for determining the active environment and mysqls for storing our session and logging information. +Now that that's done, we need to configure two add-ons, config and mysqls. The config Add-on is required for determining the active environment and mysqls for storing our session and logging information. ###4.1 Check the Add-on Configuration @@ -161,31 +161,31 @@ Now that this is done, we're ready to make some changes to our code to make use ###5.1 Bootstrap -By default, Yii comes with 3 bootstrap configuration files. Located in ``/protected/config`` the files are called ``console.php``, ``main.php`` and ``test.php``. They are the *console*, *production* and *testing* environment configurations, respectively. +By default, Yii comes with 3 bootstrap configuration files. Located in ``/protected/config`` the files are called ``console.php``, ``main.php`` and ``test.php``. They are the *console*, *production* and *testing* environment configurations, respectively. We need to change them slightly so that they'll do what we need. Have a look at the code below that will show, specifically, what we need to change. ####5.1.1 Load the Settings from the Environment - -We'll look specifically at main.php here, but you can change the other two files as well. We add the code below to the top of the file so that we are able to access the ``CRED_FILE`` variable. + +We'll look specifically at main.php here, but you can change the other two files as well. We add the code below to the top of the file so that we are able to access the ``CRED_FILE`` variable. When we configured the add ons earlier (mysqls and config) the settings were automatically persisted to the running server environments. So we’re now able to retrieve these settings and configure our database connection to use them. It’s really handy as we don’t need to do too much to make use of the options. if (!empty($_SERVER['HTTP_HOST']) && strpos($_SERVER['HTTP_HOST'], 'localdomain') === FALSE) { // Parse the json file with ADDONS credentials $string = file_get_contents($_ENV['CRED_FILE'], false); - + if ($string == false) { die('FATAL: Could not read credentials file'); } - + $creds = json_decode($string, true); } - + ####5.1.2 Enable the MySQL Database Configuration - + With the ``CRED_FILE`` information available, we set the database name, username, password and hostname automatically, as below: - + 'db'=>array( 'connectionString' => 'mysql:host=' . $creds["MYSQLS"]["MYSQLS_HOSTNAME"] . ';dbname=' . $creds["MYSQLS"]["MYSQLS_DATABASE"], 'emulatePrepare' => true, @@ -193,15 +193,15 @@ With the ``CRED_FILE`` information available, we set the database name, username 'password' => $creds["MYSQLS"]["MYSQLS_PASSWORD"], 'charset' => 'utf8', ), - + ####5.1.3 Enable Database Logging - -Now that the database is configured, we enable logging, with the CDbLogRoute class, specifying the connectionID to be that of our database, 'db'. Now, we have database logging enabled and ready. + +Now that the database is configured, we enable logging, with the CDbLogRoute class, specifying the connectionID to be that of our database, 'db'. Now, we have database logging enabled and ready. We also enable ``autoCreateLogTable``, which will create the database logging table automatically for us, if we don't initialise it with the SQL schema later. We're going to, but this way, you see that you don't have to as well as see the table schema. So whichever way you go, you're covered. -We're sticking with the default logging levels of error and warning. So if you want to have more levels enabled, please change this to suit your needs. - +We're sticking with the default logging levels of error and warning. So if you want to have more levels enabled, please change this to suit your needs. + 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( @@ -213,13 +213,13 @@ We're sticking with the default logging levels of error and warning. So if you w ), ), ), - + You can find out more about the class in [the online documentation](http://www.yiiframework.com/doc/api/1.1/CDbLogRoute/). - + ####5.1.4 Enable Caching with APC - + To enable caching of our applications, we then enable the 'cache' module using the ``system.caching.CApcCache`` class. With these done, we're just about ready to go. - + 'cache'=>array( 'class'=>'system.caching.CApcCache', ), @@ -231,38 +231,38 @@ You can find out more about the class in [the online documentation](http://www.y Initially, ``index.php`` will use the ``main.php`` configuration file as so: $config = dirname(__FILE__) . '/protected/config/main.php'; - + But we need to change that based on the environment we're in, as determined by the *APPLICATION_ENV* value we set with the configs add-on. So change ``index.php`` to be as follows: if (!empty($_SERVER['HTTP_HOST']) && strpos($_SERVER['HTTP_HOST'], 'localdomain') === FALSE) { // Parse the json file with ADDONS credentials $string = file_get_contents($_ENV['CRED_FILE'], false); - + if ($string == false) { die('FATAL: Could not read credentials file'); } - + $creds = json_decode($string, true); - + // Now getenv('APPLICATION_ENV') should work: $entryScript = $creds['CONFIG']['CONFIG_VARS']['APPLICATION_ENV']; - + } else { $entryScript = 'development'; } - + $config = dirname(__FILE__) . '/protected/config/' . $entryScript . '.php'; - + Now, ``index.php`` will load the configuration file based on *APPLICATION_ENV* automatically for us. ##6. Database Schema -Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``Yii Framework_cloudcontrol_init.sql``, ready to be used to initialise the database next. +Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``Yii Framework_cloudcontrol_init.sql``, ready to be used to initialise the database next. -- -- Table structure for table `YiiLog` -- - + DROP TABLE IF EXISTS `YiiLog`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -275,11 +275,11 @@ Ok, next we need to create a basic database schema for storing both the session PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; - + -- -- Table structure for table `tbl_user` -- - + DROP TABLE IF EXISTS `tbl_user`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -303,10 +303,10 @@ In the command above, you can see a reference to a **.pem** file. This can be do mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ --ssl-ca=mysql-ssl-ca-cert.pem - + show tables; - -This will show you the tables from the SQL file. + +This will show you the tables from the SQL file. Now that that's done, commit the changes we made earlier and push and deploy both environments again so that the new information will be used. This can be done quickly with the following commands: @@ -314,19 +314,19 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontroldlyii/default push + cctrlapp cloudcontroldlyii/default push cctrlapp cloudcontroldlyii/default deploy - + git checkout testing git merge master - + // deploy the testing branch - cctrlapp cloudcontroldlyii/testing push + cctrlapp cloudcontroldlyii/testing push cctrlapp cloudcontroldlyii/testing deploy ##7. Review the Deployment -With that completed, then have a look at both your deployments to ensure that they're working. +With that completed, then have a look at both your deployments to ensure that they're working. You should see output similar to that below, in figure 2. ![Successful Deployment](images/yii-framework-running.png) @@ -345,16 +345,15 @@ To view the information, run the following commands respectively: cctrlapp cloudcontroldlyii/default log error -The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. +The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. ##8. All done -With that, you should be up and running, ready to create your next, amazing, PHP web application, using Yii Framework. If you want to save yourself some time, you can clone a copy of the modified Yii Framework source from the cloudControl Github repository. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). +With that, you should be up and running, ready to create your next, amazing, PHP web application, using Yii Framework. If you want to save yourself some time, you can clone a copy of the modified Yii Framework source from the dotCloud Github repository. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). ##Links - + * [Yii Framework](http://www.yiiframework.com/) * [Yii on Wikipedia](http://en.wikipedia.org/wiki/Yii) * [Yii on Twitter](https://twitter.com/yiiframework) * [Learning Yii from Larry Ullman](http://www.larryullman.com/series/learning-the-yii-framework/) - diff --git a/Guides/PHP/Zend 2.md b/Guides/PHP/Zend 2.md index 1eb72c8..ac613ec 100644 --- a/Guides/PHP/Zend 2.md +++ b/Guides/PHP/Zend 2.md @@ -1,6 +1,6 @@ # Deploying a Zend2 Application -In this tutorial we're going to show you how to deploy a Zend2 application on [cloudControl]. +In this tutorial we're going to show you how to deploy a Zend2 application on [dotCloud]. The [example app] is a ready to deploy fork of the official ZendSkeletonApplication available on [github](https://github.com/zendframework/ZendSkeletonApplication). @@ -87,7 +87,7 @@ function get_credentials() { $config = array(); -// If the app is running on the cloudControl PaaS read the credentials +// If the app is running on the dotCloud PaaS read the credentials // from the environment. Local db credentials should be put in local.php if (isset($_ENV['CRED_FILE'])) { $config['db'] = get_credentials(); @@ -117,7 +117,7 @@ return $config; ### Store Sessions in the Database -Storing sessions on the local filesystem does not work well on a horizontally scaling platform like cloudControl. Additionally the filesystem on cloudControl is not persitent across deploys so all sessions are lost after each deploy. +Storing sessions on the local filesystem does not work well on a horizontally scaling platform like dotCloud. Additionally the filesystem on dotCloud is not persitent across deploys so all sessions are lost after each deploy. To avoid this, the app is preconfigured to store sessions using the previously configured connection in the database. @@ -143,7 +143,7 @@ class Module ~~~ ## Pushing and Deploying your App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create php @@ -205,6 +205,6 @@ Connection to ssh.cloudcontrolled.net closed. Et voila, the app is now up and running at `http[s]://APP_NAME.cloudcontrolled.com`. [PHP buildpack]: https://github.com/cloudControl/buildpack-php -[cloudControl]: https://www.cloudcontrol.com/ +[dotCloud]: https://www.cloudcontrol.com/ [example app]: https://github.com/cloudControl/php-zend2-example-app.git diff --git a/Guides/PHP/Zend Framework 1.11.md b/Guides/PHP/Zend Framework 1.11.md index 41a38df..4b05afc 100644 --- a/Guides/PHP/Zend Framework 1.11.md +++ b/Guides/PHP/Zend Framework 1.11.md @@ -1,4 +1,4 @@ -#Deploying Zend Framework 1.11 to cloudControl +#Deploying Zend Framework 1.11 to dotCloud ![Successful Deployment](images/ZendFramework-logo.png) @@ -10,7 +10,7 @@ If you're looking for a feature-rich, flexible and capable PHP Framework for you * Easy to read documentation * A super, shiny, new version 2 **coming soon** -In this tutorial, we're going to take you through deploying Zend Framework v1.11 to [the cloudControl platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying Zend Framework v1.11 to [the dotCloud platform](http://www.cloudcontrol.com). ##Prerequisites @@ -19,9 +19,9 @@ You're going to need only a few things to following along with this tutorial. Th * A [Git client](http://git-scm.com/), whether command-line or GUI. * A MySQL client, whether command-line or GUI, such as [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) or the command-line tools. -##1. Grab a Copy of Zend Framework +##1. Grab a Copy of Zend Framework -So now that you have the prerequisites in place, download a copy of the latest, stable, release. You can find it at: [http://framework.zend.com/download/latest](http://framework.zend.com/download/latest). After that, extract it to your local file system. +So now that you have the prerequisites in place, download a copy of the latest, stable, release. You can find it at: [http://framework.zend.com/download/latest](http://framework.zend.com/download/latest). After that, extract it to your local file system. ![Source files](images/zf-source-files.png) @@ -36,16 +36,16 @@ With that, you'll have a basic application that can be run in a basic VHost. ##2. Amend the Code -As I mentioned before, a few changes need to be made to the default application configuration and code to accommodate cloudControl deployment. These changes are as follows: +As I mentioned before, a few changes need to be made to the default application configuration and code to accommodate dotCloud deployment. These changes are as follows: * Store session and log files in a database, not on the filesystem * Auto-magically determine the environment and set the configuration ###2.1 Store Session and Log Files in a Database, Not on the Filesystem -Storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store both the session and log files in a two-level cache, composed of MySQL and APC. +Storing files in a multi-server environment can lead to hard to debug issues. So what we're going to do is to store both the session and log files in a two-level cache, composed of MySQL and APC. -Thankfully, Zend Framework is written in a very straight-forward and configurable manner, so this isn't too hard to do. What's more, the community around it is very healthy, so there's loads of options and support available. +Thankfully, Zend Framework is written in a very straight-forward and configurable manner, so this isn't too hard to do. What's more, the community around it is very healthy, so there's loads of options and support available. ###2.2 Auto-magically Determine the Environment and Set the Configuration @@ -55,62 +55,62 @@ If we were deploying the application in a simple, configurable VHost, then we'd SetEnv APPLICATION_ENV development -When using cloudControl, we need to do this in a slightly different way. It involves, for each environment, setting an environment variable with the cctrlapp config add-on, then reading that information from the environment at runtime. We'll come to this shortly. +When using dotCloud, we need to do this in a slightly different way. It involves, for each environment, setting an environment variable with the cctrlapp config add-on, then reading that information from the environment at runtime. We'll come to this shortly. ##3. Put the Code Under Git Control Ok, now let's get started making these changes and deploying the application. We'll begin by putting it under Git control. So run the following command to do that: cd - + git init . - + git add -A - + git commit -m "First addition of the source files" - + Now that the code's under version control, we're going to create a testing branch as well, so that we have one to test with and one for production. Run the following command and it will be done: git checkout -b testing - + If you're not familiar with Git, the previous command will checkout a copy of our existing branch, into a new branch, called *testing*. You can confirm that you now have two branches, by running the following command: git branch - + That will show output similar to below: $ git branch master * testing -I am using the application name ``cloudcontroldlzf`` in this example. You will of course have to use some different name. -Now, we need to make our first deployment of both branches to the cloudControl platform. To do this we checkout the master branch, create the application in our cloudControl account and push and deploy both deployments. By running the following commands, this will all be done: +I am using the application name ``cloudcontroldlzf`` in this example. You will of course have to use some different name. +Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master - + // create the application cctrlapp cloudcontroldlzf create php - + // deploy the default branch - cctrlapp cloudcontroldlzf/default push + cctrlapp cloudcontroldlzf/default push cctrlapp cloudcontroldlzf/default deploy - + // deploy the testing branch - cctrlapp cloudcontroldlzf/testing push + cctrlapp cloudcontroldlzf/testing push cctrlapp cloudcontroldlzf/testing deploy You'll see output similar to the following: $ cctrlapp cloudcontroldlzf/testing push Total 0 (delta 0), reused 0 (delta 0) - + >> Receiving push >> Compiling PHP INFO: Zend Framework 1.x detected >> Building image >> Uploading image (3.6M) - + To ssh://cloudcontroldlzf@cloudcontrolled.com/repository.git dde253a..7b040e2 testing -> testing @@ -118,7 +118,7 @@ In the output above, you'll see ``INFO: Zend Framework 1.x detected``. This is t ##4. Initialise the Required Add-ons -Now that that's done, we need to configure two add-ons, config and mysqls. The config add-on is required for determining the active environment and mysqls for storing our session and logging information. +Now that that's done, we need to configure two add-ons, config and mysqls. The config add-on is required for determining the active environment and mysqls for storing our session and logging information. ###4.1 Check the Add-on Configuration @@ -126,20 +126,20 @@ Now let's be sure that everything is in order by having a look at the add-on con // Initialise the mysqls.free addon for the default deployment cctrlapp cloudcontroldlzf/default addon.add mysqls.free - + // Retrieve the settings cctrlapp cloudcontroldlzf/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment cctrlapp cloudcontroldlzf/testing addon.add mysqls.free - + // Retrieve the settings cctrlapp cloudcontroldlzf/testing addon mysqls.free The output of the commands will be similar to that below: Addon : mysqls.free - + Settings MYSQLS_DATABASE : MYSQLS_PASSWORD : @@ -157,33 +157,33 @@ Now we need to configure the config add-on and store the respective environment // Set the testing environment setting cctrlapp cloudcontroldlzf/testing config.add APPLICATION_ENV=testing -Now that this is done, we're ready to make some changes to our code to make use of the new configuration. +Now that this is done, we're ready to make some changes to our code to make use of the new configuration. ##5. Environment Configuration ###5.1 application.ini -In the ini file, below, we've laid out the core configuration, which will be inherited by all environments by default. You can see that the params have been left blank. This is because they're required. But you'll see in the plugin resource, later, that we set them appropriately. +In the ini file, below, we've laid out the core configuration, which will be inherited by all environments by default. You can see that the params have been left blank. This is because they're required. But you'll see in the plugin resource, later, that we set them appropriately. [production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1 -####5.1.1 Database - +####5.1.1 Database + ; Configure Database settings resources.db.adapter = PDO_MYSQL resources.db.isDefaultTableAdapter = true - resources.db.params.host = - resources.db.params.username = - resources.db.params.password = - resources.db.params.dbname = + resources.db.params.host = + resources.db.params.username = + resources.db.params.password = + resources.db.params.dbname = ####5.1.2 Session Storage - + In the section below, we've configured the session to be saved with the [Zend_Session_SaveHandler_DbTable](http://framework.zend.com/manual/en/zend.session.savehandler.dbtable.html) class. The table schema will be provided shortly. This uses the default database adapter to connect to the database, so no further configuration will be required on our part to make this work properly. - + ; Configure Zend_Session_SaveHandler_DbTable: resources.session.savehandler.class = "Zend_Session_SaveHandler_DbTable" resources.session.savehandler.options.name = "session" @@ -195,7 +195,7 @@ In the section below, we've configured the session to be saved with the [Zend_Se ####5.1.3 Caching In the section below, we've setup a simple cache option which we can use within the application. It has a simple set of frontend options and uses APC as the backend. As per the manual, we could also store the information in the backend, but for the purposes of this tutorial, APC will work just fine. - + ; Configure the frontend core caching option resources.cachemanager.general.frontend.name = Core resources.cachemanager.general.frontend.options.caching = true @@ -206,31 +206,31 @@ In the section below, we've setup a simple cache option which we can use within resources.cachemanager.general.frontend.options.automatic_serialization = true resources.cachemanager.general.frontend.options.automatic_cleaning_factor = 10 resources.cachemanager.general.frontend.options.ignore_user_abort = false - + ; Configure a simple APC cache resources.cachemanager.general.backend.name = Apc ###5.2 Bootstrap Plugin Resources Ok, let's start looking over the bootstrap plugin resources that will help us complete the setup of our application. - + ####5.2.1 Database - -In the database configuration, if we're **not** in the local development environment, we need to consult the ``CRED_FILE`` variable, available in all cloudControl environments, for the options for mysql. -When we configured the add ons earlier (**mysqls** and **config**) the settings were automatically persisted to the running server environments. So we’re now able to retrieve these settings and configure our database connection to make use of them. +In the database configuration, if we're **not** in the local development environment, we need to consult the ``CRED_FILE`` variable, available in all dotCloud environments, for the options for mysql. + +When we configured the add ons earlier (**mysqls** and **config**) the settings were automatically persisted to the running server environments. So we’re now able to retrieve these settings and configure our database connection to make use of them. It’s really handy as we don’t need to do too much to make use of the options. To do this, we get a handle on the partly-configured database adapter and supplement the settings by calling the ``setParams`` method. Have a look through the code for the resource below to see how it works. - + protected function _initDb() { - // + // // Get a handle on the existing db plugin resource - // + // $dbPluginResource = $this->getPluginResource('db'); - + if (APPLICATION_ENV !=='development') { - + // // Read the environment credentials file // @@ -243,7 +243,7 @@ It’s really handy as we don’t need to do too much to make use of the options // Decode them from JSON // $creds = json_decode($string, true); - + // // Set the missing database settings with the retrieved options. // @@ -254,7 +254,7 @@ It’s really handy as we don’t need to do too much to make use of the options 'password' => $creds["MYSQLS"]["MYSQLS_PASSWORD"], )); } - + // // Set the fetch mode and store the resource in the app registry // @@ -265,36 +265,36 @@ It’s really handy as we don’t need to do too much to make use of the options Zend_Registry::set('db', $db); return $db; } - + return FALSE; } - + With this, we'll have a working database configuration. - + ####5.2.2 Logging -Despite the flexibility of the Zend Framework application.ini file, it doesn't have support for configuring database-based logging. So we need to do it in a plugin resource. You can see below that we get the application database adapter and then use it when initialising a new [Zend_Log_Writer_Db](http://framework.zend.com/manual/en/zend.log.writers.html#zend.log.writers.database) class. - - protected function _initLog() +Despite the flexibility of the Zend Framework application.ini file, it doesn't have support for configuring database-based logging. So we need to do it in a plugin resource. You can see below that we get the application database adapter and then use it when initialising a new [Zend_Log_Writer_Db](http://framework.zend.com/manual/en/zend.log.writers.html#zend.log.writers.database) class. + + protected function _initLog() { // // Get a handle on the db plugin resource // $dbPluginResource = $this->getPluginResource('db'); - + if (!is_null($dbPluginResource)) { $db = $this->getPluginResource('db')->getDbAdapter(); - - // + + // // Create a new Zend_Log_Writer_Db writer // $dbWriter = new Zend_Log_Writer_Db($db, 'log_table'); - + // // Register it with the logger // $logger = new Zend_Log($dbWriter); - + // // Store that in the registry // @@ -302,11 +302,11 @@ Despite the flexibility of the Zend Framework application.ini file, it doesn't h return $logger; } } - + ####5.2.3 Caching This is more of a utility method, for convenience within the application. We make the general ``cachemanager`` object we initialised in the application.ini file earlier available through a plugin resource. - + protected function _initCache() { try { @@ -315,17 +315,17 @@ This is more of a utility method, for convenience within the application. We mak // log error... } - if (!empty($bootstrapCacheMgr) && $bootstrapCacheMgr instanceof - Zend_Application_Bootstrap_BootstrapAbstract && - $bootstrapCacheMgr->hasResource('cachemanager')) + if (!empty($bootstrapCacheMgr) && $bootstrapCacheMgr instanceof + Zend_Application_Bootstrap_BootstrapAbstract && + $bootstrapCacheMgr->hasResource('cachemanager')) { - + // // Get a handle on the existing cache manager // $cacheManager = $bootstrapCacheMgr->getResource('cachemanager'); $generalCache = 'general'; - + if ($cacheManager->hasCache($generalCache)) { $cache = $cacheManager->getCache($generalCache); // Only attempt to cache the metadata if we have a cache available @@ -340,7 +340,7 @@ This is more of a utility method, for convenience within the application. We mak } } } - + ###5.3 index.php We then need to make an adjustment to the default ``index.php`` that comes with a standard Zend Framework installation, as created by ``zf.sh`` (or bat). @@ -350,15 +350,15 @@ Normally it looks like the below (formatted for readability): // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); - + // Define path to application directory defined('PROJECT_PATH') || define('PROJECT_PATH', realpath(dirname(__FILE__) . '/../')); - + // Define application environment defined('APPLICATION_ENV') - || define('APPLICATION_ENV', - (getenv('APPLICATION_ENV') + || define('APPLICATION_ENV', + (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); However, we need to make a small change, as highlighted below: @@ -366,30 +366,30 @@ However, we need to make a small change, as highlighted below: // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); - + if (!empty($_SERVER['HTTP_HOST']) && strpos($_SERVER['HTTP_HOST'], 'localdomain') === FALSE) { // Parse the json file with ADDONS credentials $string = file_get_contents($_ENV['CRED_FILE'], false); - + if ($string == false) { die('FATAL: Could not read credentials file'); } - + $creds = json_decode($string, true); - + // Now getenv('APPLICATION_ENV') should work: $environment = $creds['CONFIG']['CONFIG_VARS']['APPLICATION_ENV']; - - switch($environment) + + switch($environment) { case ('testing'): define('APPLICATION_ENV', 'testing'); break; - + case ('staging'): define('APPLICATION_ENV', 'staging'); break; - + case ('production'): default: define('APPLICATION_ENV', 'production'); @@ -397,15 +397,15 @@ However, we need to make a small change, as highlighted below: } else { define('APPLICATION_ENV', 'development'); } - + // Define application environment defined('APPLICATION_ENV') || define('APPLICATION_ENV', 'production'); -What that does is to use the ``CRED_FILE`` settings that we configured earlier to help us determine the environment, ``APPLICATION_ENV``, that the application's operating within. +What that does is to use the ``CRED_FILE`` settings that we configured earlier to help us determine the environment, ``APPLICATION_ENV``, that the application's operating within. ##6. Database Schema -Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``zendframework_cloudcontrol_init.sql``, ready to be used to initialise the database next. +Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``zendframework_cloudcontrol_init.sql``, ready to be used to initialise the database next. -- table structure CREATE TABLE `session` ( @@ -415,20 +415,20 @@ Ok, next we need to create a basic database schema for storing both the session `data` text, PRIMARY KEY (`id`) ); - + CREATE TABLE `log_table` ( `priority` varchar(50) default NULL, `message` varchar(100) default NULL, `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `priorityName` varchar(40) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; - + CREATE TABLE `tbl_users` ( `first` varchar(50) default NULL, `last` varchar(100) default NULL, `username` varchar(40) default NULL ) ENGINE=InnoDB; - + -- add some records INSERT INTO tbl_users(first, last, username) VALUES('matthew', 'setter', 'settermjd'); @@ -443,10 +443,10 @@ In the command above, you can see a reference to a **.pem** file. This can be do mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ --ssl-ca=mysql-ssl-ca-cert.pem - + show tables; - -This will show you the tables from the SQL file. + +This will show you the tables from the SQL file. Now that that's done, commit the changes we made earlier and push and deploy both environments again so that the new information will be used. This can be done quickly with the following commands: @@ -454,19 +454,19 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontroldlzf/default push + cctrlapp cloudcontroldlzf/default push cctrlapp cloudcontroldlzf/default deploy - + git checkout testing git merge master - + // deploy the testing branch - cctrlapp cloudcontroldlzf/testing push + cctrlapp cloudcontroldlzf/testing push cctrlapp cloudcontroldlzf/testing deploy ##7. Review the Deployment -With that completed, then have a look at both your deployments to ensure that they're working. +With that completed, then have a look at both your deployments to ensure that they're working. You should see output similar to that below, in figure 2. @@ -486,9 +486,9 @@ To view the information, run the following commands respectively: cctrlapp cloudcontroldlzf/default log error -The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. +The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. ##Links - + * [Zend_Log_Writer_Db - Customising table columns](http://www.webeks.net/php/zend-log-writer-db-customising-table-columns.html) * [Logging in Zend Framework (Zend_Log & Zend_Log_Writer_Db)](http://mnshankar.wordpress.com/tag/zend_log_writer_db/) diff --git a/Guides/Python/Add-on credentials.md b/Guides/Python/Add-on credentials.md index 3d0e0c8..cae9618 100644 --- a/Guides/Python/Add-on credentials.md +++ b/Guides/Python/Add-on credentials.md @@ -55,7 +55,7 @@ available in your deployment containers. # Examples -cloudControl offers a number of data storage solutions via the [Add-on Marketplace]. +dotCloud offers a number of data storage solutions via the [Add-on Marketplace]. Below you can see how to access Add-on credentials on two examples for MySQL and PostgreSQL. diff --git a/Guides/Python/Celery.md b/Guides/Python/Celery.md index 687de82..739130c 100644 --- a/Guides/Python/Celery.md +++ b/Guides/Python/Celery.md @@ -1,7 +1,7 @@ -# Deploying Celery on cloudControl +# Deploying Celery on dotCloud [Celery] is an asynchronous task queue/job queue based on distributed message passing. It is focused on real-time operation, but supports scheduling as well. -In this tutorial we're going to show you how to deploy an example Celery app using the [CloudAMQP Add-on] and the [Worker Add-on] on [cloudControl]. +In this tutorial we're going to show you how to deploy an example Celery app using the [CloudAMQP Add-on] and the [Worker Add-on] on [dotCloud]. ## The Example App Explained First, lets clone the example code from Github. It is based on the official [first steps with Celery guide][celeryguide] and also includes [Flower] the Celery web interface. @@ -22,7 +22,7 @@ flower==0.4.2 ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start the app's processes. +dotCloud uses a [Procfile] to know how to start the app's processes. The example code also already includes a file called `Procfile` at the top level of your repository. It looks like this: @@ -55,7 +55,7 @@ def add(x, y): ~~~ ## Creating the App and Adding the Required Add-ons -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create python @@ -96,7 +96,7 @@ Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (6/6), 605 bytes, done. Total 6 (delta 0), reused 0 (delta 0) - + -----> Receiving push -----> Preparing Python interpreter (2.7.2) -----> Creating Virtualenv version 1.7.2 @@ -107,14 +107,14 @@ Total 6 (delta 0), reused 0 (delta 0) Running virtualenv with interpreter /usr/bin/python2.7 -----> Activating virtualenv -----> Installing dependencies using pip version 1.2.1 - + [...] - + Successfully installed celery flower billiard python-dateutil kombu tornado anyjson amqp Cleaning up... -----> Building image -----> Uploading image (4.3M) - + To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ @@ -122,13 +122,13 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git Last but not least deploy the latest version of the app with the cctrlapp deploy command. ~~~bash -$ cctrlapp APP_NAME/default deploy +$ cctrlapp APP_NAME/default deploy ~~~ At this point you can see web interface at `http://APP_NAME.cloudcontrolled.com`. But it hasn't got any workers yet. ## Scaling Celery Workers -Scaling Celery workers on cloudControl is easy enough luckily. We have already defined how to run one in the `Procfile` earlier. So we can now go ahead and start the first one. +Scaling Celery workers on dotCloud is easy enough luckily. We have already defined how to run one in the `Procfile` earlier. So we can now go ahead and start the first one. ### Adding Workers @@ -139,7 +139,7 @@ $ cctrlapp APP_NAME/default worker # and also check the worker's log output with $ cctrlapp APP_NAME/default log worker [TIMESTAMP] WRK_ID Started worker (command: 'celery -A tasks worker --loglevel=info ', parameter: '') -[TIMESTAMP] WRK_ID +[TIMESTAMP] WRK_ID [TIMESTAMP] WRK_ID -------------- celery@HOSTNAME v3.0.15 (Chiastic Slide) [TIMESTAMP] WRK_ID ---- **** ----- [TIMESTAMP] WRK_ID --- * *** * -- [Configuration] @@ -151,7 +151,7 @@ $ cctrlapp APP_NAME/default log worker [TIMESTAMP] WRK_ID - *** --- * --- [Queues] [TIMESTAMP] WRK_ID -- ******* ---- . celery: exchange:celery(direct) binding:celery [TIMESTAMP] WRK_ID --- ***** ----- -[TIMESTAMP] WRK_ID +[TIMESTAMP] WRK_ID [TIMESTAMP] WRK_ID [Tasks] [TIMESTAMP] WRK_ID . tasks.add [TIMESTAMP] WRK_ID [TIMESTAMP: WARNING/MainProcess] celery@HOSTNAME ready. @@ -206,14 +206,13 @@ Connection to ssh.cloudcontrolled.net closed. ## Résumé -This guide showed how to run both Flower aswell as a Celery worker on cloudControl by specifying the commands in the `Procfile` and how to connect to a AMQP broker provided by the CloudAMQP Add-on with the credentials provided in the app's runtime environment. Additionally we learned how we can use the cctrlapp run command to use the Celery command line tool. +This guide showed how to run both Flower aswell as a Celery worker on dotCloud by specifying the commands in the `Procfile` and how to connect to a AMQP broker provided by the CloudAMQP Add-on with the credentials provided in the app's runtime environment. Additionally we learned how we can use the cctrlapp run command to use the Celery command line tool. [Celery]: http://celeryproject.org/ [CloudAMQP Add-on]: https://www.cloudcontrol.com/add-ons/cloudamqp [Worker Add-on]: https://www.cloudcontrol.com/add-ons/worker -[cloudControl]: http://www.cloudcontrol.com +[dotCloud]: http://www.cloudcontrol.com [celeryguide]: http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html [Flower]: http://docs.celeryproject.org/en/latest/userguide/monitoring.html#flower-real-time-celery-web-monitor [Python buildpack]: https://github.com/cloudControl/buildpack-python [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile - diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index eb7df02..1902a33 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -1,11 +1,11 @@ # Notes for Django Developers -This document contains information for Django programmers deploying their applications on [cloudControl]. +This document contains information for Django programmers deploying their applications on [dotCloud]. ## Managing Dependencies The [python buildpack] uses [pip] to manage dependencies. Specify your dependencies in a file called `requirements.txt` in the project root directory. ## Defining the Process Type -cloudControl uses a [Procfile][procfile] to know how to start your processes. This file specifies a _web_ command that will be executed to start the server once the app is deployed. It optionally also specifies [worker] types that can be used to execute long running tasks. +dotCloud uses a [Procfile][procfile] to know how to start your processes. This file specifies a _web_ command that will be executed to start the server once the app is deployed. It optionally also specifies [worker] types that can be used to execute long running tasks. The `Procfile` for a Django app using gunicorn as web server can look like this: ~~~ @@ -32,5 +32,5 @@ You can't use a local SMTP server, instead choose one of our [email Add-ons][mes [messaging-addons]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Messaging%20&%20Mobile/ [data-storage-addons]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/ [add-on-credentials]: https://www.cloudcontrol.com/dev-center/Guides/Python/Add-on%20credentials -[cloudControl]: https://www.cloudcontrol.com/ +[dotCloud]: https://www.cloudcontrol.com/ [worker]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index bfef983..64ced30 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -1,7 +1,7 @@ # Deploying a Django Application In this tutorial we're going to show you how to deploy a Django application on -[cloudControl]. You can find the [source code on Github][example-app] and check +[dotCloud]. You can find the [source code on Github][example-app] and check out the [Python buildpack][python buildpack] for supported features. The application follows the official [Django tutorial] and allows you to create, use and manage simple polls. @@ -48,7 +48,7 @@ INSTALLED_APPS = ( ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. The example +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes a file called Procfile at the top level of your repository. It looks like this: @@ -64,7 +64,7 @@ by the environment variable `$PORT`. The original tutorial application uses SQLite as the database in all environments, even the production one. It is not possible to use a SQLite -database on cloudControl because the filesystem is +database on dotCloud because the filesystem is [not persistent][filesystem]. To use a database, you should choose an Add-on from [the Data Storage category][data-storage-addons]. @@ -109,7 +109,7 @@ DATABASES = { ## Pushing and Deploying your App Choose a unique name to replace the `APP_NAME` placeholder for your -application and create it on the cloudControl platform: +application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create python @@ -124,7 +124,7 @@ Delta compression using up to 8 threads. Compressing objects: 100% (33/33), done. Writing objects: 100% (49/49), 8.80 KiB | 0 bytes/s, done. Total 49 (delta 11), reused 38 (delta 8) - + -----> Receiving push -----> No runtime.txt provided; assuming python-2.7.3. -----> Preparing Python runtime (python-2.7.3) @@ -161,9 +161,9 @@ For additional information take a look at [Django Notes][django-notes] and other [python-specific documents][python-guides]. [django]: https://www.djangoproject.com/ -[cloudControl]: http://www.cloudcontrol.com -[cloudControl-doc-user]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#user-accounts -[cloudControl-doc-cmdline]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud]: http://www.cloudcontrol.com +[dotCloud-doc-user]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#user-accounts +[dotCloud-doc-cmdline]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git [filesystem]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#non-persistent-filesystem diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index 14b598f..7eeeaf7 100644 --- a/Guides/Python/HelloWorld.md +++ b/Guides/Python/HelloWorld.md @@ -3,7 +3,7 @@ intentions. In this tutorial we're going to show you how to deploy a Flask -application on [cloudControl]. You can find the [source code on Github][example_app] and check out the [Python buildpack] for +application on [dotCloud]. You can find the [source code on Github][example_app] and check out the [Python buildpack] for supported features. ## The Flask App Explained @@ -26,7 +26,7 @@ Flask==0.9 ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes a file called `Procfile` at the top level of your repository. It looks like this: @@ -37,7 +37,7 @@ web: python server.py Left from the colon we specified the **required** process type called `web` followed by the command that starts the app and listens on the port specified by the environment variable `$PORT`. ## Pushing and Deploying the App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create python @@ -80,7 +80,7 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.cloudcontrolled.com`. [Flask]: http://flask.pocoo.org/ -[cloudControl]: http://www.cloudcontrol.com +[dotCloud]: http://www.cloudcontrol.com [Python buildpack]: https://github.com/cloudControl/buildpack-python [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [example_app]: https://github.com/cloudControl/python-flask-example-app.git diff --git a/Guides/Python/Tornado.md b/Guides/Python/Tornado.md index 2a1c521..ef69378 100644 --- a/Guides/Python/Tornado.md +++ b/Guides/Python/Tornado.md @@ -4,7 +4,7 @@ and tools that power FriendFeed written in Python. In this tutorial we're going to show you how to deploy a simple Tornado based -application on [cloudControl]. +application on [dotCloud]. ## The Example App Explained @@ -29,7 +29,7 @@ tornado==2.4.1 ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start the app's processes. +dotCloud uses a [Procfile] to know how to start the app's processes. The example code already includes a file called `Procfile` at the top level of your repository. It looks like this: @@ -87,7 +87,7 @@ if __name__ == "__main__": ## Pushing and Deploying the App Choose a unique name to replace the `APP_NAME` placeholder for your application -and create it on the cloudControl platform: +and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create python ~~~ @@ -126,6 +126,6 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Tornado app running at `http://APP_NAME.cloudcontrolled.com`. [Tornado]: http://www.tornadoweb.org -[cloudControl]: http://www.cloudcontrol.com +[dotCloud]: http://www.cloudcontrol.com [Python buildpack]: https://github.com/cloudControl/buildpack-python [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Ruby/Add-on credentials.md b/Guides/Ruby/Add-on credentials.md index e68746d..ed22c88 100644 --- a/Guides/Ruby/Add-on credentials.md +++ b/Guides/Ruby/Add-on credentials.md @@ -57,7 +57,7 @@ end # Examples -cloudControl offers a number of data storage solutions via the [Add-on Marketplace]. +dotCloud offers a number of data storage solutions via the [Add-on Marketplace]. Below you can see how to access Add-on credentials on two examples for MySQL and PostgreSQL. ## MySQL diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index 507bbb7..8206a76 100644 --- a/Guides/Ruby/HelloWorld.md +++ b/Guides/Ruby/HelloWorld.md @@ -2,7 +2,7 @@ [Sinatra][sinatra] is a DSL for quickly creating web applications in Ruby with minimal effort. In this tutorial we're going to show you how to deploy a Sinatra application on -[cloudControl]. You can find the [source code on Github][example-app] and check out the [Ruby buildpack] for supported features. +[dotCloud]. You can find the [source code on Github][example-app] and check out the [Ruby buildpack] for supported features. ## The Sinatra App Explained @@ -29,7 +29,7 @@ use the same versions of all the gems. ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes a file called `Procfile` at the top level of your repository. It looks like this: ~~~ @@ -39,7 +39,7 @@ web: bundle exec ruby server.rb -e production -p $PORT Left from the colon we specified the **required** process type called `web` followed by the command that starts the app and listens on the port specified by the environment variable `$PORT`. ## Pushing and Deploying the App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create ruby ~~~ @@ -86,9 +86,9 @@ Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME [sinatra]: http://www.sinatrarb.com/ -[cloudControl]: http://www.cloudcontrol.com -[cloudControl-doc-user]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#user-accounts -[cloudControl-doc-cmdline]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud]: http://www.cloudcontrol.com +[dotCloud-doc-user]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#user-accounts +[dotCloud-doc-cmdline]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [ruby buildpack]: https://github.com/cloudControl/buildpack-ruby [procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index 9ea6d9a..786d4aa 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -1,6 +1,6 @@ # Deploying a Ruby on Rails Application -In this tutorial we're going to show you how to deploy a [Ruby on Rails] application on [cloudControl]. You can find the [source code on Github][example-app] and check out the [Ruby buildpack][ruby buildpack] for supported features. The application is a fork of Michael Hartl's [Rails tutorial] sample app which is a Twitter clone. +In this tutorial we're going to show you how to deploy a [Ruby on Rails] application on [dotCloud]. You can find the [source code on Github][example-app] and check out the [Ruby buildpack][ruby buildpack] for supported features. The application is a fork of Michael Hartl's [Rails tutorial] sample app which is a Twitter clone. ## The Rails Application Explained @@ -65,11 +65,11 @@ $ bundle exec rake db:test:prepare $ bundle exec rspec spec/ ~~~ -Now that the app is working, lets have a look at changes we have made to deploy it on cloudControl. +Now that the app is working, lets have a look at changes we have made to deploy it on dotCloud. ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. The example code already includes a file called Procfile in the root of your repository. It looks like this: +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes a file called Procfile in the root of your repository. It looks like this: ~~~ web: bundle exec rails s -p $PORT @@ -98,7 +98,7 @@ end ### Production Database -By default, Rails 3 uses SQLite for all the environments. However, it is not recommended to use SQLite on cloudControl because the filesystem is [not persistent][filesystem]. To use a database, you should choose an Add-on from [Data Storage category][data-storage-addons]. +By default, Rails 3 uses SQLite for all the environments. However, it is not recommended to use SQLite on dotCloud because the filesystem is [not persistent][filesystem]. To use a database, you should choose an Add-on from [Data Storage category][data-storage-addons]. In this tutorial we use PostgresSQL with the [ElephantSQL Add-on][postgres-addon]. This is why we have modified the `Gemfile` by moving the `sqlite3` line to ":development, :test" block and added a new ":production" group with "pg" and ["cloudcontrol-rails"][gem itself] gems. @@ -114,7 +114,7 @@ The 'cloudcontrol-rails' gem will provide the database credentials. ## Pushing and Deploying your App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the cloudControl platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create ruby @@ -185,7 +185,7 @@ For additional information take a look at [Ruby on Rails notes][rails-notes] and other [ruby-specific documents][ruby-guides]. [Ruby on Rails]: http://rubyonrails.org/ -[cloudControl]: http://www.cloudcontrol.com +[dotCloud]: http://www.cloudcontrol.com [example-app]: https://github.com/cloudControl/ruby-rails-example-app [ruby buildpack]: https://github.com/cloudControl/buildpack-ruby [Rails tutorial]: http://ruby.railstutorial.org/ diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index 3629735..6a22d9e 100644 --- a/Guides/Ruby/RubyNotes.md +++ b/Guides/Ruby/RubyNotes.md @@ -3,7 +3,7 @@ ## Procfile -The cloudControl platform uses a file named `Procfile` to determine how to run your +The dotCloud platform uses a file named `Procfile` to determine how to run your application. This `Procfile` uses the YAML format to specify the desired configuration. diff --git a/Guides/Third-Party Buildpacks/Go HelloWorld.md b/Guides/Third-Party Buildpacks/Go HelloWorld.md index e7f7976..3326eb5 100644 --- a/Guides/Third-Party Buildpacks/Go HelloWorld.md +++ b/Guides/Third-Party Buildpacks/Go HelloWorld.md @@ -1,7 +1,7 @@ # Deploying a Go Application The [Go] language standard library comes with a full working web server that we used to build our *Hello world* example application -In this tutorial we're going to show you how to deploy this simple Go app on [cloudControl]. +In this tutorial we're going to show you how to deploy this simple Go app on [dotCloud]. ## The Go App Explained @@ -32,7 +32,7 @@ The `Godeps.json` you cloned as part of the example app looks like this: ### Process Type Definition -cloudControl uses a [Procfile] to know how to start your processes. +dotCloud uses a [Procfile] to know how to start your processes. The example code already includes a file called `Procfile` at the top level of your repository. It looks like this: ~~~ @@ -43,7 +43,7 @@ Left from the colon we specified the **required** process type called `web` foll ### The Actual Application Code -The example app has two request handlers registered in the `main` function. The `http.FileServer` returns the static content while the other serves the default page. To start the web server `http.ListenAndServe` is called with the server port passed. The app listens on the port specified in the `$PORT` environment variable as is required on cloudControl. +The example app has two request handlers registered in the `main` function. The `http.FileServer` returns the static content while the other serves the default page. To start the web server `http.ListenAndServe` is called with the server port passed. The app listens on the port specified in the `$PORT` environment variable as is required on dotCloud. ~~~go @@ -85,7 +85,7 @@ func getEnv(key, defaultValue string) string { ## Pushing and Deploying the App -Choose a unique name (from now on called APP_NAME) for your application and create it on the cloudControl platform: +Choose a unique name (from now on called APP_NAME) for your application and create it on the dotCloud platform: ~~~bash $ cctrlapp APP_NAME create custom --buildpack https://github.com/cloudControl/buildpack-go @@ -123,6 +123,6 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Go app running at `http[s]://APP_NAME.cloudcontrolled.com`. [Go]: http://golang.org/ -[cloudControl]: http://www.cloudcontrol.com +[dotCloud]: http://www.cloudcontrol.com [godep]: https://github.com/tools/godep [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Third-Party Buildpacks/Go Martini.md b/Guides/Third-Party Buildpacks/Go Martini.md index 08cb4a5..e211508 100644 --- a/Guides/Third-Party Buildpacks/Go Martini.md +++ b/Guides/Third-Party Buildpacks/Go Martini.md @@ -3,7 +3,7 @@ [Martini] is an open source web framework for Go. In this tutorial we're going to show you how to deploy a simple Martini based -application on [cloudControl]. +application on [dotCloud]. ## The Example App Explained @@ -54,7 +54,7 @@ as part of the example app looks like this: ~~~ ### Process Type Definition -cloudControl uses a [Procfile] to know how to start the app's processes. +dotCloud uses a [Procfile] to know how to start the app's processes. The example code already includes a file called `Procfile` at the top level of your repository. It looks like this: @@ -63,11 +63,11 @@ your repository. It looks like this: web: MARTINI_ENV=production go-martini-example-app ~~~ -Left from the colon we specify the **required** process type called `web` and then set the `$MARTINI_ENV` environment variable to `production` and run the application binary. All web processes on the cloudControl platform are required to listen on the port specified by the `$PORT` environment variable. Martini does this by default. +Left from the colon we specify the **required** process type called `web` and then set the `$MARTINI_ENV` environment variable to `production` and run the application binary. All web processes on the dotCloud platform are required to listen on the port specified by the `$PORT` environment variable. Martini does this by default. ### The Actual Application Code -The actual application code is really straight forward. It simply uses the Martini framework to render the HTML output and return it to the client. The `m.Run()` automatically binds to the port specified in the `$PORT` environment variable as is required on [cloudControl]. +The actual application code is really straight forward. It simply uses the Martini framework to render the HTML output and return it to the client. The `m.Run()` automatically binds to the port specified in the `$PORT` environment variable as is required on [dotCloud]. ~~~go package main @@ -94,7 +94,7 @@ func main() { ## Pushing and Deploying the App Choose a unique name to replace the `APP_NAME` placeholder for your application -and create it on the cloudControl platform using the custom Go buildpack: +and create it on the dotCloud platform using the custom Go buildpack: ~~~bash $ cctrlapp APP_NAME create custom --buildpack https://github.com/cloudControl/buildpack-go @@ -136,6 +136,6 @@ $ cctrlapp APP_NAME/default open ~~~ [Martini]: http://martini.codegangsta.io/ -[cloudControl]: https://www.cloudcontrol.com +[dotCloud]: https://www.cloudcontrol.com [Go buildpack]: https://github.com/cloudControl/buildpack-go [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Third-Party Buildpacks/Go Revel.md b/Guides/Third-Party Buildpacks/Go Revel.md index 56ab579..1f85ca6 100644 --- a/Guides/Third-Party Buildpacks/Go Revel.md +++ b/Guides/Third-Party Buildpacks/Go Revel.md @@ -3,7 +3,7 @@ [Revel] is an open source web framework for Go. In this tutorial we're going to show you how to deploy a simple Revel based -application on [cloudControl]. +application on [dotCloud]. ## The Example App Explained @@ -23,7 +23,7 @@ through the different files and their purpose real quick. The [Revel buildpack] handles the Revel dependencies automatically. ### Process Type Definition -cloudControl uses a [Procfile] to know how to start the app's processes. The example app provides a Procfile. It runs the revel app in production mode and listens on the port specified by the `$PORT` environment variable. +dotCloud uses a [Procfile] to know how to start the app's processes. The example app provides a Procfile. It runs the revel app in production mode and listens on the port specified by the `$PORT` environment variable. ~~~ web: revel run github.com/cloudControl/go-revel-example-app prod $PORT @@ -73,7 +73,7 @@ GET /public/*filepath Static.Serve("public") ## Pushing and Deploying the App Choose a unique name to replace the `APP_NAME` placeholder for your application -and create it on the cloudControl platform using the custom Go buildpack: +and create it on the dotCloud platform using the custom Go buildpack: ~~~bash $ cctrlapp APP_NAME create custom --buildpack https://github.com/revel/heroku-buildpack-go-revel @@ -120,6 +120,6 @@ $ cctrlapp APP_NAME/default open ~~~ [Revel]: http://revel.github.io -[cloudControl]: https://www.cloudcontrol.com +[dotCloud]: https://www.cloudcontrol.com [Revel buildpack]: https://github.com/revel/heroku-buildpack-go-revel [Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md index affd8bd..3b03e94 100644 --- a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md +++ b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md @@ -1,6 +1,6 @@ # Third-Party Custom Buildpacks -[cloudControl] officially supports the following application types via the [Pinky Stack][PinkyStack]. +[dotCloud] officially supports the following application types via the [Pinky Stack][PinkyStack]. - Java-based (Java with Maven, Gradle, Grails, Scala, Play! or Clojure) - Ruby @@ -11,7 +11,7 @@ However, you can deploy apps developed on languages and technologies beyond the ## Verified Buildpacks -Here is a list of verified and recommended buildpacks for the cloudControl platform covering the following languages and technologies: +Here is a list of verified and recommended buildpacks for the dotCloud platform covering the following languages and technologies: |Technology|Buildpack URL| |:---------|:----------:| @@ -37,7 +37,7 @@ You can use any of the aforementioned buildpacks, fork them and make changes acc Before using any third party buildpack you should inspect their source code and proceed with caution. -[cloudControl]: https://www.cloudcontrol.com +[dotCloud]: https://www.cloudcontrol.com [PinkyStack]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#stacks [buildpack-java]: https://github.com/cloudControl/buildpack-java [buildpack-python]: https://github.com/cloudControl/buildpack-python diff --git a/Platform Documentation.md b/Platform Documentation.md index 3fe1df4..f6d698b 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -21,7 +21,7 @@
    -# cloudControl Documentation +# dotCloud Documentation ## Platform Access @@ -33,7 +33,7 @@ To control the platform we offer different interfaces. The primary way of controlling your apps and deployments is via [the command-line interface](http://en.wikipedia.org/wiki/Command-line_interface) (CLI) called *cctrl*. Additionally we also offer a [web console]. Both the CLI as well as the web console however are merely frontends to our RESTful API. For deep integration into your apps you can optionally use one of our available [API libraries]. -Throughout this documentation we will use the CLI as the primary way of controlling the cloudControl platform. The CLI consists of 2 parts: *cctrlapp* and *cctrluser*. To get help for the command line client, just append --help or -h to any of the commands. +Throughout this documentation we will use the CLI as the primary way of controlling the dotCloud platform. The CLI consists of 2 parts: *cctrlapp* and *cctrluser*. To get help for the command line client, just append --help or -h to any of the commands. Installing *cctrl* is easy and works on Mac/Linux as well as on Windows. @@ -94,7 +94,7 @@ You can [reset your password], in case you forgot it. * A deployment is a running version of your application, based on the branch with the same name. Exception: the default deployment is based on the master branch. * Users can be added to apps to gain access to the repository, branches and deployments. -cloudControl PaaS uses a distinct set of naming conventions. To understand how to work with the platform effectively, it's important to understand the following few basic concepts. +dotCloud PaaS uses a distinct set of naming conventions. To understand how to work with the platform effectively, it's important to understand the following few basic concepts. ### Apps @@ -259,7 +259,7 @@ spec #### Buildpacks and the Procfile -During the push a hook is fired that runs the buildpack. A buildpack is a set of scripts that determine how an app in a specific language or framework has to be prepared for deployment on the cloudControl platform. With custom buildpacks, support for new programming languages can be added or custom runtime environments can be build. To support many PaaS with one buildpack, we recommend following the [Heroku buildpack API] which is compatible with cloudControl and other platforms. +During the push a hook is fired that runs the buildpack. A buildpack is a set of scripts that determine how an app in a specific language or framework has to be prepared for deployment on the dotCloud platform. With custom buildpacks, support for new programming languages can be added or custom runtime environments can be build. To support many PaaS with one buildpack, we recommend following the [Heroku buildpack API] which is compatible with dotCloud and other platforms. Part of the buildpack scripts is also to pull in dependencies according to the languages or frameworks native way. E.g. pip and a requirements.txt for Python, Maven for Java, npm for Node.js, Composer for PHP and so on. This allows you to fully control the libraries and versions available to your app in the final runtime environment. @@ -278,7 +278,7 @@ At the end of the buildpack process, the image is ready to be deployed. ## Deploying New Versions -The cloudControl platform supports zero downtime deploys for all deployments. To deploy a new version use either the *web console* or the `deploy` command. +The dotCloud platform supports zero downtime deploys for all deployments. To deploy a new version use either the *web console* or the `deploy` command. ~~~ $ cctrlapp APP_NAME/DEP_NAME deploy @@ -336,7 +336,7 @@ $ cctrlapp APP_NAME/DEP_NAME deploy THE_LAST_WORKING_VERSION_HASH * The filesystem is not persistent. * Don't store uploads on the filesystem. -Deployments on the cloudControl platform have access to a writable filesystem. This filesystem however is not persistent. Data written may or may not be accessible again in future requests, depending on how the [routing tier](#routing-tier) routes requests across available containers, and is deleted after each deploy. This does include deploys you trigger manually, but also re-deploys done by the platform itself during normal operation. +Deployments on the dotCloud platform have access to a writable filesystem. This filesystem however is not persistent. Data written may or may not be accessible again in future requests, depending on how the [routing tier](#routing-tier) routes requests across available containers, and is deleted after each deploy. This does include deploys you trigger manually, but also re-deploys done by the platform itself during normal operation. For customer uploads (e.g. user profile pictures) we recommend object stores like Amazon S3 or the GridFS feature available as part of the [MongoSoup Add-on]. @@ -351,7 +351,7 @@ For customer uploads (e.g. user profile pictures) we recommend object stores lik ### Development, Staging and Production: The Application Lifecycle -Most apps share a common application lifecycle consisting of development, staging and production phases. The cloudControl platform is designed from the ground up to support this. As we explained earlier, each app can have multiple deployments. Those deployments match the branches in the version control system. The reason for this is very simple. To work on a new feature it is advisable to create a new branch. This new version can then be deployed as its own deployment making sure the new feature development is not interfering with the existing deployments. More importantly even, these development/feature or staging deployments also help ensure that the new code will work in production because each deployment using the same [stack](#stacks) has the same runtime environment. +Most apps share a common application lifecycle consisting of development, staging and production phases. The dotCloud platform is designed from the ground up to support this. As we explained earlier, each app can have multiple deployments. Those deployments match the branches in the version control system. The reason for this is very simple. To work on a new feature it is advisable to create a new branch. This new version can then be deployed as its own deployment making sure the new feature development is not interfering with the existing deployments. More importantly even, these development/feature or staging deployments also help ensure that the new code will work in production because each deployment using the same [stack](#stacks) has the same runtime environment. ### Environment Variables @@ -679,7 +679,7 @@ or `greater 503`, you may see requests to `/CloudHealthCheck` coming from a `clo * You can scale up or down at any time by adding more containers (horizontal scaling) or changing the container size (vertical scaling). * Use performance monitoring and load testing to determine the optimal scaling settings for your app. -When scaling your apps you have two options. You can either scale horizontally by adding more containers, or scale vertically by changing the container size. When you scale horizontally, the cloudControl loadbalancing and [routing tier](#routing-tier) ensures efficient distribution of incoming requests accross all available containers. +When scaling your apps you have two options. You can either scale horizontally by adding more containers, or scale vertically by changing the container size. When you scale horizontally, the dotCloud loadbalancing and [routing tier](#routing-tier) ensures efficient distribution of incoming requests accross all available containers. ### Horizontal Scaling @@ -769,7 +769,7 @@ scenarios and available queuing Add-ons are available as part of the [Worker Add ## Secure Shell (SSH) -The distributed nature of the cloudControl platform means it's not possible to SSH into the actual server. Instead, we offer the run command, that allows you to launch a new container and connect to that via SSH. +The distributed nature of the dotCloud platform means it's not possible to SSH into the actual server. Instead, we offer the run command, that allows you to launch a new container and connect to that via SSH. The container is identical to the web or worker containers but starts an SSH daemon instead of one of the Procfile commands. It's based on the same stack image and deployment image and does also provides the Add-on credentials. diff --git a/Quickstart.md b/Quickstart.md index b4aa72a..0520e75 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -1,6 +1,6 @@ -# cloudControl Quickstart +# dotCloud Quickstart -It's easy to start with cloudControl. Follow this 5 minute quickstart to get your first app running on cloudControl PaaS. +It's easy to start with dotCloud. Follow this 5 minute quickstart to get your first app running on dotCloud PaaS. **Note:** All examples starting with $ are supposed to be run in a terminal. For Windows we recommend using Git bash, which comes bundled with the Windows Git installer. Throughout this quickstart and the rest of the documentation placeholders are marked by being written all uppercase. @@ -58,9 +58,9 @@ Password: PASSWORD The command line client will determine if you already have a public key and upload that or offer to create one. -## Create the First Application on cloudControl +## Create the First Application on dotCloud -Create a new application on the cloudControl platform by giving it an unique `APP_NAME` (the name is used as the `.cloudcontrolled.com` subdomain) and choosing the `TYPE`. +Create a new application on the dotCloud platform by giving it an unique `APP_NAME` (the name is used as the `.cloudcontrolled.com` subdomain) and choosing the `TYPE`. ~~~bash $ cctrlapp APP_NAME create [java, php, python, ruby, nodejs] @@ -74,7 +74,7 @@ Change to the working directory where you want to store your source code. $ cd PATH_TO/YOUR_WORKDIR ~~~ -Clone one of the example apps in your preferred programming language and push it to the cloudControl platform. +Clone one of the example apps in your preferred programming language and push it to the dotCloud platform. ~~~bash # for Java @@ -103,7 +103,7 @@ $ cctrlapp APP_NAME push The push fires a hook that prepares your application for deployment like pulling in requirements and more. You can see the output of the build process in your terminal. -## Deploy Your Application on cloudControl +## Deploy Your Application on dotCloud Deploy your app with diff --git a/README b/README index f0d2167..917a251 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -cloudControl Documentation +dotCloud Documentation -Markdown source of the cloudControl documentation online at https://www.cloudcontrol.com/dev-center +Markdown source of the dotCloud documentation online at https://www.cloudcontrol.com/dev-center For corrections or suggestions please send a pull request. From 51afab707f7f829cd5b1963fd2518a7aca5d32c4 Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 3 Dec 2014 15:01:48 +0100 Subject: [PATCH 23/84] Remove top menu from platform documentation --- Platform Documentation.md | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index f6d698b..0dd8f84 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -1,26 +1,3 @@ - - # dotCloud Documentation ## Platform Access From d27e78d6b3bff5c885728f4827500a48d608ee98 Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 3 Dec 2014 15:10:53 +0100 Subject: [PATCH 24/84] Rename migration guides dir and include celery django guide --- .../An Introduction.md | 0 .../CLI Cheatsheet.md | 0 .../Converting dotcloud.yml.md | 0 .../Django Celery.md} | 0 .../Migrating environment.md | 0 .../dotCloud-NextdotCloud migration/Python.md | 26 ------------------- 6 files changed, 26 deletions(-) rename Guides/{dotCloud-NextdotCloud migration => Migration Guides}/An Introduction.md (100%) rename Guides/{dotCloud-NextdotCloud migration => Migration Guides}/CLI Cheatsheet.md (100%) rename Guides/{dotCloud-NextdotCloud migration => Migration Guides}/Converting dotcloud.yml.md (100%) rename Guides/{dotCloud-cloudControl migration/Python/Django Celery migration guide.md => Migration Guides/Django Celery.md} (100%) rename Guides/{dotCloud-NextdotCloud migration => Migration Guides}/Migrating environment.md (100%) delete mode 100644 Guides/dotCloud-NextdotCloud migration/Python.md diff --git a/Guides/dotCloud-NextdotCloud migration/An Introduction.md b/Guides/Migration Guides/An Introduction.md similarity index 100% rename from Guides/dotCloud-NextdotCloud migration/An Introduction.md rename to Guides/Migration Guides/An Introduction.md diff --git a/Guides/dotCloud-NextdotCloud migration/CLI Cheatsheet.md b/Guides/Migration Guides/CLI Cheatsheet.md similarity index 100% rename from Guides/dotCloud-NextdotCloud migration/CLI Cheatsheet.md rename to Guides/Migration Guides/CLI Cheatsheet.md diff --git a/Guides/dotCloud-NextdotCloud migration/Converting dotcloud.yml.md b/Guides/Migration Guides/Converting dotcloud.yml.md similarity index 100% rename from Guides/dotCloud-NextdotCloud migration/Converting dotcloud.yml.md rename to Guides/Migration Guides/Converting dotcloud.yml.md diff --git a/Guides/dotCloud-cloudControl migration/Python/Django Celery migration guide.md b/Guides/Migration Guides/Django Celery.md similarity index 100% rename from Guides/dotCloud-cloudControl migration/Python/Django Celery migration guide.md rename to Guides/Migration Guides/Django Celery.md diff --git a/Guides/dotCloud-NextdotCloud migration/Migrating environment.md b/Guides/Migration Guides/Migrating environment.md similarity index 100% rename from Guides/dotCloud-NextdotCloud migration/Migrating environment.md rename to Guides/Migration Guides/Migrating environment.md diff --git a/Guides/dotCloud-NextdotCloud migration/Python.md b/Guides/dotCloud-NextdotCloud migration/Python.md deleted file mode 100644 index a5db245..0000000 --- a/Guides/dotCloud-NextdotCloud migration/Python.md +++ /dev/null @@ -1,26 +0,0 @@ -# Migrating Python Applications from dotCloud to Next dotCloud - -Before you read this document, you should read the document on *Converting dotcloud.yml* first. It provides a framework for porting your application as a whole over to Next dotCloud. Please return here to learn how to port your Python services. - -## dotCloud Features - -The first task is to determine what dotCloud features your Python service is using. - -### Nginx - -Please check your Python service's `approot` to see if you have an `nginx.conf` file. The most common use for this is to define redirections and error handlers for the Nginx web server. If you have this, then your first migration will probably require Nginx in your Next dotCloud application as well. Later you may find other ways to work around your use of Nginx, but for now we can install Nginx in your Next dotCloud application. - -### Supervisord - -Does your `approot` contain `supervisord.conf`? Or does your `dotcloud.yml` include a `process` or `processes` section in your Python service definition? If so, then you will also require `supervisord` on Next dotCloud. - -### uWSGI - -Does your `approot` contain uWSGI configuration information (`*uwsgi.conf`) or does your `dotcloud.yml` define environment variables for `UWSGI_*`? If so, then you'll need to run `uwsgi` on your Next dotCloud application. - -## Choose Your Path - -If you're not using Nginx, Supervisord, or uWSGI, then you can definitely use the standard Next dotCloud Python service! -For all the other cases, you can use a custom buildpack instead of the default Python service: https://github.com/metalivedev/buildpack-python-cloudcontrol.git#dotcloud - -The basic information about how to use that buildpack is in the buildpack's Readme.md. From 6715583b096c20068e4fb042cf53559637dfa6c1 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Tue, 2 Dec 2014 18:10:33 +0100 Subject: [PATCH 25/84] www.cloudcontrol.com -> next.dotcloud.com --- .../Data Processing/CloudAMQP.md | 2 +- .../Data Processing/Worker.md | 2 +- .../Data Storage/ElephantSQL.md | 4 +-- .../Data Storage/MemCachier.md | 4 +-- .../Data Storage/MongoSoup.md | 6 ++-- Add-on Documentation/Data Storage/MySQLd.md | 8 ++--- Add-on Documentation/Data Storage/MySQLs.md | 4 +-- Add-on Documentation/Deployment/Cron.md | 10 +++--- Add-on Documentation/Deployment/SSL.md | 4 +-- .../Messaging & Mobile/SendGrid.md | 2 +- Guides/Java/AWS S3.md | 2 +- Guides/Java/Add-on credentials.md | 14 ++++---- Guides/Java/Clojure - HelloWorld.md | 6 ++-- Guides/Java/Gradle - HelloWorld.md | 6 ++-- Guides/Java/Grails.md | 6 ++-- Guides/Java/Java - HelloWorld.md | 6 ++-- Guides/Java/Java - Play 2.md | 8 ++--- Guides/Java/Java - Tomcat.md | 6 ++-- Guides/Java/Play - HelloWorld.md | 8 ++--- Guides/Java/Scala - HelloWorld.md | 6 ++-- Guides/Migration Guides/An Introduction.md | 4 +-- .../Converting dotcloud.yml.md | 22 ++++++------- Guides/Migration Guides/Django Celery.md | 16 +++++----- Guides/NodeJS/AWS S3.md | 2 +- Guides/NodeJS/Add-on credentials.md | 12 +++---- Guides/NodeJS/Express.md | 12 +++---- Guides/NodeJS/HelloWorld.md | 8 ++--- Guides/NodeJS/Sailsjs.md | 10 +++--- Guides/PHP/Add-on credentials.md | 12 +++---- Guides/PHP/CakePHP 2.2.1.md | 2 +- Guides/PHP/Drupal 7.md | 2 +- Guides/PHP/HelloWorld.md | 8 ++--- Guides/PHP/Joomla 2.5.md | 2 +- Guides/PHP/Kohana 3.2.0.md | 2 +- Guides/PHP/Symfony 1.4.md | 2 +- Guides/PHP/Yii 1.1.10.md | 2 +- Guides/PHP/Zend 2.md | 4 +-- Guides/PHP/Zend Framework 1.11.md | 2 +- Guides/Python/AWS S3.md | 2 +- Guides/Python/Add-on credentials.md | 14 ++++---- Guides/Python/Celery.md | 8 ++--- Guides/Python/Django notes.md | 14 ++++---- Guides/Python/Django.md | 24 +++++++------- Guides/Python/HelloWorld.md | 4 +-- Guides/Python/Tornado.md | 4 +-- Guides/Ruby/AWS S3.md | 2 +- Guides/Ruby/Add-on credentials.md | 12 +++---- Guides/Ruby/HelloWorld.md | 8 ++--- Guides/Ruby/Ruby on Rails.md | 16 +++++----- Guides/Ruby/RubyNotes.md | 4 +-- .../Third-Party Buildpacks/Go HelloWorld.md | 4 +-- Guides/Third-Party Buildpacks/Go Martini.md | 4 +-- Guides/Third-Party Buildpacks/Go Revel.md | 4 +-- .../Third-Party Buildpacks.md | 4 +-- Platform Documentation.md | 32 +++++++++---------- Quickstart.md | 2 +- README | 2 +- 57 files changed, 201 insertions(+), 201 deletions(-) diff --git a/Add-on Documentation/Data Processing/CloudAMQP.md b/Add-on Documentation/Data Processing/CloudAMQP.md index 7cede1d..def43e4 100644 --- a/Add-on Documentation/Data Processing/CloudAMQP.md +++ b/Add-on Documentation/Data Processing/CloudAMQP.md @@ -37,7 +37,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.remove cloudamqp.OPTION ## Add-on credentials -It's recommended to read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. +It's recommended to read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. ## PHP AMQP Example Application diff --git a/Add-on Documentation/Data Processing/Worker.md b/Add-on Documentation/Data Processing/Worker.md index 7e1a883..da8fa41 100644 --- a/Add-on Documentation/Data Processing/Worker.md +++ b/Add-on Documentation/Data Processing/Worker.md @@ -89,7 +89,7 @@ For more details refer to the [PHP example](#php-worker-example) below. ## Worker log -As already explained in the [Logging section](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#logging) all stdout and stderr output of workers is redirected to the worker log. To see the output in a tail -f like fashion use the log command. +As already explained in the [Logging section](https://next.dotcloud.com/dev-center/Platform%20Documentation#logging) all stdout and stderr output of workers is redirected to the worker log. To see the output in a tail -f like fashion use the log command. ~~~ $ cctrlapp APP_NAME/DEP_NAME log worker diff --git a/Add-on Documentation/Data Storage/ElephantSQL.md b/Add-on Documentation/Data Storage/ElephantSQL.md index 8aeb94d..bbf7377 100644 --- a/Add-on Documentation/Data Storage/ElephantSQL.md +++ b/Add-on Documentation/Data Storage/ElephantSQL.md @@ -13,7 +13,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.add elephantsql.OPTION ~~~ Replace `elephantsql.OPTION` with a valid option, e.g. `elephantsql.turtle`. -When added, ElephantSQL automatically creates a new user account with your email adress. You can manage the Add-on within the [web console](https://www.cloudcontrol.com/console) (go to the specific deployment and click the link "elephantsql.OPTION"). +When added, ElephantSQL automatically creates a new user account with your email adress. You can manage the Add-on within the [web console](https://next.dotcloud.com/console) (go to the specific deployment and click the link "elephantsql.OPTION"). ## Upgrading the ElephantSQL Add-on @@ -46,6 +46,6 @@ $ cctrlapp APP_NAME/DEP_NAME addon.remove elephantsql.OPTION ### Internal Access -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. +It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. You can also find a ready-to-deploy example application on [Github](https://github.com/ElephantSQL/ruby-postgresql-example.git). diff --git a/Add-on Documentation/Data Storage/MemCachier.md b/Add-on Documentation/Data Storage/MemCachier.md index 8a9eb2e..bd76980 100644 --- a/Add-on Documentation/Data Storage/MemCachier.md +++ b/Add-on Documentation/Data Storage/MemCachier.md @@ -378,7 +378,7 @@ $ memcached -v Usage analytics ------ -Our analytics dashboard is a simple tool that gives you more insight into how you’re using memcache. Just open your application's dashboard on our [web interface](https://www.cloudcontrol.com/console). +Our analytics dashboard is a simple tool that gives you more insight into how you’re using memcache. Just open your application's dashboard on our [web interface](https://next.dotcloud.com/console). Sample apps ----- @@ -398,7 +398,7 @@ Changing your plan, either by upgrading or downgrading, requires no code changes Support ------- -All Memcachier support and runtime issues should be submitted via one of the dotCloud Support channels](https://www.cloudcontrol.com/dev-center/support). Any non-support related issues or product feedback is welcome via email at: [support@memcachier.com](mailto:support@memcachier.com) +All Memcachier support and runtime issues should be submitted via one of the dotCloud Support channels](https://next.dotcloud.com/dev-center/support). Any non-support related issues or product feedback is welcome via email at: [support@memcachier.com](mailto:support@memcachier.com) Any issues related to Memcachier service are reported at [Memcachier Status](http://status.memcachier.com/). diff --git a/Add-on Documentation/Data Storage/MongoSoup.md b/Add-on Documentation/Data Storage/MongoSoup.md index 930e441..b865f0a 100644 --- a/Add-on Documentation/Data Storage/MongoSoup.md +++ b/Add-on Documentation/Data Storage/MongoSoup.md @@ -15,7 +15,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.add mongosoup.OPTION For your OPTION, select one of MongoSoup's plan offerings: small, medium, large, xlarge, dedicated-small, dedicated-medium, dedicated-large, dedicated-xlarge For more information, click -[here](https://www.cloudcontrol.com/add-ons/mongosoup). +[here](https://next.dotcloud.com/add-ons/mongosoup). ## For example: ~~~bash @@ -24,7 +24,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.add mongosoup.large When added, MongoSoup automatically creates a new user account and database in an Amazon EC2 cloud. You can manage your database and data easily from the -[web console](https://www.cloudcontrol.com/console) by clicking the MongoSoup add-on +[web console](https://next.dotcloud.com/console) by clicking the MongoSoup add-on entry on your app's deployment page, and you gain immediate access to MongoSoup customer support. Email [support@mongosoup.de](mailto:support@mongosoup.de) with any questions. @@ -71,7 +71,7 @@ Here are some snippets of code to help you get started: ### Java For reading CloudControl credentials you can use the Credentials class as -described in [Reading the Credentials](https://www.cloudcontrol.com/dev-center/Guides/Java/Add-on%20credentials) +described in [Reading the Credentials](https://next.dotcloud.com/dev-center/Guides/Java/Add-on%20credentials) article. ```java diff --git a/Add-on Documentation/Data Storage/MySQLd.md b/Add-on Documentation/Data Storage/MySQLd.md index c8f2d9e..3437933 100644 --- a/Add-on Documentation/Data Storage/MySQLd.md +++ b/Add-on Documentation/Data Storage/MySQLd.md @@ -139,8 +139,8 @@ $ mysql -u MYSQLD_USER -p --host=MYSQLD_SERVER --ssl-ca=PATH_TO_CERTIFICATE/ca-c [Google Cloud SQL]: https://developers.google.com/cloud-sql/ -[Config Add-on]: https://www.cloudcontrol.com/add-ons/config -[MySQLd]: https://www.cloudcontrol.com/add-ons/mysqld -[Add-on Credentials]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons +[Config Add-on]: https://next.dotcloud.com/add-ons/config +[MySQLd]: https://next.dotcloud.com/add-ons/mysqld +[Add-on Credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons [Email us]: mailto:support@cloudcontrol.de -[Webconsole]: https://www.cloudcontrol.com/console/login +[Webconsole]: https://next.dotcloud.com/console/login diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 817b3d1..baaa3cf 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -2,7 +2,7 @@ Every deployment can access a highly available shared MySQL Add-on based on [Amazon RDS](http://aws.amazon.com/rds/). The shared MySQL Add-on is recommended for development and low-traffic apps only. For medium to high-traffic apps we -recommend one of the dedicated [MySQLd Add-on](https://www.cloudcontrol.com/add-ons/mysqld) plans. +recommend one of the dedicated [MySQLd Add-on](https://next.dotcloud.com/add-ons/mysqld) plans. ## Adding the MySQLs Add-on @@ -84,7 +84,7 @@ SHOW CHARSET; It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the -section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in +section about [Add-on Credentials](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. ### External Access diff --git a/Add-on Documentation/Deployment/Cron.md b/Add-on Documentation/Deployment/Cron.md index 068c5e9..69ae0d3 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -19,10 +19,10 @@ timelimit. If you need more control over when and how often tasks are run and/or have tasks that take longer than 120 seconds we recommend using the -[Worker](https://www.cloudcontrol.com/add-ons/worker) or -[IronWorker](https://www.cloudcontrol.com/add-ons/iron_worker) Add-on. There -are also the [IronMQ](https://www.cloudcontrol.com/add-ons/iron_mq) and the -[CloudAMQP](https://www.cloudcontrol.com/add-ons/cloudamqp) message queues +[Worker](https://next.dotcloud.com/add-ons/worker) or +[IronWorker](https://next.dotcloud.com/add-ons/iron_worker) Add-on. There +are also the [IronMQ](https://next.dotcloud.com/add-ons/iron_mq) and the +[CloudAMQP](https://next.dotcloud.com/add-ons/cloudamqp) message queues available that can be used to dispatch tasks to the workers. ## Adding the Cron Add-on @@ -34,7 +34,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.add cron.OPTION ~~~ As always the different options are listed on the [Cron -Add-on](https://www.cloudcontrol.com/add-ons/cron) page. +Add-on](https://next.dotcloud.com/add-ons/cron) page. ## Adding a URL for the Cron job diff --git a/Add-on Documentation/Deployment/SSL.md b/Add-on Documentation/Deployment/SSL.md index 826406f..e719572 100644 --- a/Add-on Documentation/Deployment/SSL.md +++ b/Add-on Documentation/Deployment/SSL.md @@ -1,7 +1,7 @@ # SSL Add-on This add-on provides SSL support for custom domains (e.g. "www.example.com") -that you have added to your application using the [alias addon](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Alias). +that you have added to your application using the [alias addon](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Alias). ## Overview @@ -15,7 +15,7 @@ sections, to add SSL support for custom domains to your deployment: * Set your DNS entry to point to your SSL DNS Domain. Root or naked domains like `example.com` without a subdomain are not -directly supported. For details, please see the [alias addon](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Alias) documentation. +directly supported. For details, please see the [alias addon](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Alias) documentation. ### Acquiring an SSL Certificate diff --git a/Add-on Documentation/Messaging & Mobile/SendGrid.md b/Add-on Documentation/Messaging & Mobile/SendGrid.md index e767269..ace0bbc 100644 --- a/Add-on Documentation/Messaging & Mobile/SendGrid.md +++ b/Add-on Documentation/Messaging & Mobile/SendGrid.md @@ -40,7 +40,7 @@ Once you added a SendGrid plan, you need to login once at http://sendgrid.com wi ## Internal access credentials -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. +It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. The JSON file has the following structure: diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index fce79f0..75293d0 100644 --- a/Guides/Java/AWS S3.md +++ b/Guides/Java/AWS S3.md @@ -26,7 +26,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config): ~~~bash $ cctrlapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] diff --git a/Guides/Java/Add-on credentials.md b/Guides/Java/Add-on credentials.md index 61c6431..66ce392 100644 --- a/Guides/Java/Add-on credentials.md +++ b/Guides/Java/Add-on credentials.md @@ -95,12 +95,12 @@ String password = credentials[1]; ~~~ [Java application with MySQL]: https://github.com/cloudControl/java-mysql-example-app -[Add-on Marketplace]: https://www.cloudcontrol.com/add-ons/?c=1 -[environment variables]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#environment-variables -[Add-on credentials]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-on-credentials -[cred-env-vars]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#enabling-disabling-credentials-environment-variables +[Add-on Marketplace]: https://next.dotcloud.com/add-ons/?c=1 +[environment variables]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables +[Add-on credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials +[cred-env-vars]: https://next.dotcloud.com/dev-center/Platform%20Documentation#enabling-disabling-credentials-environment-variables [json-simple]: http://code.google.com/p/json-simple/ [dotCloud credentials helper class]: https://gist.github.com/b350762c61fcc069b427 -[MySQL Dedicated Add-on]: https://www.cloudcontrol.com/add-ons/mysqld -[MySQL Shared Add-on]: https://www.cloudcontrol.com/add-ons/mysqls -[ElephantSQL Add-on]: https://www.cloudcontrol.com/add-ons/elephantsql +[MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld +[MySQL Shared Add-on]: https://next.dotcloud.com/add-ons/mysqls +[ElephantSQL Add-on]: https://next.dotcloud.com/add-ons/elephantsql diff --git a/Guides/Java/Clojure - HelloWorld.md b/Guides/Java/Clojure - HelloWorld.md index 405478e..dfa4035 100644 --- a/Guides/Java/Clojure - HelloWorld.md +++ b/Guides/Java/Clojure - HelloWorld.md @@ -76,9 +76,9 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Clojure application running at `http[s]://APP_NAME.cloudcontrolled.com`. -[dotCloud]: https://www.cloudcontrol.com/ +[dotCloud]: https://next.dotcloud.com/ [Clojure buildpack]: https://github.com/cloudControl/buildpack-clojure -[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [Leiningen]: http://leiningen.org/ diff --git a/Guides/Java/Gradle - HelloWorld.md b/Guides/Java/Gradle - HelloWorld.md index 5ee7847..295684c 100644 --- a/Guides/Java/Gradle - HelloWorld.md +++ b/Guides/Java/Gradle - HelloWorld.md @@ -91,8 +91,8 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Gradle application running at `http[s]://APP_NAME.cloudcontrolled.com`. -[dotCloud]: https://www.cloudcontrol.com/ +[dotCloud]: https://next.dotcloud.com/ [Gradle buildpack]: https://github.com/cloudControl/buildpack-gradle -[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Grails.md b/Guides/Java/Grails.md index c722012..6975906 100644 --- a/Guides/Java/Grails.md +++ b/Guides/Java/Grails.md @@ -100,9 +100,9 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Grails application running at `http[s]://APP_NAME.cloudcontrolled.com`. -[dotCloud]: https://www.cloudcontrol.com/ +[dotCloud]: https://next.dotcloud.com/ [Grails buildpack]: https://github.com/cloudControl/buildpack-grails -[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [Ivy]: http://ant.apache.org/ivy/ diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index 61298c9..cd5308c 100644 --- a/Guides/Java/Java - HelloWorld.md +++ b/Guides/Java/Java - HelloWorld.md @@ -107,9 +107,9 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.cloudcontrolled.com`. [Jetty]: http://jetty.codehaus.org/jetty/ -[dotCloud]: https://www.cloudcontrol.com/ +[dotCloud]: https://next.dotcloud.com/ [Java buildpack]: https://github.com/cloudControl/buildpack-java -[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Maven dependency plugin]: http://maven.apache.org/plugins/maven-dependency-plugin/ -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Java - Play 2.md b/Guides/Java/Java - Play 2.md index d3e1692..3919171 100644 --- a/Guides/Java/Java - Play 2.md +++ b/Guides/Java/Java - Play 2.md @@ -107,10 +107,10 @@ redeploy all changes will be lost. If you want a production database you should use one of our available [Data Storage Add-ons]. [Play 2.3.x]: https://www.playframework.com/documentation/2.3.x/Home -[dotCloud]: https://www.cloudcontrol.com/ +[dotCloud]: https://next.dotcloud.com/ [Scala buildpack]: https://github.com/cloudControl/buildpack-scala -[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [sbt]: http://www.scala-sbt.org/ -[Data Storage Add-ons]: https://www.cloudcontrol.com/add-ons?c=1 +[Data Storage Add-ons]: https://next.dotcloud.com/add-ons?c=1 diff --git a/Guides/Java/Java - Tomcat.md b/Guides/Java/Java - Tomcat.md index 79ce17f..dfb28db 100644 --- a/Guides/Java/Java - Tomcat.md +++ b/Guides/Java/Java - Tomcat.md @@ -165,9 +165,9 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your JSP Application running on Tomcat at `http[s]://APP_NAME.cloudcontrolled.com`. [Tomcat]: https://tomcat.apache.org/ -[dotCloud]: https://www.cloudcontrol.com/ +[dotCloud]: https://next.dotcloud.com/ [Java buildpack]: https://github.com/cloudControl/buildpack-java -[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Application Assembler Maven Plugin]: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/ -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Play - HelloWorld.md b/Guides/Java/Play - HelloWorld.md index 666e1d6..82e1866 100644 --- a/Guides/Java/Play - HelloWorld.md +++ b/Guides/Java/Play - HelloWorld.md @@ -78,10 +78,10 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Play! application running at `http[s]://APP_NAME.cloudcontrolled.com`. -[dotCloud]: https://www.cloudcontrol.com/ +[dotCloud]: https://next.dotcloud.com/ [Play buildpack]: https://github.com/cloudControl/buildpack-play -[Play 2 tutorial]: https://www.cloudcontrol.com/dev-center/Guides/Java/Java%20-%20Play%202 -[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[Play 2 tutorial]: https://next.dotcloud.com/dev-center/Guides/Java/Java%20-%20Play%202 +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [Ivy]: http://ant.apache.org/ivy/ diff --git a/Guides/Java/Scala - HelloWorld.md b/Guides/Java/Scala - HelloWorld.md index 0d0b83a..6bb01e6 100644 --- a/Guides/Java/Scala - HelloWorld.md +++ b/Guides/Java/Scala - HelloWorld.md @@ -88,10 +88,10 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Scala application running at `http[s]://APP_NAME.cloudcontrolled.com`. -[dotCloud]: https://www.cloudcontrol.com/ +[dotCloud]: https://next.dotcloud.com/ [Scala buildpack]: https://github.com/cloudControl/buildpack-scala [sbt]: http://www.scala-sbt.org/ -[dotCloud-command-line-client]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [sbt]: http://www.scala-sbt.org/ diff --git a/Guides/Migration Guides/An Introduction.md b/Guides/Migration Guides/An Introduction.md index 4e1bf08..320432c 100644 --- a/Guides/Migration Guides/An Introduction.md +++ b/Guides/Migration Guides/An Introduction.md @@ -50,8 +50,8 @@ Yes! Next dotCloud still behaves in all the ways you'd expect. # Where should I begin? -A good place to start is to read the [Quickstart](https://www.cloudcontrol.com/dev-center/Quickstart) -and [Platform Documentation](https://www.cloudcontrol.com/dev-center/Platform%20Documentation) +A good place to start is to read the [Quickstart](https://next.dotcloud.com/dev-center/Quickstart) +and [Platform Documentation](https://next.dotcloud.com/dev-center/Platform%20Documentation) to get familiar with the Next dotCloud PaaS. Then read the docs [here](https://next.dotcloud.com/dev-center/dotcloud-nextdotcloud-migration/cli-cheatsheet) comparing the dotCloud diff --git a/Guides/Migration Guides/Converting dotcloud.yml.md b/Guides/Migration Guides/Converting dotcloud.yml.md index f6a5b41..820e1bd 100644 --- a/Guides/Migration Guides/Converting dotcloud.yml.md +++ b/Guides/Migration Guides/Converting dotcloud.yml.md @@ -10,11 +10,11 @@ To better understand the differences between the dotcloud.yml file and the Procf dotCloud applications are built around several service types which you can define in the dotcloud.yml file. Each service runs different a process and has a different end point. This means that a single dotCloud application can combine, for example, a Ruby on Rails and a Python Flask implementation as two services in the same app. -On Next dotCloud, each application runs one main process – a web process. Each app also has only one type that you define when you create the app – this depends on which language the app is written in, and determines which [buildpack](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile) will create the image for your deployments on the platform. +On Next dotCloud, each application runs one main process – a web process. Each app also has only one type that you define when you create the app – this depends on which language the app is written in, and determines which [buildpack](https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile) will create the image for your deployments on the platform. -To port apps with several different languages onto Next dotCloud, you’ll need to create several applications – one for each type. However, many dotCloud services that aren’t related to the code itself, such as databases, are handled as [Add-ons](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation) on Next dotCloud. These integrate directly with your application and don’t require you to create multiple applications. +To port apps with several different languages onto Next dotCloud, you’ll need to create several applications – one for each type. However, many dotCloud services that aren’t related to the code itself, such as databases, are handled as [Add-ons](https://next.dotcloud.com/dev-center/Add-on%20Documentation) on Next dotCloud. These integrate directly with your application and don’t require you to create multiple applications. -You can run several [workers](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) within a single application on Next dotCloud. These are handled as background processes of the application and use exactly the same runtime environment as the app. +You can run several [workers](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) within a single application on Next dotCloud. These are handled as background processes of the application and use exactly the same runtime environment as the app. ### App structure on dotCloud ~~~text @@ -135,7 +135,7 @@ worker_b: python otherworker.py Note that in the Procfile, only the web and worker processes are defined. Each line in the Procfile is actually a shell command that will run just like you define it. This means you can customize the start options for your processes here. ## servicename and type -Your application on dotCloud can have multiple services, each with its own unique name that you define. On dotCloud, service names are fairly arbitrary. On Next dotCloud, services are handled quite differently because of how the platform is built. There are two types of processes on Next dotCloud, each of which is specifically defined: web processes, and worker processes. All other services are handled via [Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) and are not defined in the Procfile. +Your application on dotCloud can have multiple services, each with its own unique name that you define. On dotCloud, service names are fairly arbitrary. On Next dotCloud, services are handled quite differently because of how the platform is built. There are two types of processes on Next dotCloud, each of which is specifically defined: web processes, and worker processes. All other services are handled via [Add-ons](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) and are not defined in the Procfile. ### Type: (language) / web process On Next dotCloud, each application is based around one main, language-specific web process. This is because the Next dotCloud platform uses Buildpacks – a language-specific set of scripts that builds the images for your apps based on the language you specify. @@ -149,14 +149,14 @@ Once you’ve created the application, you need to set the web process and speci ### Type: (language)-worker / worker process On Next dotCloud, you can define multiple workers in the Procfile that will run as background processes in that application. They use the exact same runtime environment as the web process. -To use this functionality, you need to add the [Worker Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) to your app. +To use this functionality, you need to add the [Worker Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) to your app. ### Non-code services / Add-ons In the dotcloud.yml file, you can define many different kinds of services within the app, including databases like MySQL, or other services like Redis. A Procfile on Next dotCloud only specifies your web and worker processes. This is very different from a dotcloud.yml file. -On Next dotCloud, "Data Services" like MySQL and Redis, as well as many other types of services like logging, monitoring and even SSL, are handled outside of the Procfile with [Add-ons](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons). You can simply add them to your web app in the CLI with `dcapp addon.add`. This automatically connects the services to your app. +On Next dotCloud, "Data Services" like MySQL and Redis, as well as many other types of services like logging, monitoring and even SSL, are handled outside of the Procfile with [Add-ons](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons). You can simply add them to your web app in the CLI with `dcapp addon.add`. This automatically connects the services to your app. -To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config). +To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config). ### Example dotcloud.yml to Procfile migration @@ -200,7 +200,7 @@ The officially supported Buildpacks on Next dotCloud consist of a standard set o If you have applications on dotCloud that use prebuild and postbuild hooks, it’s worthwhile to try pushing and deploying them using one of the officially supported Buildpacks first. The stack may already have the components you need installed and it may work out of the box. -If not, you may need make modifications to a standard buildpack and use it as a [custom Buildpack](https://www.cloudcontrol.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). First download the Buildpack for your app’s language type from [Next dotCloud’s public Github repo](https://github.com/cloudControl?query=buildpack) and modify the `bin/compile` script according to your needs. (Keep in mind that only the `/app` folder is writeable, so you can’t use the Ubuntu package manager to install libraries.) Upload your new custom Buildpack to a public non-ssh git repository, and create your application with the apptype `custom --buildpack BUILDPACK_URL`. +If not, you may need make modifications to a standard buildpack and use it as a [custom Buildpack](https://next.dotcloud.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). First download the Buildpack for your app’s language type from [Next dotCloud’s public Github repo](https://github.com/cloudControl?query=buildpack) and modify the `bin/compile` script according to your needs. (Keep in mind that only the `/app` folder is writeable, so you can’t use the Ubuntu package manager to install libraries.) Upload your new custom Buildpack to a public non-ssh git repository, and create your application with the apptype `custom --buildpack BUILDPACK_URL`. ### postinstall scripts If you have a postinstall script, you can run the same step as part of your Procfile command, e.g. Procfile: @@ -216,7 +216,7 @@ There are a couple of ways to migrate your dotcloud.yml config section, dependin If you’re using the config section to specify an interpreter version (e.g. Python 2.6 vs. Python 2.7), check the [Next dotCloud buildpack documentation on Github](https://github.com/cloudcontrol?query=buildpack) for how to do this with your specific buildpack. For example, you can specify the Python version by creating a runtime.txt file to replace your dotcloud.yml config: python_version. -If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. +If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. For more information, read our guide on [migrating environment variables](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) from dotCloud to Next dotCloud. @@ -225,10 +225,10 @@ If you have a ports section in your dotcloud.yml then you should only have one p If you do have multiple services each with their own HTTP port, then you should consider how to either separate these into different applications or how to access each different function via a different URL path (e.g. if you used to have an "admin" interface as well as a public interface, move your "admin" interface to be part of your public interface on another path, like "www.example.com/admin"). -Note that Next dotCloud containers do not expose an SSH port. See the [Secure Shell docs](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#secure-shell-ssh). +Note that Next dotCloud containers do not expose an SSH port. See the [Secure Shell docs](https://next.dotcloud.com/dev-center/Platform%20Documentation#secure-shell-ssh). ## environment -If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and our [dedicated guide](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) on this topic. +If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and our [dedicated guide](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) on this topic. Note that the same variables are set in all your application processes (web and worker) -- you cannot specify that a variable should only be set on one process (as you could in a dotcloud.yml file). diff --git a/Guides/Migration Guides/Django Celery.md b/Guides/Migration Guides/Django Celery.md index f67af32..da771ec 100644 --- a/Guides/Migration Guides/Django Celery.md +++ b/Guides/Migration Guides/Django Celery.md @@ -136,12 +136,12 @@ having everything under control. [Django]: https://www.djangoproject.com/ [Celery]: http://www.celeryproject.org/ [dotCloud]: https://www.dotcloud.com/ -[Next dotCloud]: https://www.next.dotcloud.com/ -[Procfile]: https://www.next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile +[Next dotCloud]: https://next.dotcloud.com/ +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [gunicorn]: http://gunicorn.org/ -[add-ons]: https://www.next.dotcloud.com/add-ons -[MySQLd]: https://www.next.dotcloud.com/add-ons/mysqld -[CloudAMQP]: https://www.next.dotcloud.com/add-ons/cloudamqp -[run]: https://www.next.dotcloud.com/dev-center/platform-documentation#secure-shell-ssh -[Worker]: https://www.next.dotcloud.com/add-ons/worker -[logs]: https://www.next.dotcloud.com/dev-center/platform-documentation#logging +[add-ons]: https://next.dotcloud.com/add-ons +[MySQLd]: https://next.dotcloud.com/add-ons/mysqld +[CloudAMQP]: https://next.dotcloud.com/add-ons/cloudamqp +[run]: https://next.dotcloud.com/dev-center/platform-documentation#secure-shell-ssh +[Worker]: https://next.dotcloud.com/add-ons/worker +[logs]: https://next.dotcloud.com/dev-center/platform-documentation#logging diff --git a/Guides/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index e913fe8..538a6ed 100644 --- a/Guides/NodeJS/AWS S3.md +++ b/Guides/NodeJS/AWS S3.md @@ -94,4 +94,4 @@ You can build rich Node.js apps using more advanced S3 operations. To learn more [npm package manager]: https://npmjs.org/ [Amazon Guide]: http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-intro.html [AWS access credentials]: http://aws.amazon.com/security-credentials -[Config Add-on]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config +[Config Add-on]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config diff --git a/Guides/NodeJS/Add-on credentials.md b/Guides/NodeJS/Add-on credentials.md index d3fb9f5..f1df776 100644 --- a/Guides/NodeJS/Add-on credentials.md +++ b/Guides/NodeJS/Add-on credentials.md @@ -90,9 +90,9 @@ var password = auth[1]; var port = elephantSQLUrl.port; ~~~ -[Add-on Marketplace]: https://www.cloudcontrol.com/add-ons -[environment variables]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#environment-variables -[MySQL Dedicated Add-on]: https://www.cloudcontrol.com/add-ons/mysqld -[MySQL Shared Add-on]: https://www.cloudcontrol.com/add-ons/mysqls -[Add-on credentials]:https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-on-credentials -[ElephantSQL Add-on]: https://www.cloudcontrol.com/add-ons/elephantsql +[Add-on Marketplace]: https://next.dotcloud.com/add-ons +[environment variables]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables +[MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld +[MySQL Shared Add-on]: https://next.dotcloud.com/add-ons/mysqls +[Add-on credentials]:https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials +[ElephantSQL Add-on]: https://next.dotcloud.com/add-ons/elephantsql diff --git a/Guides/NodeJS/Express.md b/Guides/NodeJS/Express.md index 111629e..bd875f7 100644 --- a/Guides/NodeJS/Express.md +++ b/Guides/NodeJS/Express.md @@ -155,10 +155,10 @@ applications. [Node.js]: http://nodejs.org/ [Express]: http://expressjs.com/ [npm]: https://npmjs.org/ -[dotCloud]: http://www.cloudcontrol.com +[dotCloud]: http://next.dotcloud.com [Node.js buildpack]: https://github.com/cloudControl/buildpack-nodejs -[get-conf]: https://www.cloudcontrol.com/dev-center/Guides/NodeJS/Add-on%20credentials -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[platform documentation]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation -[Data Storage]: https://www.cloudcontrol.com/add-ons?c=1 -[MongoSoup]: https://www.cloudcontrol.com/add-ons/mongosoup +[get-conf]: https://next.dotcloud.com/dev-center/Guides/NodeJS/Add-on%20credentials +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[platform documentation]: https://next.dotcloud.com/dev-center/Platform%20Documentation +[Data Storage]: https://next.dotcloud.com/add-ons?c=1 +[MongoSoup]: https://next.dotcloud.com/add-ons/mongosoup diff --git a/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index 6e576ab..9507ed4 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -133,10 +133,10 @@ Building a data app with Node.js? Check out our next [example on how to use Node Good luck building your apps using Node.js and dotCloud. -[example on how to use Node.js with MongoDB]: https://www.cloudcontrol.com/dev-center/Guides/NodeJS/Express +[example on how to use Node.js with MongoDB]: https://next.dotcloud.com/dev-center/Guides/NodeJS/Express [Node.js]: http://nodejs.org/ [npm]: https://npmjs.org/ -[dotCloud]: http://www.cloudcontrol.com +[dotCloud]: http://next.dotcloud.com [Node.js buildpack]: https://github.com/cloudControl/buildpack-nodejs -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[platform documentation]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[platform documentation]: https://next.dotcloud.com/dev-center/Platform%20Documentation diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index 5e8d077..d2a0340 100644 --- a/Guides/NodeJS/Sailsjs.md +++ b/Guides/NodeJS/Sailsjs.md @@ -148,9 +148,9 @@ Congratulations, you can now see your Sails.js application running at [Sails getting started page]: http://sailsjs.org/#!getStarted [Ruby on Rails]: http://rubyonrails.org/ [npm]: https://npmjs.org/ -[dotCloud]: http://www.cloudcontrol.com -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[get the MySQL credentials]: https://www.cloudcontrol.com/dev-center/Guides/NodeJS/Add-on%20credentials +[dotCloud]: http://next.dotcloud.com +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[get the MySQL credentials]: https://next.dotcloud.com/dev-center/Guides/NodeJS/Add-on%20credentials [websockets]: http://socket.io/ -[dotCloud websockets documentation]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#websockets -[Shared MySQL Add-on]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs +[dotCloud websockets documentation]: https://next.dotcloud.com/dev-center/Platform%20Documentation#websockets +[Shared MySQL Add-on]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs diff --git a/Guides/PHP/Add-on credentials.md b/Guides/PHP/Add-on credentials.md index 4db9a10..e3f01a0 100644 --- a/Guides/PHP/Add-on credentials.md +++ b/Guides/PHP/Add-on credentials.md @@ -80,9 +80,9 @@ $db_config = array( ); ~~~ -[env-vars]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#environment-variables -[Add-on credentials]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-on-credentials -[Add-on Marketplace]: https://www.cloudcontrol.com/add-ons/ -[MySQL Dedicated Add-on]: https://www.cloudcontrol.com/add-ons/mysqld -[MySQL Shared Add-on]: https://www.cloudcontrol.com/add-ons/mysqls -[ElephantSQL Add-on]: https://www.cloudcontrol.com/add-ons/elephantsql +[env-vars]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables +[Add-on credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials +[Add-on Marketplace]: https://next.dotcloud.com/add-ons/ +[MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld +[MySQL Shared Add-on]: https://next.dotcloud.com/add-ons/mysqls +[ElephantSQL Add-on]: https://next.dotcloud.com/add-ons/elephantsql diff --git a/Guides/PHP/CakePHP 2.2.1.md b/Guides/PHP/CakePHP 2.2.1.md index 91829ca..56e6602 100644 --- a/Guides/PHP/CakePHP 2.2.1.md +++ b/Guides/PHP/CakePHP 2.2.1.md @@ -10,7 +10,7 @@ If you're looking for a fast, light and effective PHP Framework for your project * Loads of plugins and add-ons * Easy to read documentation -In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the dotCloud platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the dotCloud platform](http://next.dotcloud.com). ##Prerequisites diff --git a/Guides/PHP/Drupal 7.md b/Guides/PHP/Drupal 7.md index aeceb5c..5a00395 100644 --- a/Guides/PHP/Drupal 7.md +++ b/Guides/PHP/Drupal 7.md @@ -9,7 +9,7 @@ If you're looking for a flexible, friendly and powerful content management platf * Auto-update notification * Easy to read documentation -In this tutorial, we're going to take you through deploying Drupal 7 to [the dotCloud platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying Drupal 7 to [the dotCloud platform](http://next.dotcloud.com). ##Prerequisites diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 3c177a5..6472c97 100644 --- a/Guides/PHP/HelloWorld.md +++ b/Guides/PHP/HelloWorld.md @@ -112,11 +112,11 @@ Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.c [silex]: http://silex.sensiolabs.org/ -[dotCloud]: http://www.cloudcontrol.com -[dotCloud-doc-user]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#user-accounts -[dotCloud-doc-cmdline]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api "documentation of the dotCloud-command-line-client" +[dotCloud]: http://next.dotcloud.com +[dotCloud-doc-user]: https://next.dotcloud.com/dev-center/Platform%20Documentation#user-accounts +[dotCloud-doc-cmdline]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api "documentation of the dotCloud-command-line-client" [php buildpack]: https://github.com/cloudControl/buildpack-php -[procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git [composer]: http://getcomposer.org/ [example-app]: https://github.com/cloudControl/php-silex-example-app diff --git a/Guides/PHP/Joomla 2.5.md b/Guides/PHP/Joomla 2.5.md index 4f0504c..e67572d 100644 --- a/Guides/PHP/Joomla 2.5.md +++ b/Guides/PHP/Joomla 2.5.md @@ -10,7 +10,7 @@ If you're looking for a fast, light and effective PHP Framework for your project * Loads of plugins and add-ons * Easy to read documentation -In this tutorial, we're going to take you through deploying Joomla v2.5 to [the dotCloud platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying Joomla v2.5 to [the dotCloud platform](http://next.dotcloud.com). ##Prerequisites diff --git a/Guides/PHP/Kohana 3.2.0.md b/Guides/PHP/Kohana 3.2.0.md index 25b38d1..396de1d 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -12,7 +12,7 @@ If you're looking for a very fast, light, highly configurable and effective PHP * The ability to add in 3rd party libraries, such as Zend Framework * Rich [HMVC](http://en.wikipedia.org/wiki/Hierarchical_model%E2%80%93view%E2%80%93controller) support -In this tutorial, we're going to take you through deploying Kohana 3.2.0 to [the dotCloud platform](http://www.cloudcontrol.com). If you need further information about Kohana, check out [the online user guide](http://kohanaframework.org/documentation) or jump in to [the IRC channel](irc://irc.freenode.net/kohana). Otherwise, let's get started. +In this tutorial, we're going to take you through deploying Kohana 3.2.0 to [the dotCloud platform](http://next.dotcloud.com). If you need further information about Kohana, check out [the online user guide](http://kohanaframework.org/documentation) or jump in to [the IRC channel](irc://irc.freenode.net/kohana). Otherwise, let's get started. ##Prerequisites diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index dd57ae1..fa8b3cb 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -12,7 +12,7 @@ If you're looking for a feature-rich, open source, PHP Framework for your projec * Factories, plug-ins, and mixins * Built-in unit and functional testing framework -In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the dotCloud platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the dotCloud platform](http://next.dotcloud.com). ##Prerequisites diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index 201ab6f..7cd3905 100644 --- a/Guides/PHP/Yii 1.1.10.md +++ b/Guides/PHP/Yii 1.1.10.md @@ -10,7 +10,7 @@ If you're looking for a lightning fast, light and effective PHP Framework for yo * Lots of plugins and add-ons * Easy to read documentation -In this tutorial, we're going to take you through deploying the Yii Framework v1.1.11 to [the dotCloud platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying the Yii Framework v1.1.11 to [the dotCloud platform](http://next.dotcloud.com). ##Prerequisites diff --git a/Guides/PHP/Zend 2.md b/Guides/PHP/Zend 2.md index ac613ec..54d215f 100644 --- a/Guides/PHP/Zend 2.md +++ b/Guides/PHP/Zend 2.md @@ -188,7 +188,7 @@ $ cctrlapp APP_NAME/default deploy To store the sessions we need to add a database Add-on and initialize the table. -We are going to use [the MySQLs Add-on's free plan](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs). It provides a free shared database for testing and development. +We are going to use [the MySQLs Add-on's free plan](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs). It provides a free shared database for testing and development. Creating the session table is easy by executing the included init-session-table command in a run-container: @@ -205,6 +205,6 @@ Connection to ssh.cloudcontrolled.net closed. Et voila, the app is now up and running at `http[s]://APP_NAME.cloudcontrolled.com`. [PHP buildpack]: https://github.com/cloudControl/buildpack-php -[dotCloud]: https://www.cloudcontrol.com/ +[dotCloud]: https://next.dotcloud.com/ [example app]: https://github.com/cloudControl/php-zend2-example-app.git diff --git a/Guides/PHP/Zend Framework 1.11.md b/Guides/PHP/Zend Framework 1.11.md index 4b05afc..9c1dadd 100644 --- a/Guides/PHP/Zend Framework 1.11.md +++ b/Guides/PHP/Zend Framework 1.11.md @@ -10,7 +10,7 @@ If you're looking for a feature-rich, flexible and capable PHP Framework for you * Easy to read documentation * A super, shiny, new version 2 **coming soon** -In this tutorial, we're going to take you through deploying Zend Framework v1.11 to [the dotCloud platform](http://www.cloudcontrol.com). +In this tutorial, we're going to take you through deploying Zend Framework v1.11 to [the dotCloud platform](http://next.dotcloud.com). ##Prerequisites diff --git a/Guides/Python/AWS S3.md b/Guides/Python/AWS S3.md index d56846b..e5c87c5 100644 --- a/Guides/Python/AWS S3.md +++ b/Guides/Python/AWS S3.md @@ -21,7 +21,7 @@ boto==2.9.8 ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config): ~~~bash $ cctrlapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] diff --git a/Guides/Python/Add-on credentials.md b/Guides/Python/Add-on credentials.md index cae9618..b64b990 100644 --- a/Guides/Python/Add-on credentials.md +++ b/Guides/Python/Add-on credentials.md @@ -108,10 +108,10 @@ db_config = { } ~~~ -[env-vars]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#environment-variables -[Add-on credentials]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-on-credentials -[Add-on Marketplace]: https://www.cloudcontrol.com/add-ons/ -[Custom Config Add-on]: https://www.cloudcontrol.com/add-ons/config -[MySQL Dedicated Add-on]: https://www.cloudcontrol.com/add-ons/mysqld -[MySQL Shared Add-on]: https://www.cloudcontrol.com/add-ons/mysqls -[ElephantSQL Add-on]: https://www.cloudcontrol.com/add-ons/elephantsql +[env-vars]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables +[Add-on credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials +[Add-on Marketplace]: https://next.dotcloud.com/add-ons/ +[Custom Config Add-on]: https://next.dotcloud.com/add-ons/config +[MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld +[MySQL Shared Add-on]: https://next.dotcloud.com/add-ons/mysqls +[ElephantSQL Add-on]: https://next.dotcloud.com/add-ons/elephantsql diff --git a/Guides/Python/Celery.md b/Guides/Python/Celery.md index 739130c..1687313 100644 --- a/Guides/Python/Celery.md +++ b/Guides/Python/Celery.md @@ -209,10 +209,10 @@ Connection to ssh.cloudcontrolled.net closed. This guide showed how to run both Flower aswell as a Celery worker on dotCloud by specifying the commands in the `Procfile` and how to connect to a AMQP broker provided by the CloudAMQP Add-on with the credentials provided in the app's runtime environment. Additionally we learned how we can use the cctrlapp run command to use the Celery command line tool. [Celery]: http://celeryproject.org/ -[CloudAMQP Add-on]: https://www.cloudcontrol.com/add-ons/cloudamqp -[Worker Add-on]: https://www.cloudcontrol.com/add-ons/worker -[dotCloud]: http://www.cloudcontrol.com +[CloudAMQP Add-on]: https://next.dotcloud.com/add-ons/cloudamqp +[Worker Add-on]: https://next.dotcloud.com/add-ons/worker +[dotCloud]: http://next.dotcloud.com [celeryguide]: http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html [Flower]: http://docs.celeryproject.org/en/latest/userguide/monitoring.html#flower-real-time-celery-web-monitor [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index 1902a33..bb91cf0 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -25,12 +25,12 @@ To use a database, you should choose an Add-on from [the Data Storage category][ ## Email You can't use a local SMTP server, instead choose one of our [email Add-ons][messaging-addons]. -[SSH-session]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#secure-shell-ssh +[SSH-session]: https://next.dotcloud.com/dev-center/Platform%20Documentation#secure-shell-ssh [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ -[procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[messaging-addons]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Messaging%20&%20Mobile/ -[data-storage-addons]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/ -[add-on-credentials]: https://www.cloudcontrol.com/dev-center/Guides/Python/Add-on%20credentials -[dotCloud]: https://www.cloudcontrol.com/ -[worker]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers +[procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[messaging-addons]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Messaging%20&%20Mobile/ +[data-storage-addons]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/ +[add-on-credentials]: https://next.dotcloud.com/dev-center/Guides/Python/Add-on%20credentials +[dotCloud]: https://next.dotcloud.com/ +[worker]: https://next.dotcloud.com/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index 64ced30..babfbd3 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -161,23 +161,23 @@ For additional information take a look at [Django Notes][django-notes] and other [python-specific documents][python-guides]. [django]: https://www.djangoproject.com/ -[dotCloud]: http://www.cloudcontrol.com -[dotCloud-doc-user]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#user-accounts -[dotCloud-doc-cmdline]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[dotCloud]: http://next.dotcloud.com +[dotCloud-doc-user]: https://next.dotcloud.com/dev-center/Platform%20Documentation#user-accounts +[dotCloud-doc-cmdline]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git -[filesystem]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#non-persistent-filesystem -[data-storage-addons]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/ -[mysqls]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs +[filesystem]: https://next.dotcloud.com/dev-center/Platform%20Documentation#non-persistent-filesystem +[data-storage-addons]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/ +[mysqls]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs [example-app]: https://github.com/cloudControl/python-django-example-app -[django-notes]: https://www.cloudcontrol.com/dev-center/Guides/Python/Django%20notes -[get-conf]: https://www.cloudcontrol.com/dev-center/Guides/Python/Add-on%20credentials +[django-notes]: https://next.dotcloud.com/dev-center/Guides/Python/Django%20notes +[get-conf]: https://next.dotcloud.com/dev-center/Guides/Python/Add-on%20credentials [Django tutorial]: https://docs.djangoproject.com/en/1.4/intro/tutorial01/ -[python-guides]: https://www.cloudcontrol.com/dev-center/Guides/Python +[python-guides]: https://next.dotcloud.com/dev-center/Guides/Python [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ [gunicorn]: http://gunicorn.org/ -[worker]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers +[worker]: https://next.dotcloud.com/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers [db-commit]: https://github.com/cloudControl/python-django-example-app/commit/983f45e46ce0707476cec167ea062e19adcb53c9 -[ssh-session]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#secure-shell-ssh +[ssh-session]: https://next.dotcloud.com/dev-center/Platform%20Documentation#secure-shell-ssh [mysql-driver]: https://pypi.python.org/pypi/MySQL-python/1.2.5 diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index 7eeeaf7..8138a21 100644 --- a/Guides/Python/HelloWorld.md +++ b/Guides/Python/HelloWorld.md @@ -80,7 +80,7 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.cloudcontrolled.com`. [Flask]: http://flask.pocoo.org/ -[dotCloud]: http://www.cloudcontrol.com +[dotCloud]: http://next.dotcloud.com [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [example_app]: https://github.com/cloudControl/python-flask-example-app.git diff --git a/Guides/Python/Tornado.md b/Guides/Python/Tornado.md index ef69378..948c4fa 100644 --- a/Guides/Python/Tornado.md +++ b/Guides/Python/Tornado.md @@ -126,6 +126,6 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Tornado app running at `http://APP_NAME.cloudcontrolled.com`. [Tornado]: http://www.tornadoweb.org -[dotCloud]: http://www.cloudcontrol.com +[dotCloud]: http://next.dotcloud.com [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index 32ba7f2..8baa0a5 100644 --- a/Guides/Ruby/AWS S3.md +++ b/Guides/Ruby/AWS S3.md @@ -26,7 +26,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config): ~~~bash $ cctrlapp APP_NAME/default config.add AWS_ACCESS_KEY_ID=[YOUR_SECRET_KEY] AWS_SECRET_ACCESS_KEY=[YOUR_ACCESS_KEY] AWS_REGION='eu-west-1' diff --git a/Guides/Ruby/Add-on credentials.md b/Guides/Ruby/Add-on credentials.md index ed22c88..572a781 100644 --- a/Guides/Ruby/Add-on credentials.md +++ b/Guides/Ruby/Add-on credentials.md @@ -99,10 +99,10 @@ db_config = { You can also find a working example application on [Github][ruby-postgresql-example]. -[Add-on credentials]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-on-credentials -[environment variables]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#environment-variables -[Add-on Marketplace]: https://www.cloudcontrol.com/add-ons/?c=1 -[MySQL Dedicated Add-on]: https://www.cloudcontrol.com/add-ons/mysqld -[MySQL Shared Add-on]: https://www.cloudcontrol.com/add-ons/mysqls -[ElephantSQL Add-on]: https://www.cloudcontrol.com/add-ons/elephantsql +[Add-on credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials +[environment variables]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables +[Add-on Marketplace]: https://next.dotcloud.com/add-ons/?c=1 +[MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld +[MySQL Shared Add-on]: https://next.dotcloud.com/add-ons/mysqls +[ElephantSQL Add-on]: https://next.dotcloud.com/add-ons/elephantsql [ruby-postgresql-example]: https://github.com/ElephantSQL/ruby-postgresql-example diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index 8206a76..2a910a6 100644 --- a/Guides/Ruby/HelloWorld.md +++ b/Guides/Ruby/HelloWorld.md @@ -86,11 +86,11 @@ Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME [sinatra]: http://www.sinatrarb.com/ -[dotCloud]: http://www.cloudcontrol.com -[dotCloud-doc-user]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#user-accounts -[dotCloud-doc-cmdline]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud]: http://next.dotcloud.com +[dotCloud-doc-user]: https://next.dotcloud.com/dev-center/Platform%20Documentation#user-accounts +[dotCloud-doc-cmdline]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api [ruby buildpack]: https://github.com/cloudControl/buildpack-ruby -[procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git [bundler]: http://gembundler.com/ [example-app]: https://github.com/cloudControl/ruby-sinatra-example-app diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index 786d4aa..a51fc0c 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -185,16 +185,16 @@ For additional information take a look at [Ruby on Rails notes][rails-notes] and other [ruby-specific documents][ruby-guides]. [Ruby on Rails]: http://rubyonrails.org/ -[dotCloud]: http://www.cloudcontrol.com +[dotCloud]: http://next.dotcloud.com [example-app]: https://github.com/cloudControl/ruby-rails-example-app [ruby buildpack]: https://github.com/cloudControl/buildpack-ruby [Rails tutorial]: http://ruby.railstutorial.org/ [Bundler]: http://bundler.io/ -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[filesystem]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#non-persistent-filesystem -[data-storage-addons]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/ -[postgres-addon]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/ElephantSQL -[run command]: https://www.cloudcontrol.com/dev-center/Guides/Ruby/RunCommand -[rails-notes]: https://www.cloudcontrol.com/dev-center/Guides/Ruby/RailsNotes -[ruby-guides]: https://www.cloudcontrol.com/dev-center/Guides/Ruby +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[filesystem]: https://next.dotcloud.com/dev-center/Platform%20Documentation#non-persistent-filesystem +[data-storage-addons]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/ +[postgres-addon]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/ElephantSQL +[run command]: https://next.dotcloud.com/dev-center/Guides/Ruby/RunCommand +[rails-notes]: https://next.dotcloud.com/dev-center/Guides/Ruby/RailsNotes +[ruby-guides]: https://next.dotcloud.com/dev-center/Guides/Ruby [gem itself]: http://rubygems.org/gems/cloudcontrol-rails diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index 6a22d9e..e676eeb 100644 --- a/Guides/Ruby/RubyNotes.md +++ b/Guides/Ruby/RubyNotes.md @@ -100,7 +100,7 @@ Alternatively you can use the [cloudcontrol-rails] gem. ## Environments -Rails servers can be run in different environments. Production is the default one but you can change it by setting the `RAILS_ENV` and `RACK_ENV` environment variables with the [Custom Config addon](https://www.cloudcontrol.com/add-ons/config). For example: +Rails servers can be run in different environments. Production is the default one but you can change it by setting the `RAILS_ENV` and `RACK_ENV` environment variables with the [Custom Config addon](https://next.dotcloud.com/add-ons/config). For example: ~~~ cctrlapp APP_NAME/DEPLOYMENT config.add RACK_ENV=some_env RAILS_ENV=some_env @@ -111,6 +111,6 @@ NOTE: Gems in development and test environments are excluded from bundle install [cloudcontrol-rails]: https://rubygems.org/gems/cloudcontrol-rails -[procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#version-control--images +[procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#version-control--images [rails-procfile]: #rails-procfile [ruby-buildpack]: https://github.com/cloudControl/buildpack-ruby diff --git a/Guides/Third-Party Buildpacks/Go HelloWorld.md b/Guides/Third-Party Buildpacks/Go HelloWorld.md index 3326eb5..c30911e 100644 --- a/Guides/Third-Party Buildpacks/Go HelloWorld.md +++ b/Guides/Third-Party Buildpacks/Go HelloWorld.md @@ -123,6 +123,6 @@ $ cctrlapp APP_NAME/default deploy Congratulations, you can now see your Go app running at `http[s]://APP_NAME.cloudcontrolled.com`. [Go]: http://golang.org/ -[dotCloud]: http://www.cloudcontrol.com +[dotCloud]: http://next.dotcloud.com [godep]: https://github.com/tools/godep -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Third-Party Buildpacks/Go Martini.md b/Guides/Third-Party Buildpacks/Go Martini.md index e211508..9e9e1b4 100644 --- a/Guides/Third-Party Buildpacks/Go Martini.md +++ b/Guides/Third-Party Buildpacks/Go Martini.md @@ -136,6 +136,6 @@ $ cctrlapp APP_NAME/default open ~~~ [Martini]: http://martini.codegangsta.io/ -[dotCloud]: https://www.cloudcontrol.com +[dotCloud]: https://next.dotcloud.com [Go buildpack]: https://github.com/cloudControl/buildpack-go -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Third-Party Buildpacks/Go Revel.md b/Guides/Third-Party Buildpacks/Go Revel.md index 1f85ca6..9e6b591 100644 --- a/Guides/Third-Party Buildpacks/Go Revel.md +++ b/Guides/Third-Party Buildpacks/Go Revel.md @@ -120,6 +120,6 @@ $ cctrlapp APP_NAME/default open ~~~ [Revel]: http://revel.github.io -[dotCloud]: https://www.cloudcontrol.com +[dotCloud]: https://next.dotcloud.com [Revel buildpack]: https://github.com/revel/heroku-buildpack-go-revel -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md index 3b03e94..0ff22e8 100644 --- a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md +++ b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md @@ -37,8 +37,8 @@ You can use any of the aforementioned buildpacks, fork them and make changes acc Before using any third party buildpack you should inspect their source code and proceed with caution. -[dotCloud]: https://www.cloudcontrol.com -[PinkyStack]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#stacks +[dotCloud]: https://next.dotcloud.com +[PinkyStack]: https://next.dotcloud.com/dev-center/Platform%20Documentation#stacks [buildpack-java]: https://github.com/cloudControl/buildpack-java [buildpack-python]: https://github.com/cloudControl/buildpack-python [buildpack-ruby]: https://github.com/cloudControl/buildpack-ruby diff --git a/Platform Documentation.md b/Platform Documentation.md index 0dd8f84..dfb06a9 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -413,7 +413,7 @@ the credentials file. Set the variable `SET_ENV_VARS` using the [Custom Config Add-on] to either `false` or `true` to explicitly enable or disable this feature. -The guides section has detailed examples about how to get the credentials in different languages ([Ruby](https://www.cloudcontrol.com/dev-center/Guides/Ruby/Add-on%20credentials), [Python](https://www.cloudcontrol.com/dev-center/Guides/Python/Add-on%20credentials), [Node.js](https://www.cloudcontrol.com/dev-center/Guides/NodeJS/Add-on%20credentials), [Java](https://www.cloudcontrol.com/dev-center/Guides/Java/Add-on%20credentials), [PHP](https://www.cloudcontrol.com/dev-center/Guides/PHP/Add-on%20credentials)). +The guides section has detailed examples about how to get the credentials in different languages ([Ruby](https://next.dotcloud.com/dev-center/Guides/Ruby/Add-on%20credentials), [Python](https://next.dotcloud.com/dev-center/Guides/Python/Add-on%20credentials), [Node.js](https://next.dotcloud.com/dev-center/Guides/NodeJS/Add-on%20credentials), [Java](https://next.dotcloud.com/dev-center/Guides/Java/Add-on%20credentials), [PHP](https://next.dotcloud.com/dev-center/Guides/PHP/Add-on%20credentials)). To see the format and contents of the credentials file locally, use the `addon.creds` command. ~~~ @@ -571,10 +571,10 @@ To use this, simply point your browser to: Please note the **dash** between DEP_NAME and APP_NAME. SSL support for custom domains is available through the -[SSL add-on](https://www.cloudcontrol.com/add-ons/ssl). +[SSL add-on](https://next.dotcloud.com/add-ons/ssl). Instructions on how to add HTTPS redirects to your application can be -found in the [SSL add-on documentation](https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/SSL#https-redirects). +found in the [SSL add-on documentation](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/SSL#https-redirects). ### Elastic Addresses @@ -832,27 +832,27 @@ $ cctrlapp APP_NAME/DEP_NAME details [generating SSH keys]: https://help.github.com/articles/generating-ssh-keys -[Custom Config Add-on]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config -[web console]: https://www.cloudcontrol.com/console +[Custom Config Add-on]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config +[web console]: https://next.dotcloud.com/console [API libraries]: https://github.com/cloudControl [the latest version]: https://download.dotcloudapp.com/windows [Python 2.6+]: http://python.org/download/ -[reset your password]: https://api.cloudcontrol.com/reset_password/ +[reset your password]: https://api.dotcloudapp.com/reset_password/ [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ [Heroku buildpack API]: https://devcenter.heroku.com/articles/buildpack-api -[guides]: https://www.cloudcontrol.com/dev-center/Guides +[guides]: https://next.dotcloud.com/dev-center/Guides [MongoSoup Add-on]: https://next.dotcloud.com/add-ons/mongosoup -[Add-on marketplace]: https://www.cloudcontrol.com/add-ons -[Deployment category]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment +[Add-on marketplace]: https://next.dotcloud.com/add-ons +[Deployment category]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment [rsyslog]: http://www.rsyslog.com/ [TLS]: http://en.wikipedia.org/wiki/Transport_Layer_Security -[Alias Add-on]: https://www.cloudcontrol.com/add-ons/alias -[MemCachier Add-on]: https://www.cloudcontrol.com/add-ons/memcachier -[MemCachier Documentation]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Storage/MemCachier +[Alias Add-on]: https://next.dotcloud.com/add-ons/alias +[MemCachier Add-on]: https://next.dotcloud.com/add-ons/memcachier +[MemCachier Documentation]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/MemCachier [tutorial]: https://www.cloudcontrol.com/blog/best-practice-running-and-analyzing-load-tests-on-your-cloudcontrol-app -[Cron Add-on]: https://www.cloudcontrol.com/add-ons/cron -[Cron Add-on documentation]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment/Cron -[Worker Add-on]: https://www.cloudcontrol.com/add-ons/worker -[Worker Add-on documentation]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker +[Cron Add-on]: https://next.dotcloud.com/add-ons/cron +[Cron Add-on documentation]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Cron +[Worker Add-on]: https://next.dotcloud.com/add-ons/worker +[Worker Add-on documentation]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker [Ubuntu 10.04 LTS Lucid Lynx]: http://releases.ubuntu.com/lucid/ [Ubuntu 12.04 LTS Precise Pangolin]: http://releases.ubuntu.com/precise/ diff --git a/Quickstart.md b/Quickstart.md index 0520e75..f5a4655 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -123,4 +123,4 @@ Grab [our cheatsheet (PDF)](/dev-center/dotcloudng_cheatsheet.pdf) to have the m ## Documentation -To learn more about all the platform features and how to integrate it seamlessly into the development life cycle please refer to the extensive [platform documentation](https://www.cloudcontrol.com/dev-center/Platform%20Documentation). +To learn more about all the platform features and how to integrate it seamlessly into the development life cycle please refer to the extensive [platform documentation](https://next.dotcloud.com/dev-center/Platform%20Documentation). diff --git a/README b/README index 917a251..0f20c45 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ dotCloud Documentation -Markdown source of the dotCloud documentation online at https://www.cloudcontrol.com/dev-center +Markdown source of the dotCloud documentation online at https://next.dotcloud.com/dev-center For corrections or suggestions please send a pull request. From 56b2535085b88e369e42fa04cf49995744961ce7 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Tue, 2 Dec 2014 18:55:13 +0100 Subject: [PATCH 26/84] Uppercase to lowercase, spaces to dashes --- .../Data Processing/CloudAMQP.md | 2 +- .../Data Processing/Worker.md | 2 +- .../Data Storage/ElephantSQL.md | 2 +- .../Data Storage/MongoSoup.md | 2 +- Add-on Documentation/Data Storage/MySQLd.md | 2 +- Add-on Documentation/Data Storage/MySQLs.md | 2 +- Add-on Documentation/Deployment/SSL.md | 4 +-- .../Messaging & Mobile/SendGrid.md | 2 +- Guides/Java/AWS S3.md | 2 +- Guides/Java/Add-on credentials.md | 6 ++--- Guides/Java/Clojure - HelloWorld.md | 4 +-- Guides/Java/Gradle - HelloWorld.md | 4 +-- Guides/Java/Grails.md | 4 +-- Guides/Java/Java - HelloWorld.md | 4 +-- Guides/Java/Java - Play 2.md | 4 +-- Guides/Java/Java - Spring-Boot.md | 4 +-- Guides/Java/Java - Spring.md | 8 +++--- Guides/Java/Java - Tomcat.md | 4 +-- Guides/Java/Play - HelloWorld.md | 6 ++--- Guides/Java/Scala - HelloWorld.md | 4 +-- Guides/Migration Guides/An Introduction.md | 4 +-- .../Converting dotcloud.yml.md | 26 +++++++++---------- Guides/NodeJS/AWS S3.md | 2 +- Guides/NodeJS/Add-on credentials.md | 4 +-- Guides/NodeJS/Express.md | 6 ++--- Guides/NodeJS/HelloWorld.md | 6 ++--- Guides/NodeJS/Sailsjs.md | 8 +++--- Guides/PHP/Add-on credentials.md | 4 +-- Guides/PHP/HelloWorld.md | 6 ++--- Guides/PHP/Zend 2.md | 2 +- Guides/Python/AWS S3.md | 2 +- Guides/Python/Add-on credentials.md | 4 +-- Guides/Python/Celery.md | 2 +- Guides/Python/Django notes.md | 12 ++++----- Guides/Python/Django.md | 22 ++++++++-------- Guides/Python/HelloWorld.md | 2 +- Guides/Python/Tornado.md | 2 +- Guides/Ruby/AWS S3.md | 2 +- Guides/Ruby/Add-on credentials.md | 4 +-- Guides/Ruby/HelloWorld.md | 6 ++--- Guides/Ruby/Ruby on Rails.md | 14 +++++----- Guides/Ruby/RubyNotes.md | 2 +- .../Third-Party Buildpacks/Go HelloWorld.md | 2 +- Guides/Third-Party Buildpacks/Go Martini.md | 2 +- Guides/Third-Party Buildpacks/Go Revel.md | 2 +- .../Third-Party Buildpacks.md | 2 +- Platform Documentation.md | 16 ++++++------ Quickstart.md | 2 +- 48 files changed, 120 insertions(+), 120 deletions(-) diff --git a/Add-on Documentation/Data Processing/CloudAMQP.md b/Add-on Documentation/Data Processing/CloudAMQP.md index def43e4..49b424c 100644 --- a/Add-on Documentation/Data Processing/CloudAMQP.md +++ b/Add-on Documentation/Data Processing/CloudAMQP.md @@ -37,7 +37,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.remove cloudamqp.OPTION ## Add-on credentials -It's recommended to read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. +It's recommended to read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://next.dotcloud.com/dev-center/platform-documentation#add-ons) in the general documentation. ## PHP AMQP Example Application diff --git a/Add-on Documentation/Data Processing/Worker.md b/Add-on Documentation/Data Processing/Worker.md index da8fa41..0902b22 100644 --- a/Add-on Documentation/Data Processing/Worker.md +++ b/Add-on Documentation/Data Processing/Worker.md @@ -89,7 +89,7 @@ For more details refer to the [PHP example](#php-worker-example) below. ## Worker log -As already explained in the [Logging section](https://next.dotcloud.com/dev-center/Platform%20Documentation#logging) all stdout and stderr output of workers is redirected to the worker log. To see the output in a tail -f like fashion use the log command. +As already explained in the [Logging section](https://next.dotcloud.com/dev-center/platform-documentation#logging) all stdout and stderr output of workers is redirected to the worker log. To see the output in a tail -f like fashion use the log command. ~~~ $ cctrlapp APP_NAME/DEP_NAME log worker diff --git a/Add-on Documentation/Data Storage/ElephantSQL.md b/Add-on Documentation/Data Storage/ElephantSQL.md index bbf7377..b624bd3 100644 --- a/Add-on Documentation/Data Storage/ElephantSQL.md +++ b/Add-on Documentation/Data Storage/ElephantSQL.md @@ -46,6 +46,6 @@ $ cctrlapp APP_NAME/DEP_NAME addon.remove elephantsql.OPTION ### Internal Access -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. +It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://next.dotcloud.com/dev-center/platform-documentation#add-ons) in the general documentation. You can also find a ready-to-deploy example application on [Github](https://github.com/ElephantSQL/ruby-postgresql-example.git). diff --git a/Add-on Documentation/Data Storage/MongoSoup.md b/Add-on Documentation/Data Storage/MongoSoup.md index b865f0a..a7f9658 100644 --- a/Add-on Documentation/Data Storage/MongoSoup.md +++ b/Add-on Documentation/Data Storage/MongoSoup.md @@ -71,7 +71,7 @@ Here are some snippets of code to help you get started: ### Java For reading CloudControl credentials you can use the Credentials class as -described in [Reading the Credentials](https://next.dotcloud.com/dev-center/Guides/Java/Add-on%20credentials) +described in [Reading the Credentials](https://next.dotcloud.com/dev-center/guides/java/add-on-credentials) article. ```java diff --git a/Add-on Documentation/Data Storage/MySQLd.md b/Add-on Documentation/Data Storage/MySQLd.md index 3437933..f90822a 100644 --- a/Add-on Documentation/Data Storage/MySQLd.md +++ b/Add-on Documentation/Data Storage/MySQLd.md @@ -141,6 +141,6 @@ $ mysql -u MYSQLD_USER -p --host=MYSQLD_SERVER --ssl-ca=PATH_TO_CERTIFICATE/ca-c [Google Cloud SQL]: https://developers.google.com/cloud-sql/ [Config Add-on]: https://next.dotcloud.com/add-ons/config [MySQLd]: https://next.dotcloud.com/add-ons/mysqld -[Add-on Credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons +[Add-on Credentials]: https://next.dotcloud.com/dev-center/platform-documentation#add-ons [Email us]: mailto:support@cloudcontrol.de [Webconsole]: https://next.dotcloud.com/console/login diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index baaa3cf..32c80a2 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -84,7 +84,7 @@ SHOW CHARSET; It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the -section about [Add-on Credentials](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) in +section about [Add-on Credentials](https://next.dotcloud.com/dev-center/platform-documentation#add-ons) in the general documentation. ### External Access diff --git a/Add-on Documentation/Deployment/SSL.md b/Add-on Documentation/Deployment/SSL.md index e719572..2b1160f 100644 --- a/Add-on Documentation/Deployment/SSL.md +++ b/Add-on Documentation/Deployment/SSL.md @@ -1,7 +1,7 @@ # SSL Add-on This add-on provides SSL support for custom domains (e.g. "www.example.com") -that you have added to your application using the [alias addon](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Alias). +that you have added to your application using the [alias addon](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/alias). ## Overview @@ -15,7 +15,7 @@ sections, to add SSL support for custom domains to your deployment: * Set your DNS entry to point to your SSL DNS Domain. Root or naked domains like `example.com` without a subdomain are not -directly supported. For details, please see the [alias addon](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Alias) documentation. +directly supported. For details, please see the [alias addon](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/alias) documentation. ### Acquiring an SSL Certificate diff --git a/Add-on Documentation/Messaging & Mobile/SendGrid.md b/Add-on Documentation/Messaging & Mobile/SendGrid.md index ace0bbc..9344c67 100644 --- a/Add-on Documentation/Messaging & Mobile/SendGrid.md +++ b/Add-on Documentation/Messaging & Mobile/SendGrid.md @@ -40,7 +40,7 @@ Once you added a SendGrid plan, you need to login once at http://sendgrid.com wi ## Internal access credentials -It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. +It's recommended to the read database credentials from the creds.json file. The location of the file is available in the `CRED_FILE` environment variable. Reading the credentials from the creds.json file ensures your app is always using the correct credentials. For detailed instructions on how to use the creds.json file please refer to the section about [Add-on Credentials](https://next.dotcloud.com/dev-center/platform-documentation#add-ons) in the general documentation. The JSON file has the following structure: diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index 75293d0..098cd0a 100644 --- a/Guides/Java/AWS S3.md +++ b/Guides/Java/AWS S3.md @@ -26,7 +26,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config): ~~~bash $ cctrlapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] diff --git a/Guides/Java/Add-on credentials.md b/Guides/Java/Add-on credentials.md index 66ce392..82b6809 100644 --- a/Guides/Java/Add-on credentials.md +++ b/Guides/Java/Add-on credentials.md @@ -96,9 +96,9 @@ String password = credentials[1]; [Java application with MySQL]: https://github.com/cloudControl/java-mysql-example-app [Add-on Marketplace]: https://next.dotcloud.com/add-ons/?c=1 -[environment variables]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables -[Add-on credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials -[cred-env-vars]: https://next.dotcloud.com/dev-center/Platform%20Documentation#enabling-disabling-credentials-environment-variables +[environment variables]: https://next.dotcloud.com/dev-center/platform-documentation#environment-variables +[Add-on credentials]: https://next.dotcloud.com/dev-center/platform-documentation#add-on-credentials +[cred-env-vars]: https://next.dotcloud.com/dev-center/platform-documentation#enabling-disabling-credentials-environment-variables [json-simple]: http://code.google.com/p/json-simple/ [dotCloud credentials helper class]: https://gist.github.com/b350762c61fcc069b427 [MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld diff --git a/Guides/Java/Clojure - HelloWorld.md b/Guides/Java/Clojure - HelloWorld.md index dfa4035..b3b235f 100644 --- a/Guides/Java/Clojure - HelloWorld.md +++ b/Guides/Java/Clojure - HelloWorld.md @@ -78,7 +78,7 @@ Congratulations, you can now see your Clojure application running at `http[s]:// [dotCloud]: https://next.dotcloud.com/ [Clojure buildpack]: https://github.com/cloudControl/buildpack-clojure -[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [Leiningen]: http://leiningen.org/ diff --git a/Guides/Java/Gradle - HelloWorld.md b/Guides/Java/Gradle - HelloWorld.md index 295684c..741f8fd 100644 --- a/Guides/Java/Gradle - HelloWorld.md +++ b/Guides/Java/Gradle - HelloWorld.md @@ -93,6 +93,6 @@ Congratulations, you can now see your Gradle application running at `http[s]://A [dotCloud]: https://next.dotcloud.com/ [Gradle buildpack]: https://github.com/cloudControl/buildpack-gradle -[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Grails.md b/Guides/Java/Grails.md index 6975906..9777bb4 100644 --- a/Guides/Java/Grails.md +++ b/Guides/Java/Grails.md @@ -102,7 +102,7 @@ Congratulations, you can now see your Grails application running at `http[s]://A [dotCloud]: https://next.dotcloud.com/ [Grails buildpack]: https://github.com/cloudControl/buildpack-grails -[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [Ivy]: http://ant.apache.org/ivy/ diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index cd5308c..77d018f 100644 --- a/Guides/Java/Java - HelloWorld.md +++ b/Guides/Java/Java - HelloWorld.md @@ -109,7 +109,7 @@ Congratulations, you can now see your Jetty Application running at `http[s]://AP [Jetty]: http://jetty.codehaus.org/jetty/ [dotCloud]: https://next.dotcloud.com/ [Java buildpack]: https://github.com/cloudControl/buildpack-java -[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Maven dependency plugin]: http://maven.apache.org/plugins/maven-dependency-plugin/ -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Java - Play 2.md b/Guides/Java/Java - Play 2.md index 3919171..4e33748 100644 --- a/Guides/Java/Java - Play 2.md +++ b/Guides/Java/Java - Play 2.md @@ -109,8 +109,8 @@ use one of our available [Data Storage Add-ons]. [Play 2.3.x]: https://www.playframework.com/documentation/2.3.x/Home [dotCloud]: https://next.dotcloud.com/ [Scala buildpack]: https://github.com/cloudControl/buildpack-scala -[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [sbt]: http://www.scala-sbt.org/ [Data Storage Add-ons]: https://next.dotcloud.com/add-ons?c=1 diff --git a/Guides/Java/Java - Spring-Boot.md b/Guides/Java/Java - Spring-Boot.md index 94c9895..f1c15ae 100644 --- a/Guides/Java/Java - Spring-Boot.md +++ b/Guides/Java/Java - Spring-Boot.md @@ -138,7 +138,7 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.cloudcontrolled.c [Jetty server]: http://www.eclipse.org/jetty/ [Spring Boot]: http://projects.spring.io/spring-boot/ [examples]: https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples -[Database credentials]: Add-on%20credentials +[Database credentials]: add-on-credentials [dotCloud]: / -[MySQLs Add-on]: ../../Add-on%20Documentation/Data%20Storage/MySQLs +[MySQLs Add-on]: ../../add-on-documentation/data-storage/MySQLs [hsqlDB]: http://hsqldb.org/ diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index 788fbd4..61c4fc4 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -147,9 +147,9 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.cloudcontrolled.c [Spring Roo petclinic]: http://static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sample -[Database credentials]: Add-on%20credentials +[Database credentials]: add-on-credentials [Jetty Runner]: http://wiki.eclipse.org/Jetty/Howto/Using_Jetty_Runner [dotCloud]: / -[file system]: ../../Platform%20Documentation#non-persistent-filesystem -[log command]: ../../Platform%20Documentation#logging -[Shared MySQL Add-on]: ../../Add-on%20Documentation/Data%20Storage/MySQLs +[file system]: ../../platform-documentation#non-persistent-filesystem +[log command]: ../../platform-documentation#logging +[Shared MySQL Add-on]: ../../add-on-documentation/data-storage/MySQLs diff --git a/Guides/Java/Java - Tomcat.md b/Guides/Java/Java - Tomcat.md index dfb28db..6056848 100644 --- a/Guides/Java/Java - Tomcat.md +++ b/Guides/Java/Java - Tomcat.md @@ -167,7 +167,7 @@ Congratulations, you can now see your JSP Application running on Tomcat at `http [Tomcat]: https://tomcat.apache.org/ [dotCloud]: https://next.dotcloud.com/ [Java buildpack]: https://github.com/cloudControl/buildpack-java -[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Application Assembler Maven Plugin]: http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/ -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Play - HelloWorld.md b/Guides/Java/Play - HelloWorld.md index 82e1866..0926d05 100644 --- a/Guides/Java/Play - HelloWorld.md +++ b/Guides/Java/Play - HelloWorld.md @@ -80,8 +80,8 @@ Congratulations, you can now see your Play! application running at `http[s]://AP [dotCloud]: https://next.dotcloud.com/ [Play buildpack]: https://github.com/cloudControl/buildpack-play -[Play 2 tutorial]: https://next.dotcloud.com/dev-center/Guides/Java/Java%20-%20Play%202 -[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[Play 2 tutorial]: https://next.dotcloud.com/dev-center/guides/java/java---play-2 +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [Ivy]: http://ant.apache.org/ivy/ diff --git a/Guides/Java/Scala - HelloWorld.md b/Guides/Java/Scala - HelloWorld.md index 6bb01e6..c6ef963 100644 --- a/Guides/Java/Scala - HelloWorld.md +++ b/Guides/Java/Scala - HelloWorld.md @@ -91,7 +91,7 @@ Congratulations, you can now see your Scala application running at `http[s]://AP [dotCloud]: https://next.dotcloud.com/ [Scala buildpack]: https://github.com/cloudControl/buildpack-scala [sbt]: http://www.scala-sbt.org/ -[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [sbt]: http://www.scala-sbt.org/ diff --git a/Guides/Migration Guides/An Introduction.md b/Guides/Migration Guides/An Introduction.md index 320432c..8e818db 100644 --- a/Guides/Migration Guides/An Introduction.md +++ b/Guides/Migration Guides/An Introduction.md @@ -50,8 +50,8 @@ Yes! Next dotCloud still behaves in all the ways you'd expect. # Where should I begin? -A good place to start is to read the [Quickstart](https://next.dotcloud.com/dev-center/Quickstart) -and [Platform Documentation](https://next.dotcloud.com/dev-center/Platform%20Documentation) +A good place to start is to read the [Quickstart](https://next.dotcloud.com/dev-center/quickstart) +and [Platform Documentation](https://next.dotcloud.com/dev-center/platform-documentation) to get familiar with the Next dotCloud PaaS. Then read the docs [here](https://next.dotcloud.com/dev-center/dotcloud-nextdotcloud-migration/cli-cheatsheet) comparing the dotCloud diff --git a/Guides/Migration Guides/Converting dotcloud.yml.md b/Guides/Migration Guides/Converting dotcloud.yml.md index 820e1bd..84dcd61 100644 --- a/Guides/Migration Guides/Converting dotcloud.yml.md +++ b/Guides/Migration Guides/Converting dotcloud.yml.md @@ -10,11 +10,11 @@ To better understand the differences between the dotcloud.yml file and the Procf dotCloud applications are built around several service types which you can define in the dotcloud.yml file. Each service runs different a process and has a different end point. This means that a single dotCloud application can combine, for example, a Ruby on Rails and a Python Flask implementation as two services in the same app. -On Next dotCloud, each application runs one main process – a web process. Each app also has only one type that you define when you create the app – this depends on which language the app is written in, and determines which [buildpack](https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile) will create the image for your deployments on the platform. +On Next dotCloud, each application runs one main process – a web process. Each app also has only one type that you define when you create the app – this depends on which language the app is written in, and determines which [buildpack](https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile) will create the image for your deployments on the platform. -To port apps with several different languages onto Next dotCloud, you’ll need to create several applications – one for each type. However, many dotCloud services that aren’t related to the code itself, such as databases, are handled as [Add-ons](https://next.dotcloud.com/dev-center/Add-on%20Documentation) on Next dotCloud. These integrate directly with your application and don’t require you to create multiple applications. +To port apps with several different languages onto Next dotCloud, you’ll need to create several applications – one for each type. However, many dotCloud services that aren’t related to the code itself, such as databases, are handled as [Add-ons](https://next.dotcloud.com/dev-center/add-on-documentation) on Next dotCloud. These integrate directly with your application and don’t require you to create multiple applications. -You can run several [workers](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) within a single application on Next dotCloud. These are handled as background processes of the application and use exactly the same runtime environment as the app. +You can run several [workers](https://next.dotcloud.com/dev-center/add-on-documentation/data-processing/worker) within a single application on Next dotCloud. These are handled as background processes of the application and use exactly the same runtime environment as the app. ### App structure on dotCloud ~~~text @@ -135,7 +135,7 @@ worker_b: python otherworker.py Note that in the Procfile, only the web and worker processes are defined. Each line in the Procfile is actually a shell command that will run just like you define it. This means you can customize the start options for your processes here. ## servicename and type -Your application on dotCloud can have multiple services, each with its own unique name that you define. On dotCloud, service names are fairly arbitrary. On Next dotCloud, services are handled quite differently because of how the platform is built. There are two types of processes on Next dotCloud, each of which is specifically defined: web processes, and worker processes. All other services are handled via [Add-ons](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons) and are not defined in the Procfile. +Your application on dotCloud can have multiple services, each with its own unique name that you define. On dotCloud, service names are fairly arbitrary. On Next dotCloud, services are handled quite differently because of how the platform is built. There are two types of processes on Next dotCloud, each of which is specifically defined: web processes, and worker processes. All other services are handled via [Add-ons](https://next.dotcloud.com/dev-center/platform-documentation#add-ons) and are not defined in the Procfile. ### Type: (language) / web process On Next dotCloud, each application is based around one main, language-specific web process. This is because the Next dotCloud platform uses Buildpacks – a language-specific set of scripts that builds the images for your apps based on the language you specify. @@ -149,14 +149,14 @@ Once you’ve created the application, you need to set the web process and speci ### Type: (language)-worker / worker process On Next dotCloud, you can define multiple workers in the Procfile that will run as background processes in that application. They use the exact same runtime environment as the web process. -To use this functionality, you need to add the [Worker Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker) to your app. +To use this functionality, you need to add the [Worker Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/data-processing/worker) to your app. ### Non-code services / Add-ons In the dotcloud.yml file, you can define many different kinds of services within the app, including databases like MySQL, or other services like Redis. A Procfile on Next dotCloud only specifies your web and worker processes. This is very different from a dotcloud.yml file. -On Next dotCloud, "Data Services" like MySQL and Redis, as well as many other types of services like logging, monitoring and even SSL, are handled outside of the Procfile with [Add-ons](https://next.dotcloud.com/dev-center/Platform%20Documentation#add-ons). You can simply add them to your web app in the CLI with `dcapp addon.add`. This automatically connects the services to your app. +On Next dotCloud, "Data Services" like MySQL and Redis, as well as many other types of services like logging, monitoring and even SSL, are handled outside of the Procfile with [Add-ons](https://next.dotcloud.com/dev-center/platform-documentation#add-ons). You can simply add them to your web app in the CLI with `dcapp addon.add`. This automatically connects the services to your app. -To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config). +To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config). ### Example dotcloud.yml to Procfile migration @@ -181,7 +181,7 @@ worker: celery -A tasks worker --loglevel=info The entry for the web or worker process will be executed as a shell command. -For more specific details, please see the [porting guides](https://github.com/cloudControl/documentation/tree/master/Guides/dotCloud-cloudControl%20migration) specific to your language of choice. Please note that we will continually update these guides to include all of the languages officially supported on Next dotCloud. +For more specific details, please see the [porting guides](https://github.com/cloudControl/documentation/tree/master/Guides/dotCloud-cloudControl-migration) specific to your language of choice. Please note that we will continually update these guides to include all of the languages officially supported on Next dotCloud. ## approot You may have used the approot directive in dotcloud.yml to tell the platform where to find the code to run, but the Next dotCloud Procfile lets you set this first command explicitly, so you don't need an approot. If you need to change directory before running your first statement, you can do that in the command of the Procfile: @@ -200,7 +200,7 @@ The officially supported Buildpacks on Next dotCloud consist of a standard set o If you have applications on dotCloud that use prebuild and postbuild hooks, it’s worthwhile to try pushing and deploying them using one of the officially supported Buildpacks first. The stack may already have the components you need installed and it may work out of the box. -If not, you may need make modifications to a standard buildpack and use it as a [custom Buildpack](https://next.dotcloud.com/dev-center/Guides/Third-Party%20Buildpacks/Third-Party%20Buildpacks). First download the Buildpack for your app’s language type from [Next dotCloud’s public Github repo](https://github.com/cloudControl?query=buildpack) and modify the `bin/compile` script according to your needs. (Keep in mind that only the `/app` folder is writeable, so you can’t use the Ubuntu package manager to install libraries.) Upload your new custom Buildpack to a public non-ssh git repository, and create your application with the apptype `custom --buildpack BUILDPACK_URL`. +If not, you may need make modifications to a standard buildpack and use it as a [custom Buildpack](https://next.dotcloud.com/dev-center/guides/third-party-buildpacks/third-party-buildpacks). First download the Buildpack for your app’s language type from [Next dotCloud’s public Github repo](https://github.com/cloudControl?query=buildpack) and modify the `bin/compile` script according to your needs. (Keep in mind that only the `/app` folder is writeable, so you can’t use the Ubuntu package manager to install libraries.) Upload your new custom Buildpack to a public non-ssh git repository, and create your application with the apptype `custom --buildpack BUILDPACK_URL`. ### postinstall scripts If you have a postinstall script, you can run the same step as part of your Procfile command, e.g. Procfile: @@ -216,19 +216,19 @@ There are a couple of ways to migrate your dotcloud.yml config section, dependin If you’re using the config section to specify an interpreter version (e.g. Python 2.6 vs. Python 2.7), check the [Next dotCloud buildpack documentation on Github](https://github.com/cloudcontrol?query=buildpack) for how to do this with your specific buildpack. For example, you can specify the Python version by creating a runtime.txt file to replace your dotcloud.yml config: python_version. -If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. +If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. -For more information, read our guide on [migrating environment variables](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) from dotCloud to Next dotCloud. +For more information, read our guide on [migrating environment variables](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl-migration/Migrating-environment.md) from dotCloud to Next dotCloud. ## ports If you have a ports section in your dotcloud.yml then you should only have one port listed, a single http type port. That is the only kind of port allowed on the Next dotCloud PaaS. You can only have one process which listens to an HTTP port. If you do have multiple services each with their own HTTP port, then you should consider how to either separate these into different applications or how to access each different function via a different URL path (e.g. if you used to have an "admin" interface as well as a public interface, move your "admin" interface to be part of your public interface on another path, like "www.example.com/admin"). -Note that Next dotCloud containers do not expose an SSH port. See the [Secure Shell docs](https://next.dotcloud.com/dev-center/Platform%20Documentation#secure-shell-ssh). +Note that Next dotCloud containers do not expose an SSH port. See the [Secure Shell docs](https://next.dotcloud.com/dev-center/platform-documentation#secure-shell-ssh). ## environment -If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config) and our [dedicated guide](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl%20migration/Migrating%20environment.md) on this topic. +If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config) and our [dedicated guide](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl-migration/Migrating-environment.md) on this topic. Note that the same variables are set in all your application processes (web and worker) -- you cannot specify that a variable should only be set on one process (as you could in a dotcloud.yml file). diff --git a/Guides/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index 538a6ed..a25d503 100644 --- a/Guides/NodeJS/AWS S3.md +++ b/Guides/NodeJS/AWS S3.md @@ -94,4 +94,4 @@ You can build rich Node.js apps using more advanced S3 operations. To learn more [npm package manager]: https://npmjs.org/ [Amazon Guide]: http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-intro.html [AWS access credentials]: http://aws.amazon.com/security-credentials -[Config Add-on]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config +[Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config diff --git a/Guides/NodeJS/Add-on credentials.md b/Guides/NodeJS/Add-on credentials.md index f1df776..7731664 100644 --- a/Guides/NodeJS/Add-on credentials.md +++ b/Guides/NodeJS/Add-on credentials.md @@ -91,8 +91,8 @@ var port = elephantSQLUrl.port; ~~~ [Add-on Marketplace]: https://next.dotcloud.com/add-ons -[environment variables]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables +[environment variables]: https://next.dotcloud.com/dev-center/platform-documentation#environment-variables [MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld [MySQL Shared Add-on]: https://next.dotcloud.com/add-ons/mysqls -[Add-on credentials]:https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials +[Add-on credentials]:https://next.dotcloud.com/dev-center/platform-documentation#add-on-credentials [ElephantSQL Add-on]: https://next.dotcloud.com/add-ons/elephantsql diff --git a/Guides/NodeJS/Express.md b/Guides/NodeJS/Express.md index bd875f7..434512d 100644 --- a/Guides/NodeJS/Express.md +++ b/Guides/NodeJS/Express.md @@ -157,8 +157,8 @@ applications. [npm]: https://npmjs.org/ [dotCloud]: http://next.dotcloud.com [Node.js buildpack]: https://github.com/cloudControl/buildpack-nodejs -[get-conf]: https://next.dotcloud.com/dev-center/Guides/NodeJS/Add-on%20credentials -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[platform documentation]: https://next.dotcloud.com/dev-center/Platform%20Documentation +[get-conf]: https://next.dotcloud.com/dev-center/guides/nodejs/add-on-credentials +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile +[platform documentation]: https://next.dotcloud.com/dev-center/platform-documentation [Data Storage]: https://next.dotcloud.com/add-ons?c=1 [MongoSoup]: https://next.dotcloud.com/add-ons/mongosoup diff --git a/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index 9507ed4..628a4dd 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -133,10 +133,10 @@ Building a data app with Node.js? Check out our next [example on how to use Node Good luck building your apps using Node.js and dotCloud. -[example on how to use Node.js with MongoDB]: https://next.dotcloud.com/dev-center/Guides/NodeJS/Express +[example on how to use Node.js with MongoDB]: https://next.dotcloud.com/dev-center/guides/nodejs/express [Node.js]: http://nodejs.org/ [npm]: https://npmjs.org/ [dotCloud]: http://next.dotcloud.com [Node.js buildpack]: https://github.com/cloudControl/buildpack-nodejs -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[platform documentation]: https://next.dotcloud.com/dev-center/Platform%20Documentation +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile +[platform documentation]: https://next.dotcloud.com/dev-center/platform-documentation diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index d2a0340..0ae9832 100644 --- a/Guides/NodeJS/Sailsjs.md +++ b/Guides/NodeJS/Sailsjs.md @@ -149,8 +149,8 @@ Congratulations, you can now see your Sails.js application running at [Ruby on Rails]: http://rubyonrails.org/ [npm]: https://npmjs.org/ [dotCloud]: http://next.dotcloud.com -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[get the MySQL credentials]: https://next.dotcloud.com/dev-center/Guides/NodeJS/Add-on%20credentials +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile +[get the MySQL credentials]: https://next.dotcloud.com/dev-center/guides/nodejs/add-on-credentials [websockets]: http://socket.io/ -[dotCloud websockets documentation]: https://next.dotcloud.com/dev-center/Platform%20Documentation#websockets -[Shared MySQL Add-on]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs +[dotCloud websockets documentation]: https://next.dotcloud.com/dev-center/platform-documentation#websockets +[Shared MySQL Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/mysqls diff --git a/Guides/PHP/Add-on credentials.md b/Guides/PHP/Add-on credentials.md index e3f01a0..1cf4b1c 100644 --- a/Guides/PHP/Add-on credentials.md +++ b/Guides/PHP/Add-on credentials.md @@ -80,8 +80,8 @@ $db_config = array( ); ~~~ -[env-vars]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables -[Add-on credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials +[env-vars]: https://next.dotcloud.com/dev-center/platform-documentation#environment-variables +[Add-on credentials]: https://next.dotcloud.com/dev-center/platform-documentation#add-on-credentials [Add-on Marketplace]: https://next.dotcloud.com/add-ons/ [MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld [MySQL Shared Add-on]: https://next.dotcloud.com/add-ons/mysqls diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 6472c97..2e49ad9 100644 --- a/Guides/PHP/HelloWorld.md +++ b/Guides/PHP/HelloWorld.md @@ -113,10 +113,10 @@ Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.c [silex]: http://silex.sensiolabs.org/ [dotCloud]: http://next.dotcloud.com -[dotCloud-doc-user]: https://next.dotcloud.com/dev-center/Platform%20Documentation#user-accounts -[dotCloud-doc-cmdline]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api "documentation of the dotCloud-command-line-client" +[dotCloud-doc-user]: https://next.dotcloud.com/dev-center/platform-documentation#user-accounts +[dotCloud-doc-cmdline]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api "documentation of the dotCloud-command-line-client" [php buildpack]: https://github.com/cloudControl/buildpack-php -[procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git [composer]: http://getcomposer.org/ [example-app]: https://github.com/cloudControl/php-silex-example-app diff --git a/Guides/PHP/Zend 2.md b/Guides/PHP/Zend 2.md index 54d215f..650a2a8 100644 --- a/Guides/PHP/Zend 2.md +++ b/Guides/PHP/Zend 2.md @@ -188,7 +188,7 @@ $ cctrlapp APP_NAME/default deploy To store the sessions we need to add a database Add-on and initialize the table. -We are going to use [the MySQLs Add-on's free plan](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs). It provides a free shared database for testing and development. +We are going to use [the MySQLs Add-on's free plan](https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/mysqls). It provides a free shared database for testing and development. Creating the session table is easy by executing the included init-session-table command in a run-container: diff --git a/Guides/Python/AWS S3.md b/Guides/Python/AWS S3.md index e5c87c5..3305758 100644 --- a/Guides/Python/AWS S3.md +++ b/Guides/Python/AWS S3.md @@ -21,7 +21,7 @@ boto==2.9.8 ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config): ~~~bash $ cctrlapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] diff --git a/Guides/Python/Add-on credentials.md b/Guides/Python/Add-on credentials.md index b64b990..85dd635 100644 --- a/Guides/Python/Add-on credentials.md +++ b/Guides/Python/Add-on credentials.md @@ -108,8 +108,8 @@ db_config = { } ~~~ -[env-vars]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables -[Add-on credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials +[env-vars]: https://next.dotcloud.com/dev-center/platform-documentation#environment-variables +[Add-on credentials]: https://next.dotcloud.com/dev-center/platform-documentation#add-on-credentials [Add-on Marketplace]: https://next.dotcloud.com/add-ons/ [Custom Config Add-on]: https://next.dotcloud.com/add-ons/config [MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld diff --git a/Guides/Python/Celery.md b/Guides/Python/Celery.md index 1687313..df35cdd 100644 --- a/Guides/Python/Celery.md +++ b/Guides/Python/Celery.md @@ -215,4 +215,4 @@ This guide showed how to run both Flower aswell as a Celery worker on dotCloud b [celeryguide]: http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html [Flower]: http://docs.celeryproject.org/en/latest/userguide/monitoring.html#flower-real-time-celery-web-monitor [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index bb91cf0..f221c0a 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -25,12 +25,12 @@ To use a database, you should choose an Add-on from [the Data Storage category][ ## Email You can't use a local SMTP server, instead choose one of our [email Add-ons][messaging-addons]. -[SSH-session]: https://next.dotcloud.com/dev-center/Platform%20Documentation#secure-shell-ssh +[SSH-session]: https://next.dotcloud.com/dev-center/platform-documentation#secure-shell-ssh [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ -[procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[messaging-addons]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Messaging%20&%20Mobile/ -[data-storage-addons]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/ -[add-on-credentials]: https://next.dotcloud.com/dev-center/Guides/Python/Add-on%20credentials +[procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile +[messaging-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/messaging-&-mobile/ +[data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/ +[add-on-credentials]: https://next.dotcloud.com/dev-center/guides/python/add-on-credentials [dotCloud]: https://next.dotcloud.com/ -[worker]: https://next.dotcloud.com/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers +[worker]: https://next.dotcloud.com/dev-center/platform-documentation#scheduled-jobs-and-background-workers diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index babfbd3..0b32736 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -162,22 +162,22 @@ other [python-specific documents][python-guides]. [django]: https://www.djangoproject.com/ [dotCloud]: http://next.dotcloud.com -[dotCloud-doc-user]: https://next.dotcloud.com/dev-center/Platform%20Documentation#user-accounts -[dotCloud-doc-cmdline]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[dotCloud-doc-user]: https://next.dotcloud.com/dev-center/platform-documentation#user-accounts +[dotCloud-doc-cmdline]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git -[filesystem]: https://next.dotcloud.com/dev-center/Platform%20Documentation#non-persistent-filesystem -[data-storage-addons]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/ -[mysqls]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs +[filesystem]: https://next.dotcloud.com/dev-center/platform-documentation#non-persistent-filesystem +[data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/ +[mysqls]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/mysqls [example-app]: https://github.com/cloudControl/python-django-example-app -[django-notes]: https://next.dotcloud.com/dev-center/Guides/Python/Django%20notes -[get-conf]: https://next.dotcloud.com/dev-center/Guides/Python/Add-on%20credentials +[django-notes]: https://next.dotcloud.com/dev-center/guides/python/django-notes +[get-conf]: https://next.dotcloud.com/dev-center/guides/python/add-on-credentials [Django tutorial]: https://docs.djangoproject.com/en/1.4/intro/tutorial01/ -[python-guides]: https://next.dotcloud.com/dev-center/Guides/Python +[python-guides]: https://next.dotcloud.com/dev-center/guides/python [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ [gunicorn]: http://gunicorn.org/ -[worker]: https://next.dotcloud.com/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers +[worker]: https://next.dotcloud.com/dev-center/platform-documentation#scheduled-jobs-and-background-workers [db-commit]: https://github.com/cloudControl/python-django-example-app/commit/983f45e46ce0707476cec167ea062e19adcb53c9 -[ssh-session]: https://next.dotcloud.com/dev-center/Platform%20Documentation#secure-shell-ssh +[ssh-session]: https://next.dotcloud.com/dev-center/platform-documentation#secure-shell-ssh [mysql-driver]: https://pypi.python.org/pypi/MySQL-python/1.2.5 diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index 8138a21..4b447aa 100644 --- a/Guides/Python/HelloWorld.md +++ b/Guides/Python/HelloWorld.md @@ -82,5 +82,5 @@ Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.c [Flask]: http://flask.pocoo.org/ [dotCloud]: http://next.dotcloud.com [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [example_app]: https://github.com/cloudControl/python-flask-example-app.git diff --git a/Guides/Python/Tornado.md b/Guides/Python/Tornado.md index 948c4fa..6eda85d 100644 --- a/Guides/Python/Tornado.md +++ b/Guides/Python/Tornado.md @@ -128,4 +128,4 @@ Congratulations, you can now see your Tornado app running at `http://APP_NAME.cl [Tornado]: http://www.tornadoweb.org [dotCloud]: http://next.dotcloud.com [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index 8baa0a5..b37e9bb 100644 --- a/Guides/Ruby/AWS S3.md +++ b/Guides/Ruby/AWS S3.md @@ -26,7 +26,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config): ~~~bash $ cctrlapp APP_NAME/default config.add AWS_ACCESS_KEY_ID=[YOUR_SECRET_KEY] AWS_SECRET_ACCESS_KEY=[YOUR_ACCESS_KEY] AWS_REGION='eu-west-1' diff --git a/Guides/Ruby/Add-on credentials.md b/Guides/Ruby/Add-on credentials.md index 572a781..31bf936 100644 --- a/Guides/Ruby/Add-on credentials.md +++ b/Guides/Ruby/Add-on credentials.md @@ -99,8 +99,8 @@ db_config = { You can also find a working example application on [Github][ruby-postgresql-example]. -[Add-on credentials]: https://next.dotcloud.com/dev-center/Platform%20Documentation#add-on-credentials -[environment variables]: https://next.dotcloud.com/dev-center/Platform%20Documentation#environment-variables +[Add-on credentials]: https://next.dotcloud.com/dev-center/platform-documentation#add-on-credentials +[environment variables]: https://next.dotcloud.com/dev-center/platform-documentation#environment-variables [Add-on Marketplace]: https://next.dotcloud.com/add-ons/?c=1 [MySQL Dedicated Add-on]: https://next.dotcloud.com/add-ons/mysqld [MySQL Shared Add-on]: https://next.dotcloud.com/add-ons/mysqls diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index 2a910a6..f581676 100644 --- a/Guides/Ruby/HelloWorld.md +++ b/Guides/Ruby/HelloWorld.md @@ -87,10 +87,10 @@ Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME [sinatra]: http://www.sinatrarb.com/ [dotCloud]: http://next.dotcloud.com -[dotCloud-doc-user]: https://next.dotcloud.com/dev-center/Platform%20Documentation#user-accounts -[dotCloud-doc-cmdline]: https://next.dotcloud.com/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[dotCloud-doc-user]: https://next.dotcloud.com/dev-center/platform-documentation#user-accounts +[dotCloud-doc-cmdline]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [ruby buildpack]: https://github.com/cloudControl/buildpack-ruby -[procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git [bundler]: http://gembundler.com/ [example-app]: https://github.com/cloudControl/ruby-sinatra-example-app diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index a51fc0c..c0b5bb2 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -190,11 +190,11 @@ other [ruby-specific documents][ruby-guides]. [ruby buildpack]: https://github.com/cloudControl/buildpack-ruby [Rails tutorial]: http://ruby.railstutorial.org/ [Bundler]: http://bundler.io/ -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[filesystem]: https://next.dotcloud.com/dev-center/Platform%20Documentation#non-persistent-filesystem -[data-storage-addons]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/ -[postgres-addon]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/ElephantSQL -[run command]: https://next.dotcloud.com/dev-center/Guides/Ruby/RunCommand -[rails-notes]: https://next.dotcloud.com/dev-center/Guides/Ruby/RailsNotes -[ruby-guides]: https://next.dotcloud.com/dev-center/Guides/Ruby +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile +[filesystem]: https://next.dotcloud.com/dev-center/platform-documentation#non-persistent-filesystem +[data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/ +[postgres-addon]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/elephantsql +[run command]: https://next.dotcloud.com/dev-center/guides/ruby/runcommand +[rails-notes]: https://next.dotcloud.com/dev-center/guides/ruby/railsnotes +[ruby-guides]: https://next.dotcloud.com/dev-center/guides/ruby [gem itself]: http://rubygems.org/gems/cloudcontrol-rails diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index e676eeb..3f1eca9 100644 --- a/Guides/Ruby/RubyNotes.md +++ b/Guides/Ruby/RubyNotes.md @@ -111,6 +111,6 @@ NOTE: Gems in development and test environments are excluded from bundle install [cloudcontrol-rails]: https://rubygems.org/gems/cloudcontrol-rails -[procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#version-control--images +[procfile]: https://next.dotcloud.com/dev-center/platform-documentation#version-control--images [rails-procfile]: #rails-procfile [ruby-buildpack]: https://github.com/cloudControl/buildpack-ruby diff --git a/Guides/Third-Party Buildpacks/Go HelloWorld.md b/Guides/Third-Party Buildpacks/Go HelloWorld.md index c30911e..a5ccb98 100644 --- a/Guides/Third-Party Buildpacks/Go HelloWorld.md +++ b/Guides/Third-Party Buildpacks/Go HelloWorld.md @@ -125,4 +125,4 @@ Congratulations, you can now see your Go app running at `http[s]://APP_NAME.clou [Go]: http://golang.org/ [dotCloud]: http://next.dotcloud.com [godep]: https://github.com/tools/godep -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile diff --git a/Guides/Third-Party Buildpacks/Go Martini.md b/Guides/Third-Party Buildpacks/Go Martini.md index 9e9e1b4..5fb44a6 100644 --- a/Guides/Third-Party Buildpacks/Go Martini.md +++ b/Guides/Third-Party Buildpacks/Go Martini.md @@ -138,4 +138,4 @@ $ cctrlapp APP_NAME/default open [Martini]: http://martini.codegangsta.io/ [dotCloud]: https://next.dotcloud.com [Go buildpack]: https://github.com/cloudControl/buildpack-go -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile diff --git a/Guides/Third-Party Buildpacks/Go Revel.md b/Guides/Third-Party Buildpacks/Go Revel.md index 9e6b591..5ced67c 100644 --- a/Guides/Third-Party Buildpacks/Go Revel.md +++ b/Guides/Third-Party Buildpacks/Go Revel.md @@ -122,4 +122,4 @@ $ cctrlapp APP_NAME/default open [Revel]: http://revel.github.io [dotCloud]: https://next.dotcloud.com [Revel buildpack]: https://github.com/revel/heroku-buildpack-go-revel -[Procfile]: https://next.dotcloud.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile diff --git a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md index 0ff22e8..e98238a 100644 --- a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md +++ b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md @@ -38,7 +38,7 @@ You can use any of the aforementioned buildpacks, fork them and make changes acc Before using any third party buildpack you should inspect their source code and proceed with caution. [dotCloud]: https://next.dotcloud.com -[PinkyStack]: https://next.dotcloud.com/dev-center/Platform%20Documentation#stacks +[PinkyStack]: https://next.dotcloud.com/dev-center/platform-documentation#stacks [buildpack-java]: https://github.com/cloudControl/buildpack-java [buildpack-python]: https://github.com/cloudControl/buildpack-python [buildpack-ruby]: https://github.com/cloudControl/buildpack-ruby diff --git a/Platform Documentation.md b/Platform Documentation.md index dfb06a9..ab5202f 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -413,7 +413,7 @@ the credentials file. Set the variable `SET_ENV_VARS` using the [Custom Config Add-on] to either `false` or `true` to explicitly enable or disable this feature. -The guides section has detailed examples about how to get the credentials in different languages ([Ruby](https://next.dotcloud.com/dev-center/Guides/Ruby/Add-on%20credentials), [Python](https://next.dotcloud.com/dev-center/Guides/Python/Add-on%20credentials), [Node.js](https://next.dotcloud.com/dev-center/Guides/NodeJS/Add-on%20credentials), [Java](https://next.dotcloud.com/dev-center/Guides/Java/Add-on%20credentials), [PHP](https://next.dotcloud.com/dev-center/Guides/PHP/Add-on%20credentials)). +The guides section has detailed examples about how to get the credentials in different languages ([Ruby](https://next.dotcloud.com/dev-center/guides/ruby/add-on-credentials), [Python](https://next.dotcloud.com/dev-center/guides/python/add-on-credentials), [Node.js](https://next.dotcloud.com/dev-center/guides/nodejs/add-on-credentials), [Java](https://next.dotcloud.com/dev-center/guides/java/add-on-credentials), [PHP](https://next.dotcloud.com/dev-center/guides/php/add-on-credentials)). To see the format and contents of the credentials file locally, use the `addon.creds` command. ~~~ @@ -574,7 +574,7 @@ SSL support for custom domains is available through the [SSL add-on](https://next.dotcloud.com/add-ons/ssl). Instructions on how to add HTTPS redirects to your application can be -found in the [SSL add-on documentation](https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/SSL#https-redirects). +found in the [SSL add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/ssl#https-redirects). ### Elastic Addresses @@ -832,7 +832,7 @@ $ cctrlapp APP_NAME/DEP_NAME details [generating SSH keys]: https://help.github.com/articles/generating-ssh-keys -[Custom Config Add-on]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Custom%20Config +[Custom Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config [web console]: https://next.dotcloud.com/console [API libraries]: https://github.com/cloudControl [the latest version]: https://download.dotcloudapp.com/windows @@ -840,19 +840,19 @@ $ cctrlapp APP_NAME/DEP_NAME details [reset your password]: https://api.dotcloudapp.com/reset_password/ [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ [Heroku buildpack API]: https://devcenter.heroku.com/articles/buildpack-api -[guides]: https://next.dotcloud.com/dev-center/Guides +[guides]: https://next.dotcloud.com/dev-center/guides [MongoSoup Add-on]: https://next.dotcloud.com/add-ons/mongosoup [Add-on marketplace]: https://next.dotcloud.com/add-ons -[Deployment category]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment +[Deployment category]: https://next.dotcloud.com/dev-center/add-on-documentation/deployment [rsyslog]: http://www.rsyslog.com/ [TLS]: http://en.wikipedia.org/wiki/Transport_Layer_Security [Alias Add-on]: https://next.dotcloud.com/add-ons/alias [MemCachier Add-on]: https://next.dotcloud.com/add-ons/memcachier -[MemCachier Documentation]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Storage/MemCachier +[MemCachier Documentation]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/memcachier [tutorial]: https://www.cloudcontrol.com/blog/best-practice-running-and-analyzing-load-tests-on-your-cloudcontrol-app [Cron Add-on]: https://next.dotcloud.com/add-ons/cron -[Cron Add-on documentation]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Deployment/Cron +[Cron Add-on documentation]: https://next.dotcloud.com/dev-center/add-on-documentation/deployment/cron [Worker Add-on]: https://next.dotcloud.com/add-ons/worker -[Worker Add-on documentation]: https://next.dotcloud.com/dev-center/Add-on%20Documentation/Data%20Processing/Worker +[Worker Add-on documentation]: https://next.dotcloud.com/dev-center/add-on-documentation/data-processing/worker [Ubuntu 10.04 LTS Lucid Lynx]: http://releases.ubuntu.com/lucid/ [Ubuntu 12.04 LTS Precise Pangolin]: http://releases.ubuntu.com/precise/ diff --git a/Quickstart.md b/Quickstart.md index f5a4655..9448e49 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -123,4 +123,4 @@ Grab [our cheatsheet (PDF)](/dev-center/dotcloudng_cheatsheet.pdf) to have the m ## Documentation -To learn more about all the platform features and how to integrate it seamlessly into the development life cycle please refer to the extensive [platform documentation](https://next.dotcloud.com/dev-center/Platform%20Documentation). +To learn more about all the platform features and how to integrate it seamlessly into the development life cycle please refer to the extensive [platform documentation](https://next.dotcloud.com/dev-center/platform-documentation). From 805860ec1c004004d7fb3f44e6505334d129a65e Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 3 Dec 2014 14:40:40 +0100 Subject: [PATCH 27/84] Remove references to non-existing addons --- Add-on Documentation/Deployment/Cron.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Add-on Documentation/Deployment/Cron.md b/Add-on Documentation/Deployment/Cron.md index 69ae0d3..1f6b620 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -19,10 +19,8 @@ timelimit. If you need more control over when and how often tasks are run and/or have tasks that take longer than 120 seconds we recommend using the -[Worker](https://next.dotcloud.com/add-ons/worker) or -[IronWorker](https://next.dotcloud.com/add-ons/iron_worker) Add-on. There -are also the [IronMQ](https://next.dotcloud.com/add-ons/iron_mq) and the -[CloudAMQP](https://next.dotcloud.com/add-ons/cloudamqp) message queues +[Worker](https://next.dotcloud.com/add-ons/worker). There is also +[CloudAMQP](https://next.dotcloud.com/add-ons/cloudamqp) message queue available that can be used to dispatch tasks to the workers. ## Adding the Cron Add-on From 8f390a5c21a439790fc2347c3a16f90c5201af12 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Wed, 3 Dec 2014 15:57:00 +0100 Subject: [PATCH 28/84] Replace cctrlapp with dcapp, cctrluser with dcuser --- .../Data Processing/CloudAMQP.md | 8 +- .../Data Processing/Worker.md | 20 ++--- .../Data Storage/ElephantSQL.md | 8 +- .../Data Storage/MemCachier.md | 6 +- .../Data Storage/MongoSoup.md | 10 +-- Add-on Documentation/Data Storage/MySQLs.md | 10 +-- Add-on Documentation/Deployment/Alias.md | 18 ++-- Add-on Documentation/Deployment/Cron.md | 18 ++-- .../Deployment/Custom Config.md | 14 ++-- Add-on Documentation/Deployment/SSL.md | 8 +- .../Messaging & Mobile/SendGrid.md | 8 +- Guides/Java/AWS S3.md | 2 +- Guides/Java/Add-on credentials.md | 4 +- Guides/Java/Clojure - HelloWorld.md | 8 +- Guides/Java/Gradle - HelloWorld.md | 8 +- Guides/Java/Grails.md | 8 +- Guides/Java/Java - HelloWorld.md | 8 +- Guides/Java/Java - Play 2.md | 8 +- Guides/Java/Java - Spring-Boot.md | 8 +- Guides/Java/Java - Spring.md | 8 +- Guides/Java/Java - Tomcat.md | 8 +- Guides/Java/Play - HelloWorld.md | 8 +- Guides/Java/Scala - HelloWorld.md | 8 +- Guides/NodeJS/AWS S3.md | 2 +- Guides/NodeJS/Add-on credentials.md | 4 +- Guides/NodeJS/Express.md | 8 +- Guides/NodeJS/HelloWorld.md | 8 +- Guides/NodeJS/Sailsjs.md | 8 +- Guides/PHP/Add-on credentials.md | 2 +- Guides/PHP/CakePHP 2.2.1.md | 30 +++---- Guides/PHP/Drupal 7.md | 30 +++---- Guides/PHP/HelloWorld.md | 8 +- Guides/PHP/Joomla 2.5.md | 34 ++++---- Guides/PHP/Kohana 3.2.0.md | 30 +++---- Guides/PHP/Symfony 1.4.md | 32 +++---- Guides/PHP/Yii 1.1.10.md | 36 ++++---- Guides/PHP/Zend 2.md | 12 +-- Guides/PHP/Zend Framework 1.11.md | 38 ++++----- Guides/Python/AWS S3.md | 2 +- Guides/Python/Add-on credentials.md | 4 +- Guides/Python/Celery.md | 34 ++++---- Guides/Python/Django notes.md | 2 +- Guides/Python/Django.md | 10 +-- Guides/Python/HelloWorld.md | 8 +- Guides/Python/Tornado.md | 8 +- Guides/Ruby/AWS S3.md | 2 +- Guides/Ruby/Add-on credentials.md | 4 +- Guides/Ruby/HelloWorld.md | 8 +- Guides/Ruby/Ruby on Rails.md | 10 +-- Guides/Ruby/RubyNotes.md | 2 +- Guides/Ruby/RunCommand.md | 8 +- .../Third-Party Buildpacks/Go HelloWorld.md | 8 +- Guides/Third-Party Buildpacks/Go Martini.md | 10 +-- Guides/Third-Party Buildpacks/Go Revel.md | 10 +-- .../Third-Party Buildpacks.md | 2 +- Platform Documentation.md | 84 +++++++++---------- Quickstart.md | 12 +-- 57 files changed, 362 insertions(+), 362 deletions(-) diff --git a/Add-on Documentation/Data Processing/CloudAMQP.md b/Add-on Documentation/Data Processing/CloudAMQP.md index 49b424c..e2086a1 100644 --- a/Add-on Documentation/Data Processing/CloudAMQP.md +++ b/Add-on Documentation/Data Processing/CloudAMQP.md @@ -7,7 +7,7 @@ CloudAMQP is a hosted RabbitMQ service, with high availability and blazing perfo The Add-on comes in different sizes and prices. It can be added by executing the command addon.add: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add cloudamqp.OPTION +$ dcapp APP_NAME/DEP_NAME addon.add cloudamqp.OPTION ~~~ ".option" represents the plan size, e.g. cloudamqp.lemur @@ -16,7 +16,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.add cloudamqp.OPTION Upgrading to another option can easily be done: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade cloudamqp.OPTION_OLD cloudamqp.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.upgrade cloudamqp.OPTION_OLD cloudamqp.OPTION_NEW ~~~ ## Downgrade the CloudAMQP Add-on @@ -24,7 +24,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.upgrade cloudamqp.OPTION_OLD cloudamqp.OPTION Downgrading to another option can easily be done: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade cloudamqp.OPTION_OLD cloudamqp.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.downgrade cloudamqp.OPTION_OLD cloudamqp.OPTION_NEW ~~~ ## Removing the CloudAMQP Add-on @@ -32,7 +32,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.downgrade cloudamqp.OPTION_OLD cloudamqp.OPTI Similarily, an Add-on can also be removed from the deployment easily. The costs only apply for the time the Add-on was active: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove cloudamqp.OPTION +$ dcapp APP_NAME/DEP_NAME addon.remove cloudamqp.OPTION ~~~ ## Add-on credentials diff --git a/Add-on Documentation/Data Processing/Worker.md b/Add-on Documentation/Data Processing/Worker.md index 0902b22..c393b31 100644 --- a/Add-on Documentation/Data Processing/Worker.md +++ b/Add-on Documentation/Data Processing/Worker.md @@ -23,7 +23,7 @@ signal is send to your worker before the shutdown. Before you can start a worker, add the add-on with the addon.add command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add worker.single +$ dcapp APP_NAME/DEP_NAME addon.add worker.single ~~~ ## Starting a Worker @@ -33,13 +33,13 @@ Workers can be started via the command line client's worker.add command. To specify how to start the worker by adding a new line to your app's `Procfile` and then use that as the `WORKER_NAME`. ~~~ -$ cctrlapp APP_NAME/DEP_NAME worker.add WORKER_NAME [WORKER_PARAMS] +$ dcapp APP_NAME/DEP_NAME worker.add WORKER_NAME [WORKER_PARAMS] ~~~ Enclose multiple WORKER_PARAMS in double quotes. ~~~ -$ cctrlapp APP_NAME/DEP_NAME worker.add WORKER_NAME "PARAM1 PARAM2 PARAM3" +$ dcapp APP_NAME/DEP_NAME worker.add WORKER_NAME "PARAM1 PARAM2 PARAM3" ~~~ ## List Running Workers @@ -47,7 +47,7 @@ $ cctrlapp APP_NAME/DEP_NAME worker.add WORKER_NAME "PARAM1 PARAM2 PARAM3" To get a list of currently running workers use the worker command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME worker +$ dcapp APP_NAME/DEP_NAME worker Workers nr. wrk_id 1 WRK_ID @@ -56,7 +56,7 @@ Workers You can also get all the worker details by appending the WRK_ID to the worker command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME worker WRK_ID +$ dcapp APP_NAME/DEP_NAME worker WRK_ID Worker wrk_id : WRK_ID command : WORKER_NAME @@ -72,7 +72,7 @@ Workers can be either stopped via the command line client or by exiting the proc To stop a running worker via the command line use the worker.remove command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME worker.remove WRK_ID +$ dcapp APP_NAME/DEP_NAME worker.remove WRK_ID ~~~ To get the WRK_ID refer to the listing workers section above. @@ -92,7 +92,7 @@ For more details refer to the [PHP example](#php-worker-example) below. As already explained in the [Logging section](https://next.dotcloud.com/dev-center/platform-documentation#logging) all stdout and stderr output of workers is redirected to the worker log. To see the output in a tail -f like fashion use the log command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME log worker +$ dcapp APP_NAME/DEP_NAME log worker [Fri Dec 17 13:39:41 2010] WRK_ID Started Worker (command: 'WORKER_NAME', parameter: 'PARAM1 PARAM2 PARAM3') [Fri Dec 17 13:39:42 2010] WRK_ID Hello PARAM1 PARAM2 PARAM3 [...] @@ -103,7 +103,7 @@ $ cctrlapp APP_NAME/DEP_NAME log worker To remove the Worker add-on use the addon.remove command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove worker.single +$ dcapp APP_NAME/DEP_NAME addon.remove worker.single ~~~ ## PHP Worker Example @@ -137,8 +137,8 @@ while(true) { Running this worker with the exit code set to 2 would result in the following output and the worker stopping itself. ~~~ -$ cctrlapp APP_NAME/DEP_NAME worker.add WORKER_NAME 2 -$ cctrlapp APP_NAME/DEP_NAME log worker +$ dcapp APP_NAME/DEP_NAME worker.add WORKER_NAME 2 +$ dcapp APP_NAME/DEP_NAME log worker [Tue Apr 12 09:15:54 2011] WRK_ID Started Worker (command: 'WORKER_NAME', parameter: '2') [Tue Apr 12 09:15:54 2011] WRK_ID step: 1 [Tue Apr 12 09:15:55 2011] WRK_ID step: 2 diff --git a/Add-on Documentation/Data Storage/ElephantSQL.md b/Add-on Documentation/Data Storage/ElephantSQL.md index b624bd3..b287c5f 100644 --- a/Add-on Documentation/Data Storage/ElephantSQL.md +++ b/Add-on Documentation/Data Storage/ElephantSQL.md @@ -9,7 +9,7 @@ As a full-featured, open-source relational DBMS (RDBMS), PostgreSQL boasts many To add the ElephantSQL Add-on use the addon.add command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add elephantsql.OPTION +$ dcapp APP_NAME/DEP_NAME addon.add elephantsql.OPTION ~~~ Replace `elephantsql.OPTION` with a valid option, e.g. `elephantsql.turtle`. @@ -20,7 +20,7 @@ When added, ElephantSQL automatically creates a new user account with your email To upgrade from a smaller to a more powerful plan use the addon.upgrade command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade elephantsql.OPTION_OLD elephantsql.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.upgrade elephantsql.OPTION_OLD elephantsql.OPTION_NEW ~~~ Please note: Upgrading works only between shared plans or between dedicated @@ -33,7 +33,7 @@ later. To downgrade to a smaller plan use the addon.downgrade command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade elephantsql.OPTION_OLD elephantsql.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.downgrade elephantsql.OPTION_OLD elephantsql.OPTION_NEW ~~~ ## Removing the ElephantSQL Add-on @@ -41,7 +41,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.downgrade elephantsql.OPTION_OLD elephantsql. The ElephantSQL Add-on can be removed from the deployment by using the addon.remove command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove elephantsql.OPTION +$ dcapp APP_NAME/DEP_NAME addon.remove elephantsql.OPTION ~~~ ### Internal Access diff --git a/Add-on Documentation/Data Storage/MemCachier.md b/Add-on Documentation/Data Storage/MemCachier.md index bd76980..15125e4 100644 --- a/Add-on Documentation/Data Storage/MemCachier.md +++ b/Add-on Documentation/Data Storage/MemCachier.md @@ -9,12 +9,12 @@ Getting started Start by installing the Add-on: - $ cctrlapp APP_NAME/DEP_NAME addon.add memcachier.dev + $ dcapp APP_NAME/DEP_NAME addon.add memcachier.dev You can start with more memory if you know you'll need it: - $ cctrlapp APP_NAME/DEP_NAME addon.add memcachier.100mb - $ cctrlapp APP_NAME/DEP_NAME addon.add memcachier.250mb + $ dcapp APP_NAME/DEP_NAME addon.add memcachier.100mb + $ dcapp APP_NAME/DEP_NAME addon.add memcachier.250mb ... etc ... Next, setup your app to start using the cache. We have documentation for the following languages and frameworks: diff --git a/Add-on Documentation/Data Storage/MongoSoup.md b/Add-on Documentation/Data Storage/MongoSoup.md index a7f9658..57d4204 100644 --- a/Add-on Documentation/Data Storage/MongoSoup.md +++ b/Add-on Documentation/Data Storage/MongoSoup.md @@ -6,10 +6,10 @@ running MongoDB database in virtually no time. ## MongoSoup -The MongoSoup Add-on can be added to any deployment from the cctrlapp command +The MongoSoup Add-on can be added to any deployment from the dcapp command line: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.add mongosoup.OPTION +$ dcapp APP_NAME/DEP_NAME addon.add mongosoup.OPTION ~~~ For your OPTION, select one of MongoSoup's plan offerings: small, medium, @@ -19,7 +19,7 @@ dedicated-xlarge For more information, click ## For example: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.add mongosoup.large +$ dcapp APP_NAME/DEP_NAME addon.add mongosoup.large ~~~ When added, MongoSoup automatically creates a new user account and database in @@ -133,9 +133,9 @@ changes are required. ## Removing MongoSoup -If you'd like to remove the MongoSoup add-on, use the cctrlapp command line: +If you'd like to remove the MongoSoup add-on, use the dcapp command line: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.remove mongosoup.OPTION +$ dcapp APP_NAME/DEP_NAME addon.remove mongosoup.OPTION ~~~ Note: All data in your database will be lost if you remove the MongoSoup diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 32c80a2..98639fd 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -9,7 +9,7 @@ recommend one of the dedicated [MySQLd Add-on](https://next.dotcloud.com/add-ons The database comes in different sizes and prices. It can be added using the addon.add command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add mysqls.OPTION +$ dcapp APP_NAME/DEP_NAME addon.add mysqls.OPTION ~~~ Replace `mysqls.OPTION` with a valid option, e.g. `mysqls.free`. @@ -18,7 +18,7 @@ Replace `mysqls.OPTION` with a valid option, e.g. `mysqls.free`. To upgrade from one plan to another use the addon.upgrade command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade mysqls.OPTION_OLD mysqls.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.upgrade mysqls.OPTION_OLD mysqls.OPTION_NEW ~~~ ## Downgrading the MySQLs Add-on @@ -26,7 +26,7 @@ $ cctrlapp APP_NAME/DEP_NAME addon.upgrade mysqls.OPTION_OLD mysqls.OPTION_NEW To downgrade from the current plan to a smaller one use the addon.downgrade command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade mysqls.OPTION_OLD mysqls.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.downgrade mysqls.OPTION_OLD mysqls.OPTION_NEW ~~~ ## Removing the MySQLs Add-on @@ -36,7 +36,7 @@ Similarily, an Add-on can also be removed from the deployment by using the addon **Attention:** Removing the MySQLs Add-on deletes all data in the database. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove mysqls.OPTION +$ dcapp APP_NAME/DEP_NAME addon.remove mysqls.OPTION ~~~ ## Replication and Failover @@ -103,7 +103,7 @@ $ mysql -u MYSQLS_USERNAME -p --host=MYSQLS_HOSTNAME --ssl-ca=PATH_TO_CERTIFICAT Replace the uppercase variables with the corresponding values shown by the addon command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon mysqls.OPTION +$ dcapp APP_NAME/DEP_NAME addon mysqls.OPTION Addon : mysqls.512mb Settings diff --git a/Add-on Documentation/Deployment/Alias.md b/Add-on Documentation/Deployment/Alias.md index 4057251..dd2d944 100644 --- a/Add-on Documentation/Deployment/Alias.md +++ b/Add-on Documentation/Deployment/Alias.md @@ -11,7 +11,7 @@ custom domain follow the following simple steps **for each domain**. The verification code is unique to the owner of the app. To get it simply use the alias command. ~~~ - $ cctrlapp APP_NAME/default alias APP_NAME.cloudcontrolled.com + $ dcapp APP_NAME/default alias APP_NAME.cloudcontrolled.com ~~~ The verification code is case sensitive and includes a space after the colon. Please ensure, it keeps the exact same syntax in the TXT records text or the alias will not get verified. @@ -32,12 +32,12 @@ custom domain follow the following simple steps **for each domain**. ~~~ # for the default deployment - $ cctrlapp APP_NAME/default alias + $ dcapp APP_NAME/default alias Aliases name default verified APP_NAME.cloudcontrolled.com 1 1 # for any additional deployment - $ cctrlapp APP_NAME/DEP_NAME alias + $ dcapp APP_NAME/DEP_NAME alias Aliases name default verified DEP_NAME.APP_NAME.cloudcontrolled.com 1 1 @@ -54,13 +54,13 @@ custom domain follow the following simple steps **for each domain**. Next add the domain as an alias to your deployment using the alias.add command. ~~~ - $ cctrlapp APP_NAME/DEP_NAME alias.add www.example.com + $ dcapp APP_NAME/DEP_NAME alias.add www.example.com ~~~ You should now see your domain in the deployment's list of aliases. ~~~ - $ cctrlapp APP_NAME/DEP_NAME alias + $ dcapp APP_NAME/DEP_NAME alias Aliases name default verified www.example.com 0 0 @@ -74,7 +74,7 @@ custom domain follow the following simple steps **for each domain**. As soon as the changes have propagated through the DNS the alias will be verified and the deployment will start answering requests to that domain automatically. ~~~ - $ cctrlapp APP_NAME/DEP_NAME alias + $ dcapp APP_NAME/DEP_NAME alias Aliases name default verified www.example.com 0 1 @@ -86,7 +86,7 @@ custom domain follow the following simple steps **for each domain**. To remove an alias, simply use the alias.remove command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME alias.remove www.example.com +$ dcapp APP_NAME/DEP_NAME alias.remove www.example.com ~~~ ## Special Case: Wildcard Domains @@ -96,13 +96,13 @@ The alias add-on does support wildcard domains. A wildcard domain like `*.exampl To use this feature first upgrade your alias add-on from free to wildcard. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade alias.free alias.wildcard +$ dcapp APP_NAME/DEP_NAME addon.upgrade alias.free alias.wildcard ~~~ Then add the wildcard domain itself as an alias. ~~~ -$ cctrlapp APP_NAME/DEP_NAME alias.add *.example.com +$ dcapp APP_NAME/DEP_NAME alias.add *.example.com ~~~ The TXT record requirement also applies to wildcard domains, so please follow the steps above accordingly. diff --git a/Add-on Documentation/Deployment/Cron.md b/Add-on Documentation/Deployment/Cron.md index 1f6b620..734ab99 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -28,7 +28,7 @@ available that can be used to dispatch tasks to the workers. Before you can add a Cron job, the Add-on itself has to be added: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add cron.OPTION +$ dcapp APP_NAME/DEP_NAME addon.add cron.OPTION ~~~ As always the different options are listed on the [Cron @@ -40,9 +40,9 @@ To call an URL with the specific interval you write it as the parameter: ~~~ # for the default deployment -$ cctrlapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]APP_NAME.cloudcontrolled.com +$ dcapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]APP_NAME.cloudcontrolled.com # for any additional deployment -$ cctrlapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.cloudcontrolled.com +$ dcapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.cloudcontrolled.com ~~~ You can only add cron jobs calling a verified alias of the deployment. It is @@ -53,7 +53,7 @@ recommended to use https when sending credentials. Please, note that URL must be Get an overview of all your Cron jobs: ~~~ -$ cctrlapp APP_NAME/DEP_NAME cron +$ dcapp APP_NAME/DEP_NAME cron ~~~ ## Cron details @@ -61,7 +61,7 @@ $ cctrlapp APP_NAME/DEP_NAME cron Get the details of a specific Cron job: ~~~ -$ cctrlapp APP_NAME/DEP_NAME cron CRON_ID +$ dcapp APP_NAME/DEP_NAME cron CRON_ID Cronjob job_id : jobkqy7rdmg url : http://APP_NAME.cloudcontrolled.com @@ -75,7 +75,7 @@ Cronjob You can remove a Cron job by the job_id ~~~ -$ cctrlapp APP_NAME/DEP_NAME cron.remove JOB_ID +$ dcapp APP_NAME/DEP_NAME cron.remove JOB_ID ~~~ ## Upgrading / downgrading the Cron addon @@ -84,13 +84,13 @@ In order to switch from a daily to hourly Cron or vice versa, use the up- or downgrade function ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade cron.free cron.hourly +$ dcapp APP_NAME/DEP_NAME addon.upgrade cron.free cron.hourly ~~~ or ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade cron.hourly cron.free +$ dcapp APP_NAME/DEP_NAME addon.downgrade cron.hourly cron.free ~~~ Crons added with the free Add-on will stay daily and crons added with the @@ -101,7 +101,7 @@ hourly Add-on will stay hourly. Removing the Add-on itself can be done with: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove cron.OPTION +$ dcapp APP_NAME/DEP_NAME addon.remove cron.OPTION ~~~ Please note: Removing the Add-on will not automatically remove all Cron jobs. diff --git a/Add-on Documentation/Deployment/Custom Config.md b/Add-on Documentation/Deployment/Custom Config.md index 7a76432..cb7ab9a 100644 --- a/Add-on Documentation/Deployment/Custom Config.md +++ b/Add-on Documentation/Deployment/Custom Config.md @@ -18,7 +18,7 @@ To add configuration settings, simply invoke the config command with the add option, and append the desired `key` / `value` pairs. ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config.add KEY=VALUE +$ dcapp APP_NAME/DEP_NAME config.add KEY=VALUE ~~~ This will automatically add the Config Add-on to your deployment. @@ -30,7 +30,7 @@ To set multiple settings at once, simply append more than one `key` / `value` pair. ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config.add KEY1=VALUE1 KEY2=VALUE2 [...] +$ dcapp APP_NAME/DEP_NAME config.add KEY1=VALUE1 KEY2=VALUE2 [...] ~~~ Config parameters can be set using the format shown in first column of the @@ -53,7 +53,7 @@ You can list the existing set of configuration settings by invoking the config command: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config +$ dcapp APP_NAME/DEP_NAME config KEY1=VALUE1 KEY2=VALUE2 ~~~ @@ -61,7 +61,7 @@ KEY2=VALUE2 To show the value of a specific key, simply append the desired key name: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config KEY +$ dcapp APP_NAME/DEP_NAME config KEY VALUE ~~~ @@ -71,8 +71,8 @@ To add or remove settings to your custom config, simply use the `add` or `remove` option of the config command and append the parameters you need. ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config.add [-f|--force] NEW_PARAM=NEW_VALUE [...] -$ cctrlapp APP_NAME/DEP_NAME config.remove PARAM1 PARAM2 [...] +$ dcapp APP_NAME/DEP_NAME config.add [-f|--force] NEW_PARAM=NEW_VALUE [...] +$ dcapp APP_NAME/DEP_NAME config.remove PARAM1 PARAM2 [...] ~~~ Updating the existing settings is also possible using the `add` command. This @@ -85,7 +85,7 @@ Deleting all the existing configuration settings from a deployment can be done by removing the Add-on. ~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.remove config.free +$ dcapp APP_NAME/DEP_NAME addon.remove config.free ~~~ This will remove all the custom configuration settings. diff --git a/Add-on Documentation/Deployment/SSL.md b/Add-on Documentation/Deployment/SSL.md index 2b1160f..d29678d 100644 --- a/Add-on Documentation/Deployment/SSL.md +++ b/Add-on Documentation/Deployment/SSL.md @@ -149,12 +149,12 @@ in PEM format. To add the SSL Add-on, simply provide the paths to the files provided by the certificate authority using the respective parameters of the addon.add command. ~~~ - $ cctrlapp APP_NAME/DEP_NAME addon.add ssl.host --cert path/to/CERT_FILE --key path/to/KEY_FILE --chain path/to/CHAIN_FILE + $ dcapp APP_NAME/DEP_NAME addon.add ssl.host --cert path/to/CERT_FILE --key path/to/KEY_FILE --chain path/to/CHAIN_FILE ~~~ In order to check the status of the Add-on, you can do the following. ~~~ - $ cctrlapp APP_NAME/DEP_NAME addon ssl.host + $ dcapp APP_NAME/DEP_NAME addon ssl.host Addon : ssl.host Settings @@ -171,8 +171,8 @@ for 23 minutes after removing the Add-on so that it can be updated in the meantime without interrupting the service. To achieve that you have to run the following commands: ~~~ - $ cctrlapp APP_NAME/DEP_NAME addon.remove ssl.host - $ cctrlapp APP_NAME/DEP_NAME addon.add ssl.host --cert path/to/NEW_CERT_FILE --key path/to/KEY_FILE --chain path/to/CHAIN_FILE + $ dcapp APP_NAME/DEP_NAME addon.remove ssl.host + $ dcapp APP_NAME/DEP_NAME addon.add ssl.host --cert path/to/NEW_CERT_FILE --key path/to/KEY_FILE --chain path/to/CHAIN_FILE ~~~ Note: You need to provide the original key and chain again when updating the diff --git a/Add-on Documentation/Messaging & Mobile/SendGrid.md b/Add-on Documentation/Messaging & Mobile/SendGrid.md index 9344c67..754a607 100644 --- a/Add-on Documentation/Messaging & Mobile/SendGrid.md +++ b/Add-on Documentation/Messaging & Mobile/SendGrid.md @@ -7,7 +7,7 @@ Sendgrid's cloud-based email infrastructure relieves businesses of the cost and The Sendgrid Add-on can be added to every deployment with: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add sendgrid.OPTION +$ dcapp APP_NAME/DEP_NAME addon.add sendgrid.OPTION ~~~ When added, Sendgrid automatically creates a new user account with your email adress. You can manage your sendgrid Add-on easily within the web console (go to the specific deployment and click the link "sendgrid.OPTION"). @@ -17,7 +17,7 @@ When added, Sendgrid automatically creates a new user account with your email ad Upgrading to another version of Sendgrid is easily done: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade sendgrid.OPTION_OLD sendgrid.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.upgrade sendgrid.OPTION_OLD sendgrid.OPTION_NEW ~~~ ## Downgrade Sendgrid @@ -25,13 +25,13 @@ $ cctrlapp APP_NAME/DEP_NAME addon.upgrade sendgrid.OPTION_OLD sendgrid.OPTION_N Downgrading to another version of Sendgrid is easily done: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade sendgrid.OPTION_OLD sendgrid.OPTION_NEW +$ dcapp APP_NAME/DEP_NAME addon.downgrade sendgrid.OPTION_OLD sendgrid.OPTION_NEW ~~~ ## Removing Sendgrid ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove sendgrid.OPTION +$ dcapp APP_NAME/DEP_NAME addon.remove sendgrid.OPTION ~~~ Once you added a SendGrid plan, you need to login once at http://sendgrid.com with your Add-on credentials (see below) and complete their setup wizard to activate your account. For additional information please visit the SendGrid documentation. diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index 098cd0a..0410546 100644 --- a/Guides/Java/AWS S3.md +++ b/Guides/Java/AWS S3.md @@ -29,7 +29,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config): ~~~bash -$ cctrlapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] +$ dcapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] ~~~ Now let's show some operations on buckets and objects: diff --git a/Guides/Java/Add-on credentials.md b/Guides/Java/Add-on credentials.md index 82b6809..4c91a02 100644 --- a/Guides/Java/Add-on credentials.md +++ b/Guides/Java/Add-on credentials.md @@ -17,7 +17,7 @@ Some examples for database Add-ons can be seen in the last section. In case you don't want to expose these credentials in the environment, you can disable them by executing: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config.add SET_ENV_VARS=false +$ dcapp APP_NAME/DEP_NAME config.add SET_ENV_VARS=false ~~~ The Add-on credentials can still be read from the credentials file, as explained in the next section. @@ -31,7 +31,7 @@ All the [Add-on credentials] can be found in a provided JSON file as well, which is exposed in the `CRED_FILE` environment variable. You can see the format of that file locally: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.creds +$ dcapp APP_NAME/DEP_NAME addon.creds ~~~ We provide a small [dotCloud credentials helper class] to get the Add-on credentials from the file. diff --git a/Guides/Java/Clojure - HelloWorld.md b/Guides/Java/Clojure - HelloWorld.md index b3b235f..ef8a6e7 100644 --- a/Guides/Java/Clojure - HelloWorld.md +++ b/Guides/Java/Clojure - HelloWorld.md @@ -41,13 +41,13 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push [...] -----> Receiving push -----> Installing OpenJDK 1.7(openjdk7.b32.tar.gz)... done @@ -68,10 +68,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git ~~~ -Last but not least, deploy the latest version of the app with the cctrlapp deploy command: +Last but not least, deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Clojure application running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Java/Gradle - HelloWorld.md b/Guides/Java/Gradle - HelloWorld.md index 741f8fd..f62f2f7 100644 --- a/Guides/Java/Gradle - HelloWorld.md +++ b/Guides/Java/Gradle - HelloWorld.md @@ -50,13 +50,13 @@ The `web` process type is required and specifies the command that will be execut Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push [...] -----> Receiving push -----> Installing OpenJDK 1.6... @@ -83,10 +83,10 @@ $ cctrlapp APP_NAME/default push * [new branch] master -> master ~~~ -Last but not least, deploy the latest version of the app with the cctrlapp deploy command: +Last but not least, deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Gradle application running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Java/Grails.md b/Guides/Java/Grails.md index 9777bb4..4ca8379 100644 --- a/Guides/Java/Grails.md +++ b/Guides/Java/Grails.md @@ -66,13 +66,13 @@ The `web` process type is required and specifies the command that will be execut Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push [...] -----> Receiving push -----> Grails 2.2.0 app detected @@ -92,10 +92,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least, deploy the latest version of the app with the cctrlapp deploy command: +Last but not least, deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Grails application running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index 77d018f..3110662 100644 --- a/Guides/Java/Java - HelloWorld.md +++ b/Guides/Java/Java - HelloWorld.md @@ -65,14 +65,14 @@ The java command starts the 'com.cloudcontrolled.sample.jetty.App' with the clas Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push -----> Receiving push -----> Installing OpenJDK 1.7(openjdk7.b32.tar.gz)... done @@ -98,10 +98,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git 54b0da2..d247825 master -> master ~~~ -Last but not least deploy the latest version of the app with the cctrlapp deploy command: +Last but not least deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Java/Java - Play 2.md b/Guides/Java/Java - Play 2.md index 4e33748..94b087c 100644 --- a/Guides/Java/Java - Play 2.md +++ b/Guides/Java/Java - Play 2.md @@ -64,13 +64,13 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 5, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. @@ -94,10 +94,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least, deploy the latest version of the app with the cctrlapp deploy command: +Last but not least, deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Play 2 application running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Java/Java - Spring-Boot.md b/Guides/Java/Java - Spring-Boot.md index f1c15ae..0f14198 100644 --- a/Guides/Java/Java - Spring-Boot.md +++ b/Guides/Java/Java - Spring-Boot.md @@ -82,13 +82,13 @@ web: java -jar target/spring-boot-example-app-*.jar Choose a unique name (from now on called APP_NAME) for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 47, done. Delta compression using up to 8 threads. @@ -125,8 +125,8 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git Add MySQLs Add-on with free plan to your deployment and deploy it: ~~~bash -$ cctrlapp APP_NAME/default addon.add mysqls.free -$ cctrlapp APP_NAME/default deploy --memory=768MB +$ dcapp APP_NAME/default addon.add mysqls.free +$ dcapp APP_NAME/default deploy --memory=768MB ~~~ The `--memory=768MB` argument increases the container size to meet the high memory consumption of the Spring framework. Please note: increasing the size comes with additional costs. diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index 61c4fc4..3d471b2 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -86,13 +86,13 @@ web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target Choose a unique name (from now on called APP_NAME) for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 223, done. Delta compression using up to 4 threads. Compressing objects: 100% (212/212), done. @@ -137,8 +137,8 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git Add MySQLs Add-on with free plan to your deployment and deploy it: ~~~bash -$ cctrlapp APP_NAME/default addon.add mysqls.free -$ cctrlapp APP_NAME/default deploy --memory=768MB +$ dcapp APP_NAME/default addon.add mysqls.free +$ dcapp APP_NAME/default deploy --memory=768MB ~~~ The `--memory=768MB` argument increases the container size to meet the high memory consumption of the Spring framework. Please note: increasing the size comes with additional costs. diff --git a/Guides/Java/Java - Tomcat.md b/Guides/Java/Java - Tomcat.md index 6056848..87afc70 100644 --- a/Guides/Java/Java - Tomcat.md +++ b/Guides/Java/Java - Tomcat.md @@ -116,12 +116,12 @@ commands to start your servlet using the built classes. Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 2, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. @@ -156,10 +156,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git db605ac...6a884f1 master -> master ~~~ -Last but not least, deploy the latest version of the app with the cctrlapp deploy command: +Last but not least, deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your JSP Application running on Tomcat at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Java/Play - HelloWorld.md b/Guides/Java/Play - HelloWorld.md index 0926d05..e30e8c2 100644 --- a/Guides/Java/Play - HelloWorld.md +++ b/Guides/Java/Play - HelloWorld.md @@ -38,13 +38,13 @@ The `web` process type is required and specifies the command that will be execut Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push [...] -----> Receiving push -----> Installing OpenJDK 1.6... @@ -70,10 +70,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least, deploy the latest version of the app with the cctrlapp deploy command: +Last but not least, deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Play! application running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Java/Scala - HelloWorld.md b/Guides/Java/Scala - HelloWorld.md index c6ef963..a65fbd5 100644 --- a/Guides/Java/Scala - HelloWorld.md +++ b/Guides/Java/Scala - HelloWorld.md @@ -59,13 +59,13 @@ The `web` process type is required and specifies the command that will be execut Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create java +$ dcapp APP_NAME create java ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push [...] -----> Receiving push @@ -80,10 +80,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least, deploy the latest version of the app with the cctrlapp deploy command: +Last but not least, deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Scala application running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index a25d503..e80d4c4 100644 --- a/Guides/NodeJS/AWS S3.md +++ b/Guides/NodeJS/AWS S3.md @@ -24,7 +24,7 @@ In addition to the AWS SDK, you also need to have AWS access credentials. If you S3 needs your AWS credentials for access. The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on]: ~~~bash -cctrlapp APP_NAME/default config.add +dcapp APP_NAME/default config.add AWS_ACCESS_KEY_ID=[YOUR_SECRET_KEY] AWS_SECRET_ACCESS_KEY=[YOUR_ACCESS_KEY] AWS_REGION='eu-west-1' diff --git a/Guides/NodeJS/Add-on credentials.md b/Guides/NodeJS/Add-on credentials.md index 7731664..b0e0073 100644 --- a/Guides/NodeJS/Add-on credentials.md +++ b/Guides/NodeJS/Add-on credentials.md @@ -11,7 +11,7 @@ By default, each Add-on exposes its credentials in the environment. You can look In case you don't want to expose these credentials in the environment, you can disable them by executing: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config.add SET_ENV_VARS=false +$ dcapp APP_NAME/DEP_NAME config.add SET_ENV_VARS=false ~~~ The Add-on credentials can still be read from the credentials file, as explained in the next section. @@ -24,7 +24,7 @@ All the [Add-on credentials] can be found in a provided JSON file as well, which the `CRED_FILE` environment variable. You can see the format of that file locally with the command: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.creds +$ dcapp APP_NAME/DEP_NAME addon.creds ~~~ You can use the following code wherever you want to get the credentials in your Node.js app: diff --git a/Guides/NodeJS/Express.md b/Guides/NodeJS/Express.md index 434512d..6748601 100644 --- a/Guides/NodeJS/Express.md +++ b/Guides/NodeJS/Express.md @@ -96,14 +96,14 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create nodejs +$ dcapp APP_NAME create nodejs ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 73, done. Delta compression using up to 8 threads. Compressing objects: 100% (35/35), done. @@ -138,8 +138,8 @@ Finally, don’t forget to add the MongoSoup Add-on for dotCloud and deploy the latest version of the app: ~~~bash -$ cctrlapp APP_NAME/default addon.add mongosoup.sandbox -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default addon.add mongosoup.sandbox +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Express app running with MongoDB at diff --git a/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index 628a4dd..b39de47 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -63,14 +63,14 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create nodejs +$ dcapp APP_NAME create nodejs ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME push +$ dcapp APP_NAME push Counting objects: 344, done. Delta compression using up to 8 threads. Compressing objects: 100% (294/294), done. @@ -119,10 +119,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least, deploy the latest version of the app with the cctrlapp deploy command: +Last but not least, deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME deploy +$ dcapp APP_NAME deploy ~~~ Congratulations, you can now see your Node.js app running at diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index 0ae9832..50df84e 100644 --- a/Guides/NodeJS/Sailsjs.md +++ b/Guides/NodeJS/Sailsjs.md @@ -100,13 +100,13 @@ In Sails.js, client-backend communication is done using [websockets]. In order t To deploy your Sails.js application, choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create nodejs +$ dcapp APP_NAME create nodejs ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 73, done. Delta compression using up to 8 threads. Compressing objects: 100% (35/35), done. @@ -132,12 +132,12 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git Add the [Shared MySQL Add-on]: ~~~bash -$ cctrlapp APP_NAME/default addon.add mysqls.free +$ dcapp APP_NAME/default addon.add mysqls.free ~~~ Finally, deploy the Sails.js application: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Sails.js application running at diff --git a/Guides/PHP/Add-on credentials.md b/Guides/PHP/Add-on credentials.md index 1cf4b1c..95eeef7 100644 --- a/Guides/PHP/Add-on credentials.md +++ b/Guides/PHP/Add-on credentials.md @@ -10,7 +10,7 @@ appear in the version control and cause potential security issues. All the [Add-on credentials] can be found in a provided JSON file, which path is exposed in the `CRED_FILE` environment variable. You can see the format of that file locally with the command: ~~~bash -$ cctrlapp APP_NAME/DEPLOYMENT_NAME addon.creds +$ dcapp APP_NAME/DEPLOYMENT_NAME addon.creds ~~~ You can use the following code wherever you want to get the credentials in your diff --git a/Guides/PHP/CakePHP 2.2.1.md b/Guides/PHP/CakePHP 2.2.1.md index 56e6602..89de192 100644 --- a/Guides/PHP/CakePHP 2.2.1.md +++ b/Guides/PHP/CakePHP 2.2.1.md @@ -82,15 +82,15 @@ By running the following commands, this will all be done: git checkout master // create the application - cctrlapp cloudcontrolledcakephp create php + dcapp cloudcontrolledcakephp create php // deploy the default branch - cctrlapp cloudcontrolledcakephp/default push - cctrlapp cloudcontrolledcakephp/default deploy + dcapp cloudcontrolledcakephp/default push + dcapp cloudcontrolledcakephp/default deploy // deploy the testing branch - cctrlapp cloudcontrolledcakephp/testing push - cctrlapp cloudcontrolledcakephp/testing deploy + dcapp cloudcontrolledcakephp/testing push + dcapp cloudcontrolledcakephp/testing deploy ##4. Initialise the Required Add-ons @@ -101,16 +101,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Initialise the mysqls.free addon for the default deployment - cctrlapp cloudcontrolledcakephp/default addon.add mysql.free + dcapp cloudcontrolledcakephp/default addon.add mysql.free // Retrieve the settings - cctrlapp cloudcontrolledcakephp/default addon mysql.free + dcapp cloudcontrolledcakephp/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontrolledcakephp/testing addon.add mysql.free + dcapp cloudcontrolledcakephp/testing addon.add mysql.free // Retrieve the settings - cctrlapp cloudcontrolledcakephp/testing addon mysql.free + dcapp cloudcontrolledcakephp/testing addon mysql.free The output of the commands will be similar to that below: @@ -128,10 +128,10 @@ The output of the commands will be similar to that below: Now we need to configure the config add-on and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - cctrlapp cloudcontrolledcakephp/default config.add CAKE_ENV=production + dcapp cloudcontrolledcakephp/default config.add CAKE_ENV=production // Set the testing environment setting - cctrlapp cloudcontrolledcakephp/testing config.add CAKE_ENV=testing + dcapp cloudcontrolledcakephp/testing config.add CAKE_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -411,15 +411,15 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontrolledcakephp/default push - cctrlapp cloudcontrolledcakephp/default deploy + dcapp cloudcontrolledcakephp/default push + dcapp cloudcontrolledcakephp/default deploy git checkout testing git merge master // deploy the testing branch - cctrlapp cloudcontrolledcakephp/testing push - cctrlapp cloudcontrolledcakephp/testing deploy + dcapp cloudcontrolledcakephp/testing push + dcapp cloudcontrolledcakephp/testing deploy ##7. Review the Deployment diff --git a/Guides/PHP/Drupal 7.md b/Guides/PHP/Drupal 7.md index 5a00395..6ecfed2 100644 --- a/Guides/PHP/Drupal 7.md +++ b/Guides/PHP/Drupal 7.md @@ -71,15 +71,15 @@ Now, we need to make our first deployment of both branches to the dotCloud platf git checkout master // create the application, indicating it's PHP-based - cctrlapp cloudcontroldldrupal create php + dcapp cloudcontroldldrupal create php // deploy the default branch - cctrlapp cloudcontroldldrupal/default push - cctrlapp cloudcontroldldrupal/default deploy + dcapp cloudcontroldldrupal/default push + dcapp cloudcontroldldrupal/default deploy // deploy the testing branch - cctrlapp cloudcontroldldrupal/testing push - cctrlapp cloudcontroldldrupal/testing deploy + dcapp cloudcontroldldrupal/testing push + dcapp cloudcontroldldrupal/testing deploy ##4. Initialise the Required Addons @@ -90,16 +90,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c To initialise mysqls, run the following commands and make a note of the output: // Initialise the mysqls.free addon for the default deployment - cctrlapp cloudcontroldldrupal/default addon.add mysql.free + dcapp cloudcontroldldrupal/default addon.add mysql.free // Retrieve the settings - cctrlapp cloudcontroldldrupal/default addon mysql.free + dcapp cloudcontroldldrupal/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldldrupal/testing addon.add mysql.free + dcapp cloudcontroldldrupal/testing addon.add mysql.free // Retrieve the settings - cctrlapp cloudcontroldldrupal/testing addon mysql.free + dcapp cloudcontroldldrupal/testing addon mysql.free The output of the commands will be similar to that below: @@ -117,10 +117,10 @@ The output of the commands will be similar to that below: Now we need to configure the config addon and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - cctrlapp cloudcontroldldrupal/default config.add APPLICATION_ENV=production + dcapp cloudcontroldldrupal/default config.add APPLICATION_ENV=production // Set the testing environment setting - cctrlapp cloudcontroldldrupal/testing config.add APPLICATION_ENV=testing + dcapp cloudcontroldldrupal/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -281,15 +281,15 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontroldlDrupal 7/default push - cctrlapp cloudcontroldlDrupal 7/default deploy + dcapp cloudcontroldlDrupal 7/default push + dcapp cloudcontroldlDrupal 7/default deploy git checkout testing git merge master // deploy the testing branch - cctrlapp cloudcontroldlDrupal 7/testing push - cctrlapp cloudcontroldlDrupal 7/testing deploy + dcapp cloudcontroldlDrupal 7/testing push + dcapp cloudcontroldlDrupal 7/testing deploy ##8. Review the Deployment diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 2e49ad9..b2c4862 100644 --- a/Guides/PHP/HelloWorld.md +++ b/Guides/PHP/HelloWorld.md @@ -69,12 +69,12 @@ For more information check out [the buildpack documentation][php buildpack]. ## Pushing and Deploying the App Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create php +$ dcapp APP_NAME create php ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~ -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 29, done. Delta compression using up to 4 threads. Compressing objects: 100% (21/21), done. @@ -103,9 +103,9 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the cctrlapp deploy command: +Last but not least deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/PHP/Joomla 2.5.md b/Guides/PHP/Joomla 2.5.md index e67572d..71da28f 100644 --- a/Guides/PHP/Joomla 2.5.md +++ b/Guides/PHP/Joomla 2.5.md @@ -160,15 +160,15 @@ Now, we need to make our first deployment of both branches to the dotCloud platf git checkout master // create the application - cctrlapp cloudcontroldljoomla create php + dcapp cloudcontroldljoomla create php // deploy the default branch - cctrlapp cloudcontroldljoomla/default push - cctrlapp cloudcontroldljoomla/default deploy + dcapp cloudcontroldljoomla/default push + dcapp cloudcontroldljoomla/default deploy // deploy the testing branch - cctrlapp cloudcontroldljoomla/testing push - cctrlapp cloudcontroldljoomla/testing deploy + dcapp cloudcontroldljoomla/testing push + dcapp cloudcontroldljoomla/testing deploy ##4. Initialise the Required Add-ons @@ -179,16 +179,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Initialise the mysqls.free addon for the default deployment - cctrlapp cloudcontroldljoomla/default addon.add mysql.free + dcapp cloudcontroldljoomla/default addon.add mysql.free // Retrieve the settings - cctrlapp cloudcontroldljoomla/default addon mysql.free + dcapp cloudcontroldljoomla/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldljoomla/testing addon.add mysql.free + dcapp cloudcontroldljoomla/testing addon.add mysql.free // Retrieve the settings - cctrlapp cloudcontroldljoomla/testing addon mysql.free + dcapp cloudcontroldljoomla/testing addon mysql.free The output of the commands will be similar to that below: @@ -206,10 +206,10 @@ The output of the commands will be similar to that below: Now we need to configure the config add-on and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - cctrlapp cloudcontroldljoomla/default config.add APPLICATION_ENV=production + dcapp cloudcontroldljoomla/default config.add APPLICATION_ENV=production // Set the testing environment settings - cctrlapp cloudcontroldljoomla/testing config.add APPLICATION_ENV=testing + dcapp cloudcontroldljoomla/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -243,15 +243,15 @@ This will show you the tables from the SQL file. Now that that's done, commit th git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontroldljoomla/default push - cctrlapp cloudcontroldljoomla/default deploy + dcapp cloudcontroldljoomla/default push + dcapp cloudcontroldljoomla/default deploy git checkout testing git merge master // deploy the testing branch - cctrlapp cloudcontroldljoomla/testing push - cctrlapp cloudcontroldljoomla/testing deploy + dcapp cloudcontroldljoomla/testing push + dcapp cloudcontroldljoomla/testing deploy ##7. Review the Deployment @@ -268,11 +268,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - cctrlapp cloudcontroldljoomla/default log deploy + dcapp cloudcontroldljoomla/default log deploy ####7.1.1 Errors - cctrlapp cloudcontroldljoomla/default log error + dcapp cloudcontroldljoomla/default log error The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. diff --git a/Guides/PHP/Kohana 3.2.0.md b/Guides/PHP/Kohana 3.2.0.md index 396de1d..ef9da79 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -81,21 +81,21 @@ Now, we need to make our first deployment of both branches to the dotCloud platf git checkout master // create the application - cctrlapp cloudcontroldlkohana create php + dcapp cloudcontroldlkohana create php // deploy the default branch - cctrlapp cloudcontroldlkohana/default push - cctrlapp cloudcontroldlkohana/default deploy + dcapp cloudcontroldlkohana/default push + dcapp cloudcontroldlkohana/default deploy // deploy the testing branch - cctrlapp cloudcontroldlkohana/testing push - cctrlapp cloudcontroldlkohana/testing deploy + dcapp cloudcontroldlkohana/testing push + dcapp cloudcontroldlkohana/testing deploy ###3.1 Kohana Auto-Detected When you do this, you'll see output similar to the following: - $ cctrlapp cloudcontroldlkohana/default push + $ dcapp cloudcontroldlkohana/default push Counting objects: 9, done. Delta compression using up to 2 threads. Compressing objects: 100% (5/5), done. @@ -124,25 +124,25 @@ Note the following lines: Now that that's done, we need to configure two addons, config and mysqls. The config addon's required for determining the active environment and mysqls for storing our session information. To initialise these, run the following commands and make a note of the output: // Initialise the mysqls.free addon for the default deployment - cctrlapp cloudcontroldlkohana/default addon.add mysqls.free + dcapp cloudcontroldlkohana/default addon.add mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldlkohana/testing addon.add mysqls.free + dcapp cloudcontroldlkohana/testing addon.add mysqls.free Now we need to configure the config addon and store the respective environment setting in it. So run the following commands to do this: // Add the APPLICATION_ENV variable to production - cctrlapp cloudcontroldlkohana/default config.add APPLICATION_ENV=production + dcapp cloudcontroldlkohana/default config.add APPLICATION_ENV=production // Add the APPLICATION_ENV variable to testing - cctrlapp cloudcontroldlkohana/testing config.add APPLICATION_ENV=testing + dcapp cloudcontroldlkohana/testing config.add APPLICATION_ENV=testing ###4.1 Check the Add-on Configuration Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Retrieve the settings - cctrlapp cloudcontroldlkohana/testing addon mysqls.free + dcapp cloudcontroldlkohana/testing addon mysqls.free The output of the commands will be similar to that below: @@ -445,12 +445,12 @@ After all these changes are done, we need to then commit them on the master bran git merge master // push the code to the default (production) branch - cctrlapp cloudcontroldlkohana/default push - cctrlapp cloudcontroldlkohana/default deploy + dcapp cloudcontroldlkohana/default push + dcapp cloudcontroldlkohana/default deploy // push the code to the testing branch - cctrlapp cloudcontroldlkohana/testing push - cctrlapp cloudcontroldlkohana/testing deploy + dcapp cloudcontroldlkohana/testing push + dcapp cloudcontroldlkohana/testing deploy ##A Simple Application diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index fa8b3cb..6f50c10 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -81,21 +81,21 @@ Now, we need to make our first deployment of both branches to the dotCloud platf git checkout master // create the application - cctrlapp cloudcontroldlsymfony create php + dcapp cloudcontroldlsymfony create php // deploy the default branch - cctrlapp cloudcontroldlsymfony/default push - cctrlapp cloudcontroldlsymfony/default deploy + dcapp cloudcontroldlsymfony/default push + dcapp cloudcontroldlsymfony/default deploy // deploy the testing branch - cctrlapp cloudcontroldlsymfony/testing push - cctrlapp cloudcontroldlsymfony/testing deploy + dcapp cloudcontroldlsymfony/testing push + dcapp cloudcontroldlsymfony/testing deploy ###3.1 Symfony Auto-Detected When you do this, you'll see output similar to the following: - $ cctrlapp cloudcontroldlsymfony/default push + $ dcapp cloudcontroldlsymfony/default push Counting objects: 15, done. Delta compression using up to 2 threads. Compressing objects: 100% (7/7), done. @@ -131,16 +131,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c To initialise mysqls, run the following commands and make a note of the output: // Initialise the mysqls.free addon for the default deployment - cctrlapp cloudcontroldlsymfony/default addon.add mysql.free + dcapp cloudcontroldlsymfony/default addon.add mysql.free // Retrieve the settings - cctrlapp cloudcontroldlsymfony/default addon mysql.free + dcapp cloudcontroldlsymfony/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldlsymfony/testing addon.add mysql.free + dcapp cloudcontroldlsymfony/testing addon.add mysql.free // Retrieve the settings - cctrlapp cloudcontroldlsymfony/testing addon mysql.free + dcapp cloudcontroldlsymfony/testing addon mysql.free The output of the commands will be similar to that below: @@ -158,10 +158,10 @@ The output of the commands will be similar to that below: Now we need to configure the config addon and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - cctrlapp cloudcontroldlsymfony/default config.add APPLICATION_ENV=production + dcapp cloudcontroldlsymfony/default config.add APPLICATION_ENV=production // Set the testing environment setting - cctrlapp cloudcontroldlsymfony/testing config.add APPLICATION_ENV=testing + dcapp cloudcontroldlsymfony/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -319,15 +319,15 @@ After this, stage all the files in Git and commit them with a suitable commit me git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontroldlsymfony/default push - cctrlapp cloudcontroldlsymfony/default deploy + dcapp cloudcontroldlsymfony/default push + dcapp cloudcontroldlsymfony/default deploy git checkout testing git merge master // deploy the testing branch - cctrlapp cloudcontroldlsymfony/testing push - cctrlapp cloudcontroldlsymfony/testing deploy + dcapp cloudcontroldlsymfony/testing push + dcapp cloudcontroldlsymfony/testing deploy ##7. Review the Deployment diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index 7cd3905..4fb2bda 100644 --- a/Guides/PHP/Yii 1.1.10.md +++ b/Guides/PHP/Yii 1.1.10.md @@ -85,18 +85,18 @@ Now, we need to make our first deployment of both branches to the dotCloud platf git checkout master // create the application - cctrlapp cloudcontroldlyii create php + dcapp cloudcontroldlyii create php // deploy the default branch - cctrlapp cloudcontroldlyii/default push - cctrlapp cloudcontroldlyii/default deploy + dcapp cloudcontroldlyii/default push + dcapp cloudcontroldlyii/default deploy // deploy the testing branch - cctrlapp cloudcontroldlyii/testing push - cctrlapp cloudcontroldlyii/testing deploy + dcapp cloudcontroldlyii/testing push + dcapp cloudcontroldlyii/testing deploy You should see output as below: - $ cctrlapp cloudcontroldlyii/default push + $ dcapp cloudcontroldlyii/default push Counting objects: 2257, done. Delta compression using up to 2 threads. Compressing objects: 100% (2131/2131), done. @@ -123,16 +123,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Initialise the mysqls.free addon for the default deployment - cctrlapp cloudcontroldlyii/default addon.add mysqls.free + dcapp cloudcontroldlyii/default addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldlyii/default addon mysqls.free + dcapp cloudcontroldlyii/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldlyii/testing addon.add mysqls.free + dcapp cloudcontroldlyii/testing addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldlyii/testing addon mysqls.free + dcapp cloudcontroldlyii/testing addon mysqls.free The output of the commands will be similar to that below: @@ -150,10 +150,10 @@ The output of the commands will be similar to that below: Now we need to configure the config add-on and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - cctrlapp cloudcontroldlyii/default config.add APPLICATION_ENV=main + dcapp cloudcontroldlyii/default config.add APPLICATION_ENV=main // Set the testing environment setting - cctrlapp cloudcontroldlyii/testing config.add APPLICATION_ENV=testing + dcapp cloudcontroldlyii/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -314,15 +314,15 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontroldlyii/default push - cctrlapp cloudcontroldlyii/default deploy + dcapp cloudcontroldlyii/default push + dcapp cloudcontroldlyii/default deploy git checkout testing git merge master // deploy the testing branch - cctrlapp cloudcontroldlyii/testing push - cctrlapp cloudcontroldlyii/testing deploy + dcapp cloudcontroldlyii/testing push + dcapp cloudcontroldlyii/testing deploy ##7. Review the Deployment @@ -339,11 +339,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - cctrlapp cloudcontroldlyii/default log deploy + dcapp cloudcontroldlyii/default log deploy ####7.1.1 Errors - cctrlapp cloudcontroldlyii/default log error + dcapp cloudcontroldlyii/default log error The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. diff --git a/Guides/PHP/Zend 2.md b/Guides/PHP/Zend 2.md index 650a2a8..f81b9b0 100644 --- a/Guides/PHP/Zend 2.md +++ b/Guides/PHP/Zend 2.md @@ -146,13 +146,13 @@ class Module Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create php +$ dcapp APP_NAME create php ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 2208, done. Delta compression using up to 4 threads. Compressing objects: 100% (771/771), done. @@ -178,10 +178,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the cctrlapp deploy command: +Last but not least deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ ## Add the Required MySQL Database Add-on and Initialize the Session Table @@ -194,9 +194,9 @@ Creating the session table is easy by executing the included init-session-table ~~~bash # add the Add-on -$ cctrlapp APP_NAME/default addon.add mysqls.free +$ dcapp APP_NAME/default addon.add mysqls.free # initialize the session table -$ cctrlapp APP_NAME/default run "php code/public/index.php init-session-table" +$ dcapp APP_NAME/default run "php code/public/index.php init-session-table" Connecting... [SUCCESS] Session table created. Connection to ssh.cloudcontrolled.net closed. diff --git a/Guides/PHP/Zend Framework 1.11.md b/Guides/PHP/Zend Framework 1.11.md index 9c1dadd..f4c9a8f 100644 --- a/Guides/PHP/Zend Framework 1.11.md +++ b/Guides/PHP/Zend Framework 1.11.md @@ -55,7 +55,7 @@ If we were deploying the application in a simple, configurable VHost, then we'd SetEnv APPLICATION_ENV development -When using dotCloud, we need to do this in a slightly different way. It involves, for each environment, setting an environment variable with the cctrlapp config add-on, then reading that information from the environment at runtime. We'll come to this shortly. +When using dotCloud, we need to do this in a slightly different way. It involves, for each environment, setting an environment variable with the dcapp config add-on, then reading that information from the environment at runtime. We'll come to this shortly. ##3. Put the Code Under Git Control @@ -90,19 +90,19 @@ Now, we need to make our first deployment of both branches to the dotCloud platf git checkout master // create the application - cctrlapp cloudcontroldlzf create php + dcapp cloudcontroldlzf create php // deploy the default branch - cctrlapp cloudcontroldlzf/default push - cctrlapp cloudcontroldlzf/default deploy + dcapp cloudcontroldlzf/default push + dcapp cloudcontroldlzf/default deploy // deploy the testing branch - cctrlapp cloudcontroldlzf/testing push - cctrlapp cloudcontroldlzf/testing deploy + dcapp cloudcontroldlzf/testing push + dcapp cloudcontroldlzf/testing deploy You'll see output similar to the following: - $ cctrlapp cloudcontroldlzf/testing push + $ dcapp cloudcontroldlzf/testing push Total 0 (delta 0), reused 0 (delta 0) >> Receiving push @@ -125,16 +125,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Initialise the mysqls.free addon for the default deployment - cctrlapp cloudcontroldlzf/default addon.add mysqls.free + dcapp cloudcontroldlzf/default addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldlzf/default addon mysqls.free + dcapp cloudcontroldlzf/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldlzf/testing addon.add mysqls.free + dcapp cloudcontroldlzf/testing addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldlzf/testing addon mysqls.free + dcapp cloudcontroldlzf/testing addon mysqls.free The output of the commands will be similar to that below: @@ -152,10 +152,10 @@ The output of the commands will be similar to that below: Now we need to configure the config add-on and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - cctrlapp cloudcontroldlzf/default config.add APPLICATION_ENV=production + dcapp cloudcontroldlzf/default config.add APPLICATION_ENV=production // Set the testing environment setting - cctrlapp cloudcontroldlzf/testing config.add APPLICATION_ENV=testing + dcapp cloudcontroldlzf/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -454,15 +454,15 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - cctrlapp cloudcontroldlzf/default push - cctrlapp cloudcontroldlzf/default deploy + dcapp cloudcontroldlzf/default push + dcapp cloudcontroldlzf/default deploy git checkout testing git merge master // deploy the testing branch - cctrlapp cloudcontroldlzf/testing push - cctrlapp cloudcontroldlzf/testing deploy + dcapp cloudcontroldlzf/testing push + dcapp cloudcontroldlzf/testing deploy ##7. Review the Deployment @@ -480,11 +480,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - cctrlapp cloudcontroldlzf/default log deploy + dcapp cloudcontroldlzf/default log deploy ####7.1.1 Errors - cctrlapp cloudcontroldlzf/default log error + dcapp cloudcontroldlzf/default log error The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. diff --git a/Guides/Python/AWS S3.md b/Guides/Python/AWS S3.md index 3305758..490d184 100644 --- a/Guides/Python/AWS S3.md +++ b/Guides/Python/AWS S3.md @@ -24,7 +24,7 @@ boto==2.9.8 The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config): ~~~bash -$ cctrlapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] +$ dcapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] ~~~ Now let's show some operations on buckets and objects: diff --git a/Guides/Python/Add-on credentials.md b/Guides/Python/Add-on credentials.md index 85dd635..5fdb683 100644 --- a/Guides/Python/Add-on credentials.md +++ b/Guides/Python/Add-on credentials.md @@ -13,7 +13,7 @@ By default, all the Add-on credentials can be found in a provided JSON file, which path is exposed in the `CRED_FILE` environment variable. You can see the format of that file locally with the command: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.creds +$ dcapp APP_NAME/DEP_NAME addon.creds ~~~ You can use the following code wherever you want to get the credentials in your @@ -43,7 +43,7 @@ Some examples for database Add-ons can be seen in the last section. The default for Python is to not expose Add-on credentials as environment variables. To overwrite this default use the following command: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config.add SET_ENV_VARS +$ dcapp APP_NAME/DEP_NAME config.add SET_ENV_VARS ~~~ You can look up the individual environment variable names in the respective diff --git a/Guides/Python/Celery.md b/Guides/Python/Celery.md index df35cdd..74e3298 100644 --- a/Guides/Python/Celery.md +++ b/Guides/Python/Celery.md @@ -58,19 +58,19 @@ def add(x, y): Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create python +$ dcapp APP_NAME create python ~~~ As we chose to use AMQP as a broker, we add the CloudAMQP Add-on now. ~~~bash -$ cctrlapp APP_NAME/default addon.add cloudamqp.lemur +$ dcapp APP_NAME/default addon.add cloudamqp.lemur ~~~ We also need to add the Worker Add-on to be able to start the workers later. ~~~bash -$ cctrlapp APP_NAME/default addon.add worker.single +$ dcapp APP_NAME/default addon.add worker.single ~~~ Since we are reading the AMQP URL for the broker from the environment in both, the `Procfile` and the Python code we have to enable providing Add-on credentials as environment variables which is disabled per default for Python apps. @@ -78,7 +78,7 @@ Since we are reading the AMQP URL for the broker from the environment in both, t We also set another environment variable called `FLOWER_AUTH_EMAIL` that is passed to the Flower web process for authentication purposes. Without this, the web interface would be public showing your secret AMQP credentials and allowing people to stop your workers. ~~~bash -$ cctrlapp APP_NAME/default addon.add config.free --SET_ENV_VARS --FLOWER_AUTH_EMAIL=YOUR_EMAIL_HERE +$ dcapp APP_NAME/default addon.add config.free --SET_ENV_VARS --FLOWER_AUTH_EMAIL=YOUR_EMAIL_HERE # seperate multiple emails by comma ~~~ @@ -90,7 +90,7 @@ Now lets push your code to the application's repository, which triggers the depl The first push will take a couple of seconds, because it will download and compile and install a number of dependencies. So please be patient. Dependencies will be cached for future pushes significantly speeding up the process. ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. @@ -119,10 +119,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the cctrlapp deploy command. +Last but not least deploy the latest version of the app with the dcapp deploy command. ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ At this point you can see web interface at `http://APP_NAME.cloudcontrolled.com`. But it hasn't got any workers yet. @@ -133,11 +133,11 @@ Scaling Celery workers on dotCloud is easy enough luckily. We have already defin ### Adding Workers ~~~bash -$ cctrlapp APP_NAME/default worker.add worker +$ dcapp APP_NAME/default worker.add worker # you can always list running workers like this -$ cctrlapp APP_NAME/default worker +$ dcapp APP_NAME/default worker # and also check the worker's log output with -$ cctrlapp APP_NAME/default log worker +$ dcapp APP_NAME/default log worker [TIMESTAMP] WRK_ID Started worker (command: 'celery -A tasks worker --loglevel=info ', parameter: '') [TIMESTAMP] WRK_ID [TIMESTAMP] WRK_ID -------------- celery@HOSTNAME v3.0.15 (Chiastic Slide) @@ -165,7 +165,7 @@ To handle more tasks simultaneously you can always just add more workers. (Pleas ~~~bash # call worker.add to start additional workers one at a time -$ cctrlapp APP_NAME/default worker.add worker +$ dcapp APP_NAME/default worker.add worker ~~~ ### Removing Workers @@ -174,14 +174,14 @@ To stop a worker you can stop it from the command line. ~~~bash # use the worker list command to get the WRK_ID -$ cctrlapp APP_NAME/default worker -$ cctrlapp APP_NAME/default worker.remove WRK_ID +$ dcapp APP_NAME/default worker +$ dcapp APP_NAME/default worker.remove WRK_ID ~~~ You can also stop the Celery worker from the web interface, which will also stop the container. Check the worker log output for details. ~~~bash -$ cctrlapp APP_NAME/default log worker +$ dcapp APP_NAME/default log worker [...] [TIMESTAMP] WRK_ID [TIMESTAMP: WARNING/MainProcess] Got shutdown from remote [TIMESTAMP] WRK_ID Container stopped @@ -191,10 +191,10 @@ $ cctrlapp APP_NAME/default log worker ## Celery Commands -To run Celery commands use the cctrlapp run command. It will launch an additional container and connect you via SSH. You can then use the Celery commands in the an identical environment as the web interface and the workers itself. +To run Celery commands use the dcapp run command. It will launch an additional container and connect you via SSH. You can then use the Celery commands in the an identical environment as the web interface and the workers itself. ~~~bash -$ cctrlapp APP_NAME/default run bash +$ dcapp APP_NAME/default run bash Connecting... USER@HOSTNAME:~/www$ celery --broker=$CLOUDAMQP_URL status -> WORKER_HOSTNAME: OK @@ -206,7 +206,7 @@ Connection to ssh.cloudcontrolled.net closed. ## Résumé -This guide showed how to run both Flower aswell as a Celery worker on dotCloud by specifying the commands in the `Procfile` and how to connect to a AMQP broker provided by the CloudAMQP Add-on with the credentials provided in the app's runtime environment. Additionally we learned how we can use the cctrlapp run command to use the Celery command line tool. +This guide showed how to run both Flower aswell as a Celery worker on dotCloud by specifying the commands in the `Procfile` and how to connect to a AMQP broker provided by the CloudAMQP Add-on with the credentials provided in the app's runtime environment. Additionally we learned how we can use the dcapp run command to use the Celery command line tool. [Celery]: http://celeryproject.org/ [CloudAMQP Add-on]: https://next.dotcloud.com/add-ons/cloudamqp diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index f221c0a..ccdba02 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -16,7 +16,7 @@ manage: python manage.py ## Executing Management Tasks Use the `run` command to execute tasks like `syncdb`. This starts an interactive [SSH-session]. ~~~bash -cctrlapp APP_NAME/DEP_NAME run "python manage.py syncdb" +dcapp APP_NAME/DEP_NAME run "python manage.py syncdb" ~~~ ## Databases diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index 0b32736..664958e 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -112,13 +112,13 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create python +$ dcapp APP_NAME create python ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME push +$ dcapp APP_NAME push Counting objects: 49, done. Delta compression using up to 8 threads. Compressing objects: 100% (33/33), done. @@ -143,15 +143,15 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git Add MySQLs Add-on with `free` plan to your deployment and deploy it: ~~~bash -$ cctrlapp APP_NAME addon.add mysqls.free -$ cctrlapp APP_NAME deploy +$ dcapp APP_NAME addon.add mysqls.free +$ dcapp APP_NAME deploy ~~~ Finally, prepare the database using the [Run command][ssh-session] (when prompted create admin user): ~~~bash -$ cctrlapp APP_NAME run "python manage.py syncdb" +$ dcapp APP_NAME run "python manage.py syncdb" ~~~ You can login to the admin console at `APP_NAME.cloudcontrolled.com/admin`, diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index 4b447aa..0aa34e8 100644 --- a/Guides/Python/HelloWorld.md +++ b/Guides/Python/HelloWorld.md @@ -40,13 +40,13 @@ Left from the colon we specified the **required** process type called `web` foll Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create python +$ dcapp APP_NAME create python ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 16, done. Delta compression using up to 4 threads. Compressing objects: 100% (10/10), done. @@ -71,10 +71,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git ~~~ -Last but not least deploy the latest version of the app with the cctrlapp deploy command: +Last but not least deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Python/Tornado.md b/Guides/Python/Tornado.md index 6eda85d..dd8e7b0 100644 --- a/Guides/Python/Tornado.md +++ b/Guides/Python/Tornado.md @@ -89,13 +89,13 @@ if __name__ == "__main__": Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create python +$ dcapp APP_NAME create python ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 7, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. @@ -117,10 +117,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git + [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the cctrlapp +Last but not least deploy the latest version of the app with the dcapp deploy command. ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Tornado app running at `http://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index b37e9bb..41c7fd8 100644 --- a/Guides/Ruby/AWS S3.md +++ b/Guides/Ruby/AWS S3.md @@ -29,7 +29,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config): ~~~bash -$ cctrlapp APP_NAME/default config.add AWS_ACCESS_KEY_ID=[YOUR_SECRET_KEY] AWS_SECRET_ACCESS_KEY=[YOUR_ACCESS_KEY] AWS_REGION='eu-west-1' +$ dcapp APP_NAME/default config.add AWS_ACCESS_KEY_ID=[YOUR_SECRET_KEY] AWS_SECRET_ACCESS_KEY=[YOUR_ACCESS_KEY] AWS_REGION='eu-west-1' ~~~ Now let's show some operations on buckets and objects: diff --git a/Guides/Ruby/Add-on credentials.md b/Guides/Ruby/Add-on credentials.md index 31bf936..099b955 100644 --- a/Guides/Ruby/Add-on credentials.md +++ b/Guides/Ruby/Add-on credentials.md @@ -18,7 +18,7 @@ database Add-ons can be seen in the last section. In case you don't want to expose these credentials in the environment, you can disable them by executing: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config.add SET_ENV_VARS=false +$ dcapp APP_NAME/DEP_NAME config.add SET_ENV_VARS=false ~~~ The Add-on credentials can still be read from the credentials file, as explained in the next section. @@ -32,7 +32,7 @@ available in your deployment containers. All the [Add-on credentials] can be found in a provided JSON file as well, which path is exposed in the `CRED_FILE` environment variable. You can see the format of that file locally with the command: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.creds +$ dcapp APP_NAME/DEP_NAME addon.creds ~~~ You can use the following code wherever you want to get the credentials in your diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index f581676..28471a2 100644 --- a/Guides/Ruby/HelloWorld.md +++ b/Guides/Ruby/HelloWorld.md @@ -41,12 +41,12 @@ Left from the colon we specified the **required** process type called `web` foll ## Pushing and Deploying the App Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create ruby +$ dcapp APP_NAME create ruby ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 14, done. Delta compression using up to 4 threads. Compressing objects: 100% (10/10), done. @@ -77,9 +77,9 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the cctrlapp deploy command: +Last but not least deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index c0b5bb2..853fd53 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -117,13 +117,13 @@ The 'cloudcontrol-rails' gem will provide the database credentials. Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create ruby +$ dcapp APP_NAME create ruby ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 62, done. Delta compression using up to 4 threads. Compressing objects: 100% (51/51), done. @@ -169,14 +169,14 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git Add ElephantSQL Add-on with `turtle` plan to your deployment and deploy it: ~~~bash -$ cctrlapp APP_NAME/default addon.add elephantsql.turtle -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default addon.add elephantsql.turtle +$ dcapp APP_NAME/default deploy ~~~ Finally, prepare the database by running migrations using the [Run command][run command]: ~~~bash -$ cctrlapp APP_NAME/default run "rake db:migrate" +$ dcapp APP_NAME/default run "rake db:migrate" ~~~ Congratulations, you can now access the app at http://APP_NAME.cloudcontrolled.com. diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index 3f1eca9..872c677 100644 --- a/Guides/Ruby/RubyNotes.md +++ b/Guides/Ruby/RubyNotes.md @@ -103,7 +103,7 @@ Alternatively you can use the [cloudcontrol-rails] gem. Rails servers can be run in different environments. Production is the default one but you can change it by setting the `RAILS_ENV` and `RACK_ENV` environment variables with the [Custom Config addon](https://next.dotcloud.com/add-ons/config). For example: ~~~ -cctrlapp APP_NAME/DEPLOYMENT config.add RACK_ENV=some_env RAILS_ENV=some_env +dcapp APP_NAME/DEPLOYMENT config.add RACK_ENV=some_env RAILS_ENV=some_env ~~~ NOTE: Gems in development and test environments are excluded from bundle install process. diff --git a/Guides/Ruby/RunCommand.md b/Guides/Ruby/RunCommand.md index 1f57520..c6795eb 100644 --- a/Guides/Ruby/RunCommand.md +++ b/Guides/Ruby/RunCommand.md @@ -5,18 +5,18 @@ Run command is really useful for the ruby programmers. Here are some examples ho To migrate database: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME run "rake db:migrate" +$ dcapp APP_NAME/DEP_NAME run "rake db:migrate" ~~~ To run rails console: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME run "rails c" +$ dcapp APP_NAME/DEP_NAME run "rails c" ~~~ Here is a full example in which multiple commands are run in remote bash session: ~~~ -$ cctrlapp APP_NAME/DEP_NAME run bash +$ dcapp APP_NAME/DEP_NAME run bash Connecting... Warning: Permanently added '[X.X.X.X]:' (RSA) to the list of known hosts. u@-:~/www$ rails g scaffold Post title:string content:text @@ -84,7 +84,7 @@ Connection to ssh.cloudcontrolled.net closed. The same could be accomplished if the multiple individual commands were chained: ~~~ -$ cctrlapp APP_NAME/DEPLOYMENT run "rails g scaffold Post title:string content:text && rake db:migrate && rails c" +$ dcapp APP_NAME/DEPLOYMENT run "rails g scaffold Post title:string content:text && rake db:migrate && rails c" ~~~ The previous example is quite artificial and it's usefulness in the real world would be questionable. The changes to the database are retained, but all the generated files are lost. Nevertheless it demonstrates more complex usage of the run command and gives a bit of insight in it's power. diff --git a/Guides/Third-Party Buildpacks/Go HelloWorld.md b/Guides/Third-Party Buildpacks/Go HelloWorld.md index a5ccb98..bfc9f90 100644 --- a/Guides/Third-Party Buildpacks/Go HelloWorld.md +++ b/Guides/Third-Party Buildpacks/Go HelloWorld.md @@ -88,13 +88,13 @@ func getEnv(key, defaultValue string) string { Choose a unique name (from now on called APP_NAME) for your application and create it on the dotCloud platform: ~~~bash -$ cctrlapp APP_NAME create custom --buildpack https://github.com/cloudControl/buildpack-go +$ dcapp APP_NAME create custom --buildpack https://github.com/cloudControl/buildpack-go ~~~ Push your code to the application's repository: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 17, done. Delta compression using up to 8 threads. @@ -114,10 +114,10 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the cctrlapp deploy command: +Last but not least deploy the latest version of the app with the dcapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Go app running at `http[s]://APP_NAME.cloudcontrolled.com`. diff --git a/Guides/Third-Party Buildpacks/Go Martini.md b/Guides/Third-Party Buildpacks/Go Martini.md index 5fb44a6..2e9bb8f 100644 --- a/Guides/Third-Party Buildpacks/Go Martini.md +++ b/Guides/Third-Party Buildpacks/Go Martini.md @@ -97,14 +97,14 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform using the custom Go buildpack: ~~~bash -$ cctrlapp APP_NAME create custom --buildpack https://github.com/cloudControl/buildpack-go +$ dcapp APP_NAME create custom --buildpack https://github.com/cloudControl/buildpack-go ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 73, done. Delta compression using up to 4 threads. Compressing objects: 100% (52/52), done. @@ -122,17 +122,17 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the cctrlapp +Last but not least deploy the latest version of the app with the dcapp deploy command. ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Martini app running at `http://APP_NAME.cloudcontrolled.com`. The command line client provides the `open` command to quickly open the app in your default browser. ~~~bash -$ cctrlapp APP_NAME/default open +$ dcapp APP_NAME/default open ~~~ [Martini]: http://martini.codegangsta.io/ diff --git a/Guides/Third-Party Buildpacks/Go Revel.md b/Guides/Third-Party Buildpacks/Go Revel.md index 5ced67c..e0edaf2 100644 --- a/Guides/Third-Party Buildpacks/Go Revel.md +++ b/Guides/Third-Party Buildpacks/Go Revel.md @@ -76,14 +76,14 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform using the custom Go buildpack: ~~~bash -$ cctrlapp APP_NAME create custom --buildpack https://github.com/revel/heroku-buildpack-go-revel +$ dcapp APP_NAME create custom --buildpack https://github.com/revel/heroku-buildpack-go-revel ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ cctrlapp APP_NAME/default push +$ dcapp APP_NAME/default push Counting objects: 463, done. Delta compression using up to 4 threads. Compressing objects: 100% (334/334), done. @@ -106,17 +106,17 @@ To ssh://APP_NAME@cloudcontrolled.com/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the cctrlapp +Last but not least deploy the latest version of the app with the dcapp deploy command. ~~~bash -$ cctrlapp APP_NAME/default deploy +$ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Revel app running at `http://APP_NAME.cloudcontrolled.com`. The command line client provides the `open` command to quickly open the app in your default browser. ~~~bash -$ cctrlapp APP_NAME/default open +$ dcapp APP_NAME/default open ~~~ [Revel]: http://revel.github.io diff --git a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md index e98238a..a780758 100644 --- a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md +++ b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md @@ -28,7 +28,7 @@ Here is a list of verified and recommended buildpacks for the dotCloud platform In order to create an app using a custom buildpack you have to choose the `custom` app type and then provide the desired buildpack URL: ~~~bash -$ cctrlapp APP_NAME create custom --buildpack BUILDPACK_URL +$ dcapp APP_NAME create custom --buildpack BUILDPACK_URL ~~~ **Note:** `BUILDPACK_URL` has to be a non-ssh git repository. diff --git a/Platform Documentation.md b/Platform Documentation.md index ab5202f..8a0c7de 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -10,7 +10,7 @@ To control the platform we offer different interfaces. The primary way of controlling your apps and deployments is via [the command-line interface](http://en.wikipedia.org/wiki/Command-line_interface) (CLI) called *cctrl*. Additionally we also offer a [web console]. Both the CLI as well as the web console however are merely frontends to our RESTful API. For deep integration into your apps you can optionally use one of our available [API libraries]. -Throughout this documentation we will use the CLI as the primary way of controlling the dotCloud platform. The CLI consists of 2 parts: *cctrlapp* and *cctrluser*. To get help for the command line client, just append --help or -h to any of the commands. +Throughout this documentation we will use the CLI as the primary way of controlling the dotCloud platform. The CLI consists of 2 parts: *dcapp* and *dcuser*. To get help for the command line client, just append --help or -h to any of the commands. Installing *cctrl* is easy and works on Mac/Linux as well as on Windows. @@ -38,23 +38,23 @@ $ sudo pip install -U cctrl **TL;DR:** * Every developer has their own user account - * User accounts can be created via the *web console* or via ``cctrluser create`` - * User accounts can be deleted via the *web console* or via ``cctrluser delete`` + * User accounts can be created via the *web console* or via ``dcuser create`` + * User accounts can be deleted via the *web console* or via ``dcuser delete`` To work on and manage your applications on the platform, a user account is needed. User accounts can be created via the *web console* or using the following CLI command: ~~~ -$ cctrluser create +$ dcuser create ~~~ After this, an activation email is sent to the given email address. Click the link in the email or use the following CLI command to activate the account: ~~~ -$ cctrluser activate USER_NAME ACTIVATION_CODE +$ dcuser activate USER_NAME ACTIVATION_CODE ~~~ If you want to delete your user account, please use either the *web console* or the following CLI command: ~~~ -$ cctrluser delete +$ dcuser delete ~~~ ### Password Reset @@ -80,13 +80,13 @@ An app consists of a repository (with branches), deployments and users. Creating Creating an app is easy. Simply specify a name and the desired type to determine which [buildpack](#buildpacks-and-the-procfile) to use. ~~~ -$ cctrlapp APP_NAME create php +$ dcapp APP_NAME create php ~~~ You can always list your existing apps using the command line client too. ~~~ -$ cctrlapp -l +$ dcapp -l Apps Nr Name Type 1 myfirstapp php @@ -102,7 +102,7 @@ the user's [roles](#roles). Users can be added to applications or more fine grai You can list, add and remove app users using the command line client. ~~~ -$ cctrlapp APP_NAME user +$ dcapp APP_NAME user Users Name Email Role Deployment @@ -115,18 +115,18 @@ Users Add a user to an app by providing their email address. If the user is already registered they will be added to the app immediately. Otherwise they will receive an invitation email first. ~~~ -$ cctrlapp APP_NAME user.add user4@example.com +$ dcapp APP_NAME user.add user4@example.com ~~~ To remove a user, please use their email address. ~~~ -$ cctrlapp APP_NAME user.remove user3@example.com +$ dcapp APP_NAME user.remove user3@example.com ~~~ On deployment level: ~~~ -$ cctrlapp APP_NAME/DEP_NAME user.add user5@example.com -$ cctrlapp APP_NAME/DEP_NAME user.remove user5@example.com +$ dcapp APP_NAME/DEP_NAME user.add user5@example.com +$ dcapp APP_NAME/DEP_NAME user.remove user5@example.com ~~~ Please note: a user can either be added to the application or to one or more deployments. @@ -139,28 +139,28 @@ Please note: a user can either be added to the application or to one or more dep You can provide the role with the `user.add` command. ~~~ -$ cctrlapp APP_NAME user.add user5@example.com --role readonly +$ dcapp APP_NAME user.add user5@example.com --role readonly ~~~ #### Keys -For secure access to the app's repository, each developer needs to authenticate via public/ private key authentication. Please refer to GitHub's article on [generating SSH keys] for details on how to create a key. You can simply add your default key to your user account using the *web console* or the command line client. If no default key can be found, cctrlapp will offer to create one. +For secure access to the app's repository, each developer needs to authenticate via public/ private key authentication. Please refer to GitHub's article on [generating SSH keys] for details on how to create a key. You can simply add your default key to your user account using the *web console* or the command line client. If no default key can be found, dcapp will offer to create one. ~~~ -$ cctrluser key.add +$ dcuser key.add ~~~ You can also list the available key ids and remove existing keys using the key id. ~~~ -$ cctrluser key +$ dcuser key Keys Dohyoonuf7 -$ cctrluser key Dohyoonuf7 +$ dcuser key Dohyoonuf7 ssh-rsa AAA[...] -$ cctrluser key.remove Dohyoonuf7 +$ dcuser key.remove Dohyoonuf7 ~~~ ### Deployments @@ -175,7 +175,7 @@ Please refer to the section about [development, staging and production environme You can list all the deployments with the *details* command. ~~~ -$ cctrlapp APP_NAME details +$ dcapp APP_NAME details App Name: APP_NAME Type: php Owner: user1 Repository: ssh://APP_NAME@cloudcontrolled.com/repository.git @@ -203,13 +203,13 @@ Whenever you push an updated branch, a deployment image is built automatically. This image can then be deployed with the *deploy* command to the deployment matching the branch name. The content of the image is generated by the [buildpack](#buildpacks-and-the-procfile) including your application code in a runnable form with all the dependencies. -You can either use the cctrlapp push command or your version control system's push command. Please remember that deployment and branch names have to match. So to push to your dev deployment the following commands are interchangeable. Also note, both require the existence of a branch called dev. +You can either use the dcapp push command or your version control system's push command. Please remember that deployment and branch names have to match. So to push to your dev deployment the following commands are interchangeable. Also note, both require the existence of a branch called dev. ~~~ -# with cctrlapp: -$ cctrlapp APP_NAME/dev push +# with dcapp: +$ dcapp APP_NAME/dev push -# get the REPO_URL from the output of cctrlapp APP_NAME details +# get the REPO_URL from the output of dcapp APP_NAME details # with git: $ git remote add cctrl REPO_URL @@ -258,7 +258,7 @@ At the end of the buildpack process, the image is ready to be deployed. The dotCloud platform supports zero downtime deploys for all deployments. To deploy a new version use either the *web console* or the `deploy` command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME deploy +$ dcapp APP_NAME/DEP_NAME deploy ~~~ To deploy a specific version, append your version control systems identifier (full commit-SHA1). @@ -279,7 +279,7 @@ first request is served. All following requests will perform normally. You can see the state of your application with the following command: ~~~ -$ cctrlapp APP_NAME/DEP_NAME details +$ dcapp APP_NAME/DEP_NAME details Deployment name: APP_NAME/DEP_NAME [...] @@ -295,13 +295,13 @@ any production system. If your newest version breaks unexpectedly, you can use the rollback command to revert to the previous version in a matter of seconds: ~~~ -$ cctrlapp APP_NAME/DEP_NAME rollback +$ dcapp APP_NAME/DEP_NAME rollback ~~~ It is also possible to deploy any other prior version. To find the version identifier you need, simply check the [deploy log](#deploy-log) for a previously deployed version, or get it directly from the version control system. You can redeploy this version using the deploy command: ~~~ -$ cctrlapp APP_NAME/DEP_NAME deploy THE_LAST_WORKING_VERSION_HASH +$ dcapp APP_NAME/DEP_NAME deploy THE_LAST_WORKING_VERSION_HASH ~~~ @@ -355,23 +355,23 @@ Add-ons add additional services to your deployment. The [Add-on marketplace] off Each deployment has its own set of Add-ons. If your app needs a MySQL database and you have a production, a development and a staging environment, all three must have their own MySQL Add-ons. Each Add-on comes with different plans allowing you to choose a more powerful database for your high traffic production deployment and smaller ones for the development or staging environments. -You can see the available Add-on plans on the Add-on marketplace website or with the `cctrlapp addon.list` command. +You can see the available Add-on plans on the Add-on marketplace website or with the `dcapp addon.list` command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.list +$ dcapp APP_NAME/DEP_NAME addon.list [...] ~~~ Adding an Add-on is just as easy. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add ADDON_NAME.ADDON_OPTION +$ dcapp APP_NAME/DEP_NAME addon.add ADDON_NAME.ADDON_OPTION ~~~ As always replace the placeholders written in uppercase with their respective values. To get the list of current Add-ons for a deployment use the addon command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon +$ dcapp APP_NAME/DEP_NAME addon Addon : alias.free Addon : newrelic.standard @@ -388,9 +388,9 @@ To upgrade or downgrade an Add-on use the respective command followed by the Add ~~~ # upgrade -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade FROM_SMALL_ADDON TO_BIG_ADDON +$ dcapp APP_NAME/DEP_NAME addon.upgrade FROM_SMALL_ADDON TO_BIG_ADDON # downgrade -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade FROM_BIG_ADDON TO_SMALL_ADDON +$ dcapp APP_NAME/DEP_NAME addon.downgrade FROM_BIG_ADDON TO_SMALL_ADDON ~~~ **Remember:** As in all examples in this documentation, replace all the uppercase placeholders with their respective values. @@ -417,7 +417,7 @@ The guides section has detailed examples about how to get the credentials in dif To see the format and contents of the credentials file locally, use the `addon.creds` command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.creds +$ dcapp APP_NAME/DEP_NAME addon.creds { "BLITZ": { "BLITZ_API_KEY": "SOME_SECRET_API_KEY", @@ -444,10 +444,10 @@ $ cctrlapp APP_NAME/DEP_NAME addon.creds * There are four different log types (access, error, worker and deploy) available. -To see the log output in a `tail -f`-like fashion use the cctrlapp log command. The log command initially shows the last 500 log messages and then appends new messages as they arrive. +To see the log output in a `tail -f`-like fashion use the dcapp log command. The log command initially shows the last 500 log messages and then appends new messages as they arrive. ~~~ -$ cctrlapp APP_NAME/DEP_NAME log [access,error,worker,deploy] +$ dcapp APP_NAME/DEP_NAME log [access,error,worker,deploy] [...] ~~~ @@ -489,7 +489,7 @@ Where "SERVER_ADDRESS" and "PORT" should be replaced with the concrete values an Use the name of the file (for example `custom_remote.cfg`) as a value for the "RSYSLOG_REMOTE" config variable: ~~~ -$ cctrlapp APP_NAME/DEP_NAME config.add RSYSLOG_REMOTE=custom_remote.cfg +$ dcapp APP_NAME/DEP_NAME config.add RSYSLOG_REMOTE=custom_remote.cfg ~~~ From now on all the new logs should be visible in your custom syslog remote. @@ -755,7 +755,7 @@ The container is identical to the web or worker containers but starts an SSH dae To start a shell (e.g. bash) use the `run` command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME run bash +$ dcapp APP_NAME/DEP_NAME run bash Connecting... Warning: Permanently added '[10.62.45.100]:25832' (RSA) to the list of known hosts. u25832@DEP_ID-25832:~/www$ echo "interactive commands work as well" @@ -769,7 +769,7 @@ It's also possible to execute a command directly and have the container shutdown For example, passing the `"env | sort"` command will list the environment variables. Note that the use of the quotes is required for a command that includes spaces. ~~~ -$ cctrlapp APP_NAME/DEP_NAME run "env | sort" +$ dcapp APP_NAME/DEP_NAME run "env | sort" Connecting... CRED_FILE=/srv/creds/creds.json DEP_ID=DEP_ID @@ -822,9 +822,9 @@ Stacks are based on Ubuntu releases and have the same first letter as the releas * **Pinky** based on [Ubuntu 12.04 LTS Precise Pangolin] -Details about the current stack are available via the `cctrlapp` command line interface. +Details about the current stack are available via the `dcapp` command line interface. ~~~ -$ cctrlapp APP_NAME/DEP_NAME details +$ dcapp APP_NAME/DEP_NAME details name: APP_NAME/DEP_NAME stack: pinky [...] diff --git a/Quickstart.md b/Quickstart.md index 9448e49..bc66bfb 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -32,7 +32,7 @@ $ sudo pip install cctrl You can register on the website or directly from the command line. Provide the required values when prompted. ~~~bash -$ cctrluser create +$ dcuser create Username: USERNAME Email : EMAIL Password: PASSWORD @@ -43,7 +43,7 @@ User has been created. Please check you e-mail for your confirmation code. Activate your user account with the activate command. ~~~bash -$ cctrluser activate USERNAME ACTIVATION_CODE +$ dcuser activate USERNAME ACTIVATION_CODE ~~~ Replace `USERNAME` and `ACTIVATION_CODE` with the values form the activation e-mail. If you didn't receive one, double check the spelling of your e-mail address or check your SPAM folder. @@ -51,7 +51,7 @@ Replace `USERNAME` and `ACTIVATION_CODE` with the values form the activation e-m ## Add a Public Key ~~~bash -$ cctrluser key.add +$ dcuser key.add Email : EMAIL Password: PASSWORD ~~~ @@ -63,7 +63,7 @@ The command line client will determine if you already have a public key and uplo Create a new application on the dotCloud platform by giving it an unique `APP_NAME` (the name is used as the `.cloudcontrolled.com` subdomain) and choosing the `TYPE`. ~~~bash -$ cctrlapp APP_NAME create [java, php, python, ruby, nodejs] +$ dcapp APP_NAME create [java, php, python, ruby, nodejs] ~~~ If the `APP_NAME` is already taken, please pick another one. @@ -98,7 +98,7 @@ $ git clone https://github.com/cloudControl/nodejs-express-example-app.git $ cd nodejs-express-example-app # now push -$ cctrlapp APP_NAME push +$ dcapp APP_NAME push ~~~ The push fires a hook that prepares your application for deployment like pulling in requirements and more. You can see the output of the build process in your terminal. @@ -108,7 +108,7 @@ The push fires a hook that prepares your application for deployment like pulling Deploy your app with ~~~bash -$ cctrlapp APP_NAME deploy +$ dcapp APP_NAME deploy ~~~ **Congratulations, your app is now up and running.** From 631961173c8c885225b3051c43552db33b24e776 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Wed, 3 Dec 2014 16:01:15 +0100 Subject: [PATCH 29/84] Replace cctrl with dotcloudng --- Platform Documentation.md | 20 ++++++++++---------- Quickstart.md | 8 ++++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index 8a0c7de..5a69176 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -4,33 +4,33 @@ **TL;DR:** - * The command line client cctrl is the primary interface. + * The command line client dotcloudng is the primary interface. * We also offer a web console. * For full control and integration it's possible to talk directly to the RESTful API. -To control the platform we offer different interfaces. The primary way of controlling your apps and deployments is via [the command-line interface](http://en.wikipedia.org/wiki/Command-line_interface) (CLI) called *cctrl*. Additionally we also offer a [web console]. Both the CLI as well as the web console however are merely frontends to our RESTful API. For deep integration into your apps you can optionally use one of our available [API libraries]. +To control the platform we offer different interfaces. The primary way of controlling your apps and deployments is via [the command-line interface](http://en.wikipedia.org/wiki/Command-line_interface) (CLI) called *dotcloudng*. Additionally we also offer a [web console]. Both the CLI as well as the web console however are merely frontends to our RESTful API. For deep integration into your apps you can optionally use one of our available [API libraries]. Throughout this documentation we will use the CLI as the primary way of controlling the dotCloud platform. The CLI consists of 2 parts: *dcapp* and *dcuser*. To get help for the command line client, just append --help or -h to any of the commands. -Installing *cctrl* is easy and works on Mac/Linux as well as on Windows. +Installing *dotcloudng* is easy and works on Mac/Linux as well as on Windows. #### Quick Installation Windows -For Windows we offer an installer. Please download [the latest version] of the installer from Cloud Storage. The file is named cctrl-x.x-setup.exe. +For Windows we offer an installer. Please download [the latest version] of the installer from Cloud Storage. The file is named dotcloudng-x.x-setup.exe. #### Quick Installation Linux/Mac -On Linux and Mac OS we recommend installing and updating cctrl via pip. *cctrl* requires [Python 2.6+]. +On Linux and Mac OS we recommend installing and updating dotcloudng via pip. *dotcloudng* requires [Python 2.6+]. ~~~ -$ sudo pip install -U cctrl +$ sudo pip install -U dotcloudng ~~~ -If you don't have pip you can install pip via easy_install (on Linux usually part of the python-setuptools package) and then install cctrl. +If you don't have pip you can install pip via easy_install (on Linux usually part of the python-setuptools package) and then install dotcloudng. ~~~ $ sudo easy_install pip -$ sudo pip install -U cctrl +$ sudo pip install -U dotcloudng ~~~ ## User Accounts @@ -212,8 +212,8 @@ $ dcapp APP_NAME/dev push # get the REPO_URL from the output of dcapp APP_NAME details # with git: -$ git remote add cctrl REPO_URL -$ git push cctrl dev +$ git remote add dotcloudng REPO_URL +$ git push dotcloudng dev ~~~ The repositories support all other remote operations like pulling and cloning as well. diff --git a/Quickstart.md b/Quickstart.md index bc66bfb..c700735 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -9,20 +9,20 @@ It's easy to start with dotCloud. Follow this 5 minute quickstart to get your fi ### Requirements * git version control system -* cctrl command line client +* dotcloudng command line client ### Install git Install Git from the [official site](http://git-scm.com/) or your package repository of choice. For Windows it's recommended to use the official installer and Git bash. Come back when you are done. -### Install cctrl +### Install dotcloudng -**Linux/Mac OS X:** We recommend installing cctrl via pip. +**Linux/Mac OS X:** We recommend installing dotcloudng via pip. ~~~bash # if you don't have pip yet $ sudo easy_install pip -$ sudo pip install cctrl +$ sudo pip install dotcloudng ~~~ **Windows:** Please download the provided [installer](https://download.dotcloudapp.com/windows). From 225fba83f019fbea4ee920e1bd9eb17020e4ac1c Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Wed, 3 Dec 2014 16:37:31 +0100 Subject: [PATCH 30/84] Replace cloudcontrolapp.com, cloudcontrolled.com with dotcloudapp.com --- Add-on Documentation/Deployment/Alias.md | 14 ++++---- Add-on Documentation/Deployment/Cron.md | 6 ++-- Guides/Java/Clojure - HelloWorld.md | 4 +-- Guides/Java/Gradle - HelloWorld.md | 4 +-- Guides/Java/Grails.md | 4 +-- Guides/Java/Java - HelloWorld.md | 4 +-- Guides/Java/Java - Play 2.md | 4 +-- Guides/Java/Java - Spring-Boot.md | 4 +-- Guides/Java/Java - Spring.md | 4 +-- Guides/Java/Java - Tomcat.md | 4 +-- Guides/Java/Play - HelloWorld.md | 4 +-- Guides/Java/Scala - HelloWorld.md | 4 +-- Guides/NodeJS/Express.md | 4 +-- Guides/NodeJS/HelloWorld.md | 4 +-- Guides/NodeJS/Sailsjs.md | 12 +++---- Guides/PHP/HelloWorld.md | 4 +-- Guides/PHP/Kohana 3.2.0.md | 2 +- Guides/PHP/Symfony 1.4.md | 4 +-- Guides/PHP/Yii 1.1.10.md | 2 +- Guides/PHP/Zend 2.md | 4 +-- Guides/PHP/Zend Framework 1.11.md | 2 +- Guides/Python/Celery.md | 6 ++-- Guides/Python/Django.md | 6 ++-- Guides/Python/HelloWorld.md | 4 +-- Guides/Python/Tornado.md | 4 +-- Guides/Ruby/HelloWorld.md | 4 +-- Guides/Ruby/Ruby on Rails.md | 4 +-- .../Third-Party Buildpacks/Go HelloWorld.md | 6 ++-- Guides/Third-Party Buildpacks/Go Martini.md | 4 +-- Guides/Third-Party Buildpacks/Go Revel.md | 4 +-- Platform Documentation.md | 32 +++++++++---------- Quickstart.md | 4 +-- 32 files changed, 88 insertions(+), 88 deletions(-) diff --git a/Add-on Documentation/Deployment/Alias.md b/Add-on Documentation/Deployment/Alias.md index dd2d944..0a9e453 100644 --- a/Add-on Documentation/Deployment/Alias.md +++ b/Add-on Documentation/Deployment/Alias.md @@ -11,7 +11,7 @@ custom domain follow the following simple steps **for each domain**. The verification code is unique to the owner of the app. To get it simply use the alias command. ~~~ - $ dcapp APP_NAME/default alias APP_NAME.cloudcontrolled.com + $ dcapp APP_NAME/default alias APP_NAME.dotcloudapp.com ~~~ The verification code is case sensitive and includes a space after the colon. Please ensure, it keeps the exact same syntax in the TXT records text or the alias will not get verified. @@ -24,29 +24,29 @@ custom domain follow the following simple steps **for each domain**. example.com. 3600 IN TXT "cloudControl-verification: 68b676e063eadb350876ae291e9ae43748d6e51c85ecd3c4cc026c869acc9d2d" ~~~ - Since we are going to use a CNAME to point the custom domain to the provided `.cloudcontrolled.com` subdomain all additional record types will be ignored. It's therefor required to set the TXT record on the root domain. This has the added benefit, that if you can verifiy multiple domains like e.g. `www.example.com` and `secure.example.com` with just one TXT record set for `example.com`. + Since we are going to use a CNAME to point the custom domain to the provided `.dotcloudapp.com` subdomain all additional record types will be ignored. It's therefor required to set the TXT record on the root domain. This has the added benefit, that if you can verifiy multiple domains like e.g. `www.example.com` and `secure.example.com` with just one TXT record set for `example.com`. - 1. Add a CNAME pointing to the provided `.cloudcontrolled.com` subdomain. + 1. Add a CNAME pointing to the provided `.dotcloudapp.com` subdomain. - In addition to the TXT record, go ahead and also add a CNAME pointing to your apps `.cloudcontrolled.com` subdomain. Use the command line client's alias command to show the one specific to your deployment. + In addition to the TXT record, go ahead and also add a CNAME pointing to your apps `.dotcloudapp.com` subdomain. Use the command line client's alias command to show the one specific to your deployment. ~~~ # for the default deployment $ dcapp APP_NAME/default alias Aliases name default verified - APP_NAME.cloudcontrolled.com 1 1 + APP_NAME.dotcloudapp.com 1 1 # for any additional deployment $ dcapp APP_NAME/DEP_NAME alias Aliases name default verified - DEP_NAME.APP_NAME.cloudcontrolled.com 1 1 + DEP_NAME.APP_NAME.dotcloudapp.com 1 1 ~~~ The resulting CNAME record should look something like this example. ~~~ - www.example.com. 1593 IN CNAME APP_NAME.cloudcontrolled.com. + www.example.com. 1593 IN CNAME APP_NAME.dotcloudapp.com. ~~~ 1. Add one alias per domain to your deployment. diff --git a/Add-on Documentation/Deployment/Cron.md b/Add-on Documentation/Deployment/Cron.md index 734ab99..b68295d 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -40,9 +40,9 @@ To call an URL with the specific interval you write it as the parameter: ~~~ # for the default deployment -$ dcapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]APP_NAME.cloudcontrolled.com +$ dcapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]APP_NAME.dotcloudapp.com # for any additional deployment -$ dcapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.cloudcontrolled.com +$ dcapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.dotcloudapp.com ~~~ You can only add cron jobs calling a verified alias of the deployment. It is @@ -64,7 +64,7 @@ Get the details of a specific Cron job: $ dcapp APP_NAME/DEP_NAME cron CRON_ID Cronjob job_id : jobkqy7rdmg - url : http://APP_NAME.cloudcontrolled.com + url : http://APP_NAME.dotcloudapp.com next_run : 2011-05-09 19:39:39 created : 2011-05-05 19:39:39 modified : 2011-05-05 19:39:39 diff --git a/Guides/Java/Clojure - HelloWorld.md b/Guides/Java/Clojure - HelloWorld.md index ef8a6e7..6a81143 100644 --- a/Guides/Java/Clojure - HelloWorld.md +++ b/Guides/Java/Clojure - HelloWorld.md @@ -63,7 +63,7 @@ done -----> Building image -----> Uploading image (59M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -74,7 +74,7 @@ Last but not least, deploy the latest version of the app with the dcapp deploy c $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Clojure application running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Clojure application running at `http[s]://APP_NAME.dotcloudapp.com`. [dotCloud]: https://next.dotcloud.com/ [Clojure buildpack]: https://github.com/cloudControl/buildpack-clojure diff --git a/Guides/Java/Gradle - HelloWorld.md b/Guides/Java/Gradle - HelloWorld.md index f62f2f7..6f8a73a 100644 --- a/Guides/Java/Gradle - HelloWorld.md +++ b/Guides/Java/Gradle - HelloWorld.md @@ -79,7 +79,7 @@ $ dcapp APP_NAME/default push -----> Building image -----> Uploading image (39M) - To ssh://APP_NAME@cloudcontrolled.com/repository.git + To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -89,7 +89,7 @@ Last but not least, deploy the latest version of the app with the dcapp deploy c $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Gradle application running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Gradle application running at `http[s]://APP_NAME.dotcloudapp.com`. [dotCloud]: https://next.dotcloud.com/ [Gradle buildpack]: https://github.com/cloudControl/buildpack-gradle diff --git a/Guides/Java/Grails.md b/Guides/Java/Grails.md index 4ca8379..dba8bd1 100644 --- a/Guides/Java/Grails.md +++ b/Guides/Java/Grails.md @@ -88,7 +88,7 @@ $ dcapp APP_NAME/default push -----> Building image -----> Uploading image (73M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -98,7 +98,7 @@ Last but not least, deploy the latest version of the app with the dcapp deploy c $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Grails application running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Grails application running at `http[s]://APP_NAME.dotcloudapp.com`. [dotCloud]: https://next.dotcloud.com/ [Grails buildpack]: https://github.com/cloudControl/buildpack-grails diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index 3110662..d710979 100644 --- a/Guides/Java/Java - HelloWorld.md +++ b/Guides/Java/Java - HelloWorld.md @@ -94,7 +94,7 @@ $ dcapp APP_NAME/default push -----> Building image -----> Uploading image (39M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git 54b0da2..d247825 master -> master ~~~ @@ -104,7 +104,7 @@ Last but not least deploy the latest version of the app with the dcapp deploy co $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.dotcloudapp.com`. [Jetty]: http://jetty.codehaus.org/jetty/ [dotCloud]: https://next.dotcloud.com/ diff --git a/Guides/Java/Java - Play 2.md b/Guides/Java/Java - Play 2.md index 94b087c..b63806e 100644 --- a/Guides/Java/Java - Play 2.md +++ b/Guides/Java/Java - Play 2.md @@ -90,7 +90,7 @@ done -----> Building image -----> Uploading image (0.1 GB) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -100,7 +100,7 @@ Last but not least, deploy the latest version of the app with the dcapp deploy c $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Play 2 application running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Play 2 application running at `http[s]://APP_NAME.dotcloudapp.com`. Note: This app uses an in-memory database, which is not persistent. After a redeploy all changes will be lost. If you want a production database you should diff --git a/Guides/Java/Java - Spring-Boot.md b/Guides/Java/Java - Spring-Boot.md index 0f14198..a96a27d 100644 --- a/Guides/Java/Java - Spring-Boot.md +++ b/Guides/Java/Java - Spring-Boot.md @@ -118,7 +118,7 @@ Total 47 (delta 15), reused 0 (delta 0) -----> Building image -----> Uploading image (70.0 MB) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -131,7 +131,7 @@ $ dcapp APP_NAME/default deploy --memory=768MB The `--memory=768MB` argument increases the container size to meet the high memory consumption of the Spring framework. Please note: increasing the size comes with additional costs. -Et voila, the app is now up and running at `http[s]://APP_NAME.cloudcontrolled.com` . +Et voila, the app is now up and running at `http[s]://APP_NAME.dotcloudapp.com` . diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index 3d471b2..ca06d93 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -130,7 +130,7 @@ Total 223 (delta 107), reused 0 (delta 0) -----> Building image -----> Uploading image (84M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -143,7 +143,7 @@ $ dcapp APP_NAME/default deploy --memory=768MB The `--memory=768MB` argument increases the container size to meet the high memory consumption of the Spring framework. Please note: increasing the size comes with additional costs. -Et voila, the app is now up and running at `http[s]://APP_NAME.cloudcontrolled.com` . +Et voila, the app is now up and running at `http[s]://APP_NAME.dotcloudapp.com` . [Spring Roo petclinic]: http://static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sample diff --git a/Guides/Java/Java - Tomcat.md b/Guides/Java/Java - Tomcat.md index 87afc70..2878cbd 100644 --- a/Guides/Java/Java - Tomcat.md +++ b/Guides/Java/Java - Tomcat.md @@ -152,7 +152,7 @@ Total 2 (delta 1), reused 0 (delta 0) -----> Building image -----> Uploading image (50.2 MB) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git db605ac...6a884f1 master -> master ~~~ @@ -162,7 +162,7 @@ Last but not least, deploy the latest version of the app with the dcapp deploy c $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your JSP Application running on Tomcat at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your JSP Application running on Tomcat at `http[s]://APP_NAME.dotcloudapp.com`. [Tomcat]: https://tomcat.apache.org/ [dotCloud]: https://next.dotcloud.com/ diff --git a/Guides/Java/Play - HelloWorld.md b/Guides/Java/Play - HelloWorld.md index e30e8c2..2797b2f 100644 --- a/Guides/Java/Play - HelloWorld.md +++ b/Guides/Java/Play - HelloWorld.md @@ -66,7 +66,7 @@ $ dcapp APP_NAME/default push -----> Building image -----> Uploading image (65M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -76,7 +76,7 @@ Last but not least, deploy the latest version of the app with the dcapp deploy c $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Play! application running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Play! application running at `http[s]://APP_NAME.dotcloudapp.com`. [dotCloud]: https://next.dotcloud.com/ [Play buildpack]: https://github.com/cloudControl/buildpack-play diff --git a/Guides/Java/Scala - HelloWorld.md b/Guides/Java/Scala - HelloWorld.md index a65fbd5..c1792c5 100644 --- a/Guides/Java/Scala - HelloWorld.md +++ b/Guides/Java/Scala - HelloWorld.md @@ -76,7 +76,7 @@ $ dcapp APP_NAME/default push -----> Building image -----> Uploading image (80M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -86,7 +86,7 @@ Last but not least, deploy the latest version of the app with the dcapp deploy c $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Scala application running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Scala application running at `http[s]://APP_NAME.dotcloudapp.com`. [dotCloud]: https://next.dotcloud.com/ [Scala buildpack]: https://github.com/cloudControl/buildpack-scala diff --git a/Guides/NodeJS/Express.md b/Guides/NodeJS/Express.md index 6748601..a2ebec4 100644 --- a/Guides/NodeJS/Express.md +++ b/Guides/NodeJS/Express.md @@ -130,7 +130,7 @@ Total 73 (delta 30), reused 73 (delta 30) -----> Building image -----> Uploading image (17M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -143,7 +143,7 @@ $ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Express app running with MongoDB at -`http[s]://APP_NAME.cloudcontrolled.com`. +`http[s]://APP_NAME.dotcloudapp.com`. ## Next Steps diff --git a/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index b39de47..b5ada65 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -115,7 +115,7 @@ Total 344 (delta 24), reused 337 (delta 20) -----> Uploading image (5.9 MB) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -126,7 +126,7 @@ $ dcapp APP_NAME deploy ~~~ Congratulations, you can now see your Node.js app running at -`http[s]://APP_NAME.cloudcontrolled.com`. +`http[s]://APP_NAME.dotcloudapp.com`. ## Next Steps Building a data app with Node.js? Check out our next [example on how to use Node.js with MongoDB]. Read our [platform documentation] for a technical overview of the concepts you’ll encounter while writing, configuring, deploying and running your Node.js applications. diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index 50df84e..c9c07a6 100644 --- a/Guides/NodeJS/Sailsjs.md +++ b/Guides/NodeJS/Sailsjs.md @@ -19,7 +19,7 @@ Now you have a small, but fully functional Sails.js application. ### Dependency Tracking -Dependencies are tracked using [npm] and specified in a `package.json`-file in your project's root directory. +Dependencies are tracked using [npm] and specified in a `package.json`-file in your project's root directory. The one you cloned as part of the example app looks like this: ~~~json @@ -50,7 +50,7 @@ The one you cloned as part of the example app looks like this: ### Process Type Definition dotCloud uses a [Procfile] to start the application processes. The `Procfile` can be found at the root level of your repository. -To start the sails server, you need to use the `sails lift` command. This command is included in the procfile definition as shown below: +To start the sails server, you need to use the `sails lift` command. This command is included in the procfile definition as shown below: ~~~ web: export NODE_ENV=production; sails lift @@ -59,7 +59,7 @@ web: export NODE_ENV=production; sails lift Left from the colon we specified the **required** process type called `web` for a web application and followed by the command that starts the Sails server. ### Connecting the Sails.js Application to a Database -Sails.js is database agnostic. It provides a simple data access layer that works, no matter what database you're using. All you have to do is plug in one of the adapters for your database. Here, we show you how to connect your Sails.js application to a MySQL database using the dotCloud [Shared MySQL Add-on]. +Sails.js is database agnostic. It provides a simple data access layer that works, no matter what database you're using. All you have to do is plug in one of the adapters for your database. Here, we show you how to connect your Sails.js application to a MySQL database using the dotCloud [Shared MySQL Add-on]. Have a look at the `config/adapter.js` file so you can find out how to [get the MySQL credentials] provided by MySQLs Add-on: @@ -94,7 +94,7 @@ module.exports.adapters = { ### Socket.io and Websocket Support -In Sails.js, client-backend communication is done using [websockets]. In order to use websockets, it is important to use `*.cloudcontrolapp.com` domain instead of `*.cloudcontrolled.com`. For more details, take a look at the [dotCloud websockets documentation]. +In Sails.js, client-backend communication is done using [websockets]. For more details, take a look at the [dotCloud websockets documentation]. ## Pushing and Deploying your Sails.js App To deploy your Sails.js application, choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: @@ -126,7 +126,7 @@ Total 73 (delta 30), reused 73 (delta 30) -----> Building image -----> Uploading image (17M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -141,7 +141,7 @@ $ dcapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Sails.js application running at -`http://APP_NAME.cloudcontrolapp.com`. +`http://APP_NAME.dotcloudapp.com`. [Node.js]: http://nodejs.org/ [Sails.js]: http://sailsjs.org/ diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index b2c4862..952b973 100644 --- a/Guides/PHP/HelloWorld.md +++ b/Guides/PHP/HelloWorld.md @@ -99,7 +99,7 @@ Total 29 (delta 5), reused 18 (delta 0) -----> Building image -----> Uploading image (14M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -108,7 +108,7 @@ Last but not least deploy the latest version of the app with the dcapp deploy co $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.dotcloudapp.com`. [silex]: http://silex.sensiolabs.org/ diff --git a/Guides/PHP/Kohana 3.2.0.md b/Guides/PHP/Kohana 3.2.0.md index ef9da79..b6dcc7c 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -110,7 +110,7 @@ When you do this, you'll see output similar to the following: >> Building image >> Uploading image (772K) - To ssh://cloudcontroldlkohana@cloudcontrolled.com/repository.git + To ssh://cloudcontroldlkohana@dotcloudapp.com/repository.git f98a87c..a685cd6 master -> master Note the following lines: diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index 6f50c10..7285784 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -109,7 +109,7 @@ When you do this, you'll see output similar to the following: >> Building image >> Uploading image (3.0M) - To ssh://cloudcontroldlsymfony@cloudcontrolled.com/repository.git + To ssh://cloudcontroldlsymfony@dotcloudapp.com/repository.git d90506c..4078c78 master -> master Note the following lines: @@ -199,7 +199,7 @@ Under ``apps/frontend/config`` open the file ``factories.yaml``. In that file, w param: session_name: symfony1_cloudcontrol session_cookie_path: / - session_cookie_domain: cloudcontroldlsymfony.cloudcontrolled.com + session_cookie_domain: cloudcontroldlsymfony.dotcloudapp.com session_cookie_lifetime: +30 days session_cookie_secure: false session_cookie_http_only: true diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index 4fb2bda..e9fa900 100644 --- a/Guides/PHP/Yii 1.1.10.md +++ b/Guides/PHP/Yii 1.1.10.md @@ -111,7 +111,7 @@ You should see output as below: >> Building image >> Uploading image (4.1M) - To ssh://cloudcontroldlyii@cloudcontrolled.com/repository.git + To ssh://cloudcontroldlyii@dotcloudapp.com/repository.git * [new branch] master -> master ##4. Initialise the Required Add-ons diff --git a/Guides/PHP/Zend 2.md b/Guides/PHP/Zend 2.md index f81b9b0..f1652de 100644 --- a/Guides/PHP/Zend 2.md +++ b/Guides/PHP/Zend 2.md @@ -174,7 +174,7 @@ Total 2208 (delta 1087), reused 2208 (delta 1087) -----> Building image -----> Uploading image (3.1M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -202,7 +202,7 @@ Connecting... Connection to ssh.cloudcontrolled.net closed. ~~~ -Et voila, the app is now up and running at `http[s]://APP_NAME.cloudcontrolled.com`. +Et voila, the app is now up and running at `http[s]://APP_NAME.dotcloudapp.com`. [PHP buildpack]: https://github.com/cloudControl/buildpack-php [dotCloud]: https://next.dotcloud.com/ diff --git a/Guides/PHP/Zend Framework 1.11.md b/Guides/PHP/Zend Framework 1.11.md index f4c9a8f..e94f97f 100644 --- a/Guides/PHP/Zend Framework 1.11.md +++ b/Guides/PHP/Zend Framework 1.11.md @@ -111,7 +111,7 @@ You'll see output similar to the following: >> Building image >> Uploading image (3.6M) - To ssh://cloudcontroldlzf@cloudcontrolled.com/repository.git + To ssh://cloudcontroldlzf@dotcloudapp.com/repository.git dde253a..7b040e2 testing -> testing In the output above, you'll see ``INFO: Zend Framework 1.x detected``. This is the latest stack auto-identifying that the application we're deploying is based on the Zend Framework and will take care of ensuring it sees /public as the root directory to find the bootstrap file, ``index.php``, in. diff --git a/Guides/Python/Celery.md b/Guides/Python/Celery.md index 74e3298..59aea21 100644 --- a/Guides/Python/Celery.md +++ b/Guides/Python/Celery.md @@ -115,7 +115,7 @@ Total 6 (delta 0), reused 0 (delta 0) -----> Building image -----> Uploading image (4.3M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -125,7 +125,7 @@ Last but not least deploy the latest version of the app with the dcapp deploy co $ dcapp APP_NAME/default deploy ~~~ -At this point you can see web interface at `http://APP_NAME.cloudcontrolled.com`. But it hasn't got any workers yet. +At this point you can see web interface at `http://APP_NAME.dotcloudapp.com`. But it hasn't got any workers yet. ## Scaling Celery Workers Scaling Celery workers on dotCloud is easy enough luckily. We have already defined how to run one in the `Procfile` earlier. So we can now go ahead and start the first one. @@ -159,7 +159,7 @@ $ dcapp APP_NAME/default log worker [TIMESTAMP] WRK_ID [TIMESTAMP: INFO/MainProcess] Events enabled by remote. ~~~ -If you refresh the web interface at `http://APP_NAME.cloudcontrolled.com` you should be able to see the worker now. +If you refresh the web interface at `http://APP_NAME.dotcloudapp.com` you should be able to see the worker now. To handle more tasks simultaneously you can always just add more workers. (Please note that only the first worker is free, adding additional workers requires a billing account.) diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index 664958e..fea98fe 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -137,7 +137,7 @@ Total 49 (delta 11), reused 38 (delta 8) -----> Building image -----> Uploading image (29.9 MB) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -154,8 +154,8 @@ Finally, prepare the database using the $ dcapp APP_NAME run "python manage.py syncdb" ~~~ -You can login to the admin console at `APP_NAME.cloudcontrolled.com/admin`, -create some polls and see them at `APP_NAME.cloudcontrolled.com/polls`. +You can login to the admin console at `APP_NAME.dotcloudapp.com/admin`, +create some polls and see them at `APP_NAME.dotcloudapp.com/polls`. For additional information take a look at [Django Notes][django-notes] and other [python-specific documents][python-guides]. diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index 0aa34e8..6754ada 100644 --- a/Guides/Python/HelloWorld.md +++ b/Guides/Python/HelloWorld.md @@ -66,7 +66,7 @@ Total 16 (delta 2), reused 16 (delta 2) -----> Building image -----> Uploading image (25M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -77,7 +77,7 @@ Last but not least deploy the latest version of the app with the dcapp deploy co $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.dotcloudapp.com`. [Flask]: http://flask.pocoo.org/ [dotCloud]: http://next.dotcloud.com diff --git a/Guides/Python/Tornado.md b/Guides/Python/Tornado.md index dd8e7b0..659e986 100644 --- a/Guides/Python/Tornado.md +++ b/Guides/Python/Tornado.md @@ -113,7 +113,7 @@ Total 7 (delta 0), reused 7 (delta 0) -----> Building image -----> Uploading image (25M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git + [new branch] master -> master ~~~ @@ -123,7 +123,7 @@ deploy command. $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Tornado app running at `http://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Tornado app running at `http://APP_NAME.dotcloudapp.com`. [Tornado]: http://www.tornadoweb.org [dotCloud]: http://next.dotcloud.com diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index 28471a2..2167628 100644 --- a/Guides/Ruby/HelloWorld.md +++ b/Guides/Ruby/HelloWorld.md @@ -73,7 +73,7 @@ Total 14 (delta 0), reused 14 (delta 0) -----> Building image -----> Uploading image (31M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -82,7 +82,7 @@ Last but not least deploy the latest version of the app with the dcapp deploy co $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME.dotcloudapp.com`. [sinatra]: http://www.sinatrarb.com/ diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index 853fd53..e924c0a 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -162,7 +162,7 @@ Total 62 (delta 2), reused 0 (delta 0) -----> Building image -----> Uploading image (34M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -179,7 +179,7 @@ Finally, prepare the database by running migrations using the [Run command][run $ dcapp APP_NAME/default run "rake db:migrate" ~~~ -Congratulations, you can now access the app at http://APP_NAME.cloudcontrolled.com. +Congratulations, you can now access the app at http://APP_NAME.dotcloudapp.com. For additional information take a look at [Ruby on Rails notes][rails-notes] and other [ruby-specific documents][ruby-guides]. diff --git a/Guides/Third-Party Buildpacks/Go HelloWorld.md b/Guides/Third-Party Buildpacks/Go HelloWorld.md index bfc9f90..463dca8 100644 --- a/Guides/Third-Party Buildpacks/Go HelloWorld.md +++ b/Guides/Third-Party Buildpacks/Go HelloWorld.md @@ -60,7 +60,7 @@ import ( func defaultHandler(w http.ResponseWriter, r *http.Request) { t := template.Must(template.ParseFiles("templates/hello.html")) pageModel := make(map[string]interface{}) - pageModel["Domain"] = getEnv("DOMAIN", "cloudcontrolled.com") + pageModel["Domain"] = getEnv("DOMAIN", "dotcloudapp.com") if err := t.Execute(w, pageModel); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } @@ -110,7 +110,7 @@ Total 17 (delta 0), reused 0 (delta 0) -----> Custom buildpack provided -----> Uploading image (2.2 MB) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -120,7 +120,7 @@ Last but not least deploy the latest version of the app with the dcapp deploy co $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Go app running at `http[s]://APP_NAME.cloudcontrolled.com`. +Congratulations, you can now see your Go app running at `http[s]://APP_NAME.dotcloudapp.com`. [Go]: http://golang.org/ [dotCloud]: http://next.dotcloud.com diff --git a/Guides/Third-Party Buildpacks/Go Martini.md b/Guides/Third-Party Buildpacks/Go Martini.md index 2e9bb8f..409541e 100644 --- a/Guides/Third-Party Buildpacks/Go Martini.md +++ b/Guides/Third-Party Buildpacks/Go Martini.md @@ -118,7 +118,7 @@ Total 73 (delta 3), reused 0 (delta 0) remote: -----> Custom buildpack provided -----> Uploading image (2.5 MB) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -129,7 +129,7 @@ deploy command. $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Martini app running at `http://APP_NAME.cloudcontrolled.com`. The command line client provides the `open` command to quickly open the app in your default browser. +Congratulations, you can now see your Martini app running at `http://APP_NAME.dotcloudapp.com`. The command line client provides the `open` command to quickly open the app in your default browser. ~~~bash $ dcapp APP_NAME/default open diff --git a/Guides/Third-Party Buildpacks/Go Revel.md b/Guides/Third-Party Buildpacks/Go Revel.md index e0edaf2..576097d 100644 --- a/Guides/Third-Party Buildpacks/Go Revel.md +++ b/Guides/Third-Party Buildpacks/Go Revel.md @@ -102,7 +102,7 @@ cat: /srv/tmp/builddir/.godir: No such file or directory remote: -----> Custom buildpack provided -----> Uploading image (57.0 MB) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@dotcloudapp.com/repository.git * [new branch] master -> master ~~~ @@ -113,7 +113,7 @@ deploy command. $ dcapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Revel app running at `http://APP_NAME.cloudcontrolled.com`. The command line client provides the `open` command to quickly open the app in your default browser. +Congratulations, you can now see your Revel app running at `http://APP_NAME.dotcloudapp.com`. The command line client provides the `open` command to quickly open the app in your default browser. ~~~bash $ dcapp APP_NAME/default open diff --git a/Platform Documentation.md b/Platform Documentation.md index 5a69176..c88357a 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -178,7 +178,7 @@ You can list all the deployments with the *details* command. $ dcapp APP_NAME details App Name: APP_NAME Type: php Owner: user1 - Repository: ssh://APP_NAME@cloudcontrolled.com/repository.git + Repository: ssh://APP_NAME@dotcloudapp.com/repository.git [...] @@ -499,18 +499,18 @@ From now on all the new logs should be visible in your custom syslog remote. **TL;DR:** - * Each deployment is provided with a `cloudcontrolapp.com` subdomain. + * Each deployment is provided with a `dotcloudapp.com` subdomain. * Custom domains are supported via the Alias Add-on. -Each deployment is provided per default with a `*.cloudcontrolapp.com` subdomain. -The `APP_NAME.cloudcontrolapp.com` will point to the `default` deployment while +Each deployment is provided per default with a `*.dotcloudapp.com` subdomain. +The `APP_NAME.dotcloudapp.com` will point to the `default` deployment while any additional deployment can be accessed with a prefixed subdomain: `DEP_NAME-APP_NAME.app.exo.io`. You can also use custom domains to access your deployments. To add a domain like `www.example.com`, `app.example.com` or `secure.example.com` to one of your deployments, simply add each one as an alias and add a CNAME for each pointing to your deployment's subdomain. So to point `www.example.com` to the default deployment -of the app called *awesomeapp*, add a CNAME for `www.example.com` pointing to `awesomeapp.cloudcontrolapp.com`. +of the app called *awesomeapp*, add a CNAME for `www.example.com` pointing to `awesomeapp.dotcloudapp.com`. The [Alias Add-on] also supports mapping wildcard domains like `*.example.com` to one of your deployments. @@ -542,8 +542,8 @@ root to the configured subdomain (e.g. example.org -> www.example.org). **TL;DR:** * All HTTP requests are routed via our routing tier. - * Within the routing tier, requests are routed via the `*.cloudcontrolapp.com` subdomain. - * The `*.cloudcontrolapp.com` subdomain provides WebSocket support. + * Within the routing tier, requests are routed via the `*.dotcloudapp.com` subdomain. + * The `*.dotcloudapp.com` subdomain provides WebSocket support. * Requests are routed based on the `Host` header. * Use the `X-Forwarded-For` header to get the client IP. @@ -552,7 +552,7 @@ The routing tier is designed as a cluster of reverse proxy loadbalancers which orchestrate the forwarding of user requests to your applications. It takes care of routing the request to one of the application's containers based on matching the `Host` header against the list of the deployment's aliases. This is accomplished -via the `*.cloudcontrolapp.com` subdomain. +via the `*.dotcloudapp.com` subdomain. The routing tier is designed to be robust against single node and even complete datacenter failures while still keeping the added latency as low as possible. @@ -562,11 +562,11 @@ datacenter failures while still keeping the added latency as low as possible. Transport Layer Security (TLS / SSL) is available to encrypt traffic between users and applications. -As part of the provided `.cloudcontrolapp.com` subdomain, all deployments have -access to piggyback SSL using a `*.cloudcontrolapp.com` wildcard certificate. +As part of the provided `.dotcloudapp.com` subdomain, all deployments have +access to piggyback SSL using a `*.dotcloudapp.com` wildcard certificate. To use this, simply point your browser to: -* `https://APP_NAME.cloudcontrolapp.com` for the default deployment -* `https://DEP_NAME-APP_NAME.cloudcontrolapp.com` for non-default deployments +* `https://APP_NAME.dotcloudapp.com` for the default deployment +* `https://DEP_NAME-APP_NAME.dotcloudapp.com` for non-default deployments Please note the **dash** between DEP_NAME and APP_NAME. @@ -607,7 +607,7 @@ strict timeouts to the read/ write operations. You can find them below. * __Send timeout__ - maximum time between two write operations of a request. If your application does not take new data within this time, the routing tier will shut down the connection. -#### Timeouts for `*.cloudcontrolapp.com` subdomain: +#### Timeouts for `*.dotcloudapp.com` subdomain: |Parameter|Value [s]| |:---------|:----------:| @@ -638,7 +638,7 @@ the replacement. To avoid even short downtimes, set the --containers option to a #### Health Checker -For the `*.cloudcontrolapp.com` subdomain, failed requests will cause an error message to be returned to +For the `*.dotcloudapp.com` subdomain, failed requests will cause an error message to be returned to the user once, but the "unhealthy" container will be actively monitored by a health checker. This signals the routing tier to temporarily remove the unhealthy container from the list of containers receiving requests. Subsequent requests are routed to an available container of the deployment. Once the health checker notices @@ -688,7 +688,7 @@ css files into one file each and using sprites for images. **TL;DR:** - * WebSockets are supported via the `*.cloudcontrolapp.com` subdomain. + * WebSockets are supported via the `*.dotcloudapp.com` subdomain. * WebSockets allow real-time, bidirectional communication between clients and servers * Additional steps are necessary to secure WebSocket connections * It is highly recommended to use the secure `wss://` protocol rather than the insecure `ws://`. @@ -713,7 +713,7 @@ Normal connection: ws://{host}:{port}/{path to the server} Secure connection: wss://{host}:{port}/{path to the server} ~~~ -Please note that Secure WebSockets connections can only be established using `*.cloudcontrolapp.com` subdomains, not custom ones. It is highly recommended to use them, not only for data security reasons. Secure WebSockets are 100% proxy transparent, which puts your containers in full control of WebSocket `upgrade handshake` in case some of the proxies do not handle it properly. +Please note that Secure WebSockets connections can only be established using `*.dotcloudapp.com` subdomains, not custom ones. It is highly recommended to use them, not only for data security reasons. Secure WebSockets are 100% proxy transparent, which puts your containers in full control of WebSocket `upgrade handshake` in case some of the proxies do not handle it properly. ## Scheduled Jobs and Background Workers diff --git a/Quickstart.md b/Quickstart.md index c700735..1424d07 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -60,7 +60,7 @@ The command line client will determine if you already have a public key and uplo ## Create the First Application on dotCloud -Create a new application on the dotCloud platform by giving it an unique `APP_NAME` (the name is used as the `.cloudcontrolled.com` subdomain) and choosing the `TYPE`. +Create a new application on the dotCloud platform by giving it an unique `APP_NAME` (the name is used as the `.dotcloudapp.com` subdomain) and choosing the `TYPE`. ~~~bash $ dcapp APP_NAME create [java, php, python, ruby, nodejs] @@ -114,7 +114,7 @@ $ dcapp APP_NAME deploy **Congratulations, your app is now up and running.** ~~~bash -http[s]://APP_NAME.cloudcontrolled.com +http[s]://APP_NAME.dotcloudapp.com ~~~ ## Cheatsheet From 02f90e4243033ecce4ada388c09c4d09e186b573 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Wed, 3 Dec 2014 16:43:35 +0100 Subject: [PATCH 31/84] Adjust add-on parts In Add-ons section of Platform Doc - newrelic.standard to sendgrid.starter - blitz.250 to mysqls.free - blitz example to sendgrid example --- Platform Documentation.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index c88357a..8dfa519 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -374,10 +374,10 @@ To get the list of current Add-ons for a deployment use the addon command. $ dcapp APP_NAME/DEP_NAME addon Addon : alias.free -Addon : newrelic.standard +Addon : sendgrid.starter [...] -Addon : blitz.250 +Addon : mysqls.free [...] Addon : memcachier.dev @@ -419,9 +419,9 @@ To see the format and contents of the credentials file locally, use the `addon.c ~~~ $ dcapp APP_NAME/DEP_NAME addon.creds { - "BLITZ": { - "BLITZ_API_KEY": "SOME_SECRET_API_KEY", - "BLITZ_API_USER": "SOME_USER_ID" + "SENDGRID": { + "SENDGRID_PASSWORD": "SOME_SECRET_PASSWORD", + "SENDGRID_USERNAME": "SOME_USERNAME" }, "MEMCACHIER": { "MEMCACHIER_PASSWORD": "SOME_SECRET_PASSWORD", From 3fa569c75c34ea23ef331eeabf6e803aa3a00b4b Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 4 Dec 2014 10:08:29 +0100 Subject: [PATCH 32/84] Rename sendgrid plan --- Platform Documentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index 8dfa519..28d7653 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -374,7 +374,7 @@ To get the list of current Add-ons for a deployment use the addon command. $ dcapp APP_NAME/DEP_NAME addon Addon : alias.free -Addon : sendgrid.starter +Addon : sendgrid.free [...] Addon : mysqls.free From b09abf5a1ae10aaa5175c3e4cf45f0e482540c81 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 4 Dec 2014 10:24:04 +0100 Subject: [PATCH 33/84] Replace ssh hostname --- Guides/PHP/Zend 2.md | 2 +- Guides/Python/Celery.md | 2 +- Guides/Ruby/RunCommand.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Guides/PHP/Zend 2.md b/Guides/PHP/Zend 2.md index f1652de..aa13eb1 100644 --- a/Guides/PHP/Zend 2.md +++ b/Guides/PHP/Zend 2.md @@ -199,7 +199,7 @@ $ dcapp APP_NAME/default addon.add mysqls.free $ dcapp APP_NAME/default run "php code/public/index.php init-session-table" Connecting... [SUCCESS] Session table created. -Connection to ssh.cloudcontrolled.net closed. +Connection to sshforwarder.dotcloudapp.com closed. ~~~ Et voila, the app is now up and running at `http[s]://APP_NAME.dotcloudapp.com`. diff --git a/Guides/Python/Celery.md b/Guides/Python/Celery.md index 59aea21..a7b82a3 100644 --- a/Guides/Python/Celery.md +++ b/Guides/Python/Celery.md @@ -201,7 +201,7 @@ USER@HOSTNAME:~/www$ celery --broker=$CLOUDAMQP_URL status 1 node online. USER@HOSTNAME:~/www$ exit -Connection to ssh.cloudcontrolled.net closed. +Connection to sshforwarder.dotcloudapp.com closed. ~~~ ## Résumé diff --git a/Guides/Ruby/RunCommand.md b/Guides/Ruby/RunCommand.md index c6795eb..c9e7ecc 100644 --- a/Guides/Ruby/RunCommand.md +++ b/Guides/Ruby/RunCommand.md @@ -78,7 +78,7 @@ irb(main):004:0> Post.all irb(main):005:0> exit u@-:~/www$ exit Connection to X.X.X.X closed. -Connection to ssh.cloudcontrolled.net closed. +Connection to sshforwarder.dotcloudapp.com closed. ~~~ The same could be accomplished if the multiple individual commands were chained: From 0375828e021d80834ce2c7175fe4d756c4cbfb94 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 4 Dec 2014 10:53:03 +0100 Subject: [PATCH 34/84] Fixes #website/issues/166 and #website/issues/167 --- .../Data Storage/{MemcachedCloud.md => Memcached Cloud.md} | 0 .../Data Storage/{RedisCloud.md => Redis Cloud.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename Add-on Documentation/Data Storage/{MemcachedCloud.md => Memcached Cloud.md} (100%) rename Add-on Documentation/Data Storage/{RedisCloud.md => Redis Cloud.md} (100%) diff --git a/Add-on Documentation/Data Storage/MemcachedCloud.md b/Add-on Documentation/Data Storage/Memcached Cloud.md similarity index 100% rename from Add-on Documentation/Data Storage/MemcachedCloud.md rename to Add-on Documentation/Data Storage/Memcached Cloud.md diff --git a/Add-on Documentation/Data Storage/RedisCloud.md b/Add-on Documentation/Data Storage/Redis Cloud.md similarity index 100% rename from Add-on Documentation/Data Storage/RedisCloud.md rename to Add-on Documentation/Data Storage/Redis Cloud.md From 114865f6582a14604696948dbeeed9df46d2c4a5 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 4 Dec 2014 12:02:37 +0100 Subject: [PATCH 35/84] Replace cloudControl by dotCloud --- Add-on Documentation/Data Storage/MongoSoup.md | 4 ++-- Guides/Java/Java - Spring.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Add-on Documentation/Data Storage/MongoSoup.md b/Add-on Documentation/Data Storage/MongoSoup.md index 57d4204..16c5d59 100644 --- a/Add-on Documentation/Data Storage/MongoSoup.md +++ b/Add-on Documentation/Data Storage/MongoSoup.md @@ -36,7 +36,7 @@ variable, a JSON document that stores credentials from your add-on providers. This allows you to avoid hard-coding. Note: In the event that MongoSoup must update your MongoSoup_URI, you will be -notified through the email address you\92ve provided to CloudControl. +notified through the email address you\92ve provided to dotCloud. MongoSoup's entry in your application CRED_FILE looks like this: ~~~ @@ -70,7 +70,7 @@ Here are some snippets of code to help you get started: ### Java -For reading CloudControl credentials you can use the Credentials class as +For reading dotCloud credentials you can use the Credentials class as described in [Reading the Credentials](https://next.dotcloud.com/dev-center/guides/java/add-on-credentials) article. diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index ca06d93..270e1ed 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -64,7 +64,7 @@ In this tutorial we use the [Shared MySQL Add-on]. We have changed the `src/main Logging to a file is not recommended since the container's [file system] is not persistent. The default logger configuration - `src/main/resources/log4j.properties` is modified to log to `stdout/stderr`. -Then cloudcontrol can pick up all the messages and provide them to you via the [log command]. This is how the file looks now: +Then dotCloud can pick up all the messages and provide them to you via the [log command]. This is how the file looks now: ~~~xml og4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender From a4548a7975defb80456e59d18773e4b796e354fa Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 4 Dec 2014 12:03:30 +0100 Subject: [PATCH 36/84] Support email should be support@dotcloud.com --- Add-on Documentation/Data Storage/MySQLd.md | 2 +- Guides/PHP/CakePHP 2.2.1.md | 2 +- Guides/PHP/Drupal 7.md | 2 +- Guides/PHP/Kohana 3.2.0.md | 2 +- Guides/PHP/Symfony 1.4.md | 2 +- Guides/PHP/Yii 1.1.10.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Add-on Documentation/Data Storage/MySQLd.md b/Add-on Documentation/Data Storage/MySQLd.md index f90822a..36b04a8 100644 --- a/Add-on Documentation/Data Storage/MySQLd.md +++ b/Add-on Documentation/Data Storage/MySQLd.md @@ -142,5 +142,5 @@ $ mysql -u MYSQLD_USER -p --host=MYSQLD_SERVER --ssl-ca=PATH_TO_CERTIFICATE/ca-c [Config Add-on]: https://next.dotcloud.com/add-ons/config [MySQLd]: https://next.dotcloud.com/add-ons/mysqld [Add-on Credentials]: https://next.dotcloud.com/dev-center/platform-documentation#add-ons -[Email us]: mailto:support@cloudcontrol.de +[Email us]: mailto:support@dotcloud.com [Webconsole]: https://next.dotcloud.com/console/login diff --git a/Guides/PHP/CakePHP 2.2.1.md b/Guides/PHP/CakePHP 2.2.1.md index 89de192..011f983 100644 --- a/Guides/PHP/CakePHP 2.2.1.md +++ b/Guides/PHP/CakePHP 2.2.1.md @@ -435,7 +435,7 @@ If you see output similar to figure 3, then double check your database configura ![Misconfigured Database](images/misconfigured-database.png) -With that, you should be up and running, ready to create your next, amazing, PHP web application, using CakePHP. If you want to save yourself some time, you can clone a copy of the modified CakePHP source from the cloudControl Github repository. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). +With that, you should be up and running, ready to create your next, amazing, PHP web application, using CakePHP. If you want to save yourself some time, you can clone a copy of the modified CakePHP source from the cloudControl Github repository. If you have any issues, feel free to email [support@dotcloud.com](mailto:support@dotcloud.com). ##Links diff --git a/Guides/PHP/Drupal 7.md b/Guides/PHP/Drupal 7.md index 6ecfed2..c8e439c 100644 --- a/Guides/PHP/Drupal 7.md +++ b/Guides/PHP/Drupal 7.md @@ -299,5 +299,5 @@ You should see output similar to that below, in figure 2. ![Successful Deployment](images/drupal7-running.png) -With that, you should be up and running, ready to create your next, amazing, PHP web application, using Drupal 7. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). +With that, you should be up and running, ready to create your next, amazing, PHP web application, using Drupal 7. If you have any issues, feel free to email [support@dotcloud.com](mailto:support@dotcloud.com). diff --git a/Guides/PHP/Kohana 3.2.0.md b/Guides/PHP/Kohana 3.2.0.md index b6dcc7c..25e98f4 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -548,4 +548,4 @@ In this view file, we output some simple HTML and then iterate the value of the After this, add the files to git and commit them and push/deploy the changes out to both environments. From there you can review the testing and production deployments to ensure that they're working as well. -With that, you should be up and running, ready to create your next, amazing, PHP web application, using Kohana and dotCloud. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). +With that, you should be up and running, ready to create your next, amazing, PHP web application, using Kohana and dotCloud. If you have any issues, feel free to email [support@dotcloud.com](mailto:support@dotcloud.com). diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index 7285784..f7d9200 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -337,7 +337,7 @@ You should see output similar to that below, in figure 2. ![Successful Deployment](images/symfony1.png) -With that, you should be up and running, ready to create your next, amazing, PHP web application, using Symfony. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). +With that, you should be up and running, ready to create your next, amazing, PHP web application, using Symfony. If you have any issues, feel free to email [support@dotcloud.com](mailto:support@dotcloud.com). ##Links diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index e9fa900..80eb2ae 100644 --- a/Guides/PHP/Yii 1.1.10.md +++ b/Guides/PHP/Yii 1.1.10.md @@ -349,7 +349,7 @@ The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Ta ##8. All done -With that, you should be up and running, ready to create your next, amazing, PHP web application, using Yii Framework. If you want to save yourself some time, you can clone a copy of the modified Yii Framework source from the dotCloud Github repository. If you have any issues, feel free to email [support@cloudcontrol.com](mailto:support@cloudcontrol.com). +With that, you should be up and running, ready to create your next, amazing, PHP web application, using Yii Framework. If you want to save yourself some time, you can clone a copy of the modified Yii Framework source from the dotCloud Github repository. If you have any issues, feel free to email [support@dotcloud.com](mailto:support@dotcloud.com). ##Links From 56d3ee7b1a6de1c998b4612c4a07947e1111c598 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 4 Dec 2014 12:04:16 +0100 Subject: [PATCH 37/84] Fix links refering to doc on github --- Guides/Migration Guides/Converting dotcloud.yml.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Guides/Migration Guides/Converting dotcloud.yml.md b/Guides/Migration Guides/Converting dotcloud.yml.md index 84dcd61..3f8d084 100644 --- a/Guides/Migration Guides/Converting dotcloud.yml.md +++ b/Guides/Migration Guides/Converting dotcloud.yml.md @@ -181,7 +181,7 @@ worker: celery -A tasks worker --loglevel=info The entry for the web or worker process will be executed as a shell command. -For more specific details, please see the [porting guides](https://github.com/cloudControl/documentation/tree/master/Guides/dotCloud-cloudControl-migration) specific to your language of choice. Please note that we will continually update these guides to include all of the languages officially supported on Next dotCloud. +For more specific details, please see the [porting guides](../) specific to your language of choice. Please note that we will continually update these guides to include all of the languages officially supported on Next dotCloud. ## approot You may have used the approot directive in dotcloud.yml to tell the platform where to find the code to run, but the Next dotCloud Procfile lets you set this first command explicitly, so you don't need an approot. If you need to change directory before running your first statement, you can do that in the command of the Procfile: @@ -218,7 +218,7 @@ If you’re using the config section to specify an interpreter version (e.g. Pyt If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. -For more information, read our guide on [migrating environment variables](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl-migration/Migrating-environment.md) from dotCloud to Next dotCloud. +For more information, read our guide on [migrating environment variables](./migrating-environment) from dotCloud to Next dotCloud. ## ports If you have a ports section in your dotcloud.yml then you should only have one port listed, a single http type port. That is the only kind of port allowed on the Next dotCloud PaaS. You can only have one process which listens to an HTTP port. @@ -228,7 +228,7 @@ If you do have multiple services each with their own HTTP port, then you should Note that Next dotCloud containers do not expose an SSH port. See the [Secure Shell docs](https://next.dotcloud.com/dev-center/platform-documentation#secure-shell-ssh). ## environment -If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config) and our [dedicated guide](https://github.com/cloudControl/documentation/blob/master/Guides/dotCloud-cloudControl-migration/Migrating-environment.md) on this topic. +If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config) and our [dedicated guide](./migrating-environment) on this topic. Note that the same variables are set in all your application processes (web and worker) -- you cannot specify that a variable should only be set on one process (as you could in a dotcloud.yml file). @@ -238,5 +238,5 @@ additional dependencies of your application during build time (after `dotcloud push`). On Next dotCloud you should use the mechanism provided by your Buildpack. -For more information on all supported languages, please check our [Guides](https://github.com/cloudControl/documentation/tree/master/Guides). +For more information on all supported languages, please check our [Guides](../..). From 92a97159ce475cf60be4b7b514a5a62557ca2552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 4 Dec 2014 12:50:44 +0100 Subject: [PATCH 38/84] Change cheatsheet link to Google Storage --- Quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Quickstart.md b/Quickstart.md index 1424d07..4ef82e2 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -119,7 +119,7 @@ http[s]://APP_NAME.dotcloudapp.com ## Cheatsheet -Grab [our cheatsheet (PDF)](/dev-center/dotcloudng_cheatsheet.pdf) to have the most important command line client commands handy at all times. +Grab [our cheatsheet (PDF)](https://storage.googleapis.com/download.dotcloudapp.com/dotcloudng_cheatsheet.pdf) to have the most important command line client commands handy at all times. ## Documentation From 67450efcad80d5a5bd62f0301f9e653086f7e882 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Thu, 4 Dec 2014 14:26:06 +0100 Subject: [PATCH 39/84] Fix: broken links to add-on-documentation --- Add-on Documentation/Deployment/SSL.md | 4 ++-- Guides/Java/AWS S3.md | 2 +- Guides/Migration Guides/Converting dotcloud.yml.md | 10 +++++----- Guides/NodeJS/AWS S3.md | 2 +- Guides/NodeJS/Sailsjs.md | 2 +- Guides/PHP/Zend 2.md | 2 +- Guides/Python/AWS S3.md | 2 +- Guides/Python/Django.md | 2 +- Guides/Ruby/AWS S3.md | 2 +- Guides/Ruby/Ruby on Rails.md | 2 +- Platform Documentation.md | 12 ++++++------ 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Add-on Documentation/Deployment/SSL.md b/Add-on Documentation/Deployment/SSL.md index d29678d..f562898 100644 --- a/Add-on Documentation/Deployment/SSL.md +++ b/Add-on Documentation/Deployment/SSL.md @@ -1,7 +1,7 @@ # SSL Add-on This add-on provides SSL support for custom domains (e.g. "www.example.com") -that you have added to your application using the [alias addon](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/alias). +that you have added to your application using the [alias addon](https://next.dotcloud.com/dev-center/add-on-documentation/alias). ## Overview @@ -15,7 +15,7 @@ sections, to add SSL support for custom domains to your deployment: * Set your DNS entry to point to your SSL DNS Domain. Root or naked domains like `example.com` without a subdomain are not -directly supported. For details, please see the [alias addon](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/alias) documentation. +directly supported. For details, please see the [alias addon](https://next.dotcloud.com/dev-center/add-on-documentation/alias) documentation. ### Acquiring an SSL Certificate diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index 0410546..c42c33c 100644 --- a/Guides/Java/AWS S3.md +++ b/Guides/Java/AWS S3.md @@ -26,7 +26,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config): ~~~bash $ dcapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] diff --git a/Guides/Migration Guides/Converting dotcloud.yml.md b/Guides/Migration Guides/Converting dotcloud.yml.md index 3f8d084..04f889b 100644 --- a/Guides/Migration Guides/Converting dotcloud.yml.md +++ b/Guides/Migration Guides/Converting dotcloud.yml.md @@ -14,7 +14,7 @@ On Next dotCloud, each application runs one main process – a web process. Each To port apps with several different languages onto Next dotCloud, you’ll need to create several applications – one for each type. However, many dotCloud services that aren’t related to the code itself, such as databases, are handled as [Add-ons](https://next.dotcloud.com/dev-center/add-on-documentation) on Next dotCloud. These integrate directly with your application and don’t require you to create multiple applications. -You can run several [workers](https://next.dotcloud.com/dev-center/add-on-documentation/data-processing/worker) within a single application on Next dotCloud. These are handled as background processes of the application and use exactly the same runtime environment as the app. +You can run several [workers](https://next.dotcloud.com/dev-center/add-on-documentation/worker) within a single application on Next dotCloud. These are handled as background processes of the application and use exactly the same runtime environment as the app. ### App structure on dotCloud ~~~text @@ -149,14 +149,14 @@ Once you’ve created the application, you need to set the web process and speci ### Type: (language)-worker / worker process On Next dotCloud, you can define multiple workers in the Procfile that will run as background processes in that application. They use the exact same runtime environment as the web process. -To use this functionality, you need to add the [Worker Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/data-processing/worker) to your app. +To use this functionality, you need to add the [Worker Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/worker) to your app. ### Non-code services / Add-ons In the dotcloud.yml file, you can define many different kinds of services within the app, including databases like MySQL, or other services like Redis. A Procfile on Next dotCloud only specifies your web and worker processes. This is very different from a dotcloud.yml file. On Next dotCloud, "Data Services" like MySQL and Redis, as well as many other types of services like logging, monitoring and even SSL, are handled outside of the Procfile with [Add-ons](https://next.dotcloud.com/dev-center/platform-documentation#add-ons). You can simply add them to your web app in the CLI with `dcapp addon.add`. This automatically connects the services to your app. -To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config). +To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config). ### Example dotcloud.yml to Procfile migration @@ -216,7 +216,7 @@ There are a couple of ways to migrate your dotcloud.yml config section, dependin If you’re using the config section to specify an interpreter version (e.g. Python 2.6 vs. Python 2.7), check the [Next dotCloud buildpack documentation on Github](https://github.com/cloudcontrol?query=buildpack) for how to do this with your specific buildpack. For example, you can specify the Python version by creating a runtime.txt file to replace your dotcloud.yml config: python_version. -If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. +If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. For more information, read our guide on [migrating environment variables](./migrating-environment) from dotCloud to Next dotCloud. @@ -228,7 +228,7 @@ If you do have multiple services each with their own HTTP port, then you should Note that Next dotCloud containers do not expose an SSH port. See the [Secure Shell docs](https://next.dotcloud.com/dev-center/platform-documentation#secure-shell-ssh). ## environment -If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config) and our [dedicated guide](./migrating-environment) on this topic. +If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config) and our [dedicated guide](./migrating-environment) on this topic. Note that the same variables are set in all your application processes (web and worker) -- you cannot specify that a variable should only be set on one process (as you could in a dotcloud.yml file). diff --git a/Guides/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index e80d4c4..2d8bb72 100644 --- a/Guides/NodeJS/AWS S3.md +++ b/Guides/NodeJS/AWS S3.md @@ -94,4 +94,4 @@ You can build rich Node.js apps using more advanced S3 operations. To learn more [npm package manager]: https://npmjs.org/ [Amazon Guide]: http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-intro.html [AWS access credentials]: http://aws.amazon.com/security-credentials -[Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config +[Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/custom-config diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index c9c07a6..4d56590 100644 --- a/Guides/NodeJS/Sailsjs.md +++ b/Guides/NodeJS/Sailsjs.md @@ -153,4 +153,4 @@ Congratulations, you can now see your Sails.js application running at [get the MySQL credentials]: https://next.dotcloud.com/dev-center/guides/nodejs/add-on-credentials [websockets]: http://socket.io/ [dotCloud websockets documentation]: https://next.dotcloud.com/dev-center/platform-documentation#websockets -[Shared MySQL Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/mysqls +[Shared MySQL Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/mysqls diff --git a/Guides/PHP/Zend 2.md b/Guides/PHP/Zend 2.md index aa13eb1..64023cd 100644 --- a/Guides/PHP/Zend 2.md +++ b/Guides/PHP/Zend 2.md @@ -188,7 +188,7 @@ $ dcapp APP_NAME/default deploy To store the sessions we need to add a database Add-on and initialize the table. -We are going to use [the MySQLs Add-on's free plan](https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/mysqls). It provides a free shared database for testing and development. +We are going to use [the MySQLs Add-on's free plan](https://next.dotcloud.com/dev-center/add-on-documentation/mysqls). It provides a free shared database for testing and development. Creating the session table is easy by executing the included init-session-table command in a run-container: diff --git a/Guides/Python/AWS S3.md b/Guides/Python/AWS S3.md index 490d184..b2fdf5a 100644 --- a/Guides/Python/AWS S3.md +++ b/Guides/Python/AWS S3.md @@ -21,7 +21,7 @@ boto==2.9.8 ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config): ~~~bash $ dcapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index fea98fe..a33f767 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -168,7 +168,7 @@ other [python-specific documents][python-guides]. [git]: https://help.github.com/articles/set-up-git [filesystem]: https://next.dotcloud.com/dev-center/platform-documentation#non-persistent-filesystem [data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/ -[mysqls]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/mysqls +[mysqls]: https://next.dotcloud.com/dev-center/add-on-documentation/mysqls [example-app]: https://github.com/cloudControl/python-django-example-app [django-notes]: https://next.dotcloud.com/dev-center/guides/python/django-notes [get-conf]: https://next.dotcloud.com/dev-center/guides/python/add-on-credentials diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index 41c7fd8..6947132 100644 --- a/Guides/Ruby/AWS S3.md +++ b/Guides/Ruby/AWS S3.md @@ -26,7 +26,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config): ~~~bash $ dcapp APP_NAME/default config.add AWS_ACCESS_KEY_ID=[YOUR_SECRET_KEY] AWS_SECRET_ACCESS_KEY=[YOUR_ACCESS_KEY] AWS_REGION='eu-west-1' diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index e924c0a..129e3e7 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -193,7 +193,7 @@ other [ruby-specific documents][ruby-guides]. [Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [filesystem]: https://next.dotcloud.com/dev-center/platform-documentation#non-persistent-filesystem [data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/ -[postgres-addon]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/elephantsql +[postgres-addon]: https://next.dotcloud.com/dev-center/add-on-documentation/elephantsql [run command]: https://next.dotcloud.com/dev-center/guides/ruby/runcommand [rails-notes]: https://next.dotcloud.com/dev-center/guides/ruby/railsnotes [ruby-guides]: https://next.dotcloud.com/dev-center/guides/ruby diff --git a/Platform Documentation.md b/Platform Documentation.md index 28d7653..232760a 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -574,7 +574,7 @@ SSL support for custom domains is available through the [SSL add-on](https://next.dotcloud.com/add-ons/ssl). Instructions on how to add HTTPS redirects to your application can be -found in the [SSL add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/deployment/ssl#https-redirects). +found in the [SSL add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/ssl#https-redirects). ### Elastic Addresses @@ -832,7 +832,7 @@ $ dcapp APP_NAME/DEP_NAME details [generating SSH keys]: https://help.github.com/articles/generating-ssh-keys -[Custom Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/deployment/custom-config +[Custom Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/custom-config [web console]: https://next.dotcloud.com/console [API libraries]: https://github.com/cloudControl [the latest version]: https://download.dotcloudapp.com/windows @@ -843,16 +843,16 @@ $ dcapp APP_NAME/DEP_NAME details [guides]: https://next.dotcloud.com/dev-center/guides [MongoSoup Add-on]: https://next.dotcloud.com/add-ons/mongosoup [Add-on marketplace]: https://next.dotcloud.com/add-ons -[Deployment category]: https://next.dotcloud.com/dev-center/add-on-documentation/deployment +[Deployment category]: https://next.dotcloud.com/dev-center/add-on-documentation#deployment [rsyslog]: http://www.rsyslog.com/ [TLS]: http://en.wikipedia.org/wiki/Transport_Layer_Security [Alias Add-on]: https://next.dotcloud.com/add-ons/alias [MemCachier Add-on]: https://next.dotcloud.com/add-ons/memcachier -[MemCachier Documentation]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/memcachier +[MemCachier Documentation]: https://next.dotcloud.com/dev-center/add-on-documentation/memcachier [tutorial]: https://www.cloudcontrol.com/blog/best-practice-running-and-analyzing-load-tests-on-your-cloudcontrol-app [Cron Add-on]: https://next.dotcloud.com/add-ons/cron -[Cron Add-on documentation]: https://next.dotcloud.com/dev-center/add-on-documentation/deployment/cron +[Cron Add-on documentation]: https://next.dotcloud.com/dev-center/add-on-documentation/cron [Worker Add-on]: https://next.dotcloud.com/add-ons/worker -[Worker Add-on documentation]: https://next.dotcloud.com/dev-center/add-on-documentation/data-processing/worker +[Worker Add-on documentation]: https://next.dotcloud.com/dev-center/add-on-documentation/worker [Ubuntu 10.04 LTS Lucid Lynx]: http://releases.ubuntu.com/lucid/ [Ubuntu 12.04 LTS Precise Pangolin]: http://releases.ubuntu.com/precise/ From 3f9ff03b03c81115a9f30115ca360674278bc4b5 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Thu, 4 Dec 2014 15:54:50 +0100 Subject: [PATCH 40/84] Fix: cloudcontrol related example app names --- Guides/PHP/CakePHP 2.2.1.md | 38 +++++----- Guides/PHP/Drupal 7.md | 115 +++++++++++++++--------------- Guides/PHP/Joomla 2.5.md | 40 +++++------ Guides/PHP/Kohana 3.2.0.md | 38 +++++----- Guides/PHP/Symfony 1.4.md | 42 +++++------ Guides/PHP/Yii 1.1.10.md | 44 ++++++------ Guides/PHP/Zend Framework 1.11.md | 44 ++++++------ 7 files changed, 180 insertions(+), 181 deletions(-) diff --git a/Guides/PHP/CakePHP 2.2.1.md b/Guides/PHP/CakePHP 2.2.1.md index 011f983..2514357 100644 --- a/Guides/PHP/CakePHP 2.2.1.md +++ b/Guides/PHP/CakePHP 2.2.1.md @@ -74,7 +74,7 @@ That will show output similar to below: master * testing -I am using the application name ``cloudcontrolledcakephp`` in this example. You will of course have to use some different name. +I am using the application name ``dotcloudcakephp`` in this example. You will of course have to use some different name. Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: @@ -82,15 +82,15 @@ By running the following commands, this will all be done: git checkout master // create the application - dcapp cloudcontrolledcakephp create php + dcapp dotcloudcakephp create php // deploy the default branch - dcapp cloudcontrolledcakephp/default push - dcapp cloudcontrolledcakephp/default deploy + dcapp dotcloudcakephp/default push + dcapp dotcloudcakephp/default deploy // deploy the testing branch - dcapp cloudcontrolledcakephp/testing push - dcapp cloudcontrolledcakephp/testing deploy + dcapp dotcloudcakephp/testing push + dcapp dotcloudcakephp/testing deploy ##4. Initialise the Required Add-ons @@ -101,16 +101,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Initialise the mysqls.free addon for the default deployment - dcapp cloudcontrolledcakephp/default addon.add mysql.free + dcapp dotcloudcakephp/default addon.add mysql.free // Retrieve the settings - dcapp cloudcontrolledcakephp/default addon mysql.free + dcapp dotcloudcakephp/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment - dcapp cloudcontrolledcakephp/testing addon.add mysql.free + dcapp dotcloudcakephp/testing addon.add mysql.free // Retrieve the settings - dcapp cloudcontrolledcakephp/testing addon mysql.free + dcapp dotcloudcakephp/testing addon mysql.free The output of the commands will be similar to that below: @@ -128,10 +128,10 @@ The output of the commands will be similar to that below: Now we need to configure the config add-on and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - dcapp cloudcontrolledcakephp/default config.add CAKE_ENV=production + dcapp dotcloudcakephp/default config.add CAKE_ENV=production // Set the testing environment setting - dcapp cloudcontrolledcakephp/testing config.add CAKE_ENV=testing + dcapp dotcloudcakephp/testing config.add CAKE_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -235,7 +235,7 @@ An example is provided below: 'host' => 'localhost', 'login' => 'cc_dev', 'password' => 'cc _dev', - 'database' => 'cloudcontrol_cakephp', + 'database' => 'dotcloud_cakephp', 'prefix' => '', 'encoding' => 'utf8', ); @@ -356,7 +356,7 @@ What this does is to extend the DatabaseSession class so that we can use both AP ##6. Database Schema -Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``cakephp_cloudcontrol_init.sql``, ready to be used to initialise the database next. +Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``cakephp_dotcloud_init.sql``, ready to be used to initialise the database next. CREATE TABLE `cake_sessions` ( `id` varchar(255) NOT NULL DEFAULT '', @@ -393,7 +393,7 @@ Now, in the shell, we're going to load the data in to the remote mysql instance mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ - --ssl-ca=mysql-ssl-ca-cert.pem < cakephp_cloudcontrol_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < cakephp_dotcloud_init.sql In the command above, you can see a reference to a **.pem** file. This can be downloaded from: [http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem](http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem). All being well, the command will finish silently, loading the data. You can check that all's gone well with following commands: @@ -411,15 +411,15 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - dcapp cloudcontrolledcakephp/default push - dcapp cloudcontrolledcakephp/default deploy + dcapp dotcloudcakephp/default push + dcapp dotcloudcakephp/default deploy git checkout testing git merge master // deploy the testing branch - dcapp cloudcontrolledcakephp/testing push - dcapp cloudcontrolledcakephp/testing deploy + dcapp dotcloudcakephp/testing push + dcapp dotcloudcakephp/testing deploy ##7. Review the Deployment diff --git a/Guides/PHP/Drupal 7.md b/Guides/PHP/Drupal 7.md index c8e439c..91da812 100644 --- a/Guides/PHP/Drupal 7.md +++ b/Guides/PHP/Drupal 7.md @@ -18,13 +18,13 @@ You're going to need only a few things to following along with this tutorial. Th * A [Git client](http://git-scm.com/), whether command-line or GUI. * A MySQL client, whether command-line or GUI, such as [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) or the command-line tools. -##1. Grab a Copy of Drupal 7. +##1. Grab a Copy of Drupal 7. -So now that you have the prerequisites in place, download a copy of the latest, stable, release, 7.14 at the time or publishing. You can find it at: [http://ftp.drupal.org/files/projects/drupal-7.14.tar.gz](http://ftp.drupal.org/files/projects/drupal-7.14.tar.gz). After that, extract it to your local filesystem. +So now that you have the prerequisites in place, download a copy of the latest, stable, release, 7.14 at the time or publishing. You can find it at: [http://ftp.drupal.org/files/projects/drupal-7.14.tar.gz](http://ftp.drupal.org/files/projects/drupal-7.14.tar.gz). After that, extract it to your local filesystem. ![Source files](images/drupal7-files.png) -After this, in your local development environment, perform a standard installation of Drupal, as covered in the [online installation documentation](http://drupal.org/documentation/install). +After this, in your local development environment, perform a standard installation of Drupal, as covered in the [online installation documentation](http://drupal.org/documentation/install). ##2. Amend the Code @@ -34,7 +34,7 @@ A few changes need to be made to the default Drupal 7 configuration. These chang As is quite common in modern application development, we deploy to multiple environments, such as testing, staging and production. And each of these environments will, likely, have different configuration settings for the *database*, *caching* etc, so we need to be able to differentiate between them. Drupal does not automatically do this out of the box, but it's not that hard to adjust it to make it happen. -And luckily for us, Drupal 7, by default, stores most of its logging and session information automatically in the database. So we don't need to make many configuration changes there to make sure that it works. +And luckily for us, Drupal 7, by default, stores most of its logging and session information automatically in the database. So we don't need to make many configuration changes there to make sure that it works. What is not being covered in this tutorial is connecting the installation to a writeable filesystem, such as [Amazon S3](http://aws.amazon.com/s3/). That will be done in a follow up to this tutorial. @@ -43,63 +43,63 @@ What is not being covered in this tutorial is connecting the installation to a w Ok, now let's get started making these changes and deploying the application. We'll begin by putting it under Git control. So run the following command to do that: cd - + git init . - + git add -A - + git commit -m "First addition of the source files" - + Now that the code's under version control, we're going to create a testing branch as well, so that we have one to test with and one for production. Run the following command and it will be done: git checkout -b testing - + If you're not familiar with Git, the previous command will checkout a copy of our existing branch, into a new branch, called **testing**. You can confirm that you now have two branches, by running the following command: git branch - + That will show output similar to below: $ git branch master * testing -I am using the application name ``cloudcontroldldrupal`` in this example. You will of course have to use some different name. +I am using the application name ``dotclouddrupal`` in this example. You will of course have to use some different name. Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and *push* and *deploy* both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master - + // create the application, indicating it's PHP-based - dcapp cloudcontroldldrupal create php - + dcapp dotclouddrupal create php + // deploy the default branch - dcapp cloudcontroldldrupal/default push - dcapp cloudcontroldldrupal/default deploy - + dcapp dotclouddrupal/default push + dcapp dotclouddrupal/default deploy + // deploy the testing branch - dcapp cloudcontroldldrupal/testing push - dcapp cloudcontroldldrupal/testing deploy + dcapp dotclouddrupal/testing push + dcapp dotclouddrupal/testing deploy ##4. Initialise the Required Addons -Now that that's done, we need to configure two add-ons, config and mysqls. The config add-on is required to determine the active environment and mysqls for storing our session and logging information. +Now that that's done, we need to configure two add-ons, config and mysqls. The config add-on is required to determine the active environment and mysqls for storing our session and logging information. ###4.1 Initialising mysqls To initialise mysqls, run the following commands and make a note of the output: // Initialise the mysqls.free addon for the default deployment - dcapp cloudcontroldldrupal/default addon.add mysql.free + dcapp dotclouddrupal/default addon.add mysql.free // Retrieve the settings - dcapp cloudcontroldldrupal/default addon mysql.free + dcapp dotclouddrupal/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment - dcapp cloudcontroldldrupal/testing addon.add mysql.free + dcapp dotclouddrupal/testing addon.add mysql.free // Retrieve the settings - dcapp cloudcontroldldrupal/testing addon mysql.free + dcapp dotclouddrupal/testing addon mysql.free The output of the commands will be similar to that below: @@ -117,41 +117,41 @@ The output of the commands will be similar to that below: Now we need to configure the config addon and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - dcapp cloudcontroldldrupal/default config.add APPLICATION_ENV=production + dcapp dotclouddrupal/default config.add APPLICATION_ENV=production // Set the testing environment setting - dcapp cloudcontroldldrupal/testing config.add APPLICATION_ENV=testing + dcapp dotclouddrupal/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. ##5. Environment Configuration -Now we're going to extend the Drupal 7 bootstrap process to be able to determine which environment is being used, which we talked about earlier. To do that, open up ``sites/default/settings.php`` and add in the code below right at the end of the file. +Now we're going to extend the Drupal 7 bootstrap process to be able to determine which environment is being used, which we talked about earlier. To do that, open up ``sites/default/settings.php`` and add in the code below right at the end of the file. Have a look at it and we'll go through it together. $env = 'production'; - + if (!empty($_SERVER['HTTP_HOST']) && strpos($_SERVER['HTTP_HOST'], 'localdomain') !== FALSE) { - $env = 'development'; + $env = 'development'; } - + if (!empty($_SERVER['HTTP_HOST']) && strpos($_SERVER['HTTP_HOST'], 'localdomain') === FALSE) { // Parse the json file with ADDONS credentials $string = file_get_contents($_ENV['CRED_FILE'], false); - + if ($string == false) { die('FATAL: Could not read credentials file'); } - + $creds = json_decode($string, true); - + // Now getenv('APPLICATION_ENV') should work: $env = $creds['CONFIG']['CONFIG_VARS']['APPLICATION_ENV']; } - - - $local_settings = __DIR__ . "/settings.{$env}.inc"; + + + $local_settings = __DIR__ . "/settings.{$env}.inc"; include($local_settings); Firstly, we set the environment to default to production. Then, if we're in a local development environment, as determined, rather simply, by having ``localdomain`` in the URL, then we set the environment to development. @@ -162,7 +162,7 @@ With this code in place, we can now bootstrap multiple environments. Following t ##6. Configuring the Database -When we configured the add ons earlier (mysqls and config) the settings were automatically persisted to the running server environments. So we’re now able to retrieve these settings, when we’re not in a local development environment, and configure our database connection to use them automatically. +When we configured the add ons earlier (mysqls and config) the settings were automatically persisted to the running server environments. So we’re now able to retrieve these settings, when we’re not in a local development environment, and configure our database connection to use them automatically. It’s really handy as we don’t need to do too much to make use of the options. @@ -172,23 +172,23 @@ Under **sites/default** create three new files: * ``settings.testing.inc`` * ``settings.production.inc`` -In there, past the respective database settings for your different environments that you can retrieve from the database add-on configuration or your local development environment. +In there, past the respective database settings for your different environments that you can retrieve from the database add-on configuration or your local development environment. -Two examples are provided below: +Two examples are provided below: ###6.1 Production array ( 'default' => array ( @@ -206,16 +206,16 @@ Two examples are provided below: ###6.2 Testing array ( 'default' => array ( @@ -232,22 +232,22 @@ Two examples are provided below: ###6.3 Database Schema -Ok, next we need to create a basic database schema for storing the session and log information as well as the other configuration and user data settings that Drupal stores. Download [the file](drupal_cloudcontrol_init.sql), ready to be used to initialise the database. +Ok, next we need to create a basic database schema for storing the session and log information as well as the other configuration and user data settings that Drupal stores. Download [the file](drupal_dotcloud_init.sql), ready to be used to initialise the database. Now, in the shell, we're going to load the data in to the remote mysql instance that we created earlier. To do so, run the following command, changing the respective options with your configuration settings, doing this for both **default** and **testing**: mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ - --ssl-ca=mysql-ssl-ca-cert.pem < drupal_cloudcontrol_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < drupal_dotcloud_init.sql In the command above, you can see a reference to a **.pem** file. This can be downloaded from: [http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem](http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem). All being well, the command will finish silently, loading the data. You can check that all's gone well with following commands: mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ --ssl-ca=mysql-ssl-ca-cert.pem - + show tables; - + This should show you output similar to below: Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. @@ -270,7 +270,7 @@ Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. | watchdog | +-----------------------------+ 74 rows in set (0.06 sec) - + mysql> ##7. Commit the Code Changes @@ -281,23 +281,22 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - dcapp cloudcontroldlDrupal 7/default push - dcapp cloudcontroldlDrupal 7/default deploy - + dcapp dotclouddrupal/default push + dcapp dotclouddrupal/default deploy + git checkout testing git merge master - + // deploy the testing branch - dcapp cloudcontroldlDrupal 7/testing push - dcapp cloudcontroldlDrupal 7/testing deploy + dcapp dotclouddrupal/testing push + dcapp dotclouddrupal/testing deploy ##8. Review the Deployment -With that completed, then you'll be able to have a look at both your deployments to ensure that they're working. +With that completed, then you'll be able to have a look at both your deployments to ensure that they're working. You should see output similar to that below, in figure 2. ![Successful Deployment](images/drupal7-running.png) With that, you should be up and running, ready to create your next, amazing, PHP web application, using Drupal 7. If you have any issues, feel free to email [support@dotcloud.com](mailto:support@dotcloud.com). - diff --git a/Guides/PHP/Joomla 2.5.md b/Guides/PHP/Joomla 2.5.md index 71da28f..ff35fee 100644 --- a/Guides/PHP/Joomla 2.5.md +++ b/Guides/PHP/Joomla 2.5.md @@ -153,22 +153,22 @@ That will show output similar to below: master * testing -I am using the application name ``cloudcontroldljoomla`` in this example. You will of course have to use some different name. +I am using the application name ``dotcloudjoomla`` in this example. You will of course have to use some different name. Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master // create the application - dcapp cloudcontroldljoomla create php + dcapp dotcloudjoomla create php // deploy the default branch - dcapp cloudcontroldljoomla/default push - dcapp cloudcontroldljoomla/default deploy + dcapp dotcloudjoomla/default push + dcapp dotcloudjoomla/default deploy // deploy the testing branch - dcapp cloudcontroldljoomla/testing push - dcapp cloudcontroldljoomla/testing deploy + dcapp dotcloudjoomla/testing push + dcapp dotcloudjoomla/testing deploy ##4. Initialise the Required Add-ons @@ -179,16 +179,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Initialise the mysqls.free addon for the default deployment - dcapp cloudcontroldljoomla/default addon.add mysql.free + dcapp dotcloudjoomla/default addon.add mysql.free // Retrieve the settings - dcapp cloudcontroldljoomla/default addon mysql.free + dcapp dotcloudjoomla/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment - dcapp cloudcontroldljoomla/testing addon.add mysql.free + dcapp dotcloudjoomla/testing addon.add mysql.free // Retrieve the settings - dcapp cloudcontroldljoomla/testing addon mysql.free + dcapp dotcloudjoomla/testing addon mysql.free The output of the commands will be similar to that below: @@ -206,10 +206,10 @@ The output of the commands will be similar to that below: Now we need to configure the config add-on and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - dcapp cloudcontroldljoomla/default config.add APPLICATION_ENV=production + dcapp dotcloudjoomla/default config.add APPLICATION_ENV=production // Set the testing environment settings - dcapp cloudcontroldljoomla/testing config.add APPLICATION_ENV=testing + dcapp dotcloudjoomla/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -222,12 +222,12 @@ Where it may become interesting is if/when you start to use more than one clone Now, in the shell, we're going to dump the database that the install routine created and load it in to the remote mysql instance that we created earlier. To do so, run the following command, changing the respective options with your configuration settings, doing this for both default and testing: -- the database dump (SQL) file - mysqldump -u -p > joomla_cloudcontrol_init.sql + mysqldump -u -p > joomla_dotcloud_init.sql -- load the database dump (SQL) file in to the remote environment database mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ - --ssl-ca=mysql-ssl-ca-cert.pem < joomla_cloudcontrol_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < joomla_dotcloud_init.sql In the command above, you can see a reference to a **.pem** file. This can be downloaded from: [http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem](http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem). All being well, the command will finish silently, loading the data. You can check that all's gone well with following commands: @@ -243,15 +243,15 @@ This will show you the tables from the SQL file. Now that that's done, commit th git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - dcapp cloudcontroldljoomla/default push - dcapp cloudcontroldljoomla/default deploy + dcapp dotcloudjoomla/default push + dcapp dotcloudjoomla/default deploy git checkout testing git merge master // deploy the testing branch - dcapp cloudcontroldljoomla/testing push - dcapp cloudcontroldljoomla/testing deploy + dcapp dotcloudjoomla/testing push + dcapp dotcloudjoomla/testing deploy ##7. Review the Deployment @@ -268,11 +268,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - dcapp cloudcontroldljoomla/default log deploy + dcapp dotcloudjoomla/default log deploy ####7.1.1 Errors - dcapp cloudcontroldljoomla/default log error + dcapp dotcloudjoomla/default log error The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. diff --git a/Guides/PHP/Kohana 3.2.0.md b/Guides/PHP/Kohana 3.2.0.md index 25e98f4..a783ede 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -74,28 +74,28 @@ That will show output similar to below: master * testing -I am using the application name ``cloudcontroldlkohana`` in this example. You will of course have to use some different name. +I am using the application name ``dotcloudkohana`` in this example. You will of course have to use some different name. Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master // create the application - dcapp cloudcontroldlkohana create php + dcapp dotcloudkohana create php // deploy the default branch - dcapp cloudcontroldlkohana/default push - dcapp cloudcontroldlkohana/default deploy + dcapp dotcloudkohana/default push + dcapp dotcloudkohana/default deploy // deploy the testing branch - dcapp cloudcontroldlkohana/testing push - dcapp cloudcontroldlkohana/testing deploy + dcapp dotcloudkohana/testing push + dcapp dotcloudkohana/testing deploy ###3.1 Kohana Auto-Detected When you do this, you'll see output similar to the following: - $ dcapp cloudcontroldlkohana/default push + $ dcapp dotcloudkohana/default push Counting objects: 9, done. Delta compression using up to 2 threads. Compressing objects: 100% (5/5), done. @@ -110,7 +110,7 @@ When you do this, you'll see output similar to the following: >> Building image >> Uploading image (772K) - To ssh://cloudcontroldlkohana@dotcloudapp.com/repository.git + To ssh://dotcloudkohana@dotcloudapp.com/repository.git f98a87c..a685cd6 master -> master Note the following lines: @@ -124,25 +124,25 @@ Note the following lines: Now that that's done, we need to configure two addons, config and mysqls. The config addon's required for determining the active environment and mysqls for storing our session information. To initialise these, run the following commands and make a note of the output: // Initialise the mysqls.free addon for the default deployment - dcapp cloudcontroldlkohana/default addon.add mysqls.free + dcapp dotcloudkohana/default addon.add mysqls.free // Initialise the mysqls.free addon for the testing deployment - dcapp cloudcontroldlkohana/testing addon.add mysqls.free + dcapp dotcloudkohana/testing addon.add mysqls.free Now we need to configure the config addon and store the respective environment setting in it. So run the following commands to do this: // Add the APPLICATION_ENV variable to production - dcapp cloudcontroldlkohana/default config.add APPLICATION_ENV=production + dcapp dotcloudkohana/default config.add APPLICATION_ENV=production // Add the APPLICATION_ENV variable to testing - dcapp cloudcontroldlkohana/testing config.add APPLICATION_ENV=testing + dcapp dotcloudkohana/testing config.add APPLICATION_ENV=testing ###4.1 Check the Add-on Configuration Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Retrieve the settings - dcapp cloudcontroldlkohana/testing addon mysqls.free + dcapp dotcloudkohana/testing addon mysqls.free The output of the commands will be similar to that below: @@ -309,7 +309,7 @@ Create a new file under ``application/config`` called ``database.php``. In that 'username' => 'cc_dev', 'password' => 'cc_dev', 'persistent' => FALSE, - 'database' => 'cloudcontrol_kohana', + 'database' => 'dotcloud_kohana', ), 'table_prefix' => '', 'charset' => 'utf8', @@ -408,7 +408,7 @@ Now, in the shell, we're going to load the schema in to the remote mysql instanc mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ - --ssl-ca=mysql-ssl-ca-cert.pem < kohana_cloudcontrol_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < kohana_dotcloud_init.sql In the command above, you can see a reference to a **.pem** file. This can be downloaded from: [http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem](http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem). All being well, the command will finish silently, loading the data. You can check that all's gone well with following commands: @@ -445,12 +445,12 @@ After all these changes are done, we need to then commit them on the master bran git merge master // push the code to the default (production) branch - dcapp cloudcontroldlkohana/default push - dcapp cloudcontroldlkohana/default deploy + dcapp dotcloudkohana/default push + dcapp dotcloudkohana/default deploy // push the code to the testing branch - dcapp cloudcontroldlkohana/testing push - dcapp cloudcontroldlkohana/testing deploy + dcapp dotcloudkohana/testing push + dcapp dotcloudkohana/testing deploy ##A Simple Application diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index f7d9200..3b38546 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -74,28 +74,28 @@ That will show output similar to below: master * testing -I am using the application name ``cloudcontroldlsymfony`` in this example. You will of course have to use some different name. +I am using the application name ``dotcloudsymfony`` in this example. You will of course have to use some different name. Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master // create the application - dcapp cloudcontroldlsymfony create php + dcapp dotcloudsymfony create php // deploy the default branch - dcapp cloudcontroldlsymfony/default push - dcapp cloudcontroldlsymfony/default deploy + dcapp dotcloudsymfony/default push + dcapp dotcloudsymfony/default deploy // deploy the testing branch - dcapp cloudcontroldlsymfony/testing push - dcapp cloudcontroldlsymfony/testing deploy + dcapp dotcloudsymfony/testing push + dcapp dotcloudsymfony/testing deploy ###3.1 Symfony Auto-Detected When you do this, you'll see output similar to the following: - $ dcapp cloudcontroldlsymfony/default push + $ dcapp dotcloudsymfony/default push Counting objects: 15, done. Delta compression using up to 2 threads. Compressing objects: 100% (7/7), done. @@ -109,7 +109,7 @@ When you do this, you'll see output similar to the following: >> Building image >> Uploading image (3.0M) - To ssh://cloudcontroldlsymfony@dotcloudapp.com/repository.git + To ssh://dotcloudsymfony@dotcloudapp.com/repository.git d90506c..4078c78 master -> master Note the following lines: @@ -131,16 +131,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c To initialise mysqls, run the following commands and make a note of the output: // Initialise the mysqls.free addon for the default deployment - dcapp cloudcontroldlsymfony/default addon.add mysql.free + dcapp dotcloudsymfony/default addon.add mysql.free // Retrieve the settings - dcapp cloudcontroldlsymfony/default addon mysql.free + dcapp dotcloudsymfony/default addon mysql.free // Initialise the mysqls.free addon for the testing deployment - dcapp cloudcontroldlsymfony/testing addon.add mysql.free + dcapp dotcloudsymfony/testing addon.add mysql.free // Retrieve the settings - dcapp cloudcontroldlsymfony/testing addon mysql.free + dcapp dotcloudsymfony/testing addon mysql.free The output of the commands will be similar to that below: @@ -158,10 +158,10 @@ The output of the commands will be similar to that below: Now we need to configure the config addon and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - dcapp cloudcontroldlsymfony/default config.add APPLICATION_ENV=production + dcapp dotcloudsymfony/default config.add APPLICATION_ENV=production // Set the testing environment setting - dcapp cloudcontroldlsymfony/testing config.add APPLICATION_ENV=testing + dcapp dotcloudsymfony/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -197,9 +197,9 @@ Under ``apps/frontend/config`` open the file ``factories.yaml``. In that file, w storage: class: sfCacheSessionStorage param: - session_name: symfony1_cloudcontrol + session_name: symfony1_dotcloud session_cookie_path: / - session_cookie_domain: cloudcontroldlsymfony.dotcloudapp.com + session_cookie_domain: dotcloudsymfony.dotcloudapp.com session_cookie_lifetime: +30 days session_cookie_secure: false session_cookie_http_only: true @@ -276,7 +276,7 @@ What we're going to do is change it to have the values from our initialised mysq param: classname: DebugPDO debug: { realmemoryusage: true, details: { time: { enabled: true }, slow: { enabled: true, threshold: 0.1 }, mem: { enabled: true }, mempeak: { enabled: true }, memdelta: { enabled: true } } } - dsn: 'mysql:host=localhost;dbname=cloudcontrol_symfony1' + dsn: 'mysql:host=localhost;dbname=dotcloud_symfony1' username: cc_dev password: cc_dev encoding: utf8 @@ -319,15 +319,15 @@ After this, stage all the files in Git and commit them with a suitable commit me git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - dcapp cloudcontroldlsymfony/default push - dcapp cloudcontroldlsymfony/default deploy + dcapp dotcloudsymfony/default push + dcapp dotcloudsymfony/default deploy git checkout testing git merge master // deploy the testing branch - dcapp cloudcontroldlsymfony/testing push - dcapp cloudcontroldlsymfony/testing deploy + dcapp dotcloudsymfony/testing push + dcapp dotcloudsymfony/testing deploy ##7. Review the Deployment diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index 80eb2ae..1595106 100644 --- a/Guides/PHP/Yii 1.1.10.md +++ b/Guides/PHP/Yii 1.1.10.md @@ -78,25 +78,25 @@ That will show output similar to below: master * testing -I am using the application name ``cloudcontroldlyii`` in this example. You will of course have to use some different name. +I am using the application name ``dotcloudyii`` in this example. You will of course have to use some different name. Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master // create the application - dcapp cloudcontroldlyii create php + dcapp dotcloudyii create php // deploy the default branch - dcapp cloudcontroldlyii/default push - dcapp cloudcontroldlyii/default deploy + dcapp dotcloudyii/default push + dcapp dotcloudyii/default deploy // deploy the testing branch - dcapp cloudcontroldlyii/testing push - dcapp cloudcontroldlyii/testing deploy + dcapp dotcloudyii/testing push + dcapp dotcloudyii/testing deploy You should see output as below: - $ dcapp cloudcontroldlyii/default push + $ dcapp dotcloudyii/default push Counting objects: 2257, done. Delta compression using up to 2 threads. Compressing objects: 100% (2131/2131), done. @@ -111,7 +111,7 @@ You should see output as below: >> Building image >> Uploading image (4.1M) - To ssh://cloudcontroldlyii@dotcloudapp.com/repository.git + To ssh://dotcloudyii@dotcloudapp.com/repository.git * [new branch] master -> master ##4. Initialise the Required Add-ons @@ -123,16 +123,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Initialise the mysqls.free addon for the default deployment - dcapp cloudcontroldlyii/default addon.add mysqls.free + dcapp dotcloudyii/default addon.add mysqls.free // Retrieve the settings - dcapp cloudcontroldlyii/default addon mysqls.free + dcapp dotcloudyii/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - dcapp cloudcontroldlyii/testing addon.add mysqls.free + dcapp dotcloudyii/testing addon.add mysqls.free // Retrieve the settings - dcapp cloudcontroldlyii/testing addon mysqls.free + dcapp dotcloudyii/testing addon mysqls.free The output of the commands will be similar to that below: @@ -150,10 +150,10 @@ The output of the commands will be similar to that below: Now we need to configure the config add-on and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - dcapp cloudcontroldlyii/default config.add APPLICATION_ENV=main + dcapp dotcloudyii/default config.add APPLICATION_ENV=main // Set the testing environment setting - dcapp cloudcontroldlyii/testing config.add APPLICATION_ENV=testing + dcapp dotcloudyii/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -257,7 +257,7 @@ Now, ``index.php`` will load the configuration file based on *APPLICATION_ENV* a ##6. Database Schema -Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``Yii Framework_cloudcontrol_init.sql``, ready to be used to initialise the database next. +Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``Yii Framework_dotcloud_init.sql``, ready to be used to initialise the database next. -- -- Table structure for table `YiiLog` @@ -296,7 +296,7 @@ Now, in the shell, we're going to load the data in to the remote mysql instance mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ - --ssl-ca=mysql-ssl-ca-cert.pem < Yii Framework_cloudcontrol_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < Yii Framework_dotcloud_init.sql In the command above, you can see a reference to a **.pem** file. This can be downloaded from: [http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem](http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem). All being well, the command will finish silently, loading the data. You can check that all's gone well with following commands: @@ -314,15 +314,15 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - dcapp cloudcontroldlyii/default push - dcapp cloudcontroldlyii/default deploy + dcapp dotcloudyii/default push + dcapp dotcloudyii/default deploy git checkout testing git merge master // deploy the testing branch - dcapp cloudcontroldlyii/testing push - dcapp cloudcontroldlyii/testing deploy + dcapp dotcloudyii/testing push + dcapp dotcloudyii/testing deploy ##7. Review the Deployment @@ -339,11 +339,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - dcapp cloudcontroldlyii/default log deploy + dcapp dotcloudyii/default log deploy ####7.1.1 Errors - dcapp cloudcontroldlyii/default log error + dcapp dotcloudyii/default log error The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. diff --git a/Guides/PHP/Zend Framework 1.11.md b/Guides/PHP/Zend Framework 1.11.md index e94f97f..7018327 100644 --- a/Guides/PHP/Zend Framework 1.11.md +++ b/Guides/PHP/Zend Framework 1.11.md @@ -83,26 +83,26 @@ That will show output similar to below: master * testing -I am using the application name ``cloudcontroldlzf`` in this example. You will of course have to use some different name. +I am using the application name ``dotcloudzf`` in this example. You will of course have to use some different name. Now, we need to make our first deployment of both branches to the dotCloud platform. To do this we checkout the master branch, create the application in our dotCloud account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch git checkout master // create the application - dcapp cloudcontroldlzf create php + dcapp dotcloudzf create php // deploy the default branch - dcapp cloudcontroldlzf/default push - dcapp cloudcontroldlzf/default deploy + dcapp dotcloudzf/default push + dcapp dotcloudzf/default deploy // deploy the testing branch - dcapp cloudcontroldlzf/testing push - dcapp cloudcontroldlzf/testing deploy + dcapp dotcloudzf/testing push + dcapp dotcloudzf/testing deploy You'll see output similar to the following: - $ dcapp cloudcontroldlzf/testing push + $ dcapp dotcloudzf/testing push Total 0 (delta 0), reused 0 (delta 0) >> Receiving push @@ -111,7 +111,7 @@ You'll see output similar to the following: >> Building image >> Uploading image (3.6M) - To ssh://cloudcontroldlzf@dotcloudapp.com/repository.git + To ssh://dotcloudzf@dotcloudapp.com/repository.git dde253a..7b040e2 testing -> testing In the output above, you'll see ``INFO: Zend Framework 1.x detected``. This is the latest stack auto-identifying that the application we're deploying is based on the Zend Framework and will take care of ensuring it sees /public as the root directory to find the bootstrap file, ``index.php``, in. @@ -125,16 +125,16 @@ Now that that's done, we need to configure two add-ons, config and mysqls. The c Now let's be sure that everything is in order by having a look at the add-on configuration output, in this case for testing. To do that, run the command below: // Initialise the mysqls.free addon for the default deployment - dcapp cloudcontroldlzf/default addon.add mysqls.free + dcapp dotcloudzf/default addon.add mysqls.free // Retrieve the settings - dcapp cloudcontroldlzf/default addon mysqls.free + dcapp dotcloudzf/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - dcapp cloudcontroldlzf/testing addon.add mysqls.free + dcapp dotcloudzf/testing addon.add mysqls.free // Retrieve the settings - dcapp cloudcontroldlzf/testing addon mysqls.free + dcapp dotcloudzf/testing addon mysqls.free The output of the commands will be similar to that below: @@ -152,10 +152,10 @@ The output of the commands will be similar to that below: Now we need to configure the config add-on and store the respective environment setting in it. So run the following commands to do this: // Set the default environment setting - dcapp cloudcontroldlzf/default config.add APPLICATION_ENV=production + dcapp dotcloudzf/default config.add APPLICATION_ENV=production // Set the testing environment setting - dcapp cloudcontroldlzf/testing config.add APPLICATION_ENV=testing + dcapp dotcloudzf/testing config.add APPLICATION_ENV=testing Now that this is done, we're ready to make some changes to our code to make use of the new configuration. @@ -405,7 +405,7 @@ What that does is to use the ``CRED_FILE`` settings that we configured earlier t ##6. Database Schema -Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``zendframework_cloudcontrol_init.sql``, ready to be used to initialise the database next. +Ok, next we need to create a basic database schema for storing both the session and log information. To save time, add the following to a SQL file called ``zendframework_dotcloud_init.sql``, ready to be used to initialise the database next. -- table structure CREATE TABLE `session` ( @@ -436,7 +436,7 @@ Now, in the shell, we're going to load the data in to the remote mysql instance mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ - --ssl-ca=mysql-ssl-ca-cert.pem < zendframework_cloudcontrol_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < zendframework_dotcloud_init.sql In the command above, you can see a reference to a **.pem** file. This can be downloaded from: [http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem](http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem). All being well, the command will finish silently, loading the data. You can check that all's gone well with following commands: @@ -454,15 +454,15 @@ Now that that's done, commit the changes we made earlier and push and deploy bot git commit -m "changed to store log and session in mysql and auto-determine environment" // deploy the default branch - dcapp cloudcontroldlzf/default push - dcapp cloudcontroldlzf/default deploy + dcapp dotcloudzf/default push + dcapp dotcloudzf/default deploy git checkout testing git merge master // deploy the testing branch - dcapp cloudcontroldlzf/testing push - dcapp cloudcontroldlzf/testing deploy + dcapp dotcloudzf/testing push + dcapp dotcloudzf/testing deploy ##7. Review the Deployment @@ -480,11 +480,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - dcapp cloudcontroldlzf/default log deploy + dcapp dotcloudzf/default log deploy ####7.1.1 Errors - dcapp cloudcontroldlzf/default log error + dcapp dotcloudzf/default log error The commands output information in a [UNIX tail](http://en.wikipedia.org/wiki/Tail_%28Unix%29) like fashion. So just call them and cancel the commend when you are no longer interested in the output. From 511f1315fa4a517951254ce67c5bfc340d916781 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Thu, 4 Dec 2014 16:18:13 +0100 Subject: [PATCH 41/84] Fix:link play2 --- Guides/Java/Play - HelloWorld.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Guides/Java/Play - HelloWorld.md b/Guides/Java/Play - HelloWorld.md index 2797b2f..f45290a 100644 --- a/Guides/Java/Play - HelloWorld.md +++ b/Guides/Java/Play - HelloWorld.md @@ -35,7 +35,7 @@ web: play run --http.port=$PORT $PLAY_OPTS The `web` process type is required and specifies the command that will be executed when the app is deployed. The environment variable `$PORT` defines the port the application-server should listen to. ## Pushing and Deploying your App -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the dotCloud platform: ~~~bash $ dcapp APP_NAME create java @@ -80,7 +80,7 @@ Congratulations, you can now see your Play! application running at `http[s]://AP [dotCloud]: https://next.dotcloud.com/ [Play buildpack]: https://github.com/cloudControl/buildpack-play -[Play 2 tutorial]: https://next.dotcloud.com/dev-center/guides/java/java---play-2 +[Play 2 tutorial]: https://next.dotcloud.com/dev-center/guides/java/java-play-2 [dotCloud-command-line-client]: https://next.dotcloud.com/dev-center/platform-documentation#command-line-client-web-console-and-api [Git client]: http://git-scm.com/ [Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile From 0b61399129ea8b2d2fe4eca7598af6d2be78268e Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Thu, 4 Dec 2014 16:25:01 +0100 Subject: [PATCH 42/84] Fix: link to mysql doc --- Guides/Java/Java - Spring-Boot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Guides/Java/Java - Spring-Boot.md b/Guides/Java/Java - Spring-Boot.md index a96a27d..16f37fe 100644 --- a/Guides/Java/Java - Spring-Boot.md +++ b/Guides/Java/Java - Spring-Boot.md @@ -140,5 +140,5 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.dotcloudapp.com` [examples]: https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples [Database credentials]: add-on-credentials [dotCloud]: / -[MySQLs Add-on]: ../../add-on-documentation/data-storage/MySQLs +[MySQLs Add-on]: ../../add-on-documentation/mysqls [hsqlDB]: http://hsqldb.org/ From 3afc341c0b8016d6cda9e51c073c9c96472a9adc Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Thu, 4 Dec 2014 16:35:19 +0100 Subject: [PATCH 43/84] Fix: link to mysql doc, link to data-storage --- Guides/Java/Java - Spring.md | 6 +++--- Guides/Python/Django notes.md | 2 +- Guides/Python/Django.md | 2 +- Guides/Ruby/Ruby on Rails.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index 270e1ed..de0cf8c 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -62,8 +62,8 @@ In this tutorial we use the [Shared MySQL Add-on]. We have changed the `src/main ### Adjust Logger Configuration -Logging to a file is not recommended since the container's [file system] is not persistent. -The default logger configuration - `src/main/resources/log4j.properties` is modified to log to `stdout/stderr`. +Logging to a file is not recommended since the container's [file system] is not persistent. +The default logger configuration - `src/main/resources/log4j.properties` is modified to log to `stdout/stderr`. Then dotCloud can pick up all the messages and provide them to you via the [log command]. This is how the file looks now: ~~~xml og4j.rootLogger=DEBUG, stdout @@ -152,4 +152,4 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.dotcloudapp.com` [dotCloud]: / [file system]: ../../platform-documentation#non-persistent-filesystem [log command]: ../../platform-documentation#logging -[Shared MySQL Add-on]: ../../add-on-documentation/data-storage/MySQLs +[Shared MySQL Add-on]: ../../add-on-documentation/mysql diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index ccdba02..ab4ffbd 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -30,7 +30,7 @@ You can't use a local SMTP server, instead choose one of our [email Add-ons][mes [pip]: http://www.pip-installer.org/ [procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [messaging-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/messaging-&-mobile/ -[data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/ +[data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation#data-storage [add-on-credentials]: https://next.dotcloud.com/dev-center/guides/python/add-on-credentials [dotCloud]: https://next.dotcloud.com/ [worker]: https://next.dotcloud.com/dev-center/platform-documentation#scheduled-jobs-and-background-workers diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index a33f767..e76f78b 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -167,7 +167,7 @@ other [python-specific documents][python-guides]. [Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git [filesystem]: https://next.dotcloud.com/dev-center/platform-documentation#non-persistent-filesystem -[data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/ +[data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation#data-storage [mysqls]: https://next.dotcloud.com/dev-center/add-on-documentation/mysqls [example-app]: https://github.com/cloudControl/python-django-example-app [django-notes]: https://next.dotcloud.com/dev-center/guides/python/django-notes diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index 129e3e7..ae953c7 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -192,7 +192,7 @@ other [ruby-specific documents][ruby-guides]. [Bundler]: http://bundler.io/ [Procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile [filesystem]: https://next.dotcloud.com/dev-center/platform-documentation#non-persistent-filesystem -[data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/data-storage/ +[data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation#data-storage [postgres-addon]: https://next.dotcloud.com/dev-center/add-on-documentation/elephantsql [run command]: https://next.dotcloud.com/dev-center/guides/ruby/runcommand [rails-notes]: https://next.dotcloud.com/dev-center/guides/ruby/railsnotes From 8d7b1c17170c16b0ce91861653e75a166db40252 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Thu, 4 Dec 2014 16:43:09 +0100 Subject: [PATCH 44/84] Fix:rubynotes --- Guides/Ruby/Ruby on Rails.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index ae953c7..afca87b 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -181,8 +181,7 @@ $ dcapp APP_NAME/default run "rake db:migrate" Congratulations, you can now access the app at http://APP_NAME.dotcloudapp.com. -For additional information take a look at [Ruby on Rails notes][rails-notes] and -other [ruby-specific documents][ruby-guides]. +For additional information take a look at [Ruby notes][rubynotes]. [Ruby on Rails]: http://rubyonrails.org/ [dotCloud]: http://next.dotcloud.com @@ -195,6 +194,5 @@ other [ruby-specific documents][ruby-guides]. [data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation#data-storage [postgres-addon]: https://next.dotcloud.com/dev-center/add-on-documentation/elephantsql [run command]: https://next.dotcloud.com/dev-center/guides/ruby/runcommand -[rails-notes]: https://next.dotcloud.com/dev-center/guides/ruby/railsnotes -[ruby-guides]: https://next.dotcloud.com/dev-center/guides/ruby +[rubynotes]: https://next.dotcloud.com/dev-center/guides/ruby/rubynotes [gem itself]: http://rubygems.org/gems/cloudcontrol-rails From e30ff2db7cd18734e808a7eb705f17ef6c589a96 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Thu, 4 Dec 2014 16:58:21 +0100 Subject: [PATCH 45/84] Fix:link to python guides --- Guides/Python/Django.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index e76f78b..1862ae4 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -173,7 +173,7 @@ other [python-specific documents][python-guides]. [django-notes]: https://next.dotcloud.com/dev-center/guides/python/django-notes [get-conf]: https://next.dotcloud.com/dev-center/guides/python/add-on-credentials [Django tutorial]: https://docs.djangoproject.com/en/1.4/intro/tutorial01/ -[python-guides]: https://next.dotcloud.com/dev-center/guides/python +[python-guides]: https://next.dotcloud.com/dev-center/guides#python [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ [gunicorn]: http://gunicorn.org/ From 92f2105dd632b2213db9fe7683b42afccd1f3ba2 Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Thu, 4 Dec 2014 17:05:43 +0100 Subject: [PATCH 46/84] Fix:link to message mobile --- Guides/Python/Django notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index ab4ffbd..20831a3 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -29,7 +29,7 @@ You can't use a local SMTP server, instead choose one of our [email Add-ons][mes [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ [procfile]: https://next.dotcloud.com/dev-center/platform-documentation#buildpacks-and-the-procfile -[messaging-addons]: https://next.dotcloud.com/dev-center/add-on-documentation/messaging-&-mobile/ +[messaging-addons]: https://next.dotcloud.com/dev-center/add-on-documentation#messaging-mobile [data-storage-addons]: https://next.dotcloud.com/dev-center/add-on-documentation#data-storage [add-on-credentials]: https://next.dotcloud.com/dev-center/guides/python/add-on-credentials [dotCloud]: https://next.dotcloud.com/ From 0dd2c2a97c99421bc9922de40f44abe4fcacdc6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 4 Dec 2014 18:32:13 +0100 Subject: [PATCH 47/84] Rename space named Addons --- .../Data Storage/{Memcached Cloud.md => MemcachedCloud.md} | 0 .../Data Storage/{Redis Cloud.md => RedisCloud.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename Add-on Documentation/Data Storage/{Memcached Cloud.md => MemcachedCloud.md} (100%) rename Add-on Documentation/Data Storage/{Redis Cloud.md => RedisCloud.md} (100%) diff --git a/Add-on Documentation/Data Storage/Memcached Cloud.md b/Add-on Documentation/Data Storage/MemcachedCloud.md similarity index 100% rename from Add-on Documentation/Data Storage/Memcached Cloud.md rename to Add-on Documentation/Data Storage/MemcachedCloud.md diff --git a/Add-on Documentation/Data Storage/Redis Cloud.md b/Add-on Documentation/Data Storage/RedisCloud.md similarity index 100% rename from Add-on Documentation/Data Storage/Redis Cloud.md rename to Add-on Documentation/Data Storage/RedisCloud.md From 6f13fe31f5c2fd7217097bb46e46836adbad2acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Thu, 4 Dec 2014 18:35:02 +0100 Subject: [PATCH 48/84] Rename space from config addon doc --- Add-on Documentation/Deployment/{Custom Config.md => Config.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Add-on Documentation/Deployment/{Custom Config.md => Config.md} (100%) diff --git a/Add-on Documentation/Deployment/Custom Config.md b/Add-on Documentation/Deployment/Config.md similarity index 100% rename from Add-on Documentation/Deployment/Custom Config.md rename to Add-on Documentation/Deployment/Config.md From 23325e08149ffc6fc783b9ffa3b4735a22f57590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Fri, 5 Dec 2014 11:31:51 +0100 Subject: [PATCH 49/84] Update config add-on link --- Guides/Java/AWS S3.md | 2 +- Guides/Migration Guides/Converting dotcloud.yml.md | 6 +++--- Guides/NodeJS/AWS S3.md | 2 +- Guides/Python/AWS S3.md | 2 +- Guides/Ruby/AWS S3.md | 2 +- Platform Documentation.md | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index c42c33c..42d0032 100644 --- a/Guides/Java/AWS S3.md +++ b/Guides/Java/AWS S3.md @@ -26,7 +26,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/config): ~~~bash $ dcapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] diff --git a/Guides/Migration Guides/Converting dotcloud.yml.md b/Guides/Migration Guides/Converting dotcloud.yml.md index 04f889b..1e1a64a 100644 --- a/Guides/Migration Guides/Converting dotcloud.yml.md +++ b/Guides/Migration Guides/Converting dotcloud.yml.md @@ -156,7 +156,7 @@ In the dotcloud.yml file, you can define many different kinds of services within On Next dotCloud, "Data Services" like MySQL and Redis, as well as many other types of services like logging, monitoring and even SSL, are handled outside of the Procfile with [Add-ons](https://next.dotcloud.com/dev-center/platform-documentation#add-ons). You can simply add them to your web app in the CLI with `dcapp addon.add`. This automatically connects the services to your app. -To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config). +To connect these services to an additional web app (for example if your existing dotCloud app was using multiple http-port code services in different languages), you can connect them manually using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/config). ### Example dotcloud.yml to Procfile migration @@ -216,7 +216,7 @@ There are a couple of ways to migrate your dotcloud.yml config section, dependin If you’re using the config section to specify an interpreter version (e.g. Python 2.6 vs. Python 2.7), check the [Next dotCloud buildpack documentation on Github](https://github.com/cloudcontrol?query=buildpack) for how to do this with your specific buildpack. For example, you can specify the Python version by creating a runtime.txt file to replace your dotcloud.yml config: python_version. -If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. +If you’re using the dotcloud.yml config section to specify how to start your processes, you can accomplish this on Next dotCloud using the [Custom Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/config) and the Procfile. First set the variables using Custom Config and add them as part of the shell command that starts the web and worker processes in the Procfile. Note that for some Add-on services, this is done automatically. For more information, read our guide on [migrating environment variables](./migrating-environment) from dotCloud to Next dotCloud. @@ -228,7 +228,7 @@ If you do have multiple services each with their own HTTP port, then you should Note that Next dotCloud containers do not expose an SSH port. See the [Secure Shell docs](https://next.dotcloud.com/dev-center/platform-documentation#secure-shell-ssh). ## environment -If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config) and our [dedicated guide](./migrating-environment) on this topic. +If you were setting environment variables in your dotcloud.yml then you should set these via `dcapp APP_NAME config.add` on Next dotCloud. Please read the [Add-on documentation](https://next.dotcloud.com/dev-center/add-on-documentation/config) and our [dedicated guide](./migrating-environment) on this topic. Note that the same variables are set in all your application processes (web and worker) -- you cannot specify that a variable should only be set on one process (as you could in a dotcloud.yml file). diff --git a/Guides/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index 2d8bb72..f3efe86 100644 --- a/Guides/NodeJS/AWS S3.md +++ b/Guides/NodeJS/AWS S3.md @@ -94,4 +94,4 @@ You can build rich Node.js apps using more advanced S3 operations. To learn more [npm package manager]: https://npmjs.org/ [Amazon Guide]: http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-intro.html [AWS access credentials]: http://aws.amazon.com/security-credentials -[Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/custom-config +[Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/config diff --git a/Guides/Python/AWS S3.md b/Guides/Python/AWS S3.md index b2fdf5a..ad87e90 100644 --- a/Guides/Python/AWS S3.md +++ b/Guides/Python/AWS S3.md @@ -21,7 +21,7 @@ boto==2.9.8 ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/config): ~~~bash $ dcapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index 6947132..b815bb2 100644 --- a/Guides/Ruby/AWS S3.md +++ b/Guides/Ruby/AWS S3.md @@ -26,7 +26,7 @@ Follow the [Amazon Guide](http://docs.aws.amazon.com/AWSSdkDocsJava/latest/Devel ## Example usage: -The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/custom-config): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://next.dotcloud.com/dev-center/add-on-documentation/config): ~~~bash $ dcapp APP_NAME/default config.add AWS_ACCESS_KEY_ID=[YOUR_SECRET_KEY] AWS_SECRET_ACCESS_KEY=[YOUR_ACCESS_KEY] AWS_REGION='eu-west-1' diff --git a/Platform Documentation.md b/Platform Documentation.md index 232760a..9478c1e 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -832,7 +832,7 @@ $ dcapp APP_NAME/DEP_NAME details [generating SSH keys]: https://help.github.com/articles/generating-ssh-keys -[Custom Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/custom-config +[Custom Config Add-on]: https://next.dotcloud.com/dev-center/add-on-documentation/config [web console]: https://next.dotcloud.com/console [API libraries]: https://github.com/cloudControl [the latest version]: https://download.dotcloudapp.com/windows From 3ef3e913bcdb42c01e8743f36a5e231cf4d8b45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Fri, 5 Dec 2014 11:32:56 +0100 Subject: [PATCH 50/84] Fix mysqls add-on link --- Guides/Java/Java - Spring.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index de0cf8c..51809f0 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -152,4 +152,4 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.dotcloudapp.com` [dotCloud]: / [file system]: ../../platform-documentation#non-persistent-filesystem [log command]: ../../platform-documentation#logging -[Shared MySQL Add-on]: ../../add-on-documentation/mysql +[Shared MySQL Add-on]: ../../add-on-documentation/mysqls From e9db40861b6acda5bfcd5b5bf476413e6283829d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Fri, 5 Dec 2014 11:36:13 +0100 Subject: [PATCH 51/84] Fix migration guides link --- Guides/Migration Guides/Converting dotcloud.yml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Guides/Migration Guides/Converting dotcloud.yml.md b/Guides/Migration Guides/Converting dotcloud.yml.md index 1e1a64a..57ad888 100644 --- a/Guides/Migration Guides/Converting dotcloud.yml.md +++ b/Guides/Migration Guides/Converting dotcloud.yml.md @@ -238,5 +238,5 @@ additional dependencies of your application during build time (after `dotcloud push`). On Next dotCloud you should use the mechanism provided by your Buildpack. -For more information on all supported languages, please check our [Guides](../..). +For more information on all supported languages, please check our [Guides](../../guides). From ab117323d6412b31ec76764fa9b9fc1d2bf55485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Fri, 5 Dec 2014 11:36:45 +0100 Subject: [PATCH 52/84] Fix mysqld add-on plan --- Guides/Migration Guides/Django Celery.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Guides/Migration Guides/Django Celery.md b/Guides/Migration Guides/Django Celery.md index da771ec..40d52b6 100644 --- a/Guides/Migration Guides/Django Celery.md +++ b/Guides/Migration Guides/Django Celery.md @@ -69,7 +69,7 @@ Next dotCloud those are called [add-ons] and in this case we will need a databas add-on and a RabbitMQ add-on. In this example we will use the [MySQLd] and the [CloudAMQP] add-ons: ~~~ -$ dcapp APP_NAME addon.add mysqld.micro +$ dcapp APP_NAME addon.add mysqld.d0 $ dcapp APP_NAME addon.add cloudamqp.tiger ~~~ From 4502330e4433807547e022419b6b82ba15cf28de Mon Sep 17 00:00:00 2001 From: Matthias Wiesner Date: Tue, 9 Dec 2014 16:50:49 +0100 Subject: [PATCH 53/84] Decrease width of ascii art Decrease width accordingly to maximum length in doutcloudapp documentation. So it will not break in documentation. --- .../Converting dotcloud.yml.md | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/Guides/Migration Guides/Converting dotcloud.yml.md b/Guides/Migration Guides/Converting dotcloud.yml.md index 57ad888..e3afdf1 100644 --- a/Guides/Migration Guides/Converting dotcloud.yml.md +++ b/Guides/Migration Guides/Converting dotcloud.yml.md @@ -18,44 +18,44 @@ You can run several [workers](https://next.dotcloud.com/dev-center/add-on-docume ### App structure on dotCloud ~~~text -+--------------------------------------------------------------------------------------------------+ -| dotCloud application | -+---------------------+-+---------------------+-+--------------------------+-+---------------------+ -+---------------------+ +---------------------+ +--------------------------+ +---------------------+ -| service web | | service support | | service worker | | service storage | -| | | | | | | | -| type: ruby | | type: python | | type: python+worker | | type: mysql | -| port: 80 | | port: 8300 | | port: None | | port: 3306 | -| | | | | | | | -| | | | | | | | -| | | | | | | | -+---------------------+ +---------------------+ +--------------------------+ +---------------------+ ++------------------------------------------------------------------------------------------+ +| dotCloud application | ++-------------------+-+-------------------+-+------------------------+-+-------------------+ ++-------------------+ +-------------------+ +------------------------+ +-------------------+ +| service web | | service support | | service worker | | service storage | +| | | | | | | | +| type: ruby | | type: python | | type: python+worker | | type: mysql | +| port: 80 | | port: 8300 | | port: None | | port: 3306 | +| | | | | | | | +| | | | | | | | +| | | | | | | | ++-------------------+ +-------------------+ +------------------------+ +-------------------+ ~~~ ### App structure on Next dotCloud ~~~text -+---------------------+ +--------------------------------------------------+ -| Next dotCloud app | | Next dotCloud app | -+---------------------+ +--------------------------------------------------+ -+---------------------+ +--------------------------------------------------+ -| name: web | | name: support | -| | | | -| buildpack: ruby | | buildpack: python | -| port: 80 | | port: 80 | -| | | | -| | | additional: python-worker | -| | | | -| | | | -+-----------+---------+ +-----------------------------------------+--------+ - | | - | automatically connected to web app | - | when Add-on is added | - | | -+-----------+---------+ | -| +-------------------------------------------+ -| Add-on: MySQL | manually connected to python app -| | via custom config -+---------------------+ ++---------------------+ +--------------------------------------------------+ +| Next dotCloud app | | Next dotCloud app | ++---------------------+ +--------------------------------------------------+ ++---------------------+ +--------------------------------------------------+ +| name: web | | name: support | +| | | | +| buildpack: ruby | | buildpack: python | +| port: 80 | | port: 80 | +| | | | +| | | additional: python-worker | +| | | | +| | | | ++-----------+---------+ +-----------------------------------------+--------+ + | | + | automatically connected to web app | + | when Add-on is added | + | | ++-----------+---------+ | +| +-------------------------------------------+ +| Add-on: MySQL | manually connected to python app +| | via custom config ++---------------------+ ~~~ ## dotcloud.yml versus the Procfile From a2e53f4912111f77e19568d8d553ab884649f0ad Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 10 Dec 2014 18:17:09 +0100 Subject: [PATCH 54/84] Update mysqld creds names --- Add-on Documentation/Data Storage/MySQLd.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Add-on Documentation/Data Storage/MySQLd.md b/Add-on Documentation/Data Storage/MySQLd.md index 36b04a8..55cc9ce 100644 --- a/Add-on Documentation/Data Storage/MySQLd.md +++ b/Add-on Documentation/Data Storage/MySQLd.md @@ -118,8 +118,8 @@ $ dcapp APP_NAME/DEP_NAME addon mysqld.OPTION Addon : mysqld.d0 Settings MYSQLD_PASSWORD : SOME_SECRET_PASSWORD - MYSQLD_USER : SOME_SECRET_USER - MYSQLD_HOST : SOME_HOST + MYSQLD_USERNAME : SOME_SECRET_USERNAME + MYSQLD_HOSTNAME : SOME_HOSTNAME MYSQLD_DATABASE : SOME_DATABASE_NAME MYSQLD_PORT : 3306 MYSQLD_URL : SOME_DATABASE_URL @@ -134,7 +134,7 @@ $ mysqldump -u MYSQLD_USERNAME -p --host=MYSQLD_HOSTNAME --ssl-ca=PATH_TO_CERTIF To **import** an sql file into a MySQL database use the following command: ~~~ -$ mysql -u MYSQLD_USER -p --host=MYSQLD_SERVER --ssl-ca=PATH_TO_CERTIFICATE/ca-cert.pem MYSQLD_DATABASE < MYSQLD_DATABASE.sql +$ mysql -u MYSQLD_USERNAME -p --host=MYSQLD_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/ca-cert.pem MYSQLD_DATABASE < MYSQLD_DATABASE.sql ~~~ From 55e98c765510d62cc89a832b98c18505a6c50f15 Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 10 Dec 2014 16:51:32 +0100 Subject: [PATCH 55/84] Remove rds/amazon references from mysqls doc --- Add-on Documentation/Data Storage/MySQLs.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 98639fd..137c668 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -1,6 +1,6 @@ # MySQLs: Shared MySQL Add-on -Every deployment can access a highly available shared MySQL Add-on based on [Amazon RDS](http://aws.amazon.com/rds/). +Every deployment can access a highly available shared MySQL Add-on based on [Google Cloud SQL](https://cloud.google.com/sql/). The shared MySQL Add-on is recommended for development and low-traffic apps only. For medium to high-traffic apps we recommend one of the dedicated [MySQLd Add-on](https://next.dotcloud.com/add-ons/mysqld) plans. @@ -91,13 +91,13 @@ the general documentation. External access to the MySQLs Add-on is available through an SSL encrypted connection by following these simple steps. - 1. Download the [certificate file](http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem) to your local machine. + 1. Download the [certificate file](https://console.developers.google.com/m/cloudstorage/b/dotcloudapp-ca/o/addon_mysqls_ca.pem) to your local machine. 1. Connect to the database using an SSL encrypted connection. The following example uses the MySQL command line tool. ~~~ -$ mysql -u MYSQLS_USERNAME -p --host=MYSQLS_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/mysql-ssl-ca-cert.pem +$ mysql -u MYSQLS_USERNAME -p --host=MYSQLS_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/addon_mysqls_ca.pem ~~~ Replace the uppercase variables with the corresponding values shown by the addon command. @@ -110,7 +110,7 @@ Settings MYSQLS_PASSWORD : SOME_SECRET_PASSWORD MYSQLS_USERNAME : SOME_SECRET_USERNAME -MYSQLS_HOSTNAME : SOME_HOST.eu-west-1.rds.amazonaws.com:3306 +MYSQLS_HOSTNAME : SOME_HOSTNAME MYSQLS_DATABASE : SOME_DATABASE_NAME ~~~ @@ -118,11 +118,11 @@ Likewise imports and exports are equally simple. To **export** your data use the mysqldump command. ~~~ -$ mysqldump -u MYSQLS_USERNAME -p --host=MYSQLS_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/mysql-ssl-ca-cert.pem MYSQLS_DATABASE > MYSQLS_DATABASE.sql +$ mysqldump -u MYSQLS_USERNAME -p --host=MYSQLS_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/addon_mysqls_ca.pem MYSQLS_DATABASE > MYSQLS_DATABASE.sql ~~~ To **import** an sql file into a MySQL database use the following command. ~~~ -$ mysql -u MYSQLS_USERNAME -p --host=MYSQLS_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/mysql-ssl-ca-cert.pem MYSQLS_DATABASE < MYSQLS_DATABASE.sql +$ mysql -u MYSQLS_USERNAME -p --host=MYSQLS_HOSTNAME --ssl-ca=PATH_TO_CERTIFICATE/addon_mysqls_ca.pem MYSQLS_DATABASE < MYSQLS_DATABASE.sql ~~~ From 6b7fac70fac5c365a2e370a706348ac4b1df2d85 Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Thu, 11 Dec 2014 14:44:52 +0100 Subject: [PATCH 56/84] Remove encoding section; update failover --- Add-on Documentation/Data Storage/MySQLs.md | 36 +-------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 137c668..e3b36c3 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -41,41 +41,7 @@ $ dcapp APP_NAME/DEP_NAME addon.remove mysqls.OPTION ## Replication and Failover -All instances are master-slave replicated accross two different availability zones. In case of a failure -of the master, an automatic failover to the slave will trigger to restore availability. This failover process -takes usually between 3 and 10 minutes. - -## Encoding - -All databases and tables use `latin1` as the default character set. You can find the character set -and collation of all your tables by running `SHOW STATUS TABLE;` under the `Collation` row. - -You can change the encoding of a table with this query: - -~~~ -ALTER TABLE CHARSET=; -~~~ - -Or create a new table with an explicit encoding adding a `CHARSET` value to the query: - -~~~ -CREATE TABLE ( - `id` int, - ...... - ) CHARSET=; -~~~ - -Or change the default character set for a database, so all tables created would use this enconding: - -~~~ -ALTER DATABASE CHARSET ; -~~~ - -You can find a list with all character sets supported by MySQL with this query: - -~~~ -SHOW CHARSET; -~~~ +Your data is replicated in many geographic locations as standard. Failover between them is handled automatically by us. Your data is safe and your database is available even in the event of a major failure in one location ## Database Credentials From c58c1295a921fa2e3d232ef5c39a11d51d378b1e Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Wed, 10 Dec 2014 14:48:54 +0100 Subject: [PATCH 57/84] MySQL migration guide --- .../Migrating MySQL services.md | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 Guides/Migration Guides/Migrating MySQL services.md diff --git a/Guides/Migration Guides/Migrating MySQL services.md b/Guides/Migration Guides/Migrating MySQL services.md new file mode 100644 index 0000000..4194d0a --- /dev/null +++ b/Guides/Migration Guides/Migrating MySQL services.md @@ -0,0 +1,107 @@ +# Migrating dotCloud MySQL service to Next dotCloud platform + +Next dotCloud offers two MySQL Add-ons, a shared and dedicated one. Both are based on [Google Cloud SQL][google cloud sql]. The [shared MySQL Add-on][shared mysql addon] is recommended for development and low-traffic apps while for medium to high-traffic apps we recommend one of the [dedicated MySQLd Add-on][dedicated mysql addon] plans. For more information on each, we recommend you looking in to the documentation of [shared MySQL Add-on][shared mysql addon doc] and [dedicated MySQLd Add-on][dedicated mysql addon doc]. + +This guide aims to show you the differences between the dotCloud MySQL service and the Next dotCloud MySQL Add-ons. For the purpose of this guide we will recommend you to use the MySQLd Add-on. + +## Comparison + + | dotCloud mysql services | Next dotCloud mysql add-ons +-------------|---------------------------------------|------------------------------- +Version| [5.1][mysql 5.1 doc] | [5.5][mysql 5.5 doc] +Access |
    • [MySQL service][dotcloud mysql service] runs in separate container
    • User can access it via SSH or connect directly to MySQL instance
    |