From 13d4e531ddd28ddea67406d6efc2d69c040f942e Mon Sep 17 00:00:00 2001 From: Dimitris Verraros Date: Tue, 22 Apr 2014 16:04:00 +0200 Subject: [PATCH 01/22] exoscale rebranding Change all domains to app.exo.io --- .../Big Data & Analytics/DBInsights.md | 50 -- .../Big Data & Analytics/IndexDepot.md | 150 ------ .../Data Processing/CloudAMQP.md | 45 -- .../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/RabbitMQBigwig.md | 192 ------- .../Data Processing/Searchify.md | 44 -- .../Data Processing/Searchly.md | 319 ------------ .../Data Processing/Worker.md | 26 +- Add-on Documentation/Data Storage/Cloudant.md | 57 --- .../Data Storage/ElephantSQL.md | 51 -- .../Data Storage/Flying Sphinx.md | 42 -- .../Data Storage/MemCachier.md | 404 --------------- Add-on Documentation/Data Storage/MongoLab.md | 81 --- .../Data Storage/MongoSoup.md | 142 ------ Add-on Documentation/Data Storage/MySQLd.md | 146 ------ Add-on Documentation/Data Storage/MySQLs.md | 62 +-- .../Data Storage/OpenRedis.md | 44 -- .../Data Storage/PostgreSQLd.md | 172 ------- Add-on Documentation/Deployment/Alias.md | 67 +-- Add-on Documentation/Deployment/Codeship.md | 42 -- Add-on Documentation/Deployment/Cron.md | 58 ++- .../Deployment/Custom Config.md | 22 +- Add-on Documentation/Deployment/Logentries.md | 33 -- Add-on Documentation/Deployment/Phrase.md | 192 ------- Add-on Documentation/Deployment/SSL.md | 224 -------- 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 ------- .../Messaging & Mobile/SendGrid.md | 55 -- .../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 | 40 -- .../Performance & Monitoring/StillAlive.md | 23 - Guides/Java/AWS S3.md | 4 +- Guides/Java/Add-on credentials.md | 49 +- Guides/Java/Auto-Detection.md | 23 - Guides/Java/Clojure - HelloWorld.md | 81 --- Guides/Java/Gradle - HelloWorld.md | 98 ---- Guides/Java/Grails.md | 108 ---- Guides/Java/Java - HelloWorld.md | 66 ++- Guides/Java/Java - Spring.md | 26 +- Guides/Java/Play - HelloWorld.md | 87 ---- Guides/Java/Scala - HelloWorld.md | 87 ---- Guides/NodeJS/AWS S3.md | 4 +- Guides/NodeJS/Add-on credentials.md | 52 +- Guides/NodeJS/Express.md | 165 ------ Guides/NodeJS/HelloWorld.md | 29 +- Guides/NodeJS/Sailsjs.md | 32 +- Guides/PHP/Add-on credentials.md | 42 +- Guides/PHP/CakePHP 2.2.1.md | 65 ++- Guides/PHP/Drupal 7.md | 47 +- Guides/PHP/HelloWorld.md | 26 +- Guides/PHP/Joomla 2.5.md | 52 +- Guides/PHP/Kohana 3.2.0.md | 212 ++++---- Guides/PHP/Symfony 1.4.md | 141 +++-- Guides/PHP/Yii 1.1.10.md | 155 +++--- Guides/PHP/Zend 2.md | 30 +- Guides/PHP/Zend Framework 1.11.md | 227 ++++----- ...trol_init.sql => drupal_exoscale_init.sql} | 2 +- Guides/Python/AWS S3.md | 4 +- Guides/Python/Add-on credentials.md | 59 +-- Guides/Python/Celery.md | 219 -------- Guides/Python/Django notes.md | 25 +- Guides/Python/Django.md | 46 +- Guides/Python/HelloWorld.md | 22 +- Guides/Python/Tornado.md | 22 +- Guides/Ruby/AWS S3.md | 4 +- Guides/Ruby/Add-on credentials.md | 54 +- Guides/Ruby/HelloWorld.md | 26 +- Guides/Ruby/Ruby on Rails.md | 57 +-- Guides/Ruby/RubyNotes.md | 8 +- Guides/Ruby/RunCommand.md | 10 +- .../Third-Party Buildpacks.md | 11 +- Platform Documentation.md | 482 +++++++----------- Quickstart.md | 75 ++- README | 4 +- cctrl_cheatsheet.pdf => exo_cheatsheet.pdf | Bin 812108 -> 729006 bytes 86 files changed, 1074 insertions(+), 6445 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/CloudAMQP.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/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/ElephantSQL.md delete mode 100644 Add-on Documentation/Data Storage/Flying Sphinx.md delete mode 100644 Add-on Documentation/Data Storage/MemCachier.md delete mode 100644 Add-on Documentation/Data Storage/MongoLab.md delete mode 100644 Add-on Documentation/Data Storage/MongoSoup.md delete mode 100644 Add-on Documentation/Data Storage/MySQLd.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/SSL.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/Messaging & Mobile/SendGrid.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 delete mode 100644 Guides/Java/Auto-Detection.md delete mode 100644 Guides/Java/Clojure - HelloWorld.md delete mode 100644 Guides/Java/Gradle - HelloWorld.md delete mode 100644 Guides/Java/Grails.md delete mode 100644 Guides/Java/Play - HelloWorld.md delete mode 100644 Guides/Java/Scala - HelloWorld.md delete mode 100644 Guides/NodeJS/Express.md rename Guides/PHP/{drupal_cloudcontrol_init.sql => drupal_exoscale_init.sql} (99%) delete mode 100644 Guides/Python/Celery.md rename cctrl_cheatsheet.pdf => exo_cheatsheet.pdf (72%) 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/, - } -} -~~~ - -## Upgrade IndexDepot - -Upgrading to another version of IndexDepot is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade indexdepot.OPTION_OLD indexdepot.OPTION_NEW -~~~ - -## Downgrade IndexDepot - -Downgrading to another version of IndexDepot is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade indexdepot.OPTION_OLD indexdepot.OPTION_NEW -~~~ - -## Removing IndexDepot - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove indexdepot.OPTION -~~~ - -## IndexDepot Apache Solr Code Example - -Here is an example on how to use an IndexDepot Apache Solr search index with PHP. The example uses the Zend HTTP client. There is another library [solr-php-client](http://code.google.com/p/solr-php-client/), but it didn'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/CloudAMQP.md b/Add-on Documentation/Data Processing/CloudAMQP.md deleted file mode 100644 index 7cede1d..0000000 --- a/Add-on Documentation/Data Processing/CloudAMQP.md +++ /dev/null @@ -1,45 +0,0 @@ -# CloudAMQP (Beta) - -CloudAMQP is a hosted RabbitMQ service, with high availability and blazing performance. - -## Adding or removing the CloudAMQP 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 cloudamqp.OPTION -~~~ -".option" represents the plan size, e.g. cloudamqp.lemur - -## Upgrade the CloudAMQP Add-on - -Upgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade cloudamqp.OPTION_OLD cloudamqp.OPTION_NEW -~~~ - -## Downgrade the CloudAMQP Add-on - -Downgrading to another option can easily be done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade cloudamqp.OPTION_OLD cloudamqp.OPTION_NEW -~~~ - -## Removing the CloudAMQP 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 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. - -## PHP AMQP Example Application - -For further information on how to use CloudAMQP in your PHP app, please refer to their documentation on [Github](https://github.com/cloudamqp/php-amqp-example). - 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/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 Processing/Worker.md b/Add-on Documentation/Data Processing/Worker.md index a4caf1c..ed8bffa 100644 --- a/Add-on Documentation/Data Processing/Worker.md +++ b/Add-on Documentation/Data Processing/Worker.md @@ -9,23 +9,23 @@ Each worker started via the Worker add-on runs in a seperate isolated container. Before you can start a worker, add the add-on with the addon.add command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add worker.single +$ exoapp APP_NAME/DEP_NAME addon.add worker.single ~~~ ## Starting a Worker -Workers can be started via the command line client's worker.add command. +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 a worker add 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] +$ exoapp 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" +$ exoapp APP_NAME/DEP_NAME worker.add WORKER_NAME "PARAM1 PARAM2 PARAM3" ~~~ ## List Running Workers @@ -33,7 +33,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 +$ exoapp APP_NAME/DEP_NAME worker Workers nr. wrk_id 1 WRK_ID @@ -42,7 +42,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 +$ exoapp APP_NAME/DEP_NAME worker WRK_ID Worker wrk_id : WRK_ID command : WORKER_NAME @@ -58,7 +58,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 +$ exoapp APP_NAME/DEP_NAME worker.remove WRK_ID ~~~ To get the WRK_ID refer to the listing workers section above. @@ -75,10 +75,10 @@ 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://www.exoscale.ch/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 +$ exoapp 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 [...] @@ -89,7 +89,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 +$ exoapp APP_NAME/DEP_NAME addon.remove worker.single ~~~ ## PHP Worker Example @@ -123,8 +123,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 +$ exoapp APP_NAME/DEP_NAME worker.add WORKER_NAME 2 +$ exoapp 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/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/ElephantSQL.md b/Add-on Documentation/Data Storage/ElephantSQL.md deleted file mode 100644 index 8aeb94d..0000000 --- a/Add-on Documentation/Data Storage/ElephantSQL.md +++ /dev/null @@ -1,51 +0,0 @@ -# ElephantSQL: PostgreSQL as a Service - -The most advanced open-source database, hosted in the cloud. - -As a full-featured, open-source relational DBMS (RDBMS), PostgreSQL boasts many characteristics designed to support high-transaction, mission-critical applications. - -## Adding the ElephantSQL Add-on - -To add the ElephantSQL Add-on use the addon.add command. - -~~~ -$ 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"). - -## Upgrading the ElephantSQL Add-on - -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 -~~~ - -Please note: Upgrading works only between shared plans or between dedicated -plans. To upgrade from a shared to a dedicated plan, you would need to export -your data from the shared plan first and reimport it to the dedicated plan -later. - -## Downgrading the ElephantSQL Add-on - -To downgrade to a smaller plan use the addon.downgrade command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade elephantsql.OPTION_OLD elephantsql.OPTION_NEW -~~~ - -## Removing the ElephantSQL Add-on - -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 -~~~ - -### 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. - -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/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/MemCachier.md b/Add-on Documentation/Data Storage/MemCachier.md deleted file mode 100644 index e0c75ff..0000000 --- a/Add-on Documentation/Data Storage/MemCachier.md +++ /dev/null @@ -1,404 +0,0 @@ -# MemCachier Add-on - -[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/). - -Getting started ------ - -Start by installing the Add-on: - - $ cctrlapp 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 - ... etc ... - -Next, setup your app to start using the cache. We have documentation for the following languages and frameworks: - - * [Ruby](#ruby) - * [Rails](#rails) - * [Python](#python) - * [PHP](#php) - * [Java](#java) - -Your credentials may take up to three (3) minutes to be synced to our servers. You may see authentication errors if you start using the cache immediately. - -Ruby ------- - -Start by adding the [memcachier](https://github.com/memcachier/memcachier-gem) and [dalli](http://github.com/mperham/dalli) gems to your Gemfile. - -~~~ruby -gem 'memcachier' -gem 'dalli' -~~~ - -Then bundle install: - -~~~ -$ bundle install -~~~ - -`Dalli` is a Ruby Memcached client, and the `memcachier` gem modifies the environment (`ENV`) such that the environment variables set by MemCachier will work with Dalli. Once these gems are installed you can start writing code. The following is a basic example using Dalli. - -~~~ruby -require 'sinatra' -require 'dalli' -require 'json' -require 'memcachier' - -def getVisits() - - config = { - :srv => ENV["MEMCACHIER_SERVERS"], - :usr => ENV["MEMCACHIER_USERNAME"], - :pwd => ENV["MEMCACHIER_PASSWORD"] - } - - cache=Dalli::Client.new(config[:srv],{:username => config[:usr],:password => config[:pwd]}) - - count=cache.get(request.ip) - if count.nil? - count=0 - end - - count+=1 - cache.set(request.ip,count) - - return count -end - -get '/' do - count=getVisits - ""+ - ""+ - "Ruby Memcachier example"+ - ""+ - "

Hello #{request.ip}

"+ - "This is visit #{count}"+ - ""+ - "" -end -~~~ - -Rails ------ - -Start by adding the [memcachier](https://github.com/memcachier/memcachier-gem) and [dalli](http://github.com/mperham/dalli) gems to your Gemfile. We’ve built a small Rails example here: [MemCachier Rails Sample App](https://github.com/memcachier/memcachier-gis). - -~~~ruby -gem 'memcachier' -gem 'dalli' -~~~ - -Then bundle install: - -~~~term -$ bundle install -~~~ - -`Dalli` is a Ruby Memcached client, and the `memcachier` gem modifies the environment (`ENV`) such that the environment variables set by MemCachier will work with Dalli. Once these gems are installed you'll want to configure the Rails cache_store appropriately. Modify `config/environments/production.rb` with the following: - -~~~ruby -config.cache_store = :dalli_store -~~~ - -In your development environment, Rails.cache defaults to a simple in-memory store and so it doesn't require a running Memcached. - -From here you can use the following code examples to use the cache in your Rails app: - -~~~ruby -Rails.cache.write("foo", "bar") -puts Rails.cache.read("foo") -~~~ - -Without the `memcachier` gem, you’ll need to pass the proper credentials to Dalli in `config/environments/production.rb`: - -~~~ruby -config.cache_store = :dalli_store, ENV["MEMCACHIER_SERVERS"], - {:username => ENV["MEMCACHIER_USERNAME"], - :password => ENV["MEMCACHIER_PASSWORD"]} -~~~ - -Python ------ - -You can use many Memcached clients for python. In this example we are gonig to use `Python-Binary-Memcached` client with built in SASL support. Run the following commands on your local machine: - -~~~ -$ pip install python-binary-memcached -$ pip freeze > requirements.txt -~~~ - -Make sure your `requirements.txt` file contains this requirement (note that your versions may differ than what’s below): - -~~~ -python-binary-memcached==0.14 -~~~ - -Then you can put this code in you server.py and start caching: - -~~~python -import os -import cgi -import json -import bmemcached -from flask import Flask -from flask import request -from random import randint - -app = Flask(__name__) - -@app.route('/') -def hello(): - count=1 - try: - cred_file = open(os.environ["CRED_FILE"]) - data = json.load(cred_file) - creds = data['MEMCACHIER'] - config = { - 'srv': str(creds['MEMCACHIER_SERVERS']).split(','), - 'usr': str(creds['MEMCACHIER_USERNAME']), - 'pwd': str(creds['MEMCACHIER_PASSWORD']) - } - except IOError: - print 'Could not open file' - - client=bmemcached.Client(config['srv'], config['usr'], config['pwd']) - ipaddr=str(request.headers['X-Forwarded-For']) - if client.get(ipaddr) is not None: - count=int(client.get(ipaddr))+1 - client.set(ipaddr, str(count)) - - return "\n\ - \n\ - Python Memcachier example\n\ - \n\ -

Hello " + ipaddr + "

\n\ - This is visit " + str(count) +"\n\ - \n\ - " - -if __name__ == '__main__': - port = int(os.environ.get('PORT', 5000)) - app.run(host='0.0.0.0', port=port) -~~~ - -PHP ------- - -Memcached provided by MemCachier can be used like this: - -~~~php - array_map(function($x) {return explode(":", $x);}, explode(",", $creds['MEMCACHIER']['MEMCACHIER_SERVERS'])), - 'USERNAME' => $creds['MEMCACHIER']['MEMCACHIER_USERNAME'], - 'PASSWORD' => $creds['MEMCACHIER']['MEMCACHIER_PASSWORD'], - ); - $m = new Memcached(); - $m->setOption(Memcached::OPT_BINARY_PROTOCOL, 1); - $m->setSaslAuthData($config['USERNAME'], $config['PASSWORD']); - $m->addServers($config['SERVERS']); - - $current_count = (int)$m->get('count') + 1; - $m->set('count', $current_count); -?> - - - Memcachier Example - - -

Hello !

-

This is visit number .

- - -~~~ - -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. - -Java ----- - -In this short example we will show you how to integrate your Java application with Memcachier Add-on. We will use `spymemcached` library with SASL authentication support. To use it in your project, just specify additional dependency in your `pom.xml` file: - -~~~xml -... - - com.google.code.simple-spring-memcached - spymemcached - 2.8.4 - -... -~~~ - -#####Create Memcached SASL connection: - -~~~java -package com.cloudcontrolled.sample.spring.memcachier; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.List; - -import javax.security.auth.callback.CallbackHandler; - -import net.spy.memcached.ConnectionFactory; -import net.spy.memcached.ConnectionFactoryBuilder; -import net.spy.memcached.MemcachedClient; -import net.spy.memcached.auth.AuthDescriptor; -import net.spy.memcached.auth.PlainCallbackHandler; - -public class MemcachierConnection extends MemcachedClient { - - public MemcachierConnection(String username, String password, String servers) throws IOException { - this(new SASLConnectionFactoryBuilder().build(username, password), getAddresses(servers)); - } - - public MemcachierConnection(ConnectionFactory cf, List addrs) throws IOException { - super(cf, addrs); - } - - private static List getAddresses(String servers) { - List addrList = new ArrayList(); - for (String server : servers.split(",")) { - String addr = server.split(":")[0]; - int port = Integer.parseInt(server.split(":")[1]); - addrList.add(new InetSocketAddress(addr, port)); - } - return addrList; - } -} - -class SASLConnectionFactoryBuilder extends ConnectionFactoryBuilder { - public ConnectionFactory build(String username, String password){ - CallbackHandler ch = new PlainCallbackHandler(username, password); - AuthDescriptor ad = new AuthDescriptor(new String[]{"PLAIN"}, ch); - this.setProtocol(Protocol.BINARY); - this.setAuthDescriptor(ad); - return this.build(); - } -} -~~~ - -#####Use Memcachier: - -~~~java -String user = System.getenv("MEMCACHIER_USERNAME"); -String pass = System.getenv("MEMCACHIER_PASSWORD"); -String addr = System.getenv("MEMCACHIER_SERVERS"); -MemcachierConnection mc = new MemcachierConnection(user, pass, addr); -~~~ - -You can also find a ready-to-deploy example on [Github](https://github.com/cloudControl/java-spring-jsp-example-app/tree/memcached_guide). - -Library support ------ - -MemCachier will work with any Memcached binding that supports [SASL authentication](https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer) and the [binary protocol](https://code.google.com/p/memcached/wiki/MemcacheBinaryProtocol). We have tested MemCachier with the following language bindings, although the chances are good that other SASL binary protocol packages will also work. - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LanguageBindings
Rubydalli
Python - pylibmc -
Django - django-pylibmc -
PHP - PHP-Memcached -
Java - spymemcached -
- -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. - -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. - -On Ubuntu: - -~~~ -$ sudo apt-get install memcached -~~~ - -Or on OS X (with Homebrew): - -~~~ -$ brew install memcached -~~~ - -Or for Windows please refer to [these instructions](http://www.codeforest.net/how-to-install-memcached-on-windows-machine). - -For further information and resources (such as the memcached sourcecode) please refer to the [Memcache.org homepage](http://memcached.org) - -To run Memcached simply execute the following command: - -~~~ -$ 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). - -Sample apps ------ - -We've built a number of working sample apps, too: - -* [Sinatra Memcached Example](http://github.com/memcachier/memcachier-social) -* [Rails Memcached Example](http://github.com/memcachier/memcachier-gis) -* [PHP Memcached Example](http://github.com/memcachier/memcachier-primes) -* [Java Jetty Memcached Example](https://github.com/memcachier/memcachier-fibonacci) - -Upgrading and downgrading ------- - -Changing your plan, either by upgrading or downgrading, requires no code changes. Your cache won't be lost, either. Upgrading and downgrading Just Works™. - -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) - -Any issues related to Memcachier service are reported at [Memcachier Status](http://status.memcachier.com/). - 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/MongoSoup.md b/Add-on Documentation/Data Storage/MongoSoup.md deleted file mode 100644 index 0be03a0..0000000 --- a/Add-on Documentation/Data Storage/MongoSoup.md +++ /dev/null @@ -1,142 +0,0 @@ -# MongoSoup - -MongoSoup is the first German-based MongoDB cloud hosting solution. Supported -by a team of experts from 10gen’s first German partner comSysto you can have a -running MongoDB database in virtually no time. - -## MongoSoup - -The MongoSoup Add-on can be added to any deployment from the cctrlapp command -line: -~~~bash -$ 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). - -## For example: -~~~bash -$ 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 -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. - -## Internal access credentials - -Your MongoSoup 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 MongoSoup must update your MongoSoup_URI, you will be -notified through the email address you\92ve provided to CloudControl. - -MongoSoup's entry in your application CRED_FILE looks like this: -~~~ -{ - "mongosoup":{ - "MONGOSOUP_URL":"mongodb://APP_NAME:PASSWORD@dbs001.mongosoup.de//DBNAME", - } -} -~~~ - -Your app-name, password and db-name are all automatically generated by cloudControl and MongoSoup. - -## Samples - -Here are some snippets of code to help you get started: - -### PHP - -```php - selectDB(myDbName); - $col = new MongoCollection($db, myCollection); - $cursor = $col->find(); - foreach ($cursor as $doc) { echo $doc, "
"; } - ?> -``` - -### 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) -article. - -```java - Credentials credentials = Credentials.getInstance(); - String uriString = credentials.getCredential("url","mongosoup").toString(); - MongoClientURI uri = new MongoClientURI(uriString); - MongoClient mongo = new MongoClient(uri); - DB db = mongo.getDB("myDbName"); - DBColection collection = db.getCollection("myCollection"); - DBCursor cur = collection.find(); - while(cur.hasNext()){ - DBObject obj = cur.next(); - ... - } -``` - - -### Python - -```python -cred_file = open(os.environ["CRED_FILE"]) -data = json.load(cred_file) -creds = data['MONGOSOUP'] -uriString = str(creds['MONGOSOUP_URL']) -mongo = MongoClient(uriString); -db = mongo['myDbName'] -collection = db['myCollection'] -for obj in collection.find(): - ... -``` - -### Ruby - -```ruby -uriString = ENV['MONGOSOUP_URL'] -client = MongoClient.from_uri(uriString) -db = client.db('myDbName') -db.myCollection.each { ... } -``` - -## Upgrading to a larger MongoSoup plan - -Currently, you can only automatically change to another plan within the shared -environment. Moving to smaller plans will only work if your data will fit into -the smaller plan's limit. - -There are steps to follow if you've outgrown or anticipate outgrowing your -current dedicated 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 MongoSoup_URI from your CRED_FILE, no application -changes are required. - -## Removing MongoSoup - -If you'd like to remove the MongoSoup add-on, use the cctrlapp command line: -~~~bash -$ cctrlapp APP_NAME/DEP_NAME addon.remove mongosoup.OPTION -~~~ - -Note: All data in your database will be lost if you remove the MongoSoup -add-on. diff --git a/Add-on Documentation/Data Storage/MySQLd.md b/Add-on Documentation/Data Storage/MySQLd.md deleted file mode 100644 index c2c6db2..0000000 --- a/Add-on Documentation/Data Storage/MySQLd.md +++ /dev/null @@ -1,146 +0,0 @@ -# MySQLd: Dedicated MySQL Add-on - -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. - -## Features of the cloudControl MySQLd Add-on - -The MySQLd Add-on comes with the following features: - -1. Easy, Managed Deployments - - 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 - MySQL 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. Dashboard - - View key operational metrics like CPU/ Memory/ Storage/ Connections for your DB Instance deployments via [Webconsole]. - -## 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 -~~~ -Replace `mysqld.OPTION` with a valid option, e.g. `mysqld.small`. 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. - -## 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 -~~~ - -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 30 minutes and can involve a 3 to 10 minute downtime. - -## Downgrading the MySQLd Add-on - -To downgrade to a smaller plan, use the `addon.downgrade` command: - -~~~ -$ cctrlapp 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 -sizes. - - -## Removing the MySQLd Add-on - -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 -~~~ - -**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. - -## 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 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. 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 -~~~ - -Replace the uppercase variables with the corresponding values shown by the `addon` command: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon mysqld.OPTION -Addon : mysqld.small - Settings - MYSQLD_PASSWORD : SOME_SECRET_PASSWORD - MYSQLD_USER : SOME_SECRET_USER - MYSQLD_HOST : SOME_HOST.eu-west-1.rds.amazonaws.com - MYSQLD_DATABASE : SOME_DATABASE_NAME - MYSQLD_PORT : 3306 - MYSQLD_URL : SOME_DATABASE_URL -~~~ - -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 -~~~ - -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 -~~~ - - -[Amazon RDS]: http://aws.amazon.com/rds/ -[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 diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 8c3ea6f..47724b1 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -1,13 +1,13 @@ # 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/). 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. +Every deployment can access a highly available shared MySQL add-on. ## Adding the MySQLs Add-on 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 +$ exoapp APP_NAME/DEP_NAME addon.add mysqls.OPTION ~~~ Replace `mysqls.OPTION` with a valid option, e.g. `mysqls.free`. @@ -16,7 +16,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 +$ exoapp APP_NAME/DEP_NAME addon.upgrade mysqls.OPTION_OLD mysqls.OPTION_NEW ~~~ ## Downgrading the MySQLs Add-on @@ -24,7 +24,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 +$ exoapp APP_NAME/DEP_NAME addon.downgrade mysqls.OPTION_OLD mysqls.OPTION_NEW ~~~ ## Removing the MySQLs Add-on @@ -34,55 +34,23 @@ 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 +$ exoapp 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. +All instances are master-slave replicated. 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](https://www.cloudcontrol.com/dev-center/Platform%20Documentation#add-ons) in the general documentation. - -### External Access - -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. 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 -~~~ - -Replace the uppercase variables with the corresponding values shown by the addon command. - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon mysqls.OPTION -Addon : mysqls.512mb - -Settings - -MYSQLS_PASSWORD : SOME_SECRET_PASSWORD -MYSQLS_USERNAME : SOME_SECRET_USERNAME -MYSQLS_HOSTNAME : SOME_HOST.eu-west-1.rds.amazonaws.com:3306 -MYSQLS_DATABASE : SOME_DATABASE_NAME -~~~ - -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 -~~~ - -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 -~~~ - +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.exoscale.ch/dev-center/Platform%20Documentation#add-ons) +in the general documentation. 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 3e8dfc4..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 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 30 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/Alias.md b/Add-on Documentation/Deployment/Alias.md index 1e6418e..41ad838 100644 --- a/Add-on Documentation/Deployment/Alias.md +++ b/Add-on Documentation/Deployment/Alias.md @@ -8,82 +8,83 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro 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 + $ exoapp APP_NAME/default alias APP_NAME.app.exo.io ~~~ 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. 1. Add it as a TXT record to your root domain. - + Please use the interface of your DNS provider to add a [TXT record](http://de.wikipedia.org/wiki/TXT_Resource_Record) to your root domain. Please note how the TXT record is set for `example.com` but used to verify `www.example.com`. - + ~~~ - example.com. 3600 IN TXT "cloudControl-verification: 68b676e063eadb350876ae291e9ae43748d6e51c85ecd3c4cc026c869acc9d2d" + 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`. - - 1. Add a CNAME pointing to the provided `.cloudcontrolled.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. - + + Since we are going to use a CNAME to point the custom domain to the provided `.app.exo.io` 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 `.app.exo.io` subdomain. + + In addition to the TXT record, go ahead and also add a CNAME pointing to your apps `.app.exo.io` subdomain. Use the command line client's alias command to show the one specific to your deployment. + ~~~ # for the default deployment - $ cctrlapp APP_NAME/default alias + $ exoapp APP_NAME/default alias Aliases name default verified - APP_NAME.cloudcontrolled.com 1 1 + APP_NAME.app.exo.io 1 1 # for any additional deployment - $ cctrlapp APP_NAME/DEP_NAME alias + $ exoapp APP_NAME/DEP_NAME alias Aliases name default verified - DEP_NAME.APP_NAME.cloudcontrolled.com 1 1 + DEP_NAME.APP_NAME.app.exo.io 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.app.exo.io. ~~~ - + 1. Add one alias per domain to your deployment. - + 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 + $ exoapp 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 + $ exoapp APP_NAME/DEP_NAME alias Aliases name default verified www.example.com 0 0 [...] ~~~ - + The verification takes at least 30 minutes, but depends on the TTL of you DNS configuration. - + 1. Wait for the DNS changes to propagate. 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 + $ exoapp APP_NAME/DEP_NAME alias Aliases name default verified www.example.com 0 1 [...] ~~~ - + ## Removing an Alias To remove an alias, simply use the alias.remove command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME alias.remove www.example.com +$ exoapp APP_NAME/DEP_NAME alias.remove www.example.com ~~~ ## Special Case: Wildcard Domains @@ -93,13 +94,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 +$ exoapp 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 +$ exoapp 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/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/Cron.md b/Add-on Documentation/Deployment/Cron.md index 129d737..53beb8b 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -2,25 +2,34 @@ ## 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 to a URL you specify. +On UNIX systems [cronjobs](http://en.wikipedia.org/wiki/Cron) are commands that +are periodically executed. On exoscale however, there is no one node that +the cronjob can run on. Therefore cronjobs on exoscale are periodical calls +to a URL you specify. ## How does it work? -The Cron add-on allows you to call an URL in a specific interval, e.g. daily or hourly. When you add an hourly cron at 2.45pm, the next call will run at 3.45pm. For the daily Cron it would reoccur the next day at 2.45pm. The Cron add-on does not guarantee a URL is only called once per interval. +The Cron Add-on allows you to call an URL in a specific interval, e.g. daily or +hourly. When you add an hourly cron at 2.45pm, the next call will run at +3.45pm. For the daily Cron it would reoccur the next day at 2.45pm. The Cron +Add-on does not guarantee a URL is only called once per interval. -Cronjobs are regular requests against your app and are subject the the same 120s timelimit. +Cronjobs are regular requests against your app and are subject to the same 55s +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 available that can be used to dispatch tasks to the workers. +If you need more control over when and how often tasks are run and/or have +tasks that take longer than 55 seconds we recommend using the +[Worker](https://www.exoscale.com/add-ons/worker) Add-on. -## Adding the Cron add-on +## Adding the Cron Add-on -Before you can add a Cron job, the add-on itself has to be added: +Before you can add a Cron job, the Add-on itself has to be added: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.add cron.OPTION +$ exoapp 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. +As always the different options are listed on the [Cron Add-on](https://www.exoscale.ch/add-ons/cron) page. ## Adding a url for the Cron job @@ -28,19 +37,20 @@ 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 +$ exoapp APP_NAME/default cron.add http[s]://[user:password@]APP_NAME.app.exo.io # for any additional deployment -$ cctrlapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.cloudcontrolled.com +$ exoapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.app.exo.io ~~~ -You can only add cron jobs calling a verified alias of the deployment. The Cron add-on supports http basic authentication. It is recommended to use https when sending credentials. Please note, https via piggyback ssl is not available for non-default deployments due to the `*.cloudcontrolled.com` wildcard certificate not being valid for `*.*.cloudcontrolled.com`. +You can only add cron jobs calling a verified alias of the deployment. It is +recommended to use https when sending credentials. ## List Cron overview Get an overview of all your Cron jobs: ~~~ -$ cctrlapp APP_NAME/DEP_NAME cron +$ exoapp APP_NAME/DEP_NAME cron ~~~ ## Cron details @@ -48,10 +58,10 @@ $ cctrlapp APP_NAME/DEP_NAME cron Get the details of a specific Cron job: ~~~ -$ cctrlapp APP_NAME/DEP_NAME cron CRON_ID +$ exoapp APP_NAME/DEP_NAME cron CRON_ID Cronjob job_id : jobkqy7rdmg - url : http://APP_NAME.cloudcontrolled.com + url : http://APP_NAME.app.exo.io next_run : 2011-05-09 19:39:39 created : 2011-05-05 19:39:39 modified : 2011-05-05 19:39:39 @@ -62,32 +72,34 @@ Cronjob You can remove a Cron job by the job_id ~~~ -$ cctrlapp APP_NAME/DEP_NAME cron.remove JOB_ID +$ exoapp APP_NAME/DEP_NAME cron.remove JOB_ID ~~~ ## Upgrading / downgrading the Cron addon -In order to switch from a daily to hourly Cron or vice versa, use the up- or downgrade function +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 +$ exoapp APP_NAME/DEP_NAME addon.upgrade cron.free cron.hourly ~~~ or ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade cron.hourly cron.free +$ exoapp 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 hourly add-on will stay hourly. +Crons added with the free Add-on will stay daily and crons added with the +hourly Add-on will stay hourly. -## Removing the Cron add-on +## Removing the Cron Add-on -Removing the add-on itself can be done with: +Removing the Add-on itself can be done with: ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.remove cron.OPTION +$ exoapp APP_NAME/DEP_NAME addon.remove cron.OPTION ~~~ -Please note: Removing the add-on will not automatically remove all Cron jobs. +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 7cb85ae..8dffdc5 100644 --- a/Add-on Documentation/Deployment/Custom Config.md +++ b/Add-on Documentation/Deployment/Custom Config.md @@ -1,17 +1,15 @@ # Custom Config Add-on The Custom Config Add-on allows you to add custom credentials to the standard -creds.json file provided for each of your deployments. This makes it possible for you to keep your code in separate branches, each with their own configuration settings. - -An example for where you may need such a configuration are the Amazon S3 credentials. In this case, you -likely want to use different credentials for production and development. The Custom Config Add-on allows you to do this. +creds.json file provided for each of your deployments. This makes it possible +for you to keep your code in separate branches, each with their own configuration settings. ## Adding Configuration Settings 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 +$ exoapp APP_NAME/DEP_NAME config.add KEY=VALUE ~~~ This will automatically add the Config Add-on to your deployment. @@ -21,7 +19,7 @@ be added to your deployment's cred.json file. 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 [...] +$ exoapp APP_NAME/DEP_NAME config.add KEY1=VALUE1 KEY2=VALUE2 [...] ~~~ Config parameters can be set using the format shown in first column of the following table. They are then stored in JSON format, as shown in the second column. Multiline arguments can be set using the `\n` escape character. @@ -41,14 +39,14 @@ multiline values to make sure they are stored properly. You can list the existing set of configuration settings by invoking the config command: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config +$ exoapp APP_NAME/DEP_NAME config KEY1=VALUE1 KEY2=VALUE2 ~~~ To show the value of a specific key, simply append the desired key name: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME config KEY +$ exoapp APP_NAME/DEP_NAME config KEY VALUE ~~~ @@ -57,20 +55,20 @@ VALUE 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 [...] +$ exoapp APP_NAME/DEP_NAME config.add [-f|--force] NEW_PARAM=NEW_VALUE [...] +$ exoapp APP_NAME/DEP_NAME config.remove PARAM1 PARAM2 [...] ~~~ Updating the existing settings is also possible using the `add` command. This will require your confirmation unless you use the `-f` or `--force` flag after the add command. -## Removing the Config Addon +## Removing the Config Add-on 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 +$ exoapp APP_NAME/DEP_NAME addon.remove config.free ~~~ This will remove all the custom configuration settings. 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/SSL.md b/Add-on Documentation/Deployment/SSL.md deleted file mode 100644 index 28bd4f3..0000000 --- a/Add-on Documentation/Deployment/SSL.md +++ /dev/null @@ -1,224 +0,0 @@ -# SSL Add-on - -Overview: - - * This Add-on provides SSL support for custom domains. - * You need to have an RSA Private Key, an SSL Certificate and a Certificate Chain. - * Add the Add-on to your deployment via our CLI with the [addon.add command](#adding-the-ssl-add-on). - -Secure Socket Layer (SSL) encryption is available for improved security when -transmitting passwords and other sensitive data. - -As part of the provided `.cloudcontrolled.com` subdomain, all deployments have -access to piggyback SSL using a `*.cloudcontrolled.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 - - Please note the **dash** between DEP_NAME and APP_NAME. - -SSL support for custom domains is available through the SSL Add-on. - -## Custom Domain Certificates - -To enable SSL support for custom domains like `www.example.com` or -`secure.example.com`, you need the SSL Add-on. - -Please go through the following steps, which are described in the upcoming -sections, to add SSL support to your deployment: - - * Acquire a signed certificate from your certificate authority of trust. - * Add the SSL Add-on providing the certificate, the private key and the - certificate-chain files. - * Set your DNS entry to point to your SSL DNS Domain. - -Note: Please allow up to one hour for DNS changes to propagate before they take -effect. Root or naked domains like `example.com` without a subdomain are not -supported. - -### Acquiring an SSL Certificate - -There is wide variety of Certificate Authorities (CA) which differ in cost and -process of acquiring an SSL certificate. -[SSLShopper](http://www.sslshopper.com/certificate-authority-reviews.html) -offers an easy way to compare CAs. Some even offer a free trial period. In -most cases, you need to carry out the following steps. - -Note: For testing purposes you can always use a self-signed certificate which -is free of charge and does not require going through the registration process -of individual providers. - -#### Generate a private key - -As mentioned earlier, you need a private key, your certificate and the -certificate chain to enable SSL support. For that process you will need the -`openssl` toolkit which can be installed with one of the following methods -depending on your platform: - -|Platform|Install method| -|:-------|:-------------| -|Mac OS X ([Homebrew](http://brew.sh/))| `brew install openssl`| -|Windows|[Windows package installer](http://gnuwin32.sourceforge.net/packages/openssl.htm)| -|Ubuntu GNU/Linux|`apt-get install openssl`| - - -After you are done with the installation, use the `openssl` command line tool to -proceed with generating your private RSA key: - ~~~ - $ openssl genrsa -des3 -out server.key.org 2048 - # Enter and confirm a passphrase - ~~~ - -#### Removing the passphrase - -The generated key is protected by a passphrase which needs to be removed so -that it can be loaded by the web server. - ~~~ - $ openssl rsa -in server.key.org -out server.key - ~~~ - -Your private key used for the process is now saved in the file `server.key` - -#### Generate a CSR (Certificate Signing Request) - -For acquiring an SSL Certificate, you need to provide your CA with a CSR -(Certificate Signing Request). This can also be used for creating self-signed -certificates. The CSR contains all the information regarding your company or -organization, thus prompting you to enter those: - ~~~ - $ openssl req -new -key server.key -out server.csr - Country Name (2 letter code) [AU]:DE - State or Province Name (full name) [Some-State]: - Locality Name (eg, city) []: - Organization Name (eg, company) [Internet Widgits Pty Ltd]: - Organizational Unit Name (eg, section) []:Information Technology - Common Name (eg, your name or your server's hostname) []:www.example.com - Email Address []: - Please enter the following 'extra' attributes - to be sent with your certificate request - A challenge password []: - An optional company name []: - ~~~ - -The file created after this process is named `server.csr`. - -Note: Please pay attention to the fields Country Name and Common Name. The Country -Name should contain the 2 letter code of your country according to the -[ISO 3166-1](http://www.iso.org/iso/country_codes/iso_3166_code_lists/country_names_and_code_elements.htm) -format. Second and most important is the Common Name. This should reflect the -domain for which you want to issue the certificate. As mentioned earlier, this -cannot be a root domain but needs to have a format like `www.example.com`. - -#### Issuing the Certificate - -After choosing your CA, you have to go through their process of issuing the -certificate. For this you will need the CSR file, which was created in the -previous step. Quite often you will also need define the web server you are -going to use. In this case you should select the Nginx web server, and if this -is not an option then Apache 2.x should also be OK. - -In the end, your CA will provide you with some files including the SSL -certificate and the certificate chain. Your certificate file should have either -a `.crt` or `.pem` extension. Our service requires the certificates to be in -PEM format, so if it isn't, you can transform it with the following command: - ~~~ - $ openssl x509 -inform PEM -in www_example_com.crt -out www_example_com.pem - ~~~ - -The content of the SSL certificate file should look like this: - ~~~ - -----BEGIN CERTIFICATE----- - ... - -----END CERTIFICATE----- - ~~~ - -The certificate chain is a chain of trust which proves that your certificate is -issued by a trustworthy provider authorized by a Root CA. Root CA certificates -are stored in all modern browsers and this is how your browser is able to -verify that a website is secure. In any other case, you will receive a warning -similar to this: - -![Firefox warning](https://s3-eu-west-1.amazonaws.com/cctrl-www-production/custom_assets/attachments/000/000/038/original/ffssl.png) - -You should also have a file which is a bundle of certificates which succeed each other: - ~~~ - -----BEGIN CERTIFICATE----- - ... - -----END CERTIFICATE----- - -----BEGIN CERTIFICATE----- - ... - -----END CERTIFICATE----- - ~~~ - -Note: If you do not have a certificate bundle but a series of `.crt` files, you -have to place them in the right order starting from the intermediate -certificate and ending to the root certificate. Please make sure that they are -in PEM format. - -### Adding the SSL Add-on - -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 - ~~~ - -In order to check the status of the Add-on, you can do the following. - ~~~ - $ cctrlapp APP_NAME/DEP_NAME addon ssl.host - Addon : ssl.host - - Settings - SSLDEV_CERT_EXPIRES : 2016-01-01 10:00:00 - SSLDEV_DNS_DOMAIN : addonssl-depxxxxxxxx-1234567890.eu-west-1.elb.amazonaws.com - SSLDEV_CERT_INCEPTS : 2013-01-01 10:00:00 - ~~~ - -When the SSL certificate is expired, you can update it by removing the Add-on -and re-adding it, providing the updated certificate. The SSL service is provided -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 - ~~~ - -Note: You need to provide the original key and chain again when updating the -Add-on even if those are not changed. - -## HTTPS Redirects - -HTTPS termination is done at the routing tier. Requests are then routed via -HTTP to one of your app's clones. To determine if a request was made via HTTPS -originally, the routing tier sets the `X-FORWARDED-PROTO` header to `https`. -The header is only set for requests that arrived via HTTPS at the routing tier. -This allows you to redirect accordingly. - -### PHP Example - -For PHP you can either redirect via Apache's mod_rewrite using a `.htaccess` -file or directly in your PHP code. - -#### .htaccess -~~~ - - RewriteEngine On - RewriteCond %{HTTP:X-FORWARDED-PROTO} !=https [NC] - RewriteRule ^.*$ https://%{HTTP_HOST} - -~~~ - -#### PHP -~~~php - -~~~ 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/Messaging & Mobile/SendGrid.md b/Add-on Documentation/Messaging & Mobile/SendGrid.md deleted file mode 100644 index e767269..0000000 --- a/Add-on Documentation/Messaging & Mobile/SendGrid.md +++ /dev/null @@ -1,55 +0,0 @@ -# Sendgrid - -Sendgrid's cloud-based email infrastructure relieves businesses of the cost and complexity of maintaining custom email systems. - -## Adding Sendgrid - -The Sendgrid Add-on can be added to every deployment with: - -~~~ -$ cctrlapp 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"). - -## Upgrade Sendgrid - -Upgrading to another version of Sendgrid is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.upgrade sendgrid.OPTION_OLD sendgrid.OPTION_NEW -~~~ - -## Downgrade Sendgrid - -Downgrading to another version of Sendgrid is easily done: - -~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.downgrade sendgrid.OPTION_OLD sendgrid.OPTION_NEW -~~~ - -## Removing Sendgrid - -~~~ -$ cctrlapp 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. - -# 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. - -The JSON file has the following structure: - -~~~ -{ - "SENDGRID": { - "SENDGRID_USERNAME": "SOME_NAME@example.com", - "SENDGRID_PASSWORD": "SOME_SECRET_PASSWORD", - } -} -~~~ - 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 061693b..0000000 --- a/Add-on Documentation/Performance & Monitoring/New Relic.md +++ /dev/null @@ -1,40 +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, cloudControl automatically creates a new user account with your email adress 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. - -## 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. diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index fce79f0..8bb0db7 100644 --- a/Guides/Java/AWS S3.md +++ b/Guides/Java/AWS S3.md @@ -26,10 +26,10 @@ 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://www.exoscale.ch/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] +$ exoapp 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 0fc7851..b2137ea 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 +$ exoapp 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,10 +31,10 @@ 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 +$ exoapp 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 [exoscale 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,12 +56,12 @@ String database = (String)cr.getCredential("MYSQLS_DATABASE", "MYSQLS"); # Examples -cloudControl offers a number of data storage solutions via the [Add-on Marketplace]. +exoscale 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. +credentials for MySQL. ## MySQL -To add a MySQL database, use the [MySQL Dedicated Add-on] or [MySQL Shared Add-on]. +To add a MySQL database, use the [MySQL Shared Add-on]. Here's a Java snippet that reads the database settings from the environment variables: ~~~java @@ -71,36 +71,13 @@ int port = Integer.valueOf(System.getenv("MYSQLS_PORT")); String username = System.getenv("MYSQLS_USERNAME"); String password = System.getenv("MYSQLS_PASSWORD"); ~~~ -The example used the MySQLd Add-on. Variable names for MySQLs differ. Remember, you can always refer to the addon.creds command to see the actual variable names and values. - -You can also find a working example of a [Java application with MySQL] on Github. - -## PostgreSQL - -To add a PostgreSQL database, use the [ElephantSQL Add-on]. - -With this Java snippet you can read the PostgreSQL settings from the environment variables: -~~~java -String elephantsqlUrl = System.getenv("ELEPHANTSQL_URL"); -URI databaseUri = URI.create(elephantsqlUrl); - -String database = databaseUri.getPath().substring(1); -String host = databaseUri.getHost(); -int port = databaseUri.getPort(); -String userInfo = databaseUri.getUserInfo(); - -String[] credentials = userInfo.split(":"); -String username = credentials[0]; -String password = credentials[1]; -~~~ +Remember, you can always refer to the addon.creds command to see the actual variable names and values. [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://www.exoscale.ch/add-ons/?c=1 +[environment variables]: https://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables +[Add-on credentials]: https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials +[cred-env-vars]: https://www.exoscale.ch/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 -[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 +[exoscale credentials helper class]: https://gist.github.com/b350762c61fcc069b427 +[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls diff --git a/Guides/Java/Auto-Detection.md b/Guides/Java/Auto-Detection.md deleted file mode 100644 index e244a05..0000000 --- a/Guides/Java/Auto-Detection.md +++ /dev/null @@ -1,23 +0,0 @@ -# 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. - -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: - -|Technology|Detection| -|:---------|:----------:| -|[Clojure][buildpack-clojure]|`/project.clj` exists| -|[Gradle][buildpack-gradle]|`/build.gradle` exists| -|[Grails][buildpack-grails]|`/grails-app/` exists| -|[Java][buildpack-java]|`/pom.xml` exists| -|[Scala][buildpack-scala]|`/*.sbt`, or `project/*.scala` or `.sbt/*.scala`| -|[Play!][buildpack-play]|`*/conf/application.conf` inside your application (not modules). | - -For more details, check the `detect` script of the corresponding buildpack. - -[buildpack-clojure]: https://github.com/cloudControl/buildpack-clojure -[buildpack-gradle]: https://github.com/cloudControl/buildpack-gradle -[buildpack-grails]: https://github.com/cloudControl/buildpack-grails -[buildpack-java]: https://github.com/cloudControl/buildpack-java -[buildpack-scala]: https://github.com/cloudControl/buildpack-scala -[buildpack-play]: https://github.com/cloudControl/buildpack-play diff --git a/Guides/Java/Clojure - HelloWorld.md b/Guides/Java/Clojure - HelloWorld.md deleted file mode 100644 index 96619dc..0000000 --- a/Guides/Java/Clojure - HelloWorld.md +++ /dev/null @@ -1,81 +0,0 @@ -# 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. - -## The Clojure Application Explained -### Get the App -First, clone the Clojure application from our repository on Github: - -~~~bash -$ git clone https://github.com/cloudControl/clojure-example-app.git -$ 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 -(defproject clojure-sample "1.0.1" - :description "Hello World Clojure Web App" - :dependencies [[org.clojure/clojure "1.4.0"] - [compojure "1.1.1"] - [ring/ring-jetty-adapter "1.1.2"]] - :main ^:skip-aot sample.app) -~~~ - -### Process Type Definition -cloudControl 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: - -~~~ -web: lein run -~~~ - -The `web` process type is required and specifies the command that will be executed when the app is deployed. - -## 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: - -~~~bash -$ cctrlapp 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 - -[...] ------> Receiving push ------> Installing OpenJDK 1.7... ------> Installing Leiningen - Downloading: leiningen-1.7.1-standalone.jar - Downloading: rlwrap-0.3.7 - Writing: lein script ------> Building with Leiningen - Running: lein deps - [...] - Copying 20 files to /srv/tmp/builddir/lib ------> Building image ------> Uploading image (54M) - -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: - -~~~bash -$ 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/ -[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 -[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 deleted file mode 100644 index 80e5294..0000000 --- a/Guides/Java/Gradle - HelloWorld.md +++ /dev/null @@ -1,98 +0,0 @@ -# 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. - -## The Gradle Application Explained -### Get the App -First, clone the Gradle application from our repository on Github: - -~~~bash -$ git clone https://github.com/cloudControl/gradle-example-app.git -$ cd gradle-example-app -~~~ - -Now you have a small, but fully functional Gradle application. - -### Dependency Tracking -The dependency requirements are defined in the `build.gradle` 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: - -~~~ -apply plugin:'java' -apply plugin:'application' - -mainClassName = "HelloWorld" -applicationName = "app" - -repositories { - mavenCentral() -} - -dependencies { - compile 'org.eclipse.jetty:jetty-servlet:7.5.3.v20111011' - compile 'javax.servlet:servlet-api:2.5' -} - -task stage(dependsOn: ['clean', 'installApp']) -~~~ - -### Process Type Definition -cloudControl 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: - -~~~ -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. - -## 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: - -~~~bash -$ cctrlapp 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 -[...] ------> Receiving push ------> Installing OpenJDK 1.6... ------> Installing OpenJDK 1.6(openjdk6.b27.tar.gz)... done ------> Installing gradle-1.0-milestone-5..... done ------> Building Gradle app... - WARNING: The Gradle buildpack is currently in Beta. ------> executing gradle stage - :clean - :compileJava - [...] - :processResources UP-TO-DATE - :classes - :jar - :startScripts - :installApp - :stage - - BUILD SUCCESSFUL ------> Building image ------> Uploading image (39M) - - 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: - -~~~bash -$ 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/ -[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 -[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 deleted file mode 100644 index 6c2c6b4..0000000 --- a/Guides/Java/Grails.md +++ /dev/null @@ -1,108 +0,0 @@ -# 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. - -## The Grails Application Explained -### Get the App -First, clone the Grails application from our repository on Github: - -~~~bash -$ git clone https://github.com/cloudControl/grails-example-app -$ cd grails-example-app -~~~ - -Now you have a small, but fully functional Grails application. - -### Dependency Tracking -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.project.target.level = 1.6 -grails.project.source.level = 1.6 - -grails.project.dependency.resolution = { - inherits("global") { - } - log "error" - checksums true - legacyResolve false - repositories { - inherits true - grailsPlugins() - grailsHome() - grailsCentral() - - mavenLocal() - mavenCentral() - } - dependencies { - // runtime 'mysql:mysql-connector-java:5.1.20' - runtime 'postgresql:postgresql:8.4-702.jdbc3' - } - plugins { - runtime ":hibernate:$grailsVersion" - runtime ":jquery:1.8.3" - runtime ":resources:1.1.6" - build ":tomcat:$grailsVersion" - runtime ":database-migration:1.2.1" - compile ':cache:1.0.1' - } -} -~~~ - -### Process Type Definition -cloudControl 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: - -~~~ -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: - -~~~bash -$ cctrlapp 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 -[...] ------> Receiving push ------> Grails 2.2.0 app detected - WARNING: The Grails buildpack is currently in Beta. ------> Installing OpenJDK 1.6... ------> Installing Grails 2.2.0..... ------> Done ------> Executing grails -Divy.default.ivy.user.dir=/srv/tmp/buildpack-cache compile --non-interactive - [...] ------> Executing grails -plain-output -Divy.default.ivy.user.dir=/srv/tmp/buildpack-cache war --non-interactive - [...] ------> No server directory found. Adding webapp-runner 7.0.40.0 automatically. ------> Building image ------> Uploading image (73M) - -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: - -~~~bash -$ 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/ -[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 -[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..5490949 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 [exoscale]. You can find the [source code on Github](https://github.com/cloudControl/java-jetty-jsp-example-app.git) and check out the [Java buildpack] for supported features. ## The Jetty Application Explained @@ -10,25 +10,45 @@ In this tutorial we're going to show you how to deploy a Jetty application on [c First, clone the hello world app from our repository: ~~~bash -$ git clone https://github.com/cloudControl/java-jetty-example-app.git -$ cd java-jetty-example-app +$ git https://github.com/cloudControl/java-jetty-jsp-example-app.git +$ cd java-jetty-jsp-example-app ~~~ Now you have a small but fully functional Java/Jetty application. ### Dependency Tracking -To create this application we had to provide Jetty server and Servlet library as Maven dependencies in the `pom.xml`. +To create this application we had to provide Spring framework and Log4j as Maven dependencies in the `pom.xml`. ~~~xml - org.eclipse.jetty - jetty-servlet - 7.6.0.v20120127 + org.springframework + spring-core + ${org.springframework.version} - javax.servlet - servlet-api - 2.5 + org.springframework + spring-webmvc + ${org.springframework.version} + + + org.springframework + spring-context + ${org.springframework.version} + + + org.springframework + spring-beans + ${org.springframework.version} + + + log4j + log4j + 1.2.17 + + + org.slf4j + slf4j-log4j13 + 1.0.1 ~~~ @@ -50,29 +70,29 @@ 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. +exoscale 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: ~~~ -web: java -cp target/classes:target/dependency/* com.cloudcontrolled.sample.jetty.App +web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target/java-jetty-jsp-example-app-0.0.1-SNAPSHOT.war ~~~ The `web` process type is required and specifies the command that will be executed when the app is deployed. -The java command starts the 'com.cloudcontrolled.sample.jetty.App' with the classpath set to the compiled Java classes and dependencies. +The java command starts the 'com.exo.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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create java +$ exoapp 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 +$ exoapp APP_NAME/default push -----> Receiving push -----> Installing OpenJDK 1.7(openjdk7.b32.tar.gz)... done @@ -94,22 +114,22 @@ $ cctrlapp APP_NAME/default push -----> Building image -----> Uploading image (39M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@app.exo.io/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 exoapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ exoapp 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.app.exo.io`. [Jetty]: http://jetty.codehaus.org/jetty/ -[cloudControl]: https://www.cloudcontrol.com/ +[exoscale]: https://www.exoscale.ch/ [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 +[exoscale-command-line-client]: https://www.exoscale.ch/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://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index c1f4e32..57a1876 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 [exoscale]. The example app is a ready to deploy project based on the [Spring Roo petclinic] example. ## The Spring Application Explained @@ -62,9 +62,9 @@ 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`. -Then cloudcontrol can pick up all the messages and provide them to you via the [log command]. This is how the file looks now: +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 exoscale 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 @@ -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: +exoscale 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,16 +83,16 @@ 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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create java +$ exoapp APP_NAME create java ~~~ Push your code to the application's repository: ~~~bash -$ cctrlapp APP_NAME/default push +$ exoapp APP_NAME/default push Counting objects: 223, done. Delta compression using up to 4 threads. Compressing objects: 100% (212/212), done. @@ -130,26 +130,26 @@ 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@app.exo.io/repository.git * [new branch] master -> master ~~~ 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 +$ exoapp APP_NAME/default addon.add mysqls.free +$ exoapp 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.app.exo.io` . [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]: / +[exoscale]: http://exoscale.ch [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/Play - HelloWorld.md b/Guides/Java/Play - HelloWorld.md deleted file mode 100644 index c09e064..0000000 --- a/Guides/Java/Play - HelloWorld.md +++ /dev/null @@ -1,87 +0,0 @@ -# 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. - -If you want to deploy a Play! V2 application, see the [Scala Tutorial]. - -## The Play! Application Explained -### Get the App -First, clone the Play! application from our repository on Github: - -~~~bash -$ git clone https://github.com/cloudControl/play-example-app.git -$ cd play-example-app -~~~ - -Now you have a small, but fully functional Play! application. - -### Dependency Tracking -Dependencies in Play! applications are resolved using [Ivy]. The dependency requirements are defined in the `conf/dependencies.yml` 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: - -~~~yaml -require: - - play -~~~ - -### Process Type Definition -cloudControl 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: - -~~~ -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: - -~~~bash -$ cctrlapp 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 -[...] ------> Receiving push ------> Installing OpenJDK 1.6... ------> Installing Play! 1.2.4..... ------> done ------> Installing ivysettings.xml..... done ------> Building Play! application... - ~ _ _ - ~ _ __ | | __ _ _ _| | - ~ | '_ \| |/ _' | || |_| - ~ | __/|_|\____|\__ (_) - ~ |_| |__/ - ~ - ~ play! 1.2.4, http://www.playframework.org - ~ - 1.2.4 - Building Play! application at directory ./ - Precompiling: .play/play precompile ./ --silent 2>&1 ------> Building image ------> Uploading image (65M) - -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: - -~~~bash -$ 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/ -[Play buildpack]: https://github.com/cloudControl/buildpack-play -[Scala tutorial]: Scala -[cloudControl-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/ \ No newline at end of file diff --git a/Guides/Java/Scala - HelloWorld.md b/Guides/Java/Scala - HelloWorld.md deleted file mode 100644 index fcbb469..0000000 --- a/Guides/Java/Scala - HelloWorld.md +++ /dev/null @@ -1,87 +0,0 @@ -# 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. - -## The Scala Application Explained -### Get the App -First, clone the Scala application from our repository on Github: - -~~~bash -$ git clone https://github.com/cloudControl/scalatra-example-app.git -$ cd scalatra-example-app -~~~ - -Now you have a small, but fully functional Scala application. - -### Dependency Tracking -Dependencies in Scala applications are resolved using [sbt]. The dependency requirements are defined in the `build.sbt` 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: - -~~~scala -import com.typesafe.startscript.StartScriptPlugin -seq(StartScriptPlugin.startScriptForClassesSettings: _*) -organization := "org.soichiro" -name := "scalatra" -version := "0.1.0-SNAPSHOT" -scalaVersion := "2.9.1" -seq(webSettings :_*) -libraryDependencies ++= Seq( - "org.scalatra" %% "scalatra" % "2.0.4", - "org.scalatra" %% "scalatra-scalate" % "2.0.4", - "org.scalatra" %% "scalatra-specs2" % "2.0.4" % "test", - "ch.qos.logback" % "logback-classic" % "1.0.0" % "runtime", - "org.eclipse.jetty" % "jetty-webapp" % "7.6.0.v20120127" % "container", - "org.eclipse.jetty" % "jetty-webapp" % "7.6.0.v20120127" % "compile", - "javax.servlet" % "servlet-api" % "2.5" % "provided" -) -resolvers += "Sonatype OSS Snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/" -~~~ - -### Process Type Definition -cloudControl 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: - -~~~ -web: target/start -~~~ - -The `web` process type is required and specifies the command that will be executed when the app is deployed. - -## 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: - -~~~bash -$ cctrlapp 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 -[...] ------> Receiving push ------> Installing OpenJDK 1.6... ------> Building app with sbt ------> Running: sbt clean compile stage - [...] ------> Building image ------> Uploading image (80M) - -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: - -~~~bash -$ cctrlapp APP_NAME/default deploy -~~~ - -Congratulations, you can now see your Scala application running at `http[s]://APP_NAME.cloudcontrolled.com`. - -[cloudControl]: https://www.cloudcontrol.com/ -[Scala buildpack]: https://github.com/cloudControl/buildpack-scala -[sbt]: http://www.scala-sbt.org/ -[cloudControl-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 \ No newline at end of file diff --git a/Guides/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index e913fe8..51ee0c9 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 +exoapp APP_NAME/default config.add AWS_ACCESS_KEY_ID=[YOUR_SECRET_KEY] AWS_SECRET_ACCESS_KEY=[YOUR_ACCESS_KEY] AWS_REGION='eu-west-1' @@ -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://www.exoscale.ch/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 72d9409..2c93a1d 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 +$ exoapp 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 +$ exoapp APP_NAME/DEP_NAME addon.creds ~~~ You can use the following code wherever you want to get the credentials in your Node.js app: @@ -44,10 +44,10 @@ var param3 = creds.ADDON_NAME.ADDON_NAME_PARAMETER3; # Examples -cloudControl 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. +exoscale offers a number of data storage solutions via the [Add-on Marketplace]. Below you can see how to access Add-on credentials for MySQL. ##MySQL -To add a MySQL database, use the [MySQL Dedicated Add-on] or [MySQL Shared Add-on]. +To add a MySQL database, use the [MySQL Shared Add-on]. Here's a Node.js snippet that reads the database settings from the credentials file: @@ -58,41 +58,17 @@ var creds = JSON.parse( fs.readFileSync(process.env.CRED_FILE) ); -var host = creds.MYSQLD.MYSQLD_HOST; -var database = creds.MYSQLD.MYSQLD_DATABASE; -var user = creds.MYSQLD.MYSQLD_USER; -var password = creds.MYSQLD.MYSQLD_PASSWORD; -var port = creds.MYSQLD.MYSQLD_PORT; +var host = creds.MYSQLS.MYSQLS_HOST; +var database = creds.MYSQLS.MYSQLS_DATABASE; +var user = creds.MYSQLS.MYSQLS_USER; +var password = creds.MYSQLS.MYSQLS_PASSWORD; +var port = creds.MYSQLS.MYSQLS_PORT; ~~~ -The example used the MySQLd Add-on. Variable names for MySQLs differ. Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. +Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -##PostgreSQL -To add a PostgreSQL database, use the [ElephantSQL Add-on]. - -This sets the `ELEPHANTSQL_URL` environment variable which can be used in your code as shown below: - -~~~javascript -var fs = require('fs'); -var url = require('url'); - -var creds = JSON.parse( - fs.readFileSync(process.env.CRED_FILE) -); -var elephantSQLUrl = url.parse(creds.ELEPHANTSQL.ELEPHANTSQL_URL); - -var host = elephantSQLUrl.hostname; -var database = elephantSQLUrl.pathname.substr(1); -var auth = elephantSQLUrl.auth.split(':'); -var user = auth[0]; -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://www.exoscale.ch/add-ons +[environment variables]: https://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables +[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls +[Add-on credentials]:https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials diff --git a/Guides/NodeJS/Express.md b/Guides/NodeJS/Express.md deleted file mode 100644 index 1cb13cc..0000000 --- a/Guides/NodeJS/Express.md +++ /dev/null @@ -1,165 +0,0 @@ -# Deploying an Express Application - -This example demonstrates how to build a simple Express app on [cloudControl]. The -app uses [Express], which is a [Node.js] web framework, and MongoDB as the -backend database. - -## The Express Application Explained - -### Get the App -First, clone the Express application from our -Github repository by executing the following commands from your command line: - -~~~bash -$ git clone git@github.com:cloudControl/nodejs-express-mongodb-example-app.git -$ cd nodejs-express-mongodb-example-app -~~~ - -Now you have a small, but fully functional Express application. - -### Dependency Tracking - -The Node.js buildpack tracks dependencies using -[npm]. The dependency requirements are defined in a `package.json` 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: - -~~~json -{ - "name": "ExpressTut", - "version": "0.0.1", - "private": true, - "scripts": { - "start": "node app" - }, - "dependencies": { - "express": "3.4.0", - "jade": "*", - "mongodb": "1.3.19" - } -} -~~~ - -### Process Type Definition - -A [Procfile] is required to start processes on the cloudControl 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: - -~~~ -web: node app.js -~~~ - -Left of the colon, we specified the **required** process type called `web` followed by the command that starts the app. - -### MongoDB Database - -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 -category [Data Storage]. - -This example uses the MongoLab Add-on. In the -`employeeprovider.js` file, you can find how the connection to the database is -established: - -~~~javascript -var Db = require('mongodb').Db, - MongoClient = require('mongodb').MongoClient, - Server = require('mongodb').Server, - ReplSetServers = require('mongodb').ReplSetServers, - ObjectID = require('mongodb').ObjectID, - Binary = require('mongodb').Binary, - GridStore = require('mongodb').GridStore, - Grid = require('mongodb').Grid, - Code = require('mongodb').Code, - BSON = require('mongodb').pure().BSON, - assert = require('assert'); - -EmployeeProvider = function() { - var that = this; - mongodbUri = process.env.MONGOLAB_URI || 'mongodb://localhost'; - MongoClient.connect(mongodbUri, function(err, db){ - if(err) { return console.dir(err); } - that.db = db; - }) -}; -~~~ - -For more information related to getting Add-on credentials in JavaScript, you -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: - -~~~bash -$ cctrlapp 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 -Counting objects: 73, done. -Delta compression using up to 8 threads. -Compressing objects: 100% (35/35), done. -Writing objects: 100% (73/73), 267.28 KiB | 0 bytes/s, done. -Total 73 (delta 30), reused 73 (delta 30) - ------> Receiving push ------> Resolving engine versions - - WARNING: No version of Node.js specified in package.json, - - Using Node.js version: 0.10.15 - Using npm version: 1.3.5 ------> Fetching Node.js binaries ------> Vendoring node into slug ------> Installing dependencies with npm - npm WARN package.json ExpressTut@0.0.1 No repository field. - npm http GET https://registry.npmjs.org/jade - npm http GET https://registry.npmjs.org/mongodb/1.3.19 - npm http GET https://registry.npmjs.org/express/3.4.0 - ... - Dependencies installed ------> Building runtime environment ------> Building image ------> Uploading image (17M) - -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 -latest version of the app: - -~~~bash -$ cctrlapp APP_NAME/default addon.add mongolab.free -$ cctrlapp APP_NAME/default deploy -~~~ - -Congratulations, you can now see your Express app running with MongoDB at -`http[s]://APP_NAME.cloudcontrolled.com`. - - -## Next Steps -Read our [platform documentation] for a technical overview of the concepts you’ll -encounter while writing, configuring, deploying and running your Node.js -applications. - - -[Node.js]: http://nodejs.org/ -[Express]: http://expressjs.com/ -[npm]: https://npmjs.org/ -[cloudControl]: 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 -[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/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index 6be127d..a6bdc76 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -1,7 +1,7 @@ # Deploying a Node.js Application [Node.js] is a platform built on Chrome's JavaScript runtime for building fast and scalable network applications. Its event-driven, non-blocking I/O model 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 features. +This tutorial demonstrates how to build and deploy a simple Hello World Node.js application on [exoscale]. Check out the [Node.js buildpack] for supported features. ## The Node.js App Explained @@ -39,7 +39,7 @@ app looks like this: You should always specify the versions of your dependencies if you want your 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. There must be a file called `Procfile` at the root of your repository. In the example code you already cloned it looks like this: +A [Procfile] is required to start processes on the exoscale 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: ~~~ web: node web.js @@ -49,16 +49,16 @@ Left from the colon, we specified the **required** process type called `web` fol ## 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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create nodejs +$ exoapp 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 +$ exoapp APP_NAME/default push Counting objects: 307, done. Delta compression using up to 8 threads. Compressing objects: 100% (261/261), done. @@ -91,28 +91,23 @@ Total 307 (delta 18), reused 307 (delta 18) -----> Building image -----> Uploading image (4.3M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@app.exo.io/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 exoapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ exoapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Node.js app running at -`http[s]://APP_NAME.cloudcontrolled.com`. +`http[s]://APP_NAME.app.exo.io`. -## 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. - -[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 +[exoscale]: http://www.exoscale.ch [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://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[platform documentation]: https://www.exoscale.ch/dev-center/Platform%20Documentation diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index 2065dd9..c7df0f6 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 [exoscale]. 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. +exoscale 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 exoscale [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,19 +94,19 @@ 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]. For more details, take a look at the [exoscale 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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create nodejs +$ exoapp 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 +$ exoapp APP_NAME/default push Counting objects: 73, done. Delta compression using up to 8 threads. Compressing objects: 100% (35/35), done. @@ -126,31 +126,31 @@ 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@app.exo.io/repository.git * [new branch] master -> master ~~~ Add the [Shared MySQL Add-on]: ~~~bash -$ cctrlapp APP_NAME/default addon.add mysqls.free +$ exoapp APP_NAME/default addon.add mysqls.free ~~~ Finally, deploy the Sails.js application: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ exoapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Sails.js application running at -`http://APP_NAME.cloudcontrolapp.com`. +`http://APP_NAME.app.exo.io`. [Node.js]: http://nodejs.org/ [Sails.js]: http://sailsjs.org/ [Sails getting started page]: http://sailsjs.org/#!getStarted [Ruby on Rails]: http://rubyonrails.org/ [npm]: https://npmjs.org/ -[cloudControl]: 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 +[exoscale]: http://www.exoscale.ch +[Procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[get the MySQL credentials]: https://www.exoscale.ch/dev-center/Guides/NodeJS/Add-on%20credentials [websockets]: http://socket.io/ -[cloudControl 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 +[exoscale websockets documentation]: https://www.exoscale.ch/dev-center/Platform%20Documentation#websockets +[Shared MySQL Add-on]: https://www.exoscale.ch/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..742959a 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 +$ exoapp APP_NAME/DEP_NAME addon.creds ~~~ You can use the following code wherever you want to get the credentials in your @@ -35,12 +35,12 @@ $var3_name = $creds['ADDON_NAME']['ADDON_NAME_PARAMETER3']; # Examples -cloudControl 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. +exoscale offers a number of data storage solutions via the [Add-on Marketplace]. +Below you can see how to access Add-on credentials for MySQL. ## MySQL -To add a MySQL database, use the [MySQL Dedicated Add-on] or [MySQL Shared Add-on]. +To add a MySQL database, use the [MySQL Shared Add-on]. Here's a PHP snippet that reads the database settings from the credentials file: ~~~php @@ -56,33 +56,9 @@ $username = $creds['MYSQLS']['MYSQLS_USERNAME']; $password = $creds['MYSQLS']['MYSQLS_PASSWORD']; ~~~ -The example used the MySQLs Add-on. Variable names for MySQLd differ. Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. +Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -## PostgreSQL - -To add a PostgreSQL database, use the [ElephantSQL Add-on]. - -With this PHP snippet you can read the PostgreSQL settings and store them in -the `$db_config` array: -~~~php -$creds_string = file_get_contents($_ENV['CRED_FILE'], false); -if ($creds_string == false) { - die('FATAL: Could not read credentials file'); -} -$creds = json_decode($creds_string, true); -$elephant_uri = parse_url($creds['ELEPHANTSQL']['ELEPHANTSQL_URL']); -$db_config = array( - "database" => substr($elephant_uri["path"], 1), - "host" => $elephant_uri["host"], - "port" => $elephant_uri["port"], - "username" => $elephant_uri["user"], - "password" => $elephant_uri["pass"] -); -~~~ - -[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://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables +[Add-on credentials]: https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials +[Add-on Marketplace]: https://www.exoscale.ch/add-ons/ +[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls diff --git a/Guides/PHP/CakePHP 2.2.1.md b/Guides/PHP/CakePHP 2.2.1.md index c237f33..12c470e 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 exoscale platform](http://www.exoscale.ch). ##Prerequisites @@ -29,14 +29,14 @@ 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 exoscale 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 exoscale. 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. @@ -46,7 +46,7 @@ Thankfully, CakePHP is written in a very straight-forward and configurable manne 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 exoscale, 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 @@ -74,23 +74,22 @@ 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. -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. +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale 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 + exoapp APP_NAME create php // deploy the default branch - cctrlapp cloudcontrolledcakephp/default push - cctrlapp cloudcontrolledcakephp/default deploy - + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy + // deploy the testing branch - cctrlapp cloudcontrolledcakephp/testing push - cctrlapp cloudcontrolledcakephp/testing deploy + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy ##4. Initialise the Required Add-ons @@ -101,16 +100,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 + exoapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontrolledcakephp/default addon mysql.free + exoapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontrolledcakephp/testing addon.add mysql.free + exoapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontrolledcakephp/testing addon mysql.free + exoapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: @@ -128,10 +127,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 + exoapp APP_NAME/default config.add CAKE_ENV=production // Set the testing environment setting - cctrlapp cloudcontrolledcakephp/testing config.add CAKE_ENV=testing + exoapp APP_NAME/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. @@ -149,7 +148,7 @@ We then create a new class, **BASE_CONFIG**, that the database config, will late 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 exoscale 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. @@ -176,7 +175,7 @@ We then look in there for a value called **CAKE_ENV**, which determines the acti return $environment; } -Now that we're able to know the environment that we're operating in, we setup the database configuration appropriately. If we're in development, then we use the development configuration in ``app/Config/database.php``. If we're not, then we retrieve the options from the ``CRED_FILE`` that is available to all cloudControl environments. +Now that we're able to know the environment that we're operating in, we setup the database configuration appropriately. If we're in development, then we use the development configuration in ``app/Config/database.php``. If we're not, then we retrieve the options from the ``CRED_FILE`` that is available to all exoscale environments. 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. It's really handy as we don't need to do too much to make use of the options. @@ -235,7 +234,7 @@ An example is provided below: 'host' => 'localhost', 'login' => 'cc_dev', 'password' => 'cc _dev', - 'database' => 'cloudcontrol_cakephp', + 'database' => 'exoscale_cakephp', 'prefix' => '', 'encoding' => 'utf8', ); @@ -244,7 +243,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 exoscale 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: @@ -356,7 +355,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_exoscale_init.sql``, ready to be used to initialise the database next. CREATE TABLE `cake_sessions` ( `id` varchar(255) NOT NULL DEFAULT '', @@ -393,7 +392,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_exoscale_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,31 +410,25 @@ 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 + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy git checkout testing git merge master // deploy the testing branch - cctrlapp cloudcontrolledcakephp/testing push - cctrlapp cloudcontrolledcakephp/testing deploy + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy ##7. Review the Deployment 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/cake-deployed-successfully.png) - ###7.1 Deployment Problems -If you see output similar to figure 3, then double check your database configuration settings and run through commit and deploy again. - -![Misconfigured Database](images/misconfigured-database.png) +If you see any errors, then double check your database configuration settings and run through commit and deploy again. -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 exoscale Github repository. If you have any issues, feel free to email [support@exoscale.ch](mailto:support@exoscale.ch). ##Links diff --git a/Guides/PHP/Drupal 7.md b/Guides/PHP/Drupal 7.md index 62f28d7..4d74d38 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 exoscale platform](http://www.exoscale.ch). ##Prerequisites @@ -64,22 +64,21 @@ That will show output similar to below: master * 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: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale 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 - cctrlapp cloudcontroldldrupal create php + exoapp APP_NAME create php // deploy the default branch - cctrlapp cloudcontroldldrupal/default push - cctrlapp cloudcontroldldrupal/default deploy + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy // deploy the testing branch - cctrlapp cloudcontroldldrupal/testing push - cctrlapp cloudcontroldldrupal/testing deploy + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy ##4. Initialise the Required Addons @@ -90,16 +89,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 + exoapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldldrupal/default addon mysql.free + exoapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldldrupal/testing addon.add mysql.free + exoapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldldrupal/testing addon mysql.free + exoapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: @@ -117,10 +116,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 + exoapp APP_NAME/default config.add APPLICATION_ENV=production // Set the testing environment setting - cctrlapp cloudcontroldldrupal/testing config.add APPLICATION_ENV=testing + exoapp APP_NAME/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. @@ -156,7 +155,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 exoscale 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,. @@ -232,13 +231,13 @@ 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_exoscale_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_exoscale_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: @@ -281,23 +280,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 cloudcontroldlDrupal 7/default push - cctrlapp cloudcontroldlDrupal 7/default deploy + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy git checkout testing git merge master // deploy the testing branch - cctrlapp cloudcontroldlDrupal 7/testing push - cctrlapp cloudcontroldlDrupal 7/testing deploy + exoapp APP_NAME/testing push + exoapp APP_NAME/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. -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@exoscale.ch](mailto:support@exoscale.ch). diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 3e1c4cc..9739a43 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 exoscale [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 +[exoscale]. You can find the [source code on Github][example-app] and check out the [php buildpack] for supported features. @@ -67,14 +67,14 @@ 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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create php +$ exoapp APP_NAME create php ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~ -$ cctrlapp APP_NAME/default push +$ exoapp APP_NAME/default push Counting objects: 29, done. Delta compression using up to 4 threads. Compressing objects: 100% (21/21), done. @@ -99,24 +99,24 @@ 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@app.exo.io/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 exoapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ exoapp 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.app.exo.io`. [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" +[exoscale]: http://www.exoscale.ch +[exoscale-doc-user]: https://www.exoscale.ch/dev-center/Platform%20Documentation#user-accounts +[exoscale-doc-cmdline]: https://www.exoscale.ch/dev-center/Platform%20Documentation#command-line-client-web-console-and-api "documentation of the exoscale-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://www.exoscale.ch/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 0bd7a5c..323d15e 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 exoscale ![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 exoscale platform](http://www.exoscale.ch). ##Prerequisites @@ -32,7 +32,7 @@ Once you have a copy of the Joomla source available locally, setup a VHost (or e ##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 exoscale deployment. These changes are as follows: * Store sessions in the database * Store Cache Information in APC @@ -59,7 +59,7 @@ 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 exoscale 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. @@ -153,22 +153,21 @@ 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. -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: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale 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 cloudcontroldljoomla create php + exoapp APP_NAME create php // deploy the default branch - cctrlapp cloudcontroldljoomla/default push - cctrlapp cloudcontroldljoomla/default deploy + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy // deploy the testing branch - cctrlapp cloudcontroldljoomla/testing push - cctrlapp cloudcontroldljoomla/testing deploy + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy ##4. Initialise the Required Add-ons @@ -179,16 +178,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 + exoapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldljoomla/default addon mysql.free + exoapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldljoomla/testing addon.add mysql.free + exoapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldljoomla/testing addon mysql.free + exoapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: @@ -206,10 +205,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 + exoapp APP_NAME/default config.add APPLICATION_ENV=production // Set the testing environment settings - cctrlapp cloudcontroldljoomla/testing config.add APPLICATION_ENV=testing + exoapp APP_NAME/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 +221,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_exoscale_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_exoscale_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,22 +242,19 @@ 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 + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy git checkout testing git merge master // deploy the testing branch - cctrlapp cloudcontroldljoomla/testing push - cctrlapp cloudcontroldljoomla/testing deploy + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy ##7. Review the Deployment 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) ###7.1 Deployment Problems @@ -268,11 +264,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - cctrlapp cloudcontroldljoomla/default log deploy + exoapp APP_NAME/default log deploy ####7.1.1 Errors - cctrlapp cloudcontroldljoomla/default log error + exoapp APP_NAME/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 b3ae78c..2008c63 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 exoscale platform](http://www.exoscale.ch). 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,71 @@ 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 exoscale 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 exoscale, 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: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale 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 - + exoapp APP_NAME create php + // deploy the default branch - cctrlapp cloudcontroldlkohana/default push - cctrlapp cloudcontroldlkohana/default deploy - + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy + // deploy the testing branch - cctrlapp cloudcontroldlkohana/testing push - cctrlapp cloudcontroldlkohana/testing deploy - + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy + ###3.1 Kohana Auto-Detected When you do this, you'll see output similar to the following: - - $ cctrlapp cloudcontroldlkohana/default push + + $ exoapp APP_NAME/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,8 +108,8 @@ 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 + + To ssh://APP_NAME@app.exo.io/repository.git f98a87c..a685cd6 master -> master Note the following lines: @@ -118,53 +117,52 @@ 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 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 + exoapp APP_NAME/default addon.add mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldlkohana/testing addon.add mysqls.free + exoapp APP_NAME/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 + exoapp APP_NAME/default config.add APPLICATION_ENV=production // Add the APPLICATION_ENV variable to testing - cctrlapp cloudcontroldlkohana/testing config.add APPLICATION_ENV=testing + exoapp APP_NAME/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 + exoapp APP_NAME/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 @@ -174,43 +172,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 exoscale 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. @@ -244,14 +242,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 @@ -310,7 +308,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' => 'exoscale_kohana', ), 'table_prefix' => '', 'charset' => 'utf8', @@ -326,7 +324,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( @@ -365,20 +363,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 */; @@ -390,39 +388,39 @@ 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``. +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_exoscale_init.sql``. Now, in the shell, we're going to load the schema in to the remote mysql instance that we created earlier with the mysqls add-on. To do so, run the following command, changing the respective options with your configuration settings: 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_exoscale_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. - + mysql> show tables; +-----------------------+ | Tables_in_dep5jrx8a9a | @@ -430,83 +428,83 @@ 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 + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy // push the code to the testing branch - cctrlapp cloudcontroldlkohana/testing push - cctrlapp cloudcontroldlkohana/testing deploy - + exoapp APP_NAME/testing push + exoapp APP_NAME/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. @@ -520,11 +518,11 @@ Now create a file called ``site.php`` under ``application/views/``. In it, add t -

Welcome to Kohana on cloudControl

+

Welcome to Kohana on exoscale

@@ -535,18 +533,16 @@ 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) - +In this view file, we output some simple HTML and then iterate the value of the users that we retrieved in the controller before. Point your browser to `APP_NAME.app.exo.io/hello.php` to see the result. + ##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 exoscale. If you have any issues, feel free to email [support@exoscale.ch](mailto:support@exoscale.ch). diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index b5f6419..08b9881 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 exoscale ![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 exoscale platform](http://www.exoscale.ch). ##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 exoscale 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,63 +53,62 @@ 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: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale 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 - + exoapp APP_NAME create php + // deploy the default branch - cctrlapp cloudcontroldlsymfony/default push - cctrlapp cloudcontroldlsymfony/default deploy - + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy + // deploy the testing branch - cctrlapp cloudcontroldlsymfony/testing push - cctrlapp cloudcontroldlsymfony/testing deploy + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy ###3.1 Symfony Auto-Detected When you do this, you'll see output similar to the following: - $ cctrlapp cloudcontroldlsymfony/default push + $ exoapp APP_NAME/default push Counting objects: 15, done. Delta compression using up to 2 threads. 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 + + To ssh://APP_NAME@app.exo.io/repository.git d90506c..4078c78 master -> master Note the following lines: @@ -117,37 +116,36 @@ 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 exoscale 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 -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. +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 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 - + exoapp APP_NAME/default addon.add mysqls.free + // Retrieve the settings - cctrlapp cloudcontroldlsymfony/default addon mysql.free + exoapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldlsymfony/testing addon.add mysql.free - + exoapp APP_NAME/testing addon.add mysqls.free + // Retrieve the settings - cctrlapp cloudcontroldlsymfony/testing addon mysql.free + exoapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: Addon : mysqls.free - + Settings MYSQLS_DATABASE : MYSQLS_PASSWORD : @@ -160,12 +158,12 @@ 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 + exoapp APP_NAME/default config.add APPLICATION_ENV=production - // Set the testing environment setting - cctrlapp cloudcontroldlsymfony/testing config.add APPLICATION_ENV=testing + // Set the testing environment setting + exoapp APP_NAME/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 @@ -187,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 @@ -195,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_domain: cloudcontroldlsymfony.cloudcontrolled.com + session_name: symfony1_exoscale + session_cookie_path: / + session_cookie_domain: APP_NAME.app.exo.io 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 @@ -221,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 @@ -235,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 exoscale 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. @@ -269,22 +267,22 @@ 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 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=exoscale_symfony1' username: cc_dev password: cc_dev encoding: utf8 persistent: true pooling: true - + test: propel: class: sfPropelDatabase @@ -297,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 @@ -310,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``. @@ -321,25 +319,22 @@ 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 - + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy + git checkout testing git merge master - + // deploy the testing branch - cctrlapp cloudcontroldlsymfony/testing push - cctrlapp cloudcontroldlsymfony/testing deploy + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy ##7. Review the Deployment -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) +With that completed, then have a look at both your deployments to ensure that they're working. -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@exoscale.ch](mailto:support@exoscale.ch). ##Links diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index 78effaa..6a39ac7 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 exoscale ![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 * Loads 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 exoscale platform](http://www.exoscale.ch). ##Prerequisites @@ -19,85 +19,84 @@ 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 exoscale. ##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 exoscale 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 exoscale, 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: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale 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 cloudcontroldlyii create php + exoapp APP_NAME create php // deploy the default branch - cctrlapp cloudcontroldlyii/default push - cctrlapp cloudcontroldlyii/default deploy --stack luigi + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy // deploy the testing branch - cctrlapp cloudcontroldlyii/testing push - cctrlapp cloudcontroldlyii/testing deploy --stack luigi + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy You should see output as below: - $ cctrlapp cloudcontroldlyii/default push + $ exoapp APP_NAME/default push Counting objects: 2257, done. Delta compression using up to 2 threads. Compressing objects: 100% (2131/2131), done. @@ -112,28 +111,28 @@ You should see output as below: >> Building image >> Uploading image (4.1M) - To ssh://cloudcontroldlyii@cloudcontrolled.com/repository.git + To ssh://APP_NAME@app.exo.io/repository.git * [new branch] master -> master ##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 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 + exoapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldlyii/default addon mysqls.free + exoapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldlyii/testing addon.add mysqls.free + exoapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - cctrlapp cloudcontroldlyii/testing addon mysqls.free + exoapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: @@ -151,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 + exoapp APP_NAME/default config.add APPLICATION_ENV=main // Set the testing environment setting - cctrlapp cloudcontroldlyii/testing config.add APPLICATION_ENV=testing + exoapp APP_NAME/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. @@ -162,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, @@ -194,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( @@ -214,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', ), @@ -232,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_exoscale_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 */; @@ -276,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 */; @@ -297,17 +296,17 @@ 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_exoscale_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 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: @@ -315,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 deploy --stack luigi - + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy + git checkout testing git merge master - + // deploy the testing branch - cctrlapp cloudcontroldlyii/testing push - cctrlapp cloudcontroldlyii/testing deploy --stack luigi + exoapp APP_NAME/testing push + exoapp APP_NAME/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) @@ -340,22 +339,22 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - cctrlapp cloudcontroldlyii/default log deploy + exoapp APP_NAME/default log deploy ####7.1.1 Errors - cctrlapp cloudcontroldlyii/default log error + exoapp APP_NAME/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 exoscale Github repository. If you have any issues, feel free to email [support@exoscale.ch](mailto:support@exoscale.ch). ##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..c1a1505 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 [exoscale]. 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 exoscale 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 exoscale. Additionally the filesystem on exoscale 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,16 +143,16 @@ 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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create php +$ exoapp 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 +$ exoapp APP_NAME/default push Counting objects: 2208, done. Delta compression using up to 4 threads. Compressing objects: 100% (771/771), done. @@ -174,37 +174,37 @@ 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@app.exo.io/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 exoapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ exoapp APP_NAME/default deploy ~~~ ## Add the Required MySQL Database Add-on and Initialize the Session Table 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://www.exoscale.ch/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: ~~~bash # add the Add-on -$ cctrlapp APP_NAME/default addon.add mysqls.free +$ exoapp APP_NAME/default addon.add mysqls.free # initialize the session table -$ cctrlapp APP_NAME/default run "php code/public/index.php init-session-table" +$ exoapp 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.app.exo.io 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.app.exo.io`. [PHP buildpack]: https://github.com/cloudControl/buildpack-php -[cloudControl]: https://www.cloudcontrol.com/ +[exoscale]: https://www.exoscale.ch/ [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 dafec51..6049abd 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 exoscale ![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 exoscale platform](http://www.exoscale.ch). ##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 exoscale 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,91 +55,88 @@ 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 exoscale, we need to do this in a slightly different way. It involves, for each environment, setting an environment variable with the exoapp 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: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale 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 - + exoapp APP_NAME create php + // deploy the default branch - cctrlapp cloudcontroldlzf/default push - cctrlapp cloudcontroldlzf/default deploy --stack luigi - + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy + // deploy the testing branch - cctrlapp cloudcontroldlzf/testing push - cctrlapp cloudcontroldlzf/testing deploy --stack luigi + exoapp APP_NAME/testing push + exoapp APP_NAME/testing deploy You'll see output similar to the following: - $ cctrlapp cloudcontroldlzf/testing push + $ exoapp APP_NAME/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 -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. + To ssh://APP_NAME@app.exo.io/repository.git + dde253a..7b040e2 testing -> testing ##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 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 - + exoapp APP_NAME/default addon.add mysqls.free + // Retrieve the settings - cctrlapp cloudcontroldlzf/default addon mysqls.free + exoapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - cctrlapp cloudcontroldlzf/testing addon.add mysqls.free - + exoapp APP_NAME/testing addon.add mysqls.free + // Retrieve the settings - cctrlapp cloudcontroldlzf/testing addon mysqls.free + exoapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: Addon : mysqls.free - + Settings MYSQLS_DATABASE : MYSQLS_PASSWORD : @@ -152,38 +149,38 @@ 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 + exoapp APP_NAME/default config.add APPLICATION_ENV=production // Set the testing environment setting - cctrlapp cloudcontroldlzf/testing config.add APPLICATION_ENV=testing + exoapp APP_NAME/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 +192,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 +203,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 exoscale 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 +240,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 +251,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 +262,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 +299,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 +312,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 +337,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 +347,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 +363,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 +394,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_exoscale_init.sql``, ready to be used to initialise the database next. -- table structure CREATE TABLE `session` ( @@ -415,20 +412,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'); @@ -436,17 +433,17 @@ 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_exoscale_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 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 +451,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 deploy --stack luigi - + exoapp APP_NAME/default push + exoapp APP_NAME/default deploy + git checkout testing git merge master - + // deploy the testing branch - cctrlapp cloudcontroldlzf/testing push - cctrlapp cloudcontroldlzf/testing deploy --stack luigi + exoapp APP_NAME/testing push + exoapp APP_NAME/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. @@ -480,15 +477,15 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - cctrlapp cloudcontroldlzf/default log deploy + exoapp APP_NAME/default log deploy ####7.1.1 Errors - cctrlapp cloudcontroldlzf/default log error + exoapp APP_NAME/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/PHP/drupal_cloudcontrol_init.sql b/Guides/PHP/drupal_exoscale_init.sql similarity index 99% rename from Guides/PHP/drupal_cloudcontrol_init.sql rename to Guides/PHP/drupal_exoscale_init.sql index 27102a2..9388758 100644 --- a/Guides/PHP/drupal_cloudcontrol_init.sql +++ b/Guides/PHP/drupal_exoscale_init.sql @@ -1,6 +1,6 @@ -- MySQL dump 10.13 Distrib 5.1.62, for debian-linux-gnu (x86_64) -- --- Host: localhost Database: cloudcontrol_drupal +-- Host: localhost Database: exoscale_drupal -- ------------------------------------------------------ -- Server version 5.1.62-0ubuntu0.11.10.1-log diff --git a/Guides/Python/AWS S3.md b/Guides/Python/AWS S3.md index d56846b..23073c3 100644 --- a/Guides/Python/AWS S3.md +++ b/Guides/Python/AWS S3.md @@ -21,10 +21,10 @@ 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://www.exoscale.ch/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] +$ exoapp 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 3d0e0c8..066ccad 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 +$ exoapp 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 +$ exoapp APP_NAME/DEP_NAME config.add SET_ENV_VARS ~~~ You can look up the individual environment variable names in the respective @@ -55,13 +55,12 @@ available in your deployment containers. # Examples -cloudControl 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. +exoscale offers a number of data storage solutions via the [Add-on Marketplace]. +Below you can see how to access Add-on credentials for MySQL. ## MySQL -To add a MySQL database, use the [MySQL Dedicated Add-on] or [MySQL Shared Add-on]. +To add a MySQL database, use the [MySQL Shared Add-on]. Here's a Python snippet that reads the database settings from the credentials file and stores them in the `db_config` dictionary: @@ -73,45 +72,19 @@ cred_file = open(os.environ['CRED_FILE']) creds = json.load(cred_file) db_config = { - 'database': creds['MYSQLD']['MYSQLD_DATABASE'], - 'host': creds['MYSQLD']['MYSQLD_HOST'], - 'port': creds['MYSQLD']['MYSQLD_PORT'], - 'username': creds['MYSQLD']['MYSQLD_USER'], - 'password': creds['MYSQLD']['MYSQLD_PASSWORD'] + 'database': creds['MYSQLS']['MYSQLS_DATABASE'], + 'host': creds['MYSQLS']['MYSQLS_HOST'], + 'port': creds['MYSQLS']['MYSQLS_PORT'], + 'username': creds['MYSQLS']['MYSQLS_USER'], + 'password': creds['MYSQLS']['MYSQLS_PASSWORD'] } ~~~ -The example used the MySQLd Add-on. Variable names for MySQLs differ. Remember, -you can always refer to the `addon.creds` command to see the actual variable +Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -## PostgreSQL - -To add a PostgreSQL database, use the [ElephantSQL Add-on]. - -With this Python snippet you can read the PostgreSQL settings and store them in -the `db_config` dictionary: -~~~python -import os -import json - -cred_file = open(os.environ['CRED_FILE']) -creds = json.load(cred_file) -elephant_uri = urlparse(creds['ELEPHANTSQL']['ELEPHANTSQL_URL']) - -db_config = { - 'database': elephant_uri.path[1:], - 'host': elephant_uri.hostname, - 'port': elephant_uri.port, - 'username': elephant_uri.username, - 'password': elephant_uri.password -} -~~~ - -[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://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables +[Add-on credentials]: https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials +[Add-on Marketplace]: https://www.exoscale.ch/add-ons/ +[Custom Config Add-on]: https://www.exoscale.ch/add-ons/config +[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls diff --git a/Guides/Python/Celery.md b/Guides/Python/Celery.md deleted file mode 100644 index 687de82..0000000 --- a/Guides/Python/Celery.md +++ /dev/null @@ -1,219 +0,0 @@ -# Deploying Celery on cloudControl -[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]. - -## 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. - -~~~bash -$ git clone git://github.com/cloudControl/python-celery-example-app.git -$ cd python-celery-example-app -~~~ - -The code from the example repository is ready to be deployed. Lets still go through the different files and their purpose real quick. - -### Dependency Tracking -The [Python buildpack] tracks dependencies via pip and the `requirements.txt` file. It needs to be placed in the root directory of your repository. Our example app requires both `celery` itself aswell as `flower` Celery's monitoring web app. The `requirements.txt` you cloned as part of the example app looks like this: - -~~~pip -celery==3.0.15 -flower==0.4.2 -~~~ - -### Process Type Definition -cloudControl 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: - -~~~ -web: celery flower --port=$PORT --broker=$CLOUDAMQP_URL --auth=$FLOWER_AUTH_EMAIL -worker: celery -A tasks worker --loglevel=info -~~~ - -We have specified two process types here. One called `web` to start the web interface and additionally one called `worker` used to start the actual Celery worker. - -### The Celery Task - -The task is copied from the official Celery tutorial and simply returns the sum of two numbers. It was adjusted to read the Add-on credentials from the runtime environment. - -~~~python -import json -from os import getenv - -from celery import Celery - -# read credentials from runtime environment -amqp_url = getenv('CLOUDAMQP_URL') - -celery = Celery('tasks', broker=amqp_url) - - -@celery.task -def add(x, y): - return 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: - -~~~bash -$ cctrlapp 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 -~~~ - -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 -~~~ - -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. - -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 -# seperate multiple emails by comma -~~~ - -This is it. The example code will now find all necessary credentials to connect to the AMQP service automatically in the runtime environment. - -## Pushing and Deploying the App -Now lets push your code to the application's repository, which triggers the deployment image build process. Your output will look similiar to the following, although we have shortened it for the sake of readability in this guide. - -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 -Counting objects: 6, done. -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 - New python executable in .heroku/venv/bin/python2.7 - Also creating executable in .heroku/venv/bin/python - Installing distribute..................................................................................................................................................................................................done. - Installing pip................done. - 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 -~~~ - -Last but not least deploy the latest version of the app with the cctrlapp deploy command. - -~~~bash -$ 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. - -### Adding Workers - -~~~bash -$ cctrlapp APP_NAME/default worker.add worker -# you can always list running workers like this -$ 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 -------------- celery@HOSTNAME v3.0.15 (Chiastic Slide) -[TIMESTAMP] WRK_ID ---- **** ----- -[TIMESTAMP] WRK_ID --- * *** * -- [Configuration] -[TIMESTAMP] WRK_ID -- * - **** --- . broker: amqp://CLOUDAMQP_URL -[TIMESTAMP] WRK_ID - ** ---------- . app: tasks:0x1357890 -[TIMESTAMP] WRK_ID - ** ---------- . concurrency: 2 (processes) -[TIMESTAMP] WRK_ID - ** ---------- . events: OFF (enable -E to monitor this worker) -[TIMESTAMP] WRK_ID - ** ---------- -[TIMESTAMP] WRK_ID - *** --- * --- [Queues] -[TIMESTAMP] WRK_ID -- ******* ---- . celery: exchange:celery(direct) binding:celery -[TIMESTAMP] WRK_ID --- ***** ----- -[TIMESTAMP] WRK_ID -[TIMESTAMP] WRK_ID [Tasks] -[TIMESTAMP] WRK_ID . tasks.add -[TIMESTAMP] WRK_ID [TIMESTAMP: WARNING/MainProcess] celery@HOSTNAME ready. -[TIMESTAMP] WRK_ID [TIMESTAMP: INFO/MainProcess] consumer: Connected to amqp://CLOUDAMQP_URL -[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. - -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.) - -~~~bash -# call worker.add to start additional workers one at a time -$ cctrlapp APP_NAME/default worker.add worker -~~~ - -### Removing Workers - -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 -~~~ - -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 -[...] -[TIMESTAMP] WRK_ID [TIMESTAMP: WARNING/MainProcess] Got shutdown from remote -[TIMESTAMP] WRK_ID Container stopped -[TIMESTAMP] WRK_ID Stopping worker by itself -[TIMESTAMP] WRK_ID Worker removed by itself -~~~ - -## 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. - -~~~bash -$ cctrlapp APP_NAME/default run bash -Connecting... -USER@HOSTNAME:~/www$ celery --broker=$CLOUDAMQP_URL status --> WORKER_HOSTNAME: OK - -1 node online. -USER@HOSTNAME:~/www$ exit -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. - -[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 -[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..3b51884 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 [exoscale]. ## 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. +exoscale 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: ~~~ @@ -16,21 +16,18 @@ 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" +exoapp APP_NAME/DEP_NAME run "python manage.py syncdb" ~~~ ## Databases -To use a database, you should choose an Add-on from [the Data Storage category][data-storage-addons]. To get the credentials of your database, refer to the [Add-on credentials][add-on-credentials] article. +To use a database, have a look at the [Shared MySQL Add-on][Shared MySQL Add-on]. To get the credentials of your database, refer to the [Add-on credentials][add-on-credentials] article. -## 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://www.exoscale.ch/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 -[cloudControl]: https://www.cloudcontrol.com/ -[worker]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers +[procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[messaging-addons]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Messaging%20&%20Mobile/ +[Shared MySQL Add-on]: ../../Add-on%20Documentation/Data%20Storage/MySQLs +[add-on-credentials]: https://www.exoscale.ch/dev-center/Guides/Python/Add-on%20credentials +[exoscale]: https://www.exoscale.ch/ +[worker]: https://www.exoscale.ch/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index 873df06..b31bf4d 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -1,6 +1,6 @@ # 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 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. +In this tutorial we're going to show you how to deploy a Django application on [exoscale]. 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. ## The Django Application Explained @@ -37,7 +37,7 @@ INSTALLED_APPS = ( ### Process Type Definition -cloudControl 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: +exoscale 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: ~~~ web: python manage.py run_gunicorn -b 0.0.0.0:$PORT @@ -47,7 +47,7 @@ Left from the colon we specified the **required** process type called `web` foll ### Production Database -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 [not persistent][filesystem]. To use a database, you should choose an Add-on from [the Data Storage category][data-storage-addons]. +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 exoscale 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]. In this tutorial we use the [Shared MySQL Add-on][mysqls]. Have a look at `mysite/settings.py` so you can find out how to [get the MySQL credentials][get-conf] provided by MySQLs Add-on: @@ -87,16 +87,16 @@ 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: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform: ~~~bash -$ cctrlapp APP_NAME create python +$ exoapp 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 +$ exoapp APP_NAME/default push Counting objects: 31, done. Delta compression using up to 8 threads. Compressing objects: 100% (25/25), done. @@ -115,44 +115,44 @@ Total 31 (delta 3), reused 24 (delta 0) -----> Building image -----> Uploading image (30M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git +To ssh://APP_NAME@app.exo.io/repository.git * [new branch] master -> master ~~~ 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 +$ exoapp APP_NAME/default addon.add mysqls.free +$ exoapp APP_NAME/default deploy ~~~ Finally, prepare the database using the [Run command][ssh-session] (when prompted create admin user): ~~~bash -$ cctrlapp APP_NAME/default run "python manage.py syncdb" +$ exoapp APP_NAME/default 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.app.exo.io/admin`, create some polls and see them at `APP_NAME.app.exo.io/polls`. 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 -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[exoscale]: http://www.exoscale.ch +[exoscale-doc-user]: https://www.exoscale.ch/dev-center/Platform%20Documentation#user-accounts +[exoscale-doc-cmdline]: https://www.exoscale.ch/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[Procfile]: https://www.exoscale.ch/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://www.exoscale.ch/dev-center/Platform%20Documentation#non-persistent-filesystem +[data-storage-addons]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Storage/ +[mysqls]: https://www.exoscale.ch/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://www.exoscale.ch/dev-center/Guides/Python/Django%20notes +[get-conf]: https://www.exoscale.ch/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://www.exoscale.ch/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://www.exoscale.ch/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://www.exoscale.ch/dev-center/Platform%20Documentation#secure-shell-ssh [mysql-driver]: https://pypi.python.org/pypi/MySQL-python/1.2.4 diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index 14b598f..b9649f8 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 [exoscale]. 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. +exoscale 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,16 +37,16 @@ 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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create python +$ exoapp 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 +$ exoapp APP_NAME/default push Counting objects: 16, done. Delta compression using up to 4 threads. Compressing objects: 100% (10/10), done. @@ -66,21 +66,21 @@ 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@app.exo.io/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 exoapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ exoapp 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.app.exo.io`. [Flask]: http://flask.pocoo.org/ -[cloudControl]: http://www.cloudcontrol.com +[exoscale]: http://www.exoscale.ch [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://www.exoscale.ch/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..3223b6f 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 [exoscale]. ## 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. +exoscale 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,15 +87,15 @@ 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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create python +$ exoapp 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 +$ exoapp APP_NAME/default push Counting objects: 7, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. @@ -113,19 +113,19 @@ 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@app.exo.io/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 exoapp deploy command. ~~~bash -$ cctrlapp APP_NAME/default deploy +$ exoapp 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.app.exo.io`. [Tornado]: http://www.tornadoweb.org -[cloudControl]: http://www.cloudcontrol.com +[exoscale]: http://www.exoscale.ch [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index 32ba7f2..56bd263 100644 --- a/Guides/Ruby/AWS S3.md +++ b/Guides/Ruby/AWS S3.md @@ -26,10 +26,10 @@ 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://www.exoscale.ch/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' +$ exoapp 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 e68746d..2265350 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 +$ exoapp 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 +$ exoapp APP_NAME/DEP_NAME addon.creds ~~~ You can use the following code wherever you want to get the credentials in your @@ -57,52 +57,28 @@ end # Examples -cloudControl 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. +exoscale offers a number of data storage solutions via the [Add-on Marketplace]. +Below you can see how to access Add-on credentials for MySQL. ## MySQL -To add a MySQL database, use the [MySQL Dedicated Add-on] or [MySQL Shared Add-on]. +To add a MySQL database, use the [MySQL Shared Add-on]. Here's a Ruby snippet that reads the database settings and stores them in the `db_config` hash: ~~~ruby db_config = { - database: ENV["MYSQLD_DATABASE"], - host: ENV["MYSQLD_HOST"], - port: ENV["MYSQLD_PORT"], - username: ENV["MYSQLD_USER"], - password: ENV["MYSQLD_PASSWORD"] + database: ENV["MYSQLS_DATABASE"], + host: ENV["MYSQLS_HOST"], + port: ENV["MYSQLS_PORT"], + username: ENV["MYSQLS_USER"], + password: ENV["MYSQLS_PASSWORD"] } ~~~ -The example used the MySQLd Add-on. Variable names for MySQLs differ. Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. +Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -## PostgreSQL - -To add a PostgreSQL database, use the [ElephantSQL Add-on]. - -With this Ruby snippet you can read the PostgreSQL settings and store them in the -`db_config` hash: -~~~ruby -require 'uri' - -elephant_uri = URI.parse ENV['ELEPHANTSQL_URL'] -db_config = { - database: elephant_uri.path[1 .. -1], - host: elephant_uri.host, - port: elephant_uri.port, - username: elephant_uri.user, - password: elephant_uri.password -} -~~~ - -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 -[ruby-postgresql-example]: https://github.com/ElephantSQL/ruby-postgresql-example +[Add-on credentials]: https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials +[environment variables]: https://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables +[Add-on Marketplace]: https://www.exoscale.ch/add-ons/?c=1 +[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index 507bbb7..5e3314c 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. +[exoscale]. 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. +exoscale 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,14 +39,14 @@ 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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create ruby +$ exoapp 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 +$ exoapp APP_NAME/default push Counting objects: 14, done. Delta compression using up to 4 threads. Compressing objects: 100% (10/10), done. @@ -73,24 +73,24 @@ 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@app.exo.io/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 exoapp deploy command: ~~~bash -$ cctrlapp APP_NAME/default deploy +$ exoapp 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.app.exo.io`. [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 +[exoscale]: http://www.exoscale.ch +[exoscale-doc-user]: https://www.exoscale.ch/dev-center/Platform%20Documentation#user-accounts +[exoscale-doc-cmdline]: https://www.exoscale.ch/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://www.exoscale.ch/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 9ea6d9a..8732a38 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 [exoscale]. 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 @@ -10,7 +10,7 @@ First, clone the Rails application from our repository on Github: ~~~bash $ git clone https://github.com/cloudControl/ruby-rails-example-app.git -$ cd ruby-rails-example-app +$ cd ruby-rails-example-app; git checkout mysql; ~~~ ### Dependency Tracking @@ -41,8 +41,8 @@ group :development, :test do end group :production do - gem 'pg' - gem 'cloudcontrol-rails', '0.0.6' + gem 'mysql2' + gem 'cloudcontrol-rails', '0.0.5' end group :assets do @@ -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 exoscale. ### 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: +exoscale 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,14 +98,14 @@ 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 exoscale because the filesystem is [not persistent][filesystem]. -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. +In this tutorial we use MySQL with the [MySQL Shared Add-on]. This is why we have modified the `Gemfile` by moving the `sqlite3` line to ":development, :test" block and added a new ":production" group with "mysql2" and ["cloudcontrol-rails"][gem itself] gems. -Additionally we have changed the "production" section of `config/database.yml` to use the postgresql adapter: +Additionally we have changed the "production" section of `config/database.yml` to use the mysql adapter: ~~~ production: - adapter: postgresql + adapter: mysql2 encoding: utf8 pool: 5 ~~~ @@ -114,16 +114,16 @@ 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 exoscale platform: ~~~bash -$ cctrlapp APP_NAME create ruby +$ exoapp APP_NAME create ruby ~~~ -Push your code to the application's repository, which triggers the deployment image build process: +Push your code to the application's repository, which triggers the deployment image build process (do it with `mysql` deployment name since we use the same branch in application repo): ~~~bash -$ cctrlapp APP_NAME/default push +$ exoapp APP_NAME/mysql push Counting objects: 62, done. Delta compression using up to 4 threads. Compressing objects: 100% (51/51), done. @@ -162,39 +162,38 @@ Total 62 (delta 2), reused 0 (delta 0) -----> Building image -----> Uploading image (34M) -To ssh://APP_NAME@cloudcontrolled.com/repository.git - * [new branch] master -> master +To ssh://APP_NAME@app.exo.io/repository.git + * [new branch] mysql -> mysql ~~~ -Add ElephantSQL Add-on with `turtle` plan to your deployment and deploy it: +Add MySQLs Add-on with `free` plan to your deployment and deploy it: ~~~bash -$ cctrlapp APP_NAME/default addon.add elephantsql.turtle -$ cctrlapp APP_NAME/default deploy +$ exoapp APP_NAME/mysql addon.add mysqls.free +$ exoapp APP_NAME/mysql deploy ~~~ Finally, prepare the database by running migrations using the [Run command][run command]: ~~~bash -$ cctrlapp APP_NAME/default run "rake db:migrate" +$ exoapp APP_NAME/mysql 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://mysql-APP_NAME.app.exo.io. 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 +[exoscale]: http://www.exoscale.ch [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://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[filesystem]: https://www.exoscale.ch/dev-center/Platform%20Documentation#non-persistent-filesystem +[run command]: https://www.exoscale.ch/dev-center/Guides/Ruby/RunCommand +[rails-notes]: https://www.exoscale.ch/dev-center/Guides/Ruby/RailsNotes +[ruby-guides]: https://www.exoscale.ch/dev-center/Guides/Ruby [gem itself]: http://rubygems.org/gems/cloudcontrol-rails +[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index eaa7f5c..06317cb 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 exoscale platform uses a file named `Procfile` to determine how to run your application. This `Procfile` uses the YAML format to specify the desired configuration. @@ -100,10 +100,10 @@ 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 `RAKE_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 `RAKE_ENV` environment variables with the [Custom Config addon](https://www.exoscale.ch/add-ons/config). For example: ~~~ -cctrlapp APP_NAME/DEPLOYMENT config.add RACK_ENV=some_env RAILS_ENV=some_env +exoapp APP_NAME/DEP_NAME config.add RACK_ENV=some_env RAILS_ENV=some_env ~~~ NOTE: Gems in development and test environments are excluded from bundle install process. @@ -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://www.exoscale.ch/dev-center/Platform%20Documentation#version-control--images [rails-procfile]: #rails-procfile [ruby-buildpack]: https://github.com/cloudControl/buildpack-ruby diff --git a/Guides/Ruby/RunCommand.md b/Guides/Ruby/RunCommand.md index 69e2f55..6c8aff3 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 -$ ctrlapp APP_NAME/DEP_NAME run "rake db:migrate" +$ exoapp APP_NAME/DEP_NAME run "rake db:migrate" ~~~ To run rails console: ~~~bash -$ cctrlapp APP_NAME/DEP_NAME run "rails c" +$ exoapp 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 +$ exoapp 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 @@ -78,13 +78,13 @@ 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.app.exo.io 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" +$ exoapp 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/Third-Party Buildpacks.md b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md index 38a1a88..73a82f0 100644 --- a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md +++ b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md @@ -1,17 +1,18 @@ # Third-Party Custom Buildpacks -[cloudControl] officially supports the following application types via the [Pinky Stack][PinkyStack]. +[exoscale] officially supports the following application types via the [Pinky Stack][PinkyStack]. - Java-based (Java with Maven, Gradle, Grails, Scala, Play! or Clojure) - Ruby - PHP - Python +- NodeJS However, you can deploy apps developed on languages and technologies beyond the officially supported ones using the third-party custom buildpacks feature. ## 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 exoscale platform covering the following languages and technologies: |Technology|Buildpack URL| |:---------|:----------:| @@ -28,7 +29,7 @@ Here is a list of verified and recommended buildpacks for the cloudControl platf 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 +$ exoapp APP_NAME create custom --buildpack BUILDPACK_URL ~~~ **Note:** `BUILDPACK_URL` has to be a non-ssh git repository. @@ -37,8 +38,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. -[cloudControl]: https://www.cloudcontrol.com -[PinkyStack]: https://www.cloudcontrol.com/dev-center/Platform%20Documentation#stacks +[exoscale]: https://www.exoscale.ch +[PinkyStack]: https://www.exoscale.ch/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 64ecc31..47346ee 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)
  • @@ -21,21 +21,21 @@ -# cloudControl Documentation +# exoscale Documentation ## Platform Access **TL;DR:** - * The command line client cctrl is the primary interface. + * The command line client 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 *exoapp* and *exouser*. 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 exoscale platform. The CLI consists of 2 parts: *exoapp* and *exouser*. 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 the command line clients is easy and works on Mac/Linux as well as on Windows. #### Quick Installation Windows @@ -43,13 +43,13 @@ For Windows we offer an installer. Please download [the latest version] of the i #### 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 the command line clients via pip. They require [Python 2.6+]. ~~~ $ sudo pip install -U 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 cctrl. +If you don't have pip you can install pip via easy_install (on Linux usually part of the python-setuptools package): ~~~ $ sudo easy_install pip @@ -58,58 +58,34 @@ $ sudo pip install -U cctrl ## User Accounts -**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`` - -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 -~~~ - -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 -~~~ - -If you want to delete your user account, please use either the *web console* or the following CLI command: -~~~ -$ cctrluser delete -~~~ - -### Password Reset - -You can [reset your password], in case you forgot it. - +User accounts are created on [exoscale.ch](http://exoscale.ch). -## Apps, Users and Deployments +## Apps and Deployments **TL;DR:** - * Applications (apps) have a repository, deployments and users. + * Applications (apps) have a repository and deployments. * 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). - * Users can be added to apps to gain access to the repository, branches and deployments. + * 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. -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. +exoscale 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 -An app consists of a repository (with branches), deployments and users. Creating an app allows you to add or remove users to that app, giving them access to the source code as well as allowing them to manage the deployments. +An app consists of a repository (with branches) and deployments. 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 +$ exoapp APP_NAME create php ~~~ You can always list your existing apps using the command line client too. ~~~ -$ cctrlapp -l +$ exoapp -l Apps Nr Name Type 1 myfirstapp php @@ -117,91 +93,47 @@ Apps [...] ~~~ -### Users - -By adding users to an app you can grant fellow developers access to the source code in the repository, allow them to [deploy new versions](#deploying-new-versions) and modify the deployments including their [Add-ons](#managing-add-ons). Permissions are based on -the user's [roles](#roles). Users can be added to applications or more fine grained to deployments. - -You can list, add and remove app users using the command line client. - -~~~ -$ cctrlapp APP_NAME user - -Users - Name Email Role Deployment - user1 user1@example.com admin (app) - user2 user2@example.com readonly production - user3 user3@example.com admin staging -~~~ - - -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 -~~~ - -To remove a user, please use their email address. -~~~ -$ cctrlapp 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 -~~~ -Please note: a user can either be added to the application or to one or more deployments. - -#### Roles - - * **Owner**: Creating an app makes you the owner and gives you full access. The owner can not be removed from the app and gets charged for all their apps' consumption. - * **Admin**: The default role for users added to an app is the Admin role. Admins have full access to the repository and to all deployments. Admins can add more Admin or Read-only users or remove existing ones. They can delete deployments and even the app itself. Admins however can not change the associated billing account or remove the owner. - * **Read-only** The Read-only role allows you to see the application details, deployments and logs. Any update operation is forbidden. - -You can provide the role with the `user.add` command. - -~~~ -$ cctrlapp APP_NAME user.add user5@example.com --role readonly -~~~ - -#### Keys +### User 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, exoapp will offer to create one. ~~~ -$ cctrluser key.add +$ exouser key.add ~~~ You can also list the available key ids and remove existing keys using the key id. ~~~ -$ cctrluser key +$ exouser key Keys Dohyoonuf7 -$ cctrluser key Dohyoonuf7 +$ exouser key Dohyoonuf7 ssh-rsa AAA[...] -$ cctrluser key.remove Dohyoonuf7 +$ exouser 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). +Deployments run independently from each other, including separate runtime environments, file system storage and Add-ons (e.g. database). This allows you to have different versions of your app running at the same time without interfering with each other. Please refer to the section about [development, staging and production environments](#development-staging-and-production-environments) to understand why this is a good idea. You can list all the deployments with the *details* command. ~~~ -$ cctrlapp APP_NAME details +$ exoapp APP_NAME details App - Name: APP_NAME Type: php Owner: user1 - Repository: ssh://APP_NAME@cloudcontrolled.com/repository.git + Name: APP_NAME Type: php Owner: EMAIL_ADDRESS + Repository: ssh://APP_NAME@app.exo.io/repository.git [...] @@ -216,61 +148,48 @@ 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. -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. +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 exoapp push command or git'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 exoapp: +$ exoapp APP_NAME/dev push -# get the REPO_URL from the output of cctrlapp APP_NAME details +# get the REPO_URL from the output of exoapp APP_NAME details # with git: -$ git remote add cctrl REPO_URL -$ git push cctrl dev - -# with bzr: -$ bzr push --remember REPO_URL +$ git remote add exo REPO_URL +$ git push exo dev ~~~ -The repositories support all other remote operations like pulling and cloning as well. +The repositories support all other remote operations like pulling and cloning +as well. -The compressed image size is limited to 200MB. -Smaller images can be deployed faster, so we recommend to keep the image size below 50MB. -The image size is printed at the end of the build process; if the image exceeds the limit, the push gets rejected. +The compressed image size is limited to 200MB. Smaller images can be deployed +faster, so we recommend to keep the image size below 50MB. The image size is +printed at the end of the build process; if the image exceeds the limit, the +push gets rejected. -You can decrease your image size by making sure that no unneeded files (e.g. caches, logs, backup files) are tracked -in your repository. Files that need to be tracked but are not required in the image (e.g. development assets or -source code files in compiled languages), can be added to a `.cctrlignore` file in the project root directory. -The format is similar to the `.gitignore`, but without the negation operator `!`. Here’s an example `.cctrlignore`: +You can decrease your image size by making sure that no unneeded files (e.g. +caches, logs, backup files) are tracked in your repository. Files that need to +be tracked but are not required in the image (e.g. development assets or source +code files in compiled languages), can be added to a `.cctrlignore` file in the +project root directory. The format is similar to the `.gitignore`, but without +the negation operator `!`. Here’s an example `.cctrlignore`: ~~~ *.psd @@ -281,13 +200,29 @@ 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 exoscale 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 +exoscale 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. +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. -Which buildpack is going to be used is determined by the application type set when creating the app. +Which buildpack is going to be used is determined by the application type set +when creating the app. -A required part of the image is a file called `Procfile` in the root directory. It is used to determine how to start the actual application in the container. Some of the buildpacks can provide a default Procfile. But it is recommended to explicitly define the Procfile in your application to match your individual requirements better. For a container to be able to receive requests from the routing tier it needs at least the following content: +A required part of the image is a file called `Procfile` in the root directory. +It is used to determine how to start the actual application in the container. +Some of the buildpacks can provide a default Procfile. But it is recommended to +explicitly define the Procfile in your application to match your individual +requirements better. For a container to be able to receive requests from the +routing tier it needs at least the following content: ~~~ web: COMMAND_TO_START_THE_APP_AND_LISTEN_ON_A_PORT --port $PORT @@ -300,13 +235,13 @@ 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 exoscale 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 +$ exoapp 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). @@ -324,7 +259,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 +$ exoapp APP_NAME/DEP_NAME details Deployment name: APP_NAME/DEP_NAME [...] @@ -340,13 +275,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 +$ exoapp 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 +$ exoapp APP_NAME/DEP_NAME deploy THE_LAST_WORKING_VERSION_HASH ~~~ @@ -358,9 +293,14 @@ $ 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 exoscale 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 similar. ## Development, Staging and Production Environments @@ -373,7 +313,17 @@ 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 exoscale 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 @@ -381,7 +331,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. @@ -396,36 +346,44 @@ Sometimes you have environment specific configuration, e.g. to enable debugging ### Managing Add-ons -Add-ons add additional services to your deployment. The [Add-on marketplace] offers a wide variety of different Add-ons. Think of it as an app store dedicated to developers. Add-ons can be different database offerings, caching, performance monitoring or logging services or even complete backend APIs or billing solutions. +Add-ons add additional services to your deployment. The [Add-on marketplace] +offers a variety of different Add-ons. Think of it as an app store +dedicated to developers. Add-ons range from database offerings to data processing services +or deployment solutions. -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. +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 `exoapp addon.list` command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.list +$ exoapp 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 +$ exoapp 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 +$ exoapp APP_NAME/DEP_NAME addon Addon : alias.free -Addon : newrelic.standard +Addon : config.free [...] -Addon : blitz.250 +Addon : cron.hourly [...] -Addon : memcachier.dev +Addon : mysqls.free [...] ~~~ @@ -433,9 +391,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 +$ exoapp 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 +$ exoapp 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. @@ -458,20 +416,22 @@ 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://www.exoscale.ch/dev-center/Guides/Ruby/Add-on%20credentials), +[Python](https://www.exoscale.ch/dev-center/Guides/Python/Add-on%20credentials), +[Node.js](https://www.exoscale.ch/dev-center/Guides/NodeJS/Add-on%20credentials), +[Java](https://www.exoscale.ch/dev-center/Guides/Java/Add-on%20credentials), +[PHP](https://www.exoscale.ch/dev-center/Guides/PHP/Add-on%20credentials)). To see the format and contents of the credentials file locally, use the `addon.creds` command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME addon.creds +$ exoapp APP_NAME/DEP_NAME addon.creds { - "BLITZ": { - "BLITZ_API_KEY": "SOME_SECRET_API_KEY", - "BLITZ_API_USER": "SOME_USER_ID" - }, - "MEMCACHIER": { - "MEMCACHIER_PASSWORD": "SOME_SECRET_PASSWORD", - "MEMCACHIER_SERVERS": "SOME_HOST.eu.ec2.memcachier.com", - "MEMCACHIER_USERNAME": "SOME_USERNAME" + "CONFIG": { + "CONFIG_VARS": { + "FOO": "BAR" + } }, "MYSQLS": { "MYSQLS_DATABASE": "SOME_DB_NAME", @@ -489,10 +449,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 exoapp 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] +$ exoapp APP_NAME/DEP_NAME log [access,error,worker,deploy] [...] ~~~ @@ -514,7 +474,7 @@ The `deploy` log provides detailed information about the deploy process. It show ### Customizing logging -Some Add-ons in the [Deployment category] as well as the [Custom Config Add-on] can be used to forward error and worker logs to the external logging services. +The [Custom Config Add-on] can be used to forward error and worker logs to the external logging services. #### Adding custom syslog logging with Custom Config Add-on @@ -534,7 +494,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 +$ exoapp 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. @@ -544,14 +504,14 @@ 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 `*.app.exo.io` 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 `*.app.exo.io` subdomain. The `APP_NAME.app.exo.io` 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.app.exo.io`. 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. @@ -561,13 +521,12 @@ Changes to DNS can take up to 24 hours until they have effect. Please refer to t **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. - * The `*.cloudcontrolapp.com` subdomain provides WebSocket support. + * Within the routing tier, requests are routed via the `*.app.exo.io` subdomain. + * The `*.app.exo.io` 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 `*.app.exo.io` 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. @@ -581,21 +540,13 @@ Given that client requests don't hit your application directly, but are forwarde ### 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. * __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 `*.cloudcontrolled.com` subdomain: - -|Parameter|Value [s]| -|:---------|:----------:| -|Connect timeout|60| -|Send timeout|60| -|Read timeout|120| - -#### Timeouts for `*.cloudcontrolapp.com` subdomain: +#### Timeouts for `*.app.exo.io` subdomain: |Parameter|Value [s]| |:---------|:----------:| @@ -609,17 +560,13 @@ Our smart [DNS](https://en.wikipedia.org/wiki/Domain_Name_System) provides a fas ### 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. +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. 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. -#### `*.cloudcontrolled.com` subdomain - -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 `*.app.exo.io` 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. @@ -631,7 +578,7 @@ Because the health checker actively monitors containers where an application is * 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 exoscale loadbalancing and [routing tier](#routing-tier) ensures efficient distribution of incoming requests accross all available containers. ### Horizontal Scaling @@ -642,61 +589,25 @@ 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 +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. -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`). - ## WebSockets **TL;DR:** - * WebSockets are supported via the `*.cloudcontrolapp.com` subdomain. + * WebSockets are supported via the Routing Tier. * 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://`. @@ -721,18 +632,18 @@ 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 `*.app.exo.io` 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 **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 @@ -740,21 +651,25 @@ For tasks that are guaranteed to finish within the time limit, the [Cron add-on] ### 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) -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 exoscale 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. +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. ### Examples To start a shell (e.g. bash) use the `run` command. ~~~ -$ cctrlapp APP_NAME/DEP_NAME run bash +$ exoapp 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" @@ -762,21 +677,21 @@ 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.app.exo.io 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. 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" +$ exoapp 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 +DOMAIN=app.exo.io GEM_PATH=vendor/bundle/ruby/1.9.1 HOME=/srv HOSTNAME=DEP_ID-10346 @@ -784,7 +699,7 @@ LANG=en_US.UTF-8 LOGNAME=u10346 MAIL=/var/mail/u10346 OLDPWD=/srv -PAAS_VENDOR=cloudControl +PAAS_VENDOR=exoscale PATH=bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin PORT=10346 PWD=/srv/www @@ -800,7 +715,7 @@ TMPDIR=/srv/tmp USER=u10346 WRK_ID=WRK_ID Connection to 10.250.134.126 closed. -Connection to ssh.cloudcontrolled.net closed. +Connection to sshforwarder.app.exo.io closed. ~~~ ## Stacks @@ -809,57 +724,46 @@ 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. +A stack defines the common runtime environment for all deployments using it. +This guarantees that all your deployments find the same version of all OS +components as well as all pre-installed libraries. -Stacks are based on Ubuntu releases and have the same first letter as the release they are based on. Each stack is named after a super hero sidekick. We try to keep them as close to the Ubuntu release as possible, but do make changes when necessary for security or performance reasons to optimize the stack for its specific purpose on our platform. +Stacks are based on Ubuntu releases and have the same first letter as the +release they are based on. Each stack is named after a super hero sidekick. We +try to keep them as close to the Ubuntu release as possible, but do make +changes when necessary for security or performance reasons to optimize the +stack for its specific purpose on our platform. ### 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 `exoapp` command line interface. ~~~ -$ cctrlapp APP_NAME/DEP_NAME details +$ exoapp 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 -[web console]: https://www.cloudcontrol.com/console +[Custom Config Add-on]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Deployment/Custom%20Config +[web console]: https://www.exoscale.ch/console [API libraries]: https://github.com/cloudControl [the latest version]: http://cctrl.s3-website-eu-west-1.amazonaws.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/ -[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 -[Add-on marketplace]: https://www.cloudcontrol.com/add-ons -[Deployment category]: https://www.cloudcontrol.com/dev-center/Add-on%20Documentation/Deployment +[guides]: https://www.exoscale.ch/dev-center/Guides +[Add-on marketplace]: https://www.exoscale.ch/add-ons +[Deployment category]: https://www.exoscale.ch/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 -[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 -[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 -[Ubuntu 10.04 LTS Lucid Lynx]: http://releases.ubuntu.com/lucid/ +[Alias Add-on]: https://www.exoscale.ch/add-ons/alias +[Cron Add-on]: https://www.exoscale.ch/add-ons/cron +[Cron Add-on documentation]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Deployment/Cron +[Worker Add-on]: https://www.exoscale.ch/add-ons/worker +[Worker Add-on documentation]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Processing/Worker [Ubuntu 12.04 LTS Precise Pangolin]: http://releases.ubuntu.com/precise/ diff --git a/Quickstart.md b/Quickstart.md index 6121784..0fde15c 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -1,23 +1,29 @@ -# cloudControl Quickstart +# exoscale 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 exoscale. Follow this 5 minute quickstart to get your +first app running on exoscale 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. +**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. ## Install the Required Software ### Requirements * git version control system -* cctrl command line client +* the exouser/ exoapp command line clients ### 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 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 command line clients -**Linux/Mac OS X:** We recommend installing cctrl via pip. +**Linux/Mac OS X:** We recommend installing the command line clients via pip. ~~~bash # if you don't have pip yet @@ -25,45 +31,30 @@ $ 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]. ## Create a User Account (if you haven't already) -You can register on the website or directly from the command line. Provide the required values when prompted. - -~~~bash -$ cctrluser create -Username: USERNAME -Email : EMAIL -Password: PASSWORD -Password (again): PASSWORD -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 -~~~ - -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. +You can register on [exoscale.ch](http://exoscale.ch). ## Add a Public Key ~~~bash -$ cctrluser key.add +$ exouser key.add Email : EMAIL 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 exoscale -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 exoscale platform by giving it an unique +`APP_NAME` (the name is used as the `.app.exo.io` subdomain) and choosing the +`TYPE`. ~~~bash -$ cctrlapp APP_NAME create [java, php, python, ruby, nodejs] +$ exoapp APP_NAME create [java, php, python, ruby, nodejs] ~~~ If the `APP_NAME` is already taken, please pick another one. @@ -74,7 +65,8 @@ 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 exoscale platform. ~~~bash # for Java @@ -98,29 +90,36 @@ $ git clone https://github.com/cloudControl/nodejs-express-example-app.git $ cd nodejs-express-example-app # now push -$ cctrlapp APP_NAME push +$ exoapp 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. +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 exoscale Deploy your app with ~~~bash -$ cctrlapp APP_NAME deploy +$ exoapp APP_NAME deploy ~~~ **Congratulations, your app is now up and running.** ~~~bash -http[s]://APP_NAME.cloudcontrolled.com +http[s]://APP_NAME.app.exo.io ~~~ ## 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)](https://www.exoscale.ch/dev-center/exo_cheatsheet.pdf) +to have the most important command line client commands handy at all times. ## 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://www.exoscale.ch/dev-center/Platform%20Documentation). + +[installer]: http://cctrl.s3-website-eu-west-1.amazonaws.com/#windows/ diff --git a/README b/README index f0d2167..e51fb73 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -cloudControl Documentation +exoscale Documentation -Markdown source of the cloudControl documentation online at https://www.cloudcontrol.com/dev-center +Markdown source of the exoscale documentation online at https://www.exoscale.ch/dev-center For corrections or suggestions please send a pull request. diff --git a/cctrl_cheatsheet.pdf b/exo_cheatsheet.pdf similarity index 72% rename from cctrl_cheatsheet.pdf rename to exo_cheatsheet.pdf index 22b64b7748069e39c361cea74c61a98389d2a852..0db4655638b2fbbe67c39d8016e521566e488bb0 100644 GIT binary patch delta 129237 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 delta 207355 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%0Am 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

    7c#f#BeI99E3Eb)p87~?RqJ8WCI9m;g+jFkEi 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

    rIZL@iL^ zN6{|`^N|IhhDR4_^$T&eh@Dto!!ArHjohB5KcgT6ntDsx;TEpH$eP_ zMjf%9M<1MJJLtq-i;?ZKM)(ZA4m5GnJfp|+yPf0g*K{P~OMO>W58i1~Xn8>(zt865% zOo@b-#WI_AmJ|i|>k_&~0X5p7P0lD?&~yorGK5N@{34Ca#MQ`ZVajq;hs&52EJ_wD ze#D-PNf|KC_Fp#lMI2&?4SF38MApP&jZPVH4kD404vCq=Kkh0h>jIq2bORM`8e|Rd zL^=V=zz*OSGrg{q&g&V`R!@tSeli9>V%aI>JXkzj1x6-loNjYOFye@@$G8#(!V8!x z(d03B+ZsSx>U#BEz1-ZcN@Zm

    hzi$v--v!RPkSc5A)r?S0-KQ=9Q*(DHbgYozbA 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�ZhDvLy2~}B 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 Date: Wed, 21 May 2014 15:06:24 +0200 Subject: [PATCH 02/22] Use abs links --- Guides/Java/Java - Spring.md | 6 +++--- Guides/Python/Django notes.md | 2 +- Guides/Ruby/RubyNotes.md | 2 +- Platform Documentation.md | 6 +++--- Quickstart.md | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index 57a1876..406955d 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -150,6 +150,6 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.app.exo.io` . [Database credentials]: Add-on%20credentials [Jetty Runner]: http://wiki.eclipse.org/Jetty/Howto/Using_Jetty_Runner [exoscale]: http://exoscale.ch -[file system]: ../../Platform%20Documentation#non-persistent-filesystem -[log command]: ../../Platform%20Documentation#logging -[Shared MySQL Add-on]: ../../Add-on%20Documentation/Data%20Storage/MySQLs +[file system]: https://www.exoscale.ch/dev-center/Platform%20Documentation#non-persistent-filesystem +[log command]: https://www.exoscale.ch/dev-center/Platform%20Documentation#logging +[Shared MySQL Add-on]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index 3b51884..daac3d7 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -27,7 +27,7 @@ To use a database, have a look at the [Shared MySQL Add-on][Shared MySQL Add-on] [pip]: http://www.pip-installer.org/ [procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile [messaging-addons]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Messaging%20&%20Mobile/ -[Shared MySQL Add-on]: ../../Add-on%20Documentation/Data%20Storage/MySQLs +[Shared MySQL Add-on]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs [add-on-credentials]: https://www.exoscale.ch/dev-center/Guides/Python/Add-on%20credentials [exoscale]: https://www.exoscale.ch/ [worker]: https://www.exoscale.ch/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index 06317cb..af090d6 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://www.exoscale.ch/dev-center/Platform%20Documentation#version-control--images +[procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#version-control-images [rails-procfile]: #rails-procfile [ruby-buildpack]: https://github.com/cloudControl/buildpack-ruby diff --git a/Platform Documentation.md b/Platform Documentation.md index 47346ee..195e9c7 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -2,8 +2,8 @@

    -# exoscale Documentation +# exoscale Apps Documentation ## Platform Access diff --git a/Quickstart.md b/Quickstart.md index 0fde15c..c4658e9 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -1,4 +1,4 @@ -# exoscale Quickstart +# exoscale Apps Quickstart It's easy to start with exoscale. Follow this 5 minute quickstart to get your first app running on exoscale PaaS. From 5a22659ccc612c835c91677194fe60c96e4ccb62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Reni=C3=A9?= Date: Wed, 21 May 2014 15:06:57 +0200 Subject: [PATCH 03/22] Use /static/ for static files --- Guides/PHP/CakePHP 2.2.1.md | 4 ++-- Guides/PHP/Drupal 7.md | 8 +++++--- Guides/PHP/Joomla 2.5.md | 4 ++-- Guides/PHP/Kohana 3.2.0.md | 6 +++--- Guides/PHP/Symfony 1.4.md | 4 ++-- Guides/PHP/Yii 1.1.10.md | 6 +++--- Guides/PHP/Zend Framework 1.11.md | 6 +++--- Quickstart.md | 2 +- 8 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Guides/PHP/CakePHP 2.2.1.md b/Guides/PHP/CakePHP 2.2.1.md index 12c470e..e3424e4 100644 --- a/Guides/PHP/CakePHP 2.2.1.md +++ b/Guides/PHP/CakePHP 2.2.1.md @@ -1,6 +1,6 @@ #Deploying CakePHP 2.2.1 -![Successful Deployment](images/cake-homepage.png) +![Successful Deployment](/static/apps/images/cake-homepage.png) If you're looking for a fast, light and effective PHP Framework for your projects, you can't go past [CakePHP](http://cakephp.org/). Now at [version 2.2.1](https://github.com/cakephp/cakephp/zipball/2.2.1) it comes with a variety of features to speed up your application development, including: @@ -23,7 +23,7 @@ You're going to need only a few things to following along with this tutorial. Th 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) +![Source files](/static/apps/images/expanded-sourcefile.png) If you use an IDE, then it's best to open up the source as a project in it. In this tutorial, I'm using SublimeText2. diff --git a/Guides/PHP/Drupal 7.md b/Guides/PHP/Drupal 7.md index 4d74d38..4f19406 100644 --- a/Guides/PHP/Drupal 7.md +++ b/Guides/PHP/Drupal 7.md @@ -1,5 +1,5 @@ #Deploying Drupal 7 -![Successful Deployment](images/drupal7.png) +![Successful Deployment](/static/apps/images/drupal7.png) If you're looking for a flexible, friendly and powerful content management platform, built in PHP, for your projects, you really can't go past [Drupal](http://drupal.org/). Having been consistently growing and evolving since it was first created by Dries Buytaert in January 2001, Drupal 7 is the latest iteration and comes packed with a variety of features to speed up your application development, including: @@ -22,7 +22,7 @@ You're going to need only a few things to following along with this tutorial. Th 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) +![Source files](/static/apps/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). @@ -231,7 +231,9 @@ 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_exoscale_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](/static/apps/drupal_exoscale_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**: diff --git a/Guides/PHP/Joomla 2.5.md b/Guides/PHP/Joomla 2.5.md index 323d15e..68e9acf 100644 --- a/Guides/PHP/Joomla 2.5.md +++ b/Guides/PHP/Joomla 2.5.md @@ -1,6 +1,6 @@ #Deploying Joomla 2.5 to exoscale -![Successful Deployment](images/joomla-logo.png) +![Successful Deployment](/static/apps/images/joomla-logo.png) If you're looking for a fast, light and effective PHP Framework for your projects, you can't go past [Joomla](http://www.joomla.org/download.html). Now at [version 2.5](http://www.joomla.org/download.html) it comes with a variety of features to speed up your application development, including: @@ -23,7 +23,7 @@ You're going to need only a few things to following along with this tutorial. Th 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) +![Successful Deployment](/static/apps/images/joomla-source.png) ##Create a Basic Application diff --git a/Guides/PHP/Kohana 3.2.0.md b/Guides/PHP/Kohana 3.2.0.md index 2008c63..d46fbee 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -1,6 +1,6 @@ #Deploying Kohana 3.2.0 -![Successful Deployment](images/kohana-homepage.png) +![Successful Deployment](/static/apps/images/kohana-homepage.png) If you're looking for a very fast, light, highly configurable and effective PHP Framework for your projects, look no further than [Kohana](http://kohanaframework.org/). Now at [version 3.2.0](http://dev.kohanaframework.org/attachments/download/1670/kohana-3.2.0.zip) it comes with a variety of features to speed up your application development, including: @@ -25,7 +25,7 @@ You're going to need only a few things to following along with this tutorial. Th 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) +![Source files](/static/apps/images/kohana-files.png) ##2. Amend the Code @@ -346,7 +346,7 @@ What this does is to say that the session information will be stored in the data So your ``application/config`` directory should look like that below: -![Successful Deployment](images/kohana application-config dir.png) +![Successful Deployment](/static/apps/images/kohana application-config dir.png) ##6. Database Schema diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index 08b9881..7b7b86a 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -1,6 +1,6 @@ #Deploying Symfony 1.4 to exoscale -![Successful Deployment](images/symfony1.4-homepage.png) +![Successful Deployment](/static/apps/images/symfony1.4-homepage.png) If you're looking for a feature-rich, open source, PHP Framework for your projects complete with a strong community, large variety of plugins and add-ons and a strong history of active development, you can't go past [Symfony 1](http://symfony.com/). It comes with a variety of features to speed up your application development, including: @@ -25,7 +25,7 @@ You're going to need only a few things to following along with this tutorial. Th 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) +![Source files](/static/apps/images/symfony1-source.png) ##2. Amend the Code diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index 6a39ac7..d891e30 100644 --- a/Guides/PHP/Yii 1.1.10.md +++ b/Guides/PHP/Yii 1.1.10.md @@ -1,6 +1,6 @@ #Deploying Yii 1.1.10 to exoscale -![Successful Deployment](images/yii-framework-logo.png) +![Successful Deployment](/static/apps/images/yii-framework-logo.png) If you're looking for a lightning fast, light and effective PHP Framework for your projects, one without a lot of the cruft and legacy overhead of some of the other popular PHP frameworks available today, you can't go past [Yii Framework](http://www.yiiframework.com/). Now at [version 1.1.11](http://yii.googlecode.com/files/yii-1.1.11.58da45.tar.gz) it comes with a variety of features to speed up your application development, including: @@ -23,7 +23,7 @@ You're going to need only a few things to following along with this tutorial. Th 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) +![Source files](/static/apps/images/yii-framework-source.png) ##Create a Basic Application @@ -329,7 +329,7 @@ Now that that's done, commit the changes we made earlier and push and deploy bot 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) +![Successful Deployment](/static/apps/images/yii-framework-running.png) ###7.1 Deployment Problems diff --git a/Guides/PHP/Zend Framework 1.11.md b/Guides/PHP/Zend Framework 1.11.md index 6049abd..f5fcf53 100644 --- a/Guides/PHP/Zend Framework 1.11.md +++ b/Guides/PHP/Zend Framework 1.11.md @@ -1,6 +1,6 @@ #Deploying Zend Framework 1.11 to exoscale -![Successful Deployment](images/ZendFramework-logo.png) +![Successful Deployment](/static/apps/images/ZendFramework-logo.png) If you're looking for a feature-rich, flexible and capable PHP Framework for your projects, you can't go past [Zend Framework](http://framework.zend.com/). Now at [version 1.11](http://framework.zend.com/download/latest) it comes with a variety of features to speed up your application development, including: @@ -23,7 +23,7 @@ You're going to need only a few things to following along with this tutorial. Th 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) +![Source files](/static/apps/images/zf-source-files.png) ##Create a Basic Application @@ -467,7 +467,7 @@ With that completed, then have a look at both your deployments to ensure that th You should see output similar to that below, in figure 2. -![Successful Deployment](images/zf-deployed.png) +![Successful Deployment](/static/apps/images/zf-deployed.png) ###7.1 Deployment Problems diff --git a/Quickstart.md b/Quickstart.md index c4658e9..092363c 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -113,7 +113,7 @@ http[s]://APP_NAME.app.exo.io ## Cheatsheet -Grab [our cheatsheet (PDF)](https://www.exoscale.ch/dev-center/exo_cheatsheet.pdf) +Grab [our cheatsheet (PDF)](/static/apps/exo_cheatsheet.pdf) to have the most important command line client commands handy at all times. ## Documentation From fc84ef117f9a3b619d6702cb637e3fb5f9ff642e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Reni=C3=A9?= Date: Thu, 22 May 2014 16:01:00 +0200 Subject: [PATCH 04/22] Update java example --- Quickstart.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Quickstart.md b/Quickstart.md index 092363c..724e524 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -70,8 +70,8 @@ it to the exoscale platform. ~~~bash # for Java -$ git clone https://github.com/cloudControl/java-jetty-example-app.git -$ cd java-jetty-example-app +$ git clone https://github.com/cloudControl/java-jetty-jsp-example-app.git +$ cd java-jetty-jsp-example-app # for PHP $ git clone https://github.com/cloudControl/php-silex-example-app.git From d4f2198435e6139ac3295032755fa7d29ed606ca Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 23 May 2014 16:08:04 +0200 Subject: [PATCH 05/22] Fix broken links --- .../Data Processing/Worker.md | 2 +- Add-on Documentation/Data Storage/MySQLs.md | 2 +- Add-on Documentation/Deployment/Cron.md | 2 +- Guides/Java/AWS S3.md | 2 +- Guides/Java/Add-on credentials.md | 10 +++---- Guides/Java/Java - HelloWorld.md | 4 +-- Guides/Java/Java - Spring.md | 6 ++-- Guides/NodeJS/AWS S3.md | 2 +- Guides/NodeJS/Add-on credentials.md | 8 ++--- Guides/NodeJS/HelloWorld.md | 4 +-- Guides/NodeJS/Sailsjs.md | 8 ++--- Guides/PHP/Add-on credentials.md | 8 ++--- Guides/PHP/HelloWorld.md | 6 ++-- Guides/PHP/Zend 2.md | 2 +- Guides/Python/AWS S3.md | 2 +- Guides/Python/Add-on credentials.md | 10 +++---- 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 | 8 ++--- Guides/Ruby/HelloWorld.md | 6 ++-- Guides/Ruby/Ruby on Rails.md | 12 ++++---- Guides/Ruby/RubyNotes.md | 4 +-- .../Third-Party Buildpacks.md | 2 +- Platform Documentation.md | 30 +++++++++---------- Quickstart.md | 2 +- README | 2 +- 29 files changed, 92 insertions(+), 92 deletions(-) diff --git a/Add-on Documentation/Data Processing/Worker.md b/Add-on Documentation/Data Processing/Worker.md index ed8bffa..b5f5214 100644 --- a/Add-on Documentation/Data Processing/Worker.md +++ b/Add-on Documentation/Data Processing/Worker.md @@ -75,7 +75,7 @@ For more details refer to the [PHP example](#php-worker-example) below. ## Worker log -As already explained in the [Logging section](https://www.exoscale.ch/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://community.exoscale.ch/apps/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. ~~~ $ exoapp APP_NAME/DEP_NAME log worker diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 47724b1..07054db 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -52,5 +52,5 @@ 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.exoscale.ch/dev-center/Platform%20Documentation#add-ons) +[Add-on Credentials](https://community.exoscale.ch/apps/Platform%20Documentation#add-ons) in the general documentation. diff --git a/Add-on Documentation/Deployment/Cron.md b/Add-on Documentation/Deployment/Cron.md index 53beb8b..eba1472 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -29,7 +29,7 @@ Before you can add a Cron job, the Add-on itself has to be added: $ exoapp APP_NAME/DEP_NAME addon.add cron.OPTION ~~~ -As always the different options are listed on the [Cron Add-on](https://www.exoscale.ch/add-ons/cron) page. +As always the different options are listed on the [Cron Add-on](https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Cron/) page. ## Adding a url for the Cron job diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index 8bb0db7..7c5ac62 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.exoscale.ch/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://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config): ~~~bash $ exoapp 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 b2137ea..c96bda0 100644 --- a/Guides/Java/Add-on credentials.md +++ b/Guides/Java/Add-on credentials.md @@ -74,10 +74,10 @@ String password = System.getenv("MYSQLS_PASSWORD"); Remember, you can always refer to the addon.creds command to see the actual variable names and values. [Java application with MySQL]: https://github.com/cloudControl/java-mysql-example-app -[Add-on Marketplace]: https://www.exoscale.ch/add-ons/?c=1 -[environment variables]: https://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables -[Add-on credentials]: https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials -[cred-env-vars]: https://www.exoscale.ch/dev-center/Platform%20Documentation#enabling-disabling-credentials-environment-variables +[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ +[environment variables]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables +[Add-on credentials]: https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials +[cred-env-vars]: https://community.exoscale.ch/apps/Platform%20Documentation#enabling-disabling-credentials-environment-variables [json-simple]: http://code.google.com/p/json-simple/ [exoscale credentials helper class]: https://gist.github.com/b350762c61fcc069b427 -[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls +[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index 5490949..600038f 100644 --- a/Guides/Java/Java - HelloWorld.md +++ b/Guides/Java/Java - HelloWorld.md @@ -129,7 +129,7 @@ Congratulations, you can now see your Jetty Application running at `http[s]://AP [Jetty]: http://jetty.codehaus.org/jetty/ [exoscale]: https://www.exoscale.ch/ [Java buildpack]: https://github.com/cloudControl/buildpack-java -[exoscale-command-line-client]: https://www.exoscale.ch/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[exoscale-command-line-client]: https://community.exoscale.ch/apps/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.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index 406955d..983ac61 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -150,6 +150,6 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.app.exo.io` . [Database credentials]: Add-on%20credentials [Jetty Runner]: http://wiki.eclipse.org/Jetty/Howto/Using_Jetty_Runner [exoscale]: http://exoscale.ch -[file system]: https://www.exoscale.ch/dev-center/Platform%20Documentation#non-persistent-filesystem -[log command]: https://www.exoscale.ch/dev-center/Platform%20Documentation#logging -[Shared MySQL Add-on]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs +[file system]: https://community.exoscale.ch/apps/Platform%20Documentation#non-persistent-filesystem +[log command]: https://community.exoscale.ch/apps/Platform%20Documentation#logging +[Shared MySQL Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs diff --git a/Guides/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index 51ee0c9..b1266cd 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.exoscale.ch/dev-center/Add-on%20Documentation/Deployment/Custom%20Config +[Config Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config diff --git a/Guides/NodeJS/Add-on credentials.md b/Guides/NodeJS/Add-on credentials.md index 2c93a1d..664680a 100644 --- a/Guides/NodeJS/Add-on credentials.md +++ b/Guides/NodeJS/Add-on credentials.md @@ -68,7 +68,7 @@ var port = creds.MYSQLS.MYSQLS_PORT; Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[Add-on Marketplace]: https://www.exoscale.ch/add-ons -[environment variables]: https://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables -[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls -[Add-on credentials]:https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials +[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation +[environment variables]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables +[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ +[Add-on credentials]:https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials diff --git a/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index a6bdc76..18de022 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -109,5 +109,5 @@ Congratulations, you can now see your Node.js app running at [npm]: https://npmjs.org/ [exoscale]: http://www.exoscale.ch [Node.js buildpack]: https://github.com/cloudControl/buildpack-nodejs -[Procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[platform documentation]: https://www.exoscale.ch/dev-center/Platform%20Documentation +[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[platform documentation]: https://community.exoscale.ch/apps/Platform%20Documentation diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index c7df0f6..1045e80 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/ [exoscale]: http://www.exoscale.ch -[Procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[get the MySQL credentials]: https://www.exoscale.ch/dev-center/Guides/NodeJS/Add-on%20credentials +[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[get the MySQL credentials]: https://community.exoscale.ch/apps/Guides/NodeJS/Add-on%20credentials [websockets]: http://socket.io/ -[exoscale websockets documentation]: https://www.exoscale.ch/dev-center/Platform%20Documentation#websockets -[Shared MySQL Add-on]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs +[exoscale websockets documentation]: https://community.exoscale.ch/apps/Platform%20Documentation#websockets +[Shared MySQL Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs diff --git a/Guides/PHP/Add-on credentials.md b/Guides/PHP/Add-on credentials.md index 742959a..9b97f1f 100644 --- a/Guides/PHP/Add-on credentials.md +++ b/Guides/PHP/Add-on credentials.md @@ -58,7 +58,7 @@ $password = $creds['MYSQLS']['MYSQLS_PASSWORD']; Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[env-vars]: https://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables -[Add-on credentials]: https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials -[Add-on Marketplace]: https://www.exoscale.ch/add-ons/ -[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls +[env-vars]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables +[Add-on credentials]: https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials +[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ +[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 9739a43..8c42f28 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.a [silex]: http://silex.sensiolabs.org/ [exoscale]: http://www.exoscale.ch -[exoscale-doc-user]: https://www.exoscale.ch/dev-center/Platform%20Documentation#user-accounts -[exoscale-doc-cmdline]: https://www.exoscale.ch/dev-center/Platform%20Documentation#command-line-client-web-console-and-api "documentation of the exoscale-command-line-client" +[exoscale-doc-user]: https://community.exoscale.ch/apps/Platform%20Documentation#user-accounts +[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/Platform%20Documentation#command-line-client-web-console-and-api "documentation of the exoscale-command-line-client" [php buildpack]: https://github.com/cloudControl/buildpack-php -[procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[procfile]: https://community.exoscale.ch/apps/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/Zend 2.md b/Guides/PHP/Zend 2.md index c1a1505..5b3ee3d 100644 --- a/Guides/PHP/Zend 2.md +++ b/Guides/PHP/Zend 2.md @@ -188,7 +188,7 @@ $ exoapp 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.exoscale.ch/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://community.exoscale.ch/apps/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: diff --git a/Guides/Python/AWS S3.md b/Guides/Python/AWS S3.md index 23073c3..8133e02 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.exoscale.ch/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://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config): ~~~bash $ exoapp 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 066ccad..0440aa3 100644 --- a/Guides/Python/Add-on credentials.md +++ b/Guides/Python/Add-on credentials.md @@ -83,8 +83,8 @@ db_config = { Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[env-vars]: https://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables -[Add-on credentials]: https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials -[Add-on Marketplace]: https://www.exoscale.ch/add-ons/ -[Custom Config Add-on]: https://www.exoscale.ch/add-ons/config -[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls +[env-vars]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables +[Add-on credentials]: https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials +[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ +[Custom Config Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config/ +[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index daac3d7..e0eb048 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -22,12 +22,12 @@ exoapp APP_NAME/DEP_NAME run "python manage.py syncdb" ## Databases To use a database, have a look at the [Shared MySQL Add-on][Shared MySQL Add-on]. To get the credentials of your database, refer to the [Add-on credentials][add-on-credentials] article. -[SSH-session]: https://www.exoscale.ch/dev-center/Platform%20Documentation#secure-shell-ssh +[SSH-session]: https://community.exoscale.ch/apps/Platform%20Documentation#secure-shell-ssh [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ -[procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[messaging-addons]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Messaging%20&%20Mobile/ -[Shared MySQL Add-on]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs -[add-on-credentials]: https://www.exoscale.ch/dev-center/Guides/Python/Add-on%20credentials +[procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[messaging-addons]: https://community.exoscale.ch/apps/Add-on%20Documentation/Messaging%20&%20Mobile/ +[Shared MySQL Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs +[add-on-credentials]: https://community.exoscale.ch/apps/Guides/Python/Add-on%20credentials [exoscale]: https://www.exoscale.ch/ -[worker]: https://www.exoscale.ch/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers +[worker]: https://community.exoscale.ch/apps/Platform%20Documentation#scheduled-jobs-and-background-workers diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index b31bf4d..a47617d 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -137,22 +137,22 @@ For additional information take a look at [Django Notes][django-notes] and other [django]: https://www.djangoproject.com/ [exoscale]: http://www.exoscale.ch -[exoscale-doc-user]: https://www.exoscale.ch/dev-center/Platform%20Documentation#user-accounts -[exoscale-doc-cmdline]: https://www.exoscale.ch/dev-center/Platform%20Documentation#command-line-client-web-console-and-api -[Procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[exoscale-doc-user]: https://community.exoscale.ch/apps/Platform%20Documentation#user-accounts +[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/Platform%20Documentation#command-line-client-web-console-and-api +[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git -[filesystem]: https://www.exoscale.ch/dev-center/Platform%20Documentation#non-persistent-filesystem -[data-storage-addons]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Storage/ -[mysqls]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Storage/MySQLs +[filesystem]: https://community.exoscale.ch/apps/Platform%20Documentation#non-persistent-filesystem +[data-storage-addons]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/ +[mysqls]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs [example-app]: https://github.com/cloudControl/python-django-example-app -[django-notes]: https://www.exoscale.ch/dev-center/Guides/Python/Django%20notes -[get-conf]: https://www.exoscale.ch/dev-center/Guides/Python/Add-on%20credentials +[django-notes]: https://community.exoscale.ch/apps/Guides/Python/Django%20notes +[get-conf]: https://community.exoscale.ch/apps/Guides/Python/Add-on%20credentials [Django tutorial]: https://docs.djangoproject.com/en/1.4/intro/tutorial01/ -[python-guides]: https://www.exoscale.ch/dev-center/Guides/Python +[python-guides]: https://community.exoscale.ch/apps/Guides/Python [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ [gunicorn]: http://gunicorn.org/ -[worker]: https://www.exoscale.ch/dev-center/Platform%20Documentation#scheduled-jobs-and-background-workers +[worker]: https://community.exoscale.ch/apps/Platform%20Documentation#scheduled-jobs-and-background-workers [db-commit]: https://github.com/cloudControl/python-django-example-app/commit/983f45e46ce0707476cec167ea062e19adcb53c9 -[ssh-session]: https://www.exoscale.ch/dev-center/Platform%20Documentation#secure-shell-ssh +[ssh-session]: https://community.exoscale.ch/apps/Platform%20Documentation#secure-shell-ssh [mysql-driver]: https://pypi.python.org/pypi/MySQL-python/1.2.4 diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index b9649f8..627aeb7 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.a [Flask]: http://flask.pocoo.org/ [exoscale]: http://www.exoscale.ch [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://community.exoscale.ch/apps/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 3223b6f..5736983 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.ap [Tornado]: http://www.tornadoweb.org [exoscale]: http://www.exoscale.ch [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index 56bd263..f4f297d 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.exoscale.ch/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://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config): ~~~bash $ exoapp 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 2265350..f4db598 100644 --- a/Guides/Ruby/Add-on credentials.md +++ b/Guides/Ruby/Add-on credentials.md @@ -78,7 +78,7 @@ db_config = { Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[Add-on credentials]: https://www.exoscale.ch/dev-center/Platform%20Documentation#add-on-credentials -[environment variables]: https://www.exoscale.ch/dev-center/Platform%20Documentation#environment-variables -[Add-on Marketplace]: https://www.exoscale.ch/add-ons/?c=1 -[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls +[Add-on credentials]: https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials +[environment variables]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables +[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ +[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index 5e3314c..1835520 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/ [exoscale]: http://www.exoscale.ch -[exoscale-doc-user]: https://www.exoscale.ch/dev-center/Platform%20Documentation#user-accounts -[exoscale-doc-cmdline]: https://www.exoscale.ch/dev-center/Platform%20Documentation#command-line-client-web-console-and-api +[exoscale-doc-user]: https://community.exoscale.ch/apps/Platform%20Documentation#user-accounts +[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/Platform%20Documentation#command-line-client-web-console-and-api [ruby buildpack]: https://github.com/cloudControl/buildpack-ruby -[procfile]: https://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile +[procfile]: https://community.exoscale.ch/apps/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 8732a38..b4032e6 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -190,10 +190,10 @@ 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://www.exoscale.ch/dev-center/Platform%20Documentation#buildpacks-and-the-procfile -[filesystem]: https://www.exoscale.ch/dev-center/Platform%20Documentation#non-persistent-filesystem -[run command]: https://www.exoscale.ch/dev-center/Guides/Ruby/RunCommand -[rails-notes]: https://www.exoscale.ch/dev-center/Guides/Ruby/RailsNotes -[ruby-guides]: https://www.exoscale.ch/dev-center/Guides/Ruby +[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[filesystem]: https://community.exoscale.ch/apps/Platform%20Documentation#non-persistent-filesystem +[run command]: https://community.exoscale.ch/apps/Guides/Ruby/RunCommand +[rails-notes]: https://community.exoscale.ch/apps/Guides/Ruby/RailsNotes +[ruby-guides]: https://community.exoscale.ch/apps/Guides/Ruby [gem itself]: http://rubygems.org/gems/cloudcontrol-rails -[MySQL Shared Add-on]: https://www.exoscale.ch/add-ons/mysqls +[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index af090d6..8c9ab4a 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 `RAKE_ENV` environment variables with the [Custom Config addon](https://www.exoscale.ch/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 `RAKE_ENV` environment variables with the [Custom Config addon](https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config/). For example: ~~~ exoapp APP_NAME/DEP_NAME 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.exoscale.ch/dev-center/Platform%20Documentation#version-control-images +[procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#version-control-images [rails-procfile]: #rails-procfile [ruby-buildpack]: https://github.com/cloudControl/buildpack-ruby diff --git a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md index 73a82f0..dbd786d 100644 --- a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md +++ b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md @@ -39,7 +39,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. [exoscale]: https://www.exoscale.ch -[PinkyStack]: https://www.exoscale.ch/dev-center/Platform%20Documentation#stacks +[PinkyStack]: https://community.exoscale.ch/apps/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 195e9c7..f0bf4c8 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -418,11 +418,11 @@ this feature. The guides section has detailed examples about how to get the credentials in different languages -([Ruby](https://www.exoscale.ch/dev-center/Guides/Ruby/Add-on%20credentials), -[Python](https://www.exoscale.ch/dev-center/Guides/Python/Add-on%20credentials), -[Node.js](https://www.exoscale.ch/dev-center/Guides/NodeJS/Add-on%20credentials), -[Java](https://www.exoscale.ch/dev-center/Guides/Java/Add-on%20credentials), -[PHP](https://www.exoscale.ch/dev-center/Guides/PHP/Add-on%20credentials)). +([Ruby](https://community.exoscale.ch/apps/Guides/Ruby/Add-on%20credentials), +[Python](https://community.exoscale.ch/apps/Guides/Python/Add-on%20credentials), +[Node.js](https://community.exoscale.ch/apps/Guides/NodeJS/Add-on%20credentials), +[Java](https://community.exoscale.ch/apps/Guides/Java/Add-on%20credentials), +[PHP](https://community.exoscale.ch/apps/Guides/PHP/Add-on%20credentials)). To see the format and contents of the credentials file locally, use the `addon.creds` command. ~~~ @@ -749,21 +749,21 @@ $ exoapp APP_NAME/DEP_NAME details ~~~ [generating SSH keys]: https://help.github.com/articles/generating-ssh-keys -[Custom Config Add-on]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Deployment/Custom%20Config -[web console]: https://www.exoscale.ch/console +[Custom Config Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config +[web console]: https://portal.exoscale.ch/applications [API libraries]: https://github.com/cloudControl [the latest version]: http://cctrl.s3-website-eu-west-1.amazonaws.com/#windows/ [Python 2.6+]: http://python.org/download/ [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ [Heroku buildpack API]: https://devcenter.heroku.com/articles/buildpack-api -[guides]: https://www.exoscale.ch/dev-center/Guides -[Add-on marketplace]: https://www.exoscale.ch/add-ons -[Deployment category]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Deployment +[guides]: https://community.exoscale.ch/apps/Guides +[Add-on marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation +[Deployment category]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment [rsyslog]: http://www.rsyslog.com/ [TLS]: http://en.wikipedia.org/wiki/Transport_Layer_Security -[Alias Add-on]: https://www.exoscale.ch/add-ons/alias -[Cron Add-on]: https://www.exoscale.ch/add-ons/cron -[Cron Add-on documentation]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Deployment/Cron -[Worker Add-on]: https://www.exoscale.ch/add-ons/worker -[Worker Add-on documentation]: https://www.exoscale.ch/dev-center/Add-on%20Documentation/Data%20Processing/Worker +[Alias Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Alias/ +[Cron Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Cron/ +[Cron Add-on documentation]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Cron +[Worker Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Processing/Worker/ +[Worker Add-on documentation]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Processing/Worker [Ubuntu 12.04 LTS Precise Pangolin]: http://releases.ubuntu.com/precise/ diff --git a/Quickstart.md b/Quickstart.md index 724e524..43c8b6d 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -120,6 +120,6 @@ to have the most important command line client commands handy at all times. 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.exoscale.ch/dev-center/Platform%20Documentation). +[platform documentation](https://community.exoscale.ch/apps/Platform%20Documentation). [installer]: http://cctrl.s3-website-eu-west-1.amazonaws.com/#windows/ diff --git a/README b/README index e51fb73..4ef4dbc 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ exoscale Documentation -Markdown source of the exoscale documentation online at https://www.exoscale.ch/dev-center +Markdown source of the exoscale documentation online at https://community.exoscale.ch/apps For corrections or suggestions please send a pull request. From 5f717ac2c4b1f103d00a4301e2177582fb09e57d Mon Sep 17 00:00:00 2001 From: Dimitris Verraros Date: Thu, 15 May 2014 14:30:31 +0200 Subject: [PATCH 06/22] Add external access section on MySQLs add-on (cherry picked from commit 630a6b4f2229b62a0f1a30ea93a37cddf154b88c) --- Add-on Documentation/Data Storage/MySQLs.md | 40 +++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 07054db..bba85a7 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -54,3 +54,43 @@ 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://community.exoscale.ch/apps/Platform%20Documentation#add-ons) in the general documentation. + +### External Access + +External access to the MySQLs add-on is available through an SSL encrypted connection by following these simple steps. + + 1. Download the [certificate file](https://to.be.filled.com/ca-cert.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/ca-cert.pem +~~~ + +Replace the uppercase variables with the corresponding values shown by the addon command. + +~~~ +$ exoapp APP_NAME/DEP_NAME addon mysqls.OPTION +Addon : mysqls.512mb + +Settings + +MYSQLS_DATABASE : SOME_DATABASE_NAME +MYSQLS_HOSTNAME : mysql.app.exo.io +MYSQLS_PORT : 3306 +MYSQLS_PASSWORD : SOME_SECRET_PASSWORD +MYSQLS_USERNAME : SOME_SECRET_USERNAME +~~~ + +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/ca-cert.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/ca-cert.pem MYSQLS_DATABASE < MYSQLS_DATABASE.sql +~~~ From dec6ffdf0dc525f8799b3a80d840f24234d85dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Reni=C3=A9?= Date: Wed, 25 Jun 2014 10:15:43 +0200 Subject: [PATCH 07/22] Provide ca-cert URL --- Add-on Documentation/Data Storage/MySQLs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index bba85a7..a6debec 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -59,7 +59,7 @@ in 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](https://to.be.filled.com/ca-cert.pem) to your local machine. + 1. Download the [certificate file](https://community.exoscale.ch/static/apps/ca-cert.pem) to your local machine. 1. Connect to the database using an SSL encrypted connection. The following example uses the MySQL command line tool. From cccd908286a45b29b75f3b786fb2a4a36ea87c24 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 4 Jul 2014 10:22:06 +0200 Subject: [PATCH 08/22] Describe mysqls replication and failover --- Add-on Documentation/Data Storage/MySQLs.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index a6debec..5306c92 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. +Every deployment can access a highly available shared MySQL add-on with databases guaranteed to be located in Exoscale datacenters in Switzerland. ## Adding the MySQLs Add-on @@ -39,9 +39,8 @@ $ exoapp APP_NAME/DEP_NAME addon.remove mysqls.OPTION ## Replication and Failover -All instances are master-slave replicated. 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 data is synchronously replicated in our robust multi master +[MariaDB](https://mariadb.org/) [Galera](http://galeracluster.com/) cluster. No slave lag or lost transactions. We provide high available access with our smart load balancers. By periodically checks, nodes in maintenance or failure state are automatically excluded from the load balancers database backend pool. That assures that requests are routed to healthy nodes only. ## Database Credentials @@ -55,6 +54,12 @@ creds.json file please refer to the section about [Add-on Credentials](https://community.exoscale.ch/apps/Platform%20Documentation#add-ons) in the general documentation. +Most database drivers provide a reconnect on connection issues when you add **autoReconnect=true** parameter to your database uri. This should be enabled to have the most stable setup. For example with Java: +~~~ +jdbc:mysql://{MYSQLS_HOSTNAME}:{MYSQLS_PORT}/{MYSQLS_DATABASE}?autoReconnect=true +~~~ + + ### External Access External access to the MySQLs add-on is available through an SSL encrypted connection by following these simple steps. From beef34486d8d4258f450ec7087b88cee1422336a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Reni=C3=A9?= Date: Fri, 4 Jul 2014 14:25:36 +0200 Subject: [PATCH 09/22] exoscale --- Add-on Documentation/Data Storage/MySQLs.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 5306c92..4f73d18 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -1,6 +1,7 @@ # MySQLs: Shared MySQL Add-on -Every deployment can access a highly available shared MySQL add-on with databases guaranteed to be located in Exoscale datacenters in Switzerland. +Every deployment can access a highly available shared MySQL add-on with +databases guaranteed to be located in exoscale datacenters in Switzerland. ## Adding the MySQLs Add-on From 6cdfc8bc575955e00b614def05a16f3a46e56863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20=C3=81lvarez?= Date: Tue, 8 Jul 2014 17:20:08 +0200 Subject: [PATCH 10/22] Introduce fastapp.exo.io in platform documentation - Provided Subdomains and Custom Domains - Routing Tier - Performance & Caching - WebSockets --- Platform Documentation.md | 76 +++++++++++++++++++++++++++++++++------ 1 file changed, 65 insertions(+), 11 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index f0bf4c8..3ba17f4 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -13,7 +13,7 @@
  • Provided Subdomains and Custom Domains
  • Routing Tier
  • Scaling
  • -
  • Performance
  • +
  • Performance & Caching
  • WebSockets
  • Scheduled Jobs and Background Workers
  • Secure Shell (SSH)
  • @@ -504,29 +504,46 @@ From now on all the new logs should be visible in your custom syslog remote. **TL;DR:** - * Each deployment is provided with a `*.app.exo.io` subdomain. + * Each deployment is provided with both a `*.app.exo.io` and `*.fastapp.exo.io` subdomain. * Custom domains are supported via the Alias Add-on. -Each deployment is provided per default with a `*.app.exo.io` subdomain. The `APP_NAME.app.exo.io` will point to the `default` deployment while any additional deployment can be accessed with a prefixed subdomain: `DEP_NAME-APP_NAME.app.exo.io`. +Each deployment is provided per default with both a `*.app.exo.io` and `*.fastapp.exo.io` subdomain. The `APP_NAME.app.exo.io` or `APP_NAME.fastapp.exo.io` will point to the `default` deployment while any additional deployment can be accessed with a prefixed subdomain: `DEP_NAME-APP_NAME.app.exo.io` or `DEP_NAME-APP_NAME.fastapp.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.app.exo.io`. 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.app.exo.io` or `awesomeapp.fastapp.exo.io`. 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 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. +### Root Domains + +Root domains (e.g. "example.com") can also be added but are not directly +supported. While you theoretically can add a CNAME record for your root +domain, you have to be aware that no other record for this domain can +be set then. ("A CNAME record is not allowed to coexist with any other +data", http://tools.ietf.org/html/rfc1912). From the point you set a +CNAME, all standard-compliant DNS servers will ignore any other entry you +might have set for your zone (e.g. SOA, NS or MX records). + +You can circumvent this limitation by using a DNS provider which provides +CNAME-like functionality for root domains, often called ANAME or ALIAS. + +An alternative is to use a redirection service to send users from the +root to the configured subdomain (e.g. example.org -> www.example.org). + ## Routing Tier **TL;DR:** * All HTTP requests are routed via our routing tier. - * Within the routing tier, requests are routed via the `*.app.exo.io` subdomain. + * Within the routing tier, you can choose to route requests via the `*.app.exo.io` or `*.fastapp.exo.io` subdomains. * The `*.app.exo.io` subdomain provides WebSocket support. + * The `*.fastapp.exo.io` subdomain provides support for HTTP caching via Varnish. * 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 `*.app.exo.io` subdomain. +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 `*.app.exo.io` or `*.fastapp.exo.io` subdomains. 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. @@ -540,7 +557,7 @@ Given that client requests don't hit your application directly, but are forwarde ### 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. 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. The values differ slightly between the `*.app.exo.io` and `*.fastapp.exo.io` subdomains. 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. * __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. @@ -554,22 +571,34 @@ Our routing tier uses a cluster of reverse proxy loadbalancers to manage the acc |Send timeout|55| |Read timeout|55| +#### Timeouts for `*.fastapp.exo.io` subdomain: + +|Parameter|Value [s]| +|:---------|:----------:| +|Connect timeout|60| +|Send timeout|60| +|Read timeout|120| + ### 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. ### High Availability -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. +The routing tier provides two mechanisms to ensure high availability, depending on the provided subdomain. These are Health Checker (for the `*.app.exo.io` subdomain) and Failover (for the `*.fastapp.exo.io` 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. -#### Health Checker +#### `*.app.exo.io` subdomain For the `*.app.exo.io` 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. +#### `*.fastapp.exo.io` subdomain + +For the `*.fastapp.exo.io` 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. + ## Scaling @@ -592,22 +621,46 @@ Deployments with --containers 1 (the default) are unavailable for a few minutes 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 +## Performance & Caching **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 `*.fastapp.exo.io` 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.fastapp.exo.io` 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. + +### 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. + +### Caching in app.exo.io subdomain + +Requests via the `*.app.exo.io` 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 `*.fastapp.exo.io`subdomain. For example, you can serve the dynamic requests of your application via www.example.com (a CNAME FOR `example.app.exo.io`) and serve the static assets like CSS, JS and images via `static.example.com` (a CNAME for `example.fastapp.exo.io`). + ## WebSockets **TL;DR:** - * WebSockets are supported via the Routing Tier. + * WebSockets are supported via the `*.app.exo.io` 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://`. @@ -762,6 +815,7 @@ $ exoapp APP_NAME/DEP_NAME details [rsyslog]: http://www.rsyslog.com/ [TLS]: http://en.wikipedia.org/wiki/Transport_Layer_Security [Alias Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Alias/ +[Varnish]: https://www.varnish-cache.org/ [Cron Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Cron/ [Cron Add-on documentation]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Cron [Worker Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Processing/Worker/ From 1e92cbd1f05d4d7988ed98111bc64220968724fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Reni=C3=A9?= Date: Thu, 10 Jul 2014 13:13:36 +0200 Subject: [PATCH 11/22] Fix slug --- Platform Documentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index 3ba17f4..a05bbf7 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -13,7 +13,7 @@
  • Provided Subdomains and Custom Domains
  • Routing Tier
  • Scaling
  • -
  • Performance & Caching
  • +
  • Performance & Caching
  • WebSockets
  • Scheduled Jobs and Background Workers
  • Secure Shell (SSH)
  • From 0c08390b44d330f4434eb26d75c393e9d931cba2 Mon Sep 17 00:00:00 2001 From: Peter Elsayeh Date: Mon, 29 Sep 2014 14:58:49 +0200 Subject: [PATCH 12/22] Update Add-on credentials.md for NodeJS guide, for exo-mirror Minor fix discovered by exoscale where parameter HOST and USER should be substituted to HOSTNAME and USERNAME, for exo-mirror branch --- Guides/NodeJS/Add-on credentials.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Guides/NodeJS/Add-on credentials.md b/Guides/NodeJS/Add-on credentials.md index 664680a..037cb7e 100644 --- a/Guides/NodeJS/Add-on credentials.md +++ b/Guides/NodeJS/Add-on credentials.md @@ -58,9 +58,9 @@ var creds = JSON.parse( fs.readFileSync(process.env.CRED_FILE) ); -var host = creds.MYSQLS.MYSQLS_HOST; +var host = creds.MYSQLS.MYSQLS_HOSTNAME; var database = creds.MYSQLS.MYSQLS_DATABASE; -var user = creds.MYSQLS.MYSQLS_USER; +var user = creds.MYSQLS.MYSQLS_USERNAME; var password = creds.MYSQLS.MYSQLS_PASSWORD; var port = creds.MYSQLS.MYSQLS_PORT; From 026dc04ccebb4b937f2cd7c09f4102bca3fb4559 Mon Sep 17 00:00:00 2001 From: Stefano Marengo Date: Fri, 10 Oct 2014 18:05:44 +0200 Subject: [PATCH 13/22] replaced and updated all the links but the addon series --- .../Data Processing/Worker.md | 2 +- Add-on Documentation/Data Storage/MySQLs.md | 2 +- Guides/Java/Add-on credentials.md | 6 ++-- Guides/Java/Java - HelloWorld.md | 4 +-- Guides/Java/Java - Spring.md | 4 +-- Guides/NodeJS/Add-on credentials.md | 4 +-- Guides/NodeJS/HelloWorld.md | 4 +-- Guides/NodeJS/Sailsjs.md | 6 ++-- Guides/PHP/Add-on credentials.md | 4 +-- Guides/PHP/HelloWorld.md | 6 ++-- Guides/Python/Add-on credentials.md | 4 +-- Guides/Python/Django notes.md | 8 ++--- Guides/Python/Django.md | 18 +++++----- Guides/Python/HelloWorld.md | 2 +- Guides/Python/Tornado.md | 2 +- Guides/Ruby/Add-on credentials.md | 4 +-- Guides/Ruby/HelloWorld.md | 6 ++-- Guides/Ruby/Ruby on Rails.md | 10 +++--- Guides/Ruby/RubyNotes.md | 2 +- .../Third-Party Buildpacks.md | 2 +- Platform Documentation.md | 35 ++++--------------- Quickstart.md | 2 +- 22 files changed, 57 insertions(+), 80 deletions(-) diff --git a/Add-on Documentation/Data Processing/Worker.md b/Add-on Documentation/Data Processing/Worker.md index b5f5214..ebbeede 100644 --- a/Add-on Documentation/Data Processing/Worker.md +++ b/Add-on Documentation/Data Processing/Worker.md @@ -75,7 +75,7 @@ For more details refer to the [PHP example](#php-worker-example) below. ## Worker log -As already explained in the [Logging section](https://community.exoscale.ch/apps/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://community.exoscale.ch/apps/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. ~~~ $ exoapp APP_NAME/DEP_NAME log worker diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 4f73d18..c75e281 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -52,7 +52,7 @@ 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://community.exoscale.ch/apps/Platform%20Documentation#add-ons) +[Add-on Credentials](https://community.exoscale.ch/apps/documentation/#add-ons) in the general documentation. Most database drivers provide a reconnect on connection issues when you add **autoReconnect=true** parameter to your database uri. This should be enabled to have the most stable setup. For example with Java: diff --git a/Guides/Java/Add-on credentials.md b/Guides/Java/Add-on credentials.md index c96bda0..6105748 100644 --- a/Guides/Java/Add-on credentials.md +++ b/Guides/Java/Add-on credentials.md @@ -75,9 +75,9 @@ Remember, you can always refer to the addon.creds command to see the actual vari [Java application with MySQL]: https://github.com/cloudControl/java-mysql-example-app [Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ -[environment variables]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables -[Add-on credentials]: https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials -[cred-env-vars]: https://community.exoscale.ch/apps/Platform%20Documentation#enabling-disabling-credentials-environment-variables +[environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables +[Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials +[cred-env-vars]: https://community.exoscale.ch/apps/documentation/#enabling-disabling-credentials-environment-variables [json-simple]: http://code.google.com/p/json-simple/ [exoscale credentials helper class]: https://gist.github.com/b350762c61fcc069b427 [MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index 600038f..0ddd628 100644 --- a/Guides/Java/Java - HelloWorld.md +++ b/Guides/Java/Java - HelloWorld.md @@ -129,7 +129,7 @@ Congratulations, you can now see your Jetty Application running at `http[s]://AP [Jetty]: http://jetty.codehaus.org/jetty/ [exoscale]: https://www.exoscale.ch/ [Java buildpack]: https://github.com/cloudControl/buildpack-java -[exoscale-command-line-client]: https://community.exoscale.ch/apps/Platform%20Documentation#command-line-client-web-console-and-api +[exoscale-command-line-client]: https://community.exoscale.ch/apps/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://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index 983ac61..2c8716f 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -150,6 +150,6 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.app.exo.io` . [Database credentials]: Add-on%20credentials [Jetty Runner]: http://wiki.eclipse.org/Jetty/Howto/Using_Jetty_Runner [exoscale]: http://exoscale.ch -[file system]: https://community.exoscale.ch/apps/Platform%20Documentation#non-persistent-filesystem -[log command]: https://community.exoscale.ch/apps/Platform%20Documentation#logging +[file system]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem +[log command]: https://community.exoscale.ch/apps/documentation/#logging [Shared MySQL Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs diff --git a/Guides/NodeJS/Add-on credentials.md b/Guides/NodeJS/Add-on credentials.md index 037cb7e..1cf7382 100644 --- a/Guides/NodeJS/Add-on credentials.md +++ b/Guides/NodeJS/Add-on credentials.md @@ -69,6 +69,6 @@ var port = creds.MYSQLS.MYSQLS_PORT; Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. [Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation -[environment variables]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables +[environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables [MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ -[Add-on credentials]:https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials +[Add-on credentials]:https://community.exoscale.ch/apps/documentation/#add-on-credentials diff --git a/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index 18de022..0669572 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -109,5 +109,5 @@ Congratulations, you can now see your Node.js app running at [npm]: https://npmjs.org/ [exoscale]: http://www.exoscale.ch [Node.js buildpack]: https://github.com/cloudControl/buildpack-nodejs -[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile -[platform documentation]: https://community.exoscale.ch/apps/Platform%20Documentation +[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile +[platform documentation]: https://community.exoscale.ch/apps/documentation/ diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index 1045e80..827a2dc 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/ [exoscale]: http://www.exoscale.ch -[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile -[get the MySQL credentials]: https://community.exoscale.ch/apps/Guides/NodeJS/Add-on%20credentials +[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile +[get the MySQL credentials]: https://community.exoscale.ch/tutorial/nodejs-app-add-on-credentials/ [websockets]: http://socket.io/ -[exoscale websockets documentation]: https://community.exoscale.ch/apps/Platform%20Documentation#websockets +[exoscale websockets documentation]: https://community.exoscale.ch/apps/documentation/#websockets [Shared MySQL Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs diff --git a/Guides/PHP/Add-on credentials.md b/Guides/PHP/Add-on credentials.md index 9b97f1f..fb2701e 100644 --- a/Guides/PHP/Add-on credentials.md +++ b/Guides/PHP/Add-on credentials.md @@ -58,7 +58,7 @@ $password = $creds['MYSQLS']['MYSQLS_PASSWORD']; Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[env-vars]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables -[Add-on credentials]: https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials +[env-vars]: https://community.exoscale.ch/apps/documentation/#environment-variables +[Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials [Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ [MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 8c42f28..9e17c43 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.a [silex]: http://silex.sensiolabs.org/ [exoscale]: http://www.exoscale.ch -[exoscale-doc-user]: https://community.exoscale.ch/apps/Platform%20Documentation#user-accounts -[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/Platform%20Documentation#command-line-client-web-console-and-api "documentation of the exoscale-command-line-client" +[exoscale-doc-user]: https://community.exoscale.ch/apps/documentation/#user-accounts +[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/documentation/#command-line-client-web-console-and-api "documentation of the exoscale-command-line-client" [php buildpack]: https://github.com/cloudControl/buildpack-php -[procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[procfile]: https://community.exoscale.ch/apps/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/Python/Add-on credentials.md b/Guides/Python/Add-on credentials.md index 0440aa3..731717c 100644 --- a/Guides/Python/Add-on credentials.md +++ b/Guides/Python/Add-on credentials.md @@ -83,8 +83,8 @@ db_config = { Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[env-vars]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables -[Add-on credentials]: https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials +[env-vars]: https://community.exoscale.ch/apps/documentation/#environment-variables +[Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials [Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ [Custom Config Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config/ [MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index e0eb048..2dfed0f 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -22,12 +22,12 @@ exoapp APP_NAME/DEP_NAME run "python manage.py syncdb" ## Databases To use a database, have a look at the [Shared MySQL Add-on][Shared MySQL Add-on]. To get the credentials of your database, refer to the [Add-on credentials][add-on-credentials] article. -[SSH-session]: https://community.exoscale.ch/apps/Platform%20Documentation#secure-shell-ssh +[SSH-session]: https://community.exoscale.ch/apps/documentation/#secure-shell-ssh [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ -[procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile [messaging-addons]: https://community.exoscale.ch/apps/Add-on%20Documentation/Messaging%20&%20Mobile/ [Shared MySQL Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs -[add-on-credentials]: https://community.exoscale.ch/apps/Guides/Python/Add-on%20credentials +[add-on-credentials]: https://community.exoscale.ch/tutorial/python-app-add-on-credentials [exoscale]: https://www.exoscale.ch/ -[worker]: https://community.exoscale.ch/apps/Platform%20Documentation#scheduled-jobs-and-background-workers +[worker]: https://community.exoscale.ch/apps/documentation/#scheduled-jobs-and-background-workers diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index a47617d..e95b303 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -137,22 +137,22 @@ For additional information take a look at [Django Notes][django-notes] and other [django]: https://www.djangoproject.com/ [exoscale]: http://www.exoscale.ch -[exoscale-doc-user]: https://community.exoscale.ch/apps/Platform%20Documentation#user-accounts -[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/Platform%20Documentation#command-line-client-web-console-and-api -[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[exoscale-doc-user]: https://community.exoscale.ch/apps/documentation/#user-accounts +[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/documentation/#command-line-client-web-console-and-api +[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git -[filesystem]: https://community.exoscale.ch/apps/Platform%20Documentation#non-persistent-filesystem +[filesystem]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem [data-storage-addons]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/ [mysqls]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs [example-app]: https://github.com/cloudControl/python-django-example-app -[django-notes]: https://community.exoscale.ch/apps/Guides/Python/Django%20notes -[get-conf]: https://community.exoscale.ch/apps/Guides/Python/Add-on%20credentials +[django-notes]: https://community.exoscale.ch/tutorial/python-app-django-notes +[get-conf]: https://community.exoscale.ch/tutorial/python-app-add-on-credentials [Django tutorial]: https://docs.djangoproject.com/en/1.4/intro/tutorial01/ -[python-guides]: https://community.exoscale.ch/apps/Guides/Python +[python-guides]: https://community.exoscale.ch/tutorials/tagged/python [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ [gunicorn]: http://gunicorn.org/ -[worker]: https://community.exoscale.ch/apps/Platform%20Documentation#scheduled-jobs-and-background-workers +[worker]: https://community.exoscale.ch/apps/documentation/#scheduled-jobs-and-background-workers [db-commit]: https://github.com/cloudControl/python-django-example-app/commit/983f45e46ce0707476cec167ea062e19adcb53c9 -[ssh-session]: https://community.exoscale.ch/apps/Platform%20Documentation#secure-shell-ssh +[ssh-session]: https://community.exoscale.ch/apps/documentation/#secure-shell-ssh [mysql-driver]: https://pypi.python.org/pypi/MySQL-python/1.2.4 diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index 627aeb7..cb10b58 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.a [Flask]: http://flask.pocoo.org/ [exoscale]: http://www.exoscale.ch [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://community.exoscale.ch/apps/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 5736983..ca891a8 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.ap [Tornado]: http://www.tornadoweb.org [exoscale]: http://www.exoscale.ch [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile diff --git a/Guides/Ruby/Add-on credentials.md b/Guides/Ruby/Add-on credentials.md index f4db598..0df22bd 100644 --- a/Guides/Ruby/Add-on credentials.md +++ b/Guides/Ruby/Add-on credentials.md @@ -78,7 +78,7 @@ db_config = { Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[Add-on credentials]: https://community.exoscale.ch/apps/Platform%20Documentation#add-on-credentials -[environment variables]: https://community.exoscale.ch/apps/Platform%20Documentation#environment-variables +[Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials +[environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables [Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ [MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index 1835520..266e26f 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/ [exoscale]: http://www.exoscale.ch -[exoscale-doc-user]: https://community.exoscale.ch/apps/Platform%20Documentation#user-accounts -[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/Platform%20Documentation#command-line-client-web-console-and-api +[exoscale-doc-user]: https://community.exoscale.ch/apps/documentation/#user-accounts +[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/documentation/#command-line-client-web-console-and-api [ruby buildpack]: https://github.com/cloudControl/buildpack-ruby -[procfile]: https://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile +[procfile]: https://community.exoscale.ch/apps/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 b4032e6..9fa2d0e 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -190,10 +190,10 @@ 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://community.exoscale.ch/apps/Platform%20Documentation#buildpacks-and-the-procfile -[filesystem]: https://community.exoscale.ch/apps/Platform%20Documentation#non-persistent-filesystem -[run command]: https://community.exoscale.ch/apps/Guides/Ruby/RunCommand -[rails-notes]: https://community.exoscale.ch/apps/Guides/Ruby/RailsNotes -[ruby-guides]: https://community.exoscale.ch/apps/Guides/Ruby +[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile +[filesystem]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem +[run command]: https://community.exoscale.ch/tutorial/ruby-app-runcommand +[rails-notes]: https://community.exoscale.ch/tutorial/ruby/ruby-app-rubynotes +[ruby-guides]: https://community.exoscale.ch/tutorials/tagged/ruby [gem itself]: http://rubygems.org/gems/cloudcontrol-rails [MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index 8c9ab4a..3e48f56 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://community.exoscale.ch/apps/Platform%20Documentation#version-control-images +[procfile]: https://community.exoscale.ch/apps/documentation/#version-control-images [rails-procfile]: #rails-procfile [ruby-buildpack]: https://github.com/cloudControl/buildpack-ruby diff --git a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md index dbd786d..59897a8 100644 --- a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md +++ b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md @@ -39,7 +39,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. [exoscale]: https://www.exoscale.ch -[PinkyStack]: https://community.exoscale.ch/apps/Platform%20Documentation#stacks +[PinkyStack]: https://community.exoscale.ch/apps/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 3ba17f4..cf8ff6b 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -1,26 +1,3 @@ - - # exoscale Apps Documentation ## Platform Access @@ -418,11 +395,11 @@ this feature. The guides section has detailed examples about how to get the credentials in different languages -([Ruby](https://community.exoscale.ch/apps/Guides/Ruby/Add-on%20credentials), -[Python](https://community.exoscale.ch/apps/Guides/Python/Add-on%20credentials), -[Node.js](https://community.exoscale.ch/apps/Guides/NodeJS/Add-on%20credentials), -[Java](https://community.exoscale.ch/apps/Guides/Java/Add-on%20credentials), -[PHP](https://community.exoscale.ch/apps/Guides/PHP/Add-on%20credentials)). +([Ruby](https://community.exoscale.ch/tutorial/ruby-app-add-on-credentials), +[Python](https://community.exoscale.ch/tutorial/python-app-add-on-credentials), +[Node.js](https://community.exoscale.ch/tutorial/nodejs-app-add-on-credentials), +[Java](https://community.exoscale.ch/tutorial/java-app-add-on-credentials), +[PHP](https://community.exoscale.ch/tutorial/php-app-add-on-credentials)). To see the format and contents of the credentials file locally, use the `addon.creds` command. ~~~ @@ -809,7 +786,7 @@ $ exoapp APP_NAME/DEP_NAME details [Python 2.6+]: http://python.org/download/ [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ [Heroku buildpack API]: https://devcenter.heroku.com/articles/buildpack-api -[guides]: https://community.exoscale.ch/apps/Guides +[guides]: https://community.exoscale.ch/apps/tutorials [Add-on marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation [Deployment category]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment [rsyslog]: http://www.rsyslog.com/ diff --git a/Quickstart.md b/Quickstart.md index 43c8b6d..7e4bcdc 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -120,6 +120,6 @@ to have the most important command line client commands handy at all times. 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://community.exoscale.ch/apps/Platform%20Documentation). +[platform documentation](https://community.exoscale.ch/apps/documentation/). [installer]: http://cctrl.s3-website-eu-west-1.amazonaws.com/#windows/ From 8c46dfd1b1dc2fe83e5d5b7eada099227a933f41 Mon Sep 17 00:00:00 2001 From: Stefano Marengo Date: Tue, 14 Oct 2014 11:19:11 +0200 Subject: [PATCH 14/22] fixed wrong in-page link --- Guides/Java/Add-on credentials.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Guides/Java/Add-on credentials.md b/Guides/Java/Add-on credentials.md index 6105748..ffe19db 100644 --- a/Guides/Java/Add-on credentials.md +++ b/Guides/Java/Add-on credentials.md @@ -77,7 +77,7 @@ Remember, you can always refer to the addon.creds command to see the actual vari [Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ [environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables [Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials -[cred-env-vars]: https://community.exoscale.ch/apps/documentation/#enabling-disabling-credentials-environment-variables +[cred-env-vars]: https://community.exoscale.ch/apps/documentation/#enablingdisabling-credentials-environment-variables [json-simple]: http://code.google.com/p/json-simple/ [exoscale credentials helper class]: https://gist.github.com/b350762c61fcc069b427 [MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ From 58dc0156049c0071a4c1d594b3d927fc8bdafccc Mon Sep 17 00:00:00 2001 From: Stefano Marengo Date: Mon, 20 Oct 2014 11:40:52 +0200 Subject: [PATCH 15/22] fixed addons links --- Add-on Documentation/Deployment/Cron.md | 2 +- Guides/Java/AWS S3.md | 2 +- Guides/Java/Add-on credentials.md | 4 ++-- Guides/Java/Java - Spring.md | 2 +- Guides/NodeJS/AWS S3.md | 2 +- Guides/NodeJS/Add-on credentials.md | 4 ++-- Guides/NodeJS/Sailsjs.md | 2 +- Guides/PHP/Add-on credentials.md | 4 ++-- Guides/PHP/Zend 2.md | 2 +- Guides/Python/AWS S3.md | 2 +- Guides/Python/Add-on credentials.md | 6 +++--- Guides/Python/Django notes.md | 3 +-- Guides/Python/Django.md | 6 +++--- Guides/Ruby/AWS S3.md | 2 +- Guides/Ruby/Add-on credentials.md | 4 ++-- Guides/Ruby/Ruby on Rails.md | 2 +- Guides/Ruby/RubyNotes.md | 2 +- Platform Documentation.md | 15 +++++++-------- 18 files changed, 32 insertions(+), 34 deletions(-) diff --git a/Add-on Documentation/Deployment/Cron.md b/Add-on Documentation/Deployment/Cron.md index eba1472..a10deda 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -29,7 +29,7 @@ Before you can add a Cron job, the Add-on itself has to be added: $ exoapp APP_NAME/DEP_NAME addon.add cron.OPTION ~~~ -As always the different options are listed on the [Cron Add-on](https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Cron/) page. +As always the different options are listed on the [Cron Add-on](https://community.exoscale.ch/tutorial/cron-add-on/) page. ## Adding a url for the Cron job diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index 7c5ac62..6635e1b 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://community.exoscale.ch/apps/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://community.exoscale.ch/tutorial/custom-config-add-on/): ~~~bash $ exoapp 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 ffe19db..edc6259 100644 --- a/Guides/Java/Add-on credentials.md +++ b/Guides/Java/Add-on credentials.md @@ -74,10 +74,10 @@ String password = System.getenv("MYSQLS_PASSWORD"); Remember, you can always refer to the addon.creds command to see the actual variable names and values. [Java application with MySQL]: https://github.com/cloudControl/java-mysql-example-app -[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ +[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ [environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables [Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials [cred-env-vars]: https://community.exoscale.ch/apps/documentation/#enablingdisabling-credentials-environment-variables [json-simple]: http://code.google.com/p/json-simple/ [exoscale credentials helper class]: https://gist.github.com/b350762c61fcc069b427 -[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ +[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index 2c8716f..c367b7e 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.app.exo.io` . [exoscale]: http://exoscale.ch [file system]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem [log command]: https://community.exoscale.ch/apps/documentation/#logging -[Shared MySQL Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs +[Shared MySQL Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ diff --git a/Guides/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index b1266cd..c945a2a 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://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config +[Config Add-on]: https://community.exoscale.ch/tutorial/custom-config-add-on/ diff --git a/Guides/NodeJS/Add-on credentials.md b/Guides/NodeJS/Add-on credentials.md index 1cf7382..37da139 100644 --- a/Guides/NodeJS/Add-on credentials.md +++ b/Guides/NodeJS/Add-on credentials.md @@ -68,7 +68,7 @@ var port = creds.MYSQLS.MYSQLS_PORT; Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation +[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ [environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables -[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ +[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ [Add-on credentials]:https://community.exoscale.ch/apps/documentation/#add-on-credentials diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index 827a2dc..e786de9 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://community.exoscale.ch/tutorial/nodejs-app-add-on-credentials/ [websockets]: http://socket.io/ [exoscale websockets documentation]: https://community.exoscale.ch/apps/documentation/#websockets -[Shared MySQL Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs +[Shared MySQL Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ diff --git a/Guides/PHP/Add-on credentials.md b/Guides/PHP/Add-on credentials.md index fb2701e..b4a2fc6 100644 --- a/Guides/PHP/Add-on credentials.md +++ b/Guides/PHP/Add-on credentials.md @@ -60,5 +60,5 @@ Remember, you can always refer to the `addon.creds` command to see the actual va [env-vars]: https://community.exoscale.ch/apps/documentation/#environment-variables [Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials -[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ -[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ +[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ +[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ diff --git a/Guides/PHP/Zend 2.md b/Guides/PHP/Zend 2.md index 5b3ee3d..60b12c6 100644 --- a/Guides/PHP/Zend 2.md +++ b/Guides/PHP/Zend 2.md @@ -188,7 +188,7 @@ $ exoapp 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://community.exoscale.ch/apps/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://community.exoscale.ch/tutorial/mysqls-add-on/). 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 8133e02..cda03d7 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://community.exoscale.ch/apps/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://community.exoscale.ch/tutorial/custom-config-add-on/): ~~~bash $ exoapp 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 731717c..4730351 100644 --- a/Guides/Python/Add-on credentials.md +++ b/Guides/Python/Add-on credentials.md @@ -85,6 +85,6 @@ names and values. [env-vars]: https://community.exoscale.ch/apps/documentation/#environment-variables [Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials -[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ -[Custom Config Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config/ -[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ +[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ +[Custom Config Add-on]: https://community.exoscale.ch/tutorial/custom-config-add-on/ +[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index 2dfed0f..4bcee27 100644 --- a/Guides/Python/Django notes.md +++ b/Guides/Python/Django notes.md @@ -26,8 +26,7 @@ To use a database, have a look at the [Shared MySQL Add-on][Shared MySQL Add-on] [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ [procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile -[messaging-addons]: https://community.exoscale.ch/apps/Add-on%20Documentation/Messaging%20&%20Mobile/ -[Shared MySQL Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs +[Shared MySQL Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ [add-on-credentials]: https://community.exoscale.ch/tutorial/python-app-add-on-credentials [exoscale]: https://www.exoscale.ch/ [worker]: https://community.exoscale.ch/apps/documentation/#scheduled-jobs-and-background-workers diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index e95b303..9eaa978 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -47,7 +47,7 @@ Left from the colon we specified the **required** process type called `web` foll ### Production Database -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 exoscale 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]. +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 exoscale because the filesystem is [not persistent][filesystem]. To use a database, you should choose a data storage Add-on from [the available addons][data-storage-addons]. In this tutorial we use the [Shared MySQL Add-on][mysqls]. Have a look at `mysite/settings.py` so you can find out how to [get the MySQL credentials][get-conf] provided by MySQLs Add-on: @@ -142,8 +142,8 @@ For additional information take a look at [Django Notes][django-notes] and other [Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git [filesystem]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem -[data-storage-addons]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/ -[mysqls]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs +[data-storage-addons]: https://community.exoscale.ch/apps/addons/ +[mysqls]: https://community.exoscale.ch/tutorial/mysqls-add-on/ [example-app]: https://github.com/cloudControl/python-django-example-app [django-notes]: https://community.exoscale.ch/tutorial/python-app-django-notes [get-conf]: https://community.exoscale.ch/tutorial/python-app-add-on-credentials diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index f4f297d..6460b73 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://community.exoscale.ch/apps/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://community.exoscale.ch/tutorial/custom-config-add-on/): ~~~bash $ exoapp 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 0df22bd..cecde44 100644 --- a/Guides/Ruby/Add-on credentials.md +++ b/Guides/Ruby/Add-on credentials.md @@ -80,5 +80,5 @@ Remember, you can always refer to the `addon.creds` command to see the actual va [Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials [environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables -[Add-on Marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation/ -[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ +[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ +[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index 9fa2d0e..cecb1b1 100644 --- a/Guides/Ruby/Ruby on Rails.md +++ b/Guides/Ruby/Ruby on Rails.md @@ -196,4 +196,4 @@ other [ruby-specific documents][ruby-guides]. [rails-notes]: https://community.exoscale.ch/tutorial/ruby/ruby-app-rubynotes [ruby-guides]: https://community.exoscale.ch/tutorials/tagged/ruby [gem itself]: http://rubygems.org/gems/cloudcontrol-rails -[MySQL Shared Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Storage/MySQLs/ +[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index 3e48f56..f604854 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 `RAKE_ENV` environment variables with the [Custom Config addon](https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config/). 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 `RAKE_ENV` environment variables with the [Custom Config addon](https://community.exoscale.ch/tutorial/custom-config-add-on/). For example: ~~~ exoapp APP_NAME/DEP_NAME config.add RACK_ENV=some_env RAILS_ENV=some_env diff --git a/Platform Documentation.md b/Platform Documentation.md index cf8ff6b..d30eb71 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -779,7 +779,7 @@ $ exoapp APP_NAME/DEP_NAME details ~~~ [generating SSH keys]: https://help.github.com/articles/generating-ssh-keys -[Custom Config Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Custom%20Config +[Custom Config Add-on]: https://community.exoscale.ch/tutorial/custom-config-add-on/ [web console]: https://portal.exoscale.ch/applications [API libraries]: https://github.com/cloudControl [the latest version]: http://cctrl.s3-website-eu-west-1.amazonaws.com/#windows/ @@ -787,14 +787,13 @@ $ exoapp 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://community.exoscale.ch/apps/tutorials -[Add-on marketplace]: https://community.exoscale.ch/apps/Add-on%20Documentation -[Deployment category]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment +[Add-on marketplace]: https://community.exoscale.ch/apps/addons/ [rsyslog]: http://www.rsyslog.com/ [TLS]: http://en.wikipedia.org/wiki/Transport_Layer_Security -[Alias Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Alias/ +[Alias Add-on]: https://community.exoscale.ch/tutorial/alias-add-on/ [Varnish]: https://www.varnish-cache.org/ -[Cron Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Cron/ -[Cron Add-on documentation]: https://community.exoscale.ch/apps/Add-on%20Documentation/Deployment/Cron -[Worker Add-on]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Processing/Worker/ -[Worker Add-on documentation]: https://community.exoscale.ch/apps/Add-on%20Documentation/Data%20Processing/Worker +[Cron Add-on]: https://community.exoscale.ch/tutorial/cron-add-on/ +[Cron Add-on documentation]: https://community.exoscale.ch/tutorial/cron-add-on/ +[Worker Add-on]: https://community.exoscale.ch/tutorial/worker-add-on/ +[Worker Add-on documentation]: https://community.exoscale.ch/tutorial/worker-add-on/ [Ubuntu 12.04 LTS Precise Pangolin]: http://releases.ubuntu.com/precise/ From 8ea7659027cd2b2ea0e0fdf6bedcf676604d1506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Reni=C3=A9?= Date: Wed, 19 Nov 2014 13:19:21 +0100 Subject: [PATCH 16/22] Fix windows installer link --- Platform Documentation.md | 2 +- Quickstart.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index d30eb71..a09977e 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -782,7 +782,7 @@ $ exoapp APP_NAME/DEP_NAME details [Custom Config Add-on]: https://community.exoscale.ch/tutorial/custom-config-add-on/ [web console]: https://portal.exoscale.ch/applications [API libraries]: https://github.com/cloudControl -[the latest version]: http://cctrl.s3-website-eu-west-1.amazonaws.com/#windows/ +[the latest version]: https://www.cloudcontrol.com/download/win [Python 2.6+]: http://python.org/download/ [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ [Heroku buildpack API]: https://devcenter.heroku.com/articles/buildpack-api diff --git a/Quickstart.md b/Quickstart.md index 7e4bcdc..cf5506f 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -122,4 +122,4 @@ 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://community.exoscale.ch/apps/documentation/). -[installer]: http://cctrl.s3-website-eu-west-1.amazonaws.com/#windows/ +[installer]: https://www.cloudcontrol.com/download/win From 0058b6168faa0a20c0468f2ac09b49951c59c017 Mon Sep 17 00:00:00 2001 From: Stefano Marengo Date: Thu, 4 Dec 2014 16:50:57 +0100 Subject: [PATCH 17/22] fixed broken links --- Add-on Documentation/Deployment/Cron.md | 5 +++-- Guides/Java/Java - Spring.md | 2 +- Guides/Ruby/Ruby on Rails.md | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Add-on Documentation/Deployment/Cron.md b/Add-on Documentation/Deployment/Cron.md index a10deda..cd128b5 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -1,3 +1,4 @@ + # Cron Add-on ## What are cronjobs? @@ -19,7 +20,7 @@ timelimit. If you need more control over when and how often tasks are run and/or have tasks that take longer than 55 seconds we recommend using the -[Worker](https://www.exoscale.com/add-ons/worker) Add-on. +[Worker](https://community.exoscale.ch/tutorial/worker-add-on) Add-on. ## Adding the Cron Add-on @@ -29,7 +30,7 @@ Before you can add a Cron job, the Add-on itself has to be added: $ exoapp APP_NAME/DEP_NAME addon.add cron.OPTION ~~~ -As always the different options are listed on the [Cron Add-on](https://community.exoscale.ch/tutorial/cron-add-on/) page. +As always the different options are listed on the [Cron Add-on](https://community.exoscale.ch/tutorial/cron-add-on) page. ## Adding a url for the Cron job diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index c367b7e..b2a721a 100644 --- a/Guides/Java/Java - Spring.md +++ b/Guides/Java/Java - Spring.md @@ -147,7 +147,7 @@ Et voila, the app is now up and running at `http[s]://APP_NAME.app.exo.io` . [Spring Roo petclinic]: http://static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sample -[Database credentials]: Add-on%20credentials +[Database credentials]: https://community.exoscale.ch/tutorial/java-app-add-on-credentials [Jetty Runner]: http://wiki.eclipse.org/Jetty/Howto/Using_Jetty_Runner [exoscale]: http://exoscale.ch [file system]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index cecb1b1..924b957 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://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile [filesystem]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem [run command]: https://community.exoscale.ch/tutorial/ruby-app-runcommand -[rails-notes]: https://community.exoscale.ch/tutorial/ruby/ruby-app-rubynotes +[rails-notes]: https://community.exoscale.ch/tutorial/ruby-app-rubynotes [ruby-guides]: https://community.exoscale.ch/tutorials/tagged/ruby [gem itself]: http://rubygems.org/gems/cloudcontrol-rails -[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ +[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on From b83994b21221ab475e99a6a4f831e4b641c91366 Mon Sep 17 00:00:00 2001 From: Stefano Marengo Date: Thu, 4 Dec 2014 16:54:33 +0100 Subject: [PATCH 18/22] there is one more link --- Platform Documentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Platform Documentation.md b/Platform Documentation.md index a09977e..e4bea01 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -786,7 +786,7 @@ $ exoapp APP_NAME/DEP_NAME details [Python 2.6+]: http://python.org/download/ [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ [Heroku buildpack API]: https://devcenter.heroku.com/articles/buildpack-api -[guides]: https://community.exoscale.ch/apps/tutorials +[guides]: https://community.exoscale.ch/tutorials/tagged/apps/ [Add-on marketplace]: https://community.exoscale.ch/apps/addons/ [rsyslog]: http://www.rsyslog.com/ [TLS]: http://en.wikipedia.org/wiki/Transport_Layer_Security From cc88970aa8cba84e46e8efad3337c6ada2e78ba9 Mon Sep 17 00:00:00 2001 From: Stefan Friesel Date: Fri, 2 May 2014 11:20:49 +0200 Subject: [PATCH 19/22] Rebrand SSL Add-on guide and adapt to SNI implementation --- Add-on Documentation/Deployment/SSL.md | 183 +++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 Add-on Documentation/Deployment/SSL.md diff --git a/Add-on Documentation/Deployment/SSL.md b/Add-on Documentation/Deployment/SSL.md new file mode 100644 index 0000000..63c75f6 --- /dev/null +++ b/Add-on Documentation/Deployment/SSL.md @@ -0,0 +1,183 @@ +# SSL Add-on + +Overview: + + * This Add-on provides SSL support for custom domains. + * You need to have an RSA Private Key, an SSL Certificate and a Certificate Chain. + * Add the Add-on to your deployment via our CLI with the [addon.add command](#adding-the-ssl-add-on). + +Secure Socket Layer (SSL) encryption is available for improved security when +transmitting passwords and other sensitive data. + +As part of the provided `.app.exo.io` subdomain, all deployments have +access to piggyback SSL using a `*.app.exo.io` wildcard certificate. +To use this, simply point your browser to: +* `https://APP_NAME.app.exo.io` for the default deployment +* `https://DEP_NAME-APP_NAME.app.exo.io` for non-default deployments + + Please note the **dash** between DEP_NAME and APP_NAME. + +SSL support for custom domains is available through the SSL Add-on. + +## Custom Domain Certificates + +To enable SSL support for custom domains like `www.example.com` or +`secure.example.com`, you need the SSL Add-on. + +Please go through the following steps, which are described in the upcoming +sections, to add SSL support to your deployment: + + * Acquire a signed certificate from your certificate authority of trust. + * Add the SSL Add-on providing the certificate, the private key and the + certificate-chain files. + * Set your DNS entry to point to your SSL DNS Domain. + +Note: Please allow up to one hour for DNS changes to propagate before they take +effect. Root or naked domains like `example.com` without a subdomain are not +supported. + +### Acquiring an SSL Certificate + +There is wide variety of Certificate Authorities (CA) which differ in cost and +process of acquiring an SSL certificate. +[SSLShopper](http://www.sslshopper.com/certificate-authority-reviews.html) +offers an easy way to compare CAs. Some even offer a free trial period. In +most cases, you need to carry out the following steps. + +Note: For testing purposes you can always use a self-signed certificate which +is free of charge and does not require going through the registration process +of individual providers. + +#### Generate a private key + +As mentioned earlier, you need a private key, your certificate and the +certificate chain to enable SSL support. For that process you will need the +`openssl` toolkit which can be installed with one of the following methods +depending on your platform: + +|Platform|Install method| +|:-------|:-------------| +|Mac OS X ([Homebrew](http://brew.sh/))| `brew install openssl`| +|Windows|[Windows package installer](http://gnuwin32.sourceforge.net/packages/openssl.htm)| +|Ubuntu GNU/Linux|`apt-get install openssl`| + + +After you are done with the installation, use the `openssl` command line tool to +proceed with generating your private RSA key: + ~~~ + $ openssl genrsa -des3 -out server.key.org 2048 + # Enter and confirm a passphrase + ~~~ + +#### Removing the passphrase + +The generated key is protected by a passphrase which needs to be removed so +that it can be loaded by the web server. + ~~~ + $ openssl rsa -in server.key.org -out server.key + ~~~ + +Your private key used for the process is now saved in the file `server.key` + +#### Generate a CSR (Certificate Signing Request) + +For acquiring an SSL Certificate, you need to provide your CA with a CSR +(Certificate Signing Request). This can also be used for creating self-signed +certificates. The CSR contains all the information regarding your company or +organization, thus prompting you to enter those: + ~~~ + $ openssl req -new -key server.key -out server.csr + Country Name (2 letter code) [AU]:DE + State or Province Name (full name) [Some-State]: + Locality Name (eg, city) []: + Organization Name (eg, company) [Internet Widgits Pty Ltd]: + Organizational Unit Name (eg, section) []:Information Technology + Common Name (eg, your name or your server's hostname) []:www.example.com + Email Address []: + Please enter the following 'extra' attributes + to be sent with your certificate request + A challenge password []: + An optional company name []: + ~~~ + +The file created after this process is named `server.csr`. + +Note: Please pay attention to the fields Country Name and Common Name. The Country +Name should contain the 2 letter code of your country according to the +[ISO 3166-1](http://www.iso.org/iso/country_codes/iso_3166_code_lists/country_names_and_code_elements.htm) +format. Second and most important is the Common Name. This should reflect the +domain for which you want to issue the certificate. As mentioned earlier, this +cannot be a root domain but needs to have a format like `www.example.com`. + +#### Issuing the Certificate + +After choosing your CA, you have to go through their process of issuing the +certificate. For this you will need the CSR file, which was created in the +previous step. Quite often you will also need define the web server you are +going to use. In this case you should select the Nginx web server, and if this +is not an option then Apache 2.x should also be OK. + +In the end, your CA will provide you with some files including the SSL +certificate and the certificate chain. Your certificate file should have either +a `.crt` or `.pem` extension. Our service requires the certificates to be in +PEM format, so if it isn't, you can transform it with the following command: + ~~~ + $ openssl x509 -inform PEM -in www_example_com.crt -out www_example_com.pem + ~~~ + +The content of the SSL certificate file should look like this: + ~~~ + -----BEGIN CERTIFICATE----- + ... + -----END CERTIFICATE----- + ~~~ + +The certificate chain is a chain of trust which proves that your certificate is +issued by a trustworthy provider authorized by a Root CA. Root CA certificates +are stored in all modern browsers and this is how your browser is able to +verify that a website is secure. In any other case, you will receive a warning +similar to this: + +![Firefox warning](https://s3-eu-west-1.amazonaws.com/cctrl-www-production/custom_assets/attachments/000/000/038/original/ffssl.png) + +You should also have a file which is a bundle of certificates which succeed each other: + ~~~ + -----BEGIN CERTIFICATE----- + ... + -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + ... + -----END CERTIFICATE----- + ~~~ + +Note: If you do not have a certificate bundle but a series of `.crt` files, you +have to place them in the right order starting from the intermediate +certificate and ending to the root certificate. Please make sure that they are +in PEM format. + +### Adding the SSL Add-on + +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] + ~~~ + +In order to check the status of the Add-on, you can do the following. + ~~~ + $ cctrlapp APP_NAME/DEP_NAME addon ssl.host + Addon : ssl.host + + Settings + SSLDEV_CERT_EXPIRES : 2016-01-01 10:00:00 + SSLDEV_DNS_DOMAIN : snip.app.exo.com + SSLDEV_CERT_INCEPTS : 2013-01-01 10:00:00 + ~~~ + +If you want to exchange your certificate (e.g. because it is about to expire), +you can upload the new certificate with the following command: + ~~~ + $ exoapp APP_NAME/DEP_NAME addon.upgrade ssl.host ssl.host --cert path/to/NEW_CERT_FILE --key path/to/KEY_FILE [--chain path/to/CHAIN_FILE] + ~~~ + +Note: If the new certificate has the same chain file, you still need to pass it again. From bd158c8c64d4f5da7d0af9c19c2d609f7eb3ad43 Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Tue, 10 Mar 2015 15:08:47 +0100 Subject: [PATCH 20/22] Update cli name --- .../Data Processing/Worker.md | 20 +++--- 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 | 2 +- Guides/Java/AWS S3.md | 2 +- Guides/Java/Add-on credentials.md | 4 +- Guides/Java/Java - HelloWorld.md | 8 +-- Guides/Java/Java - Spring.md | 8 +-- Guides/NodeJS/AWS S3.md | 2 +- Guides/NodeJS/Add-on credentials.md | 4 +- 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/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.md | 2 +- Platform Documentation.md | 64 +++++++++---------- Quickstart.md | 10 +-- 39 files changed, 261 insertions(+), 261 deletions(-) diff --git a/Add-on Documentation/Data Processing/Worker.md b/Add-on Documentation/Data Processing/Worker.md index ebbeede..124df3c 100644 --- a/Add-on Documentation/Data Processing/Worker.md +++ b/Add-on Documentation/Data Processing/Worker.md @@ -9,7 +9,7 @@ Each worker started via the Worker add-on runs in a seperate isolated container. Before you can start a worker, add the add-on with the addon.add command. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.add worker.single +$ ironcliapp APP_NAME/DEP_NAME addon.add worker.single ~~~ ## Starting a Worker @@ -19,13 +19,13 @@ Workers can be started via the command line client's worker.add command. To specify how to start a worker add a new line to your app's `Procfile` and then use that as the `WORKER_NAME`. ~~~ -$ exoapp APP_NAME/DEP_NAME worker.add WORKER_NAME [WORKER_PARAMS] +$ ironcliapp APP_NAME/DEP_NAME worker.add WORKER_NAME [WORKER_PARAMS] ~~~ Enclose multiple WORKER_PARAMS in double quotes. ~~~ -$ exoapp APP_NAME/DEP_NAME worker.add WORKER_NAME "PARAM1 PARAM2 PARAM3" +$ ironcliapp APP_NAME/DEP_NAME worker.add WORKER_NAME "PARAM1 PARAM2 PARAM3" ~~~ ## List Running Workers @@ -33,7 +33,7 @@ $ exoapp APP_NAME/DEP_NAME worker.add WORKER_NAME "PARAM1 PARAM2 PARAM3" To get a list of currently running workers use the worker command. ~~~ -$ exoapp APP_NAME/DEP_NAME worker +$ ironcliapp APP_NAME/DEP_NAME worker Workers nr. wrk_id 1 WRK_ID @@ -42,7 +42,7 @@ Workers You can also get all the worker details by appending the WRK_ID to the worker command. ~~~ -$ exoapp APP_NAME/DEP_NAME worker WRK_ID +$ ironcliapp APP_NAME/DEP_NAME worker WRK_ID Worker wrk_id : WRK_ID command : WORKER_NAME @@ -58,7 +58,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. ~~~ -$ exoapp APP_NAME/DEP_NAME worker.remove WRK_ID +$ ironcliapp APP_NAME/DEP_NAME worker.remove WRK_ID ~~~ To get the WRK_ID refer to the listing workers section above. @@ -78,7 +78,7 @@ For more details refer to the [PHP example](#php-worker-example) below. As already explained in the [Logging section](https://community.exoscale.ch/apps/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. ~~~ -$ exoapp APP_NAME/DEP_NAME log worker +$ ironcliapp 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 [...] @@ -89,7 +89,7 @@ $ exoapp APP_NAME/DEP_NAME log worker To remove the Worker add-on use the addon.remove command. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.remove worker.single +$ ironcliapp APP_NAME/DEP_NAME addon.remove worker.single ~~~ ## PHP Worker Example @@ -123,8 +123,8 @@ while(true) { Running this worker with the exit code set to 2 would result in the following output and the worker stopping itself. ~~~ -$ exoapp APP_NAME/DEP_NAME worker.add WORKER_NAME 2 -$ exoapp APP_NAME/DEP_NAME log worker +$ ironcliapp APP_NAME/DEP_NAME worker.add WORKER_NAME 2 +$ ironcliapp 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/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index c75e281..9b56cf3 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -8,7 +8,7 @@ databases guaranteed to be located in exoscale datacenters in Switzerland. The database comes in different sizes and prices. It can be added using the addon.add command. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.add mysqls.OPTION +$ ironcliapp APP_NAME/DEP_NAME addon.add mysqls.OPTION ~~~ Replace `mysqls.OPTION` with a valid option, e.g. `mysqls.free`. @@ -17,7 +17,7 @@ Replace `mysqls.OPTION` with a valid option, e.g. `mysqls.free`. To upgrade from one plan to another use the addon.upgrade command. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.upgrade mysqls.OPTION_OLD mysqls.OPTION_NEW +$ ironcliapp APP_NAME/DEP_NAME addon.upgrade mysqls.OPTION_OLD mysqls.OPTION_NEW ~~~ ## Downgrading the MySQLs Add-on @@ -25,7 +25,7 @@ $ exoapp 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. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.downgrade mysqls.OPTION_OLD mysqls.OPTION_NEW +$ ironcliapp APP_NAME/DEP_NAME addon.downgrade mysqls.OPTION_OLD mysqls.OPTION_NEW ~~~ ## Removing the MySQLs Add-on @@ -35,7 +35,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. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.remove mysqls.OPTION +$ ironcliapp APP_NAME/DEP_NAME addon.remove mysqls.OPTION ~~~ ## Replication and Failover @@ -77,7 +77,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. ~~~ -$ exoapp APP_NAME/DEP_NAME addon mysqls.OPTION +$ ironcliapp 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 41ad838..f0f4e2d 100644 --- a/Add-on Documentation/Deployment/Alias.md +++ b/Add-on Documentation/Deployment/Alias.md @@ -8,7 +8,7 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro The verification code is unique to the owner of the app. To get it simply use the alias command. ~~~ - $ exoapp APP_NAME/default alias APP_NAME.app.exo.io + $ ironcliapp APP_NAME/default alias APP_NAME.app.exo.io ~~~ 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. @@ -30,12 +30,12 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro ~~~ # for the default deployment - $ exoapp APP_NAME/default alias + $ ironcliapp APP_NAME/default alias Aliases name default verified APP_NAME.app.exo.io 1 1 # for any additional deployment - $ exoapp APP_NAME/DEP_NAME alias + $ ironcliapp APP_NAME/DEP_NAME alias Aliases name default verified DEP_NAME.APP_NAME.app.exo.io 1 1 @@ -52,13 +52,13 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro Next add the domain as an alias to your deployment using the alias.add command. ~~~ - $ exoapp APP_NAME/DEP_NAME alias.add www.example.com + $ ironcliapp APP_NAME/DEP_NAME alias.add www.example.com ~~~ You should now see your domain in the deployment's list of aliases. ~~~ - $ exoapp APP_NAME/DEP_NAME alias + $ ironcliapp APP_NAME/DEP_NAME alias Aliases name default verified www.example.com 0 0 @@ -72,7 +72,7 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro 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. ~~~ - $ exoapp APP_NAME/DEP_NAME alias + $ ironcliapp APP_NAME/DEP_NAME alias Aliases name default verified www.example.com 0 1 @@ -84,7 +84,7 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro To remove an alias, simply use the alias.remove command. ~~~ -$ exoapp APP_NAME/DEP_NAME alias.remove www.example.com +$ ironcliapp APP_NAME/DEP_NAME alias.remove www.example.com ~~~ ## Special Case: Wildcard Domains @@ -94,13 +94,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. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.upgrade alias.free alias.wildcard +$ ironcliapp APP_NAME/DEP_NAME addon.upgrade alias.free alias.wildcard ~~~ Then add the wildcard domain itself as an alias. ~~~ -$ exoapp APP_NAME/DEP_NAME alias.add *.example.com +$ ironcliapp 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 cd128b5..e824f40 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -27,7 +27,7 @@ tasks that take longer than 55 seconds we recommend using the Before you can add a Cron job, the Add-on itself has to be added: ~~~ -$ exoapp APP_NAME/DEP_NAME addon.add cron.OPTION +$ ironcliapp APP_NAME/DEP_NAME addon.add cron.OPTION ~~~ As always the different options are listed on the [Cron Add-on](https://community.exoscale.ch/tutorial/cron-add-on) page. @@ -38,9 +38,9 @@ To call an URL with the specific interval you write it as the parameter: ~~~ # for the default deployment -$ exoapp APP_NAME/default cron.add http[s]://[user:password@]APP_NAME.app.exo.io +$ ironcliapp APP_NAME/default cron.add http[s]://[user:password@]APP_NAME.app.exo.io # for any additional deployment -$ exoapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.app.exo.io +$ ironcliapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.app.exo.io ~~~ You can only add cron jobs calling a verified alias of the deployment. It is @@ -51,7 +51,7 @@ recommended to use https when sending credentials. Get an overview of all your Cron jobs: ~~~ -$ exoapp APP_NAME/DEP_NAME cron +$ ironcliapp APP_NAME/DEP_NAME cron ~~~ ## Cron details @@ -59,7 +59,7 @@ $ exoapp APP_NAME/DEP_NAME cron Get the details of a specific Cron job: ~~~ -$ exoapp APP_NAME/DEP_NAME cron CRON_ID +$ ironcliapp APP_NAME/DEP_NAME cron CRON_ID Cronjob job_id : jobkqy7rdmg url : http://APP_NAME.app.exo.io @@ -73,7 +73,7 @@ Cronjob You can remove a Cron job by the job_id ~~~ -$ exoapp APP_NAME/DEP_NAME cron.remove JOB_ID +$ ironcliapp APP_NAME/DEP_NAME cron.remove JOB_ID ~~~ ## Upgrading / downgrading the Cron addon @@ -82,13 +82,13 @@ In order to switch from a daily to hourly Cron or vice versa, use the up- or downgrade function ~~~ -$ exoapp APP_NAME/DEP_NAME addon.upgrade cron.free cron.hourly +$ ironcliapp APP_NAME/DEP_NAME addon.upgrade cron.free cron.hourly ~~~ or ~~~ -$ exoapp APP_NAME/DEP_NAME addon.downgrade cron.hourly cron.free +$ ironcliapp 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 @@ -99,7 +99,7 @@ hourly Add-on will stay hourly. Removing the Add-on itself can be done with: ~~~ -$ exoapp APP_NAME/DEP_NAME addon.remove cron.OPTION +$ ironcliapp 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 8dffdc5..70f1aae 100644 --- a/Add-on Documentation/Deployment/Custom Config.md +++ b/Add-on Documentation/Deployment/Custom Config.md @@ -9,7 +9,7 @@ for you to keep your code in separate branches, each with their own configuratio To add configuration settings, simply invoke the config command with the add option, and append the desired `key` / `value` pairs. ~~~bash -$ exoapp APP_NAME/DEP_NAME config.add KEY=VALUE +$ ironcliapp APP_NAME/DEP_NAME config.add KEY=VALUE ~~~ This will automatically add the Config Add-on to your deployment. @@ -19,7 +19,7 @@ be added to your deployment's cred.json file. To set multiple settings at once, simply append more than one `key` / `value` pair. ~~~bash -$ exoapp APP_NAME/DEP_NAME config.add KEY1=VALUE1 KEY2=VALUE2 [...] +$ ironcliapp APP_NAME/DEP_NAME config.add KEY1=VALUE1 KEY2=VALUE2 [...] ~~~ Config parameters can be set using the format shown in first column of the following table. They are then stored in JSON format, as shown in the second column. Multiline arguments can be set using the `\n` escape character. @@ -39,14 +39,14 @@ multiline values to make sure they are stored properly. You can list the existing set of configuration settings by invoking the config command: ~~~bash -$ exoapp APP_NAME/DEP_NAME config +$ ironcliapp APP_NAME/DEP_NAME config KEY1=VALUE1 KEY2=VALUE2 ~~~ To show the value of a specific key, simply append the desired key name: ~~~bash -$ exoapp APP_NAME/DEP_NAME config KEY +$ ironcliapp APP_NAME/DEP_NAME config KEY VALUE ~~~ @@ -55,8 +55,8 @@ VALUE 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 -$ exoapp APP_NAME/DEP_NAME config.add [-f|--force] NEW_PARAM=NEW_VALUE [...] -$ exoapp APP_NAME/DEP_NAME config.remove PARAM1 PARAM2 [...] +$ ironcliapp APP_NAME/DEP_NAME config.add [-f|--force] NEW_PARAM=NEW_VALUE [...] +$ ironcliapp APP_NAME/DEP_NAME config.remove PARAM1 PARAM2 [...] ~~~ Updating the existing settings is also possible using the `add` command. This @@ -68,7 +68,7 @@ the add command. Deleting all the existing configuration settings from a deployment can be done by removing the Add-on. ~~~bash -$ exoapp APP_NAME/DEP_NAME addon.remove config.free +$ ironcliapp 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 63c75f6..6c372d1 100644 --- a/Add-on Documentation/Deployment/SSL.md +++ b/Add-on Documentation/Deployment/SSL.md @@ -177,7 +177,7 @@ In order to check the status of the Add-on, you can do the following. If you want to exchange your certificate (e.g. because it is about to expire), you can upload the new certificate with the following command: ~~~ - $ exoapp APP_NAME/DEP_NAME addon.upgrade ssl.host ssl.host --cert path/to/NEW_CERT_FILE --key path/to/KEY_FILE [--chain path/to/CHAIN_FILE] + $ ironcliapp APP_NAME/DEP_NAME addon.upgrade ssl.host ssl.host --cert path/to/NEW_CERT_FILE --key path/to/KEY_FILE [--chain path/to/CHAIN_FILE] ~~~ Note: If the new certificate has the same chain file, you still need to pass it again. diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index 6635e1b..f6ba4ad 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://community.exoscale.ch/tutorial/custom-config-add-on/): ~~~bash -$ exoapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] +$ ironcliapp 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 edc6259..9f9e2be 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 -$ exoapp APP_NAME/DEP_NAME config.add SET_ENV_VARS=false +$ ironcliapp 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 -$ exoapp APP_NAME/DEP_NAME addon.creds +$ ironcliapp APP_NAME/DEP_NAME addon.creds ~~~ We provide a small [exoscale credentials helper class] to get the Add-on credentials from the file. diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index 0ddd628..39cb021 100644 --- a/Guides/Java/Java - HelloWorld.md +++ b/Guides/Java/Java - HelloWorld.md @@ -85,14 +85,14 @@ The java command starts the 'com.exo.sample.jetty.App' with the classpath set to Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform: ~~~bash -$ exoapp APP_NAME create java +$ ironcliapp APP_NAME create java ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ exoapp APP_NAME/default push +$ ironcliapp APP_NAME/default push -----> Receiving push -----> Installing OpenJDK 1.7(openjdk7.b32.tar.gz)... done @@ -118,10 +118,10 @@ To ssh://APP_NAME@app.exo.io/repository.git 54b0da2..d247825 master -> master ~~~ -Last but not least deploy the latest version of the app with the exoapp deploy command: +Last but not least deploy the latest version of the app with the ironcliapp deploy command: ~~~bash -$ exoapp APP_NAME/default deploy +$ ironcliapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.app.exo.io`. diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index b2a721a..8d7a7e1 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 exoscale platform: ~~~bash -$ exoapp APP_NAME create java +$ ironcliapp APP_NAME create java ~~~ Push your code to the application's repository: ~~~bash -$ exoapp APP_NAME/default push +$ ironcliapp 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@app.exo.io/repository.git Add MySQLs Add-on with free plan to your deployment and deploy it: ~~~bash -$ exoapp APP_NAME/default addon.add mysqls.free -$ exoapp APP_NAME/default deploy --memory=768MB +$ ironcliapp APP_NAME/default addon.add mysqls.free +$ ironcliapp 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/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index c945a2a..de9c555 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 -exoapp APP_NAME/default config.add +ironcliapp 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 37da139..150fe38 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 -$ exoapp APP_NAME/DEP_NAME config.add SET_ENV_VARS=false +$ ironcliapp 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 -$ exoapp APP_NAME/DEP_NAME addon.creds +$ ironcliapp 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/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index 0669572..2177f75 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -52,13 +52,13 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform: ~~~bash -$ exoapp APP_NAME create nodejs +$ ironcliapp APP_NAME create nodejs ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ exoapp APP_NAME/default push +$ ironcliapp APP_NAME/default push Counting objects: 307, done. Delta compression using up to 8 threads. Compressing objects: 100% (261/261), done. @@ -95,10 +95,10 @@ To ssh://APP_NAME@app.exo.io/repository.git * [new branch] master -> master ~~~ -Last but not least, deploy the latest version of the app with the exoapp deploy command: +Last but not least, deploy the latest version of the app with the ironcliapp deploy command: ~~~bash -$ exoapp APP_NAME/default deploy +$ ironcliapp APP_NAME/default 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 e786de9..da8a8c9 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]. For more d To deploy your Sails.js application, choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform: ~~~bash -$ exoapp APP_NAME create nodejs +$ ironcliapp APP_NAME create nodejs ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ exoapp APP_NAME/default push +$ ironcliapp 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@app.exo.io/repository.git Add the [Shared MySQL Add-on]: ~~~bash -$ exoapp APP_NAME/default addon.add mysqls.free +$ ironcliapp APP_NAME/default addon.add mysqls.free ~~~ Finally, deploy the Sails.js application: ~~~bash -$ exoapp APP_NAME/default deploy +$ ironcliapp 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 b4a2fc6..975bf62 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 -$ exoapp APP_NAME/DEP_NAME addon.creds +$ ironcliapp 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/PHP/CakePHP 2.2.1.md b/Guides/PHP/CakePHP 2.2.1.md index e3424e4..b978144 100644 --- a/Guides/PHP/CakePHP 2.2.1.md +++ b/Guides/PHP/CakePHP 2.2.1.md @@ -81,15 +81,15 @@ By running the following commands, this will all be done: git checkout master // create the application - exoapp APP_NAME create php + ironcliapp APP_NAME create php // deploy the default branch - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ##4. Initialise the Required Add-ons @@ -100,16 +100,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 - exoapp APP_NAME/default addon.add mysqls.free + ironcliapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/default addon mysqls.free + ironcliapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - exoapp APP_NAME/testing addon.add mysqls.free + ironcliapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/testing addon mysqls.free + ironcliapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: @@ -127,10 +127,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 - exoapp APP_NAME/default config.add CAKE_ENV=production + ironcliapp APP_NAME/default config.add CAKE_ENV=production // Set the testing environment setting - exoapp APP_NAME/testing config.add CAKE_ENV=testing + ironcliapp APP_NAME/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. @@ -410,15 +410,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 - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy git checkout testing git merge master // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ##7. Review the Deployment diff --git a/Guides/PHP/Drupal 7.md b/Guides/PHP/Drupal 7.md index 4f19406..f393ebc 100644 --- a/Guides/PHP/Drupal 7.md +++ b/Guides/PHP/Drupal 7.md @@ -70,15 +70,15 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application git checkout master // create the application, indicating it's PHP-based - exoapp APP_NAME create php + ironcliapp APP_NAME create php // deploy the default branch - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ##4. Initialise the Required Addons @@ -89,16 +89,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 - exoapp APP_NAME/default addon.add mysqls.free + ironcliapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/default addon mysqls.free + ironcliapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - exoapp APP_NAME/testing addon.add mysqls.free + ironcliapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/testing addon mysqls.free + ironcliapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: @@ -116,10 +116,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 - exoapp APP_NAME/default config.add APPLICATION_ENV=production + ironcliapp APP_NAME/default config.add APPLICATION_ENV=production // Set the testing environment setting - exoapp APP_NAME/testing config.add APPLICATION_ENV=testing + ironcliapp APP_NAME/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. @@ -282,15 +282,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 - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy git checkout testing git merge master // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ##8. Review the Deployment diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 9e17c43..4938921 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 exoscale platform: ~~~bash -$ exoapp APP_NAME create php +$ ironcliapp APP_NAME create php ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~ -$ exoapp APP_NAME/default push +$ ironcliapp 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@app.exo.io/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the exoapp deploy command: +Last but not least deploy the latest version of the app with the ironcliapp deploy command: ~~~bash -$ exoapp APP_NAME/default deploy +$ ironcliapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.app.exo.io`. diff --git a/Guides/PHP/Joomla 2.5.md b/Guides/PHP/Joomla 2.5.md index 68e9acf..32d06d5 100644 --- a/Guides/PHP/Joomla 2.5.md +++ b/Guides/PHP/Joomla 2.5.md @@ -159,15 +159,15 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application git checkout master // create the application - exoapp APP_NAME create php + ironcliapp APP_NAME create php // deploy the default branch - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ##4. Initialise the Required Add-ons @@ -178,16 +178,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 - exoapp APP_NAME/default addon.add mysqls.free + ironcliapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/default addon mysqls.free + ironcliapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - exoapp APP_NAME/testing addon.add mysqls.free + ironcliapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/testing addon mysqls.free + ironcliapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: @@ -205,10 +205,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 - exoapp APP_NAME/default config.add APPLICATION_ENV=production + ironcliapp APP_NAME/default config.add APPLICATION_ENV=production // Set the testing environment settings - exoapp APP_NAME/testing config.add APPLICATION_ENV=testing + ironcliapp APP_NAME/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. @@ -242,15 +242,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 - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy git checkout testing git merge master // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ##7. Review the Deployment @@ -264,11 +264,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - exoapp APP_NAME/default log deploy + ironcliapp APP_NAME/default log deploy ####7.1.1 Errors - exoapp APP_NAME/default log error + ironcliapp APP_NAME/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 d46fbee..415f6f7 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -80,21 +80,21 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application git checkout master // create the application - exoapp APP_NAME create php + ironcliapp APP_NAME create php // deploy the default branch - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ###3.1 Kohana Auto-Detected When you do this, you'll see output similar to the following: - $ exoapp APP_NAME/default push + $ ironcliapp APP_NAME/default push Counting objects: 9, done. Delta compression using up to 2 threads. Compressing objects: 100% (5/5), done. @@ -123,25 +123,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 - exoapp APP_NAME/default addon.add mysqls.free + ironcliapp APP_NAME/default addon.add mysqls.free // Initialise the mysqls.free addon for the testing deployment - exoapp APP_NAME/testing addon.add mysqls.free + ironcliapp APP_NAME/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 - exoapp APP_NAME/default config.add APPLICATION_ENV=production + ironcliapp APP_NAME/default config.add APPLICATION_ENV=production // Add the APPLICATION_ENV variable to testing - exoapp APP_NAME/testing config.add APPLICATION_ENV=testing + ironcliapp APP_NAME/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 - exoapp APP_NAME/testing addon mysqls.free + ironcliapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: @@ -444,12 +444,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 - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy // push the code to the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ##A Simple Application diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index 7b7b86a..df8d1c2 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -80,21 +80,21 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application git checkout master // create the application - exoapp APP_NAME create php + ironcliapp APP_NAME create php // deploy the default branch - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ###3.1 Symfony Auto-Detected When you do this, you'll see output similar to the following: - $ exoapp APP_NAME/default push + $ ironcliapp APP_NAME/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 - exoapp APP_NAME/default addon.add mysqls.free + ironcliapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/default addon mysqls.free + ironcliapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - exoapp APP_NAME/testing addon.add mysqls.free + ironcliapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/testing addon mysqls.free + ironcliapp APP_NAME/testing addon mysqls.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 - exoapp APP_NAME/default config.add APPLICATION_ENV=production + ironcliapp APP_NAME/default config.add APPLICATION_ENV=production // Set the testing environment setting - exoapp APP_NAME/testing config.add APPLICATION_ENV=testing + ironcliapp APP_NAME/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 - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy git checkout testing git merge master // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/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 d891e30..c03c60d 100644 --- a/Guides/PHP/Yii 1.1.10.md +++ b/Guides/PHP/Yii 1.1.10.md @@ -84,19 +84,19 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application git checkout master // create the application - exoapp APP_NAME create php + ironcliapp APP_NAME create php // deploy the default branch - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy You should see output as below: - $ exoapp APP_NAME/default push + $ ironcliapp APP_NAME/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 - exoapp APP_NAME/default addon.add mysqls.free + ironcliapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/default addon mysqls.free + ironcliapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - exoapp APP_NAME/testing addon.add mysqls.free + ironcliapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/testing addon mysqls.free + ironcliapp APP_NAME/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 - exoapp APP_NAME/default config.add APPLICATION_ENV=main + ironcliapp APP_NAME/default config.add APPLICATION_ENV=main // Set the testing environment setting - exoapp APP_NAME/testing config.add APPLICATION_ENV=testing + ironcliapp APP_NAME/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 - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy git checkout testing git merge master // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ##7. Review the Deployment @@ -339,11 +339,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - exoapp APP_NAME/default log deploy + ironcliapp APP_NAME/default log deploy ####7.1.1 Errors - exoapp APP_NAME/default log error + ironcliapp APP_NAME/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 60b12c6..c886847 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 exoscale platform: ~~~bash -$ exoapp APP_NAME create php +$ ironcliapp APP_NAME create php ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ exoapp APP_NAME/default push +$ ironcliapp 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@app.exo.io/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the exoapp deploy command: +Last but not least deploy the latest version of the app with the ironcliapp deploy command: ~~~bash -$ exoapp APP_NAME/default deploy +$ ironcliapp 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 -$ exoapp APP_NAME/default addon.add mysqls.free +$ ironcliapp APP_NAME/default addon.add mysqls.free # initialize the session table -$ exoapp APP_NAME/default run "php code/public/index.php init-session-table" +$ ironcliapp APP_NAME/default run "php code/public/index.php init-session-table" Connecting... [SUCCESS] Session table created. Connection to sshforwarder.app.exo.io closed. diff --git a/Guides/PHP/Zend Framework 1.11.md b/Guides/PHP/Zend Framework 1.11.md index f5fcf53..0d440e2 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 exoscale, we need to do this in a slightly different way. It involves, for each environment, setting an environment variable with the exoapp config add-on, then reading that information from the environment at runtime. We'll come to this shortly. +When using exoscale, we need to do this in a slightly different way. It involves, for each environment, setting an environment variable with the ironcliapp 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 @@ -89,19 +89,19 @@ Choose a unique name to replace the `APP_NAME` placeholder for your application git checkout master // create the application - exoapp APP_NAME create php + ironcliapp APP_NAME create php // deploy the default branch - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy You'll see output similar to the following: - $ exoapp APP_NAME/testing push + $ ironcliapp APP_NAME/testing push Total 0 (delta 0), reused 0 (delta 0) >> Receiving push @@ -122,16 +122,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 - exoapp APP_NAME/default addon.add mysqls.free + ironcliapp APP_NAME/default addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/default addon mysqls.free + ironcliapp APP_NAME/default addon mysqls.free // Initialise the mysqls.free addon for the testing deployment - exoapp APP_NAME/testing addon.add mysqls.free + ironcliapp APP_NAME/testing addon.add mysqls.free // Retrieve the settings - exoapp APP_NAME/testing addon mysqls.free + ironcliapp APP_NAME/testing addon mysqls.free The output of the commands will be similar to that below: @@ -149,10 +149,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 - exoapp APP_NAME/default config.add APPLICATION_ENV=production + ironcliapp APP_NAME/default config.add APPLICATION_ENV=production // Set the testing environment setting - exoapp APP_NAME/testing config.add APPLICATION_ENV=testing + ironcliapp APP_NAME/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. @@ -451,15 +451,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 - exoapp APP_NAME/default push - exoapp APP_NAME/default deploy + ironcliapp APP_NAME/default push + ironcliapp APP_NAME/default deploy git checkout testing git merge master // deploy the testing branch - exoapp APP_NAME/testing push - exoapp APP_NAME/testing deploy + ironcliapp APP_NAME/testing push + ironcliapp APP_NAME/testing deploy ##7. Review the Deployment @@ -477,11 +477,11 @@ To view the information, run the following commands respectively: ####7.1.1 Deployment - exoapp APP_NAME/default log deploy + ironcliapp APP_NAME/default log deploy ####7.1.1 Errors - exoapp APP_NAME/default log error + ironcliapp APP_NAME/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 cda03d7..aa1d9e7 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://community.exoscale.ch/tutorial/custom-config-add-on/): ~~~bash -$ exoapp APP_NAME/default config.add AWS_SECRET_KEY=[YOUR_SECRET_KEY] AWS_ACCESS_KEY=[YOUR_ACCESS_KEY] +$ ironcliapp 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 4730351..ba2a955 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 -$ exoapp APP_NAME/DEP_NAME addon.creds +$ ironcliapp 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 -$ exoapp APP_NAME/DEP_NAME config.add SET_ENV_VARS +$ ironcliapp 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/Django notes.md b/Guides/Python/Django notes.md index 4bcee27..8ae5ee1 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 -exoapp APP_NAME/DEP_NAME run "python manage.py syncdb" +ironcliapp APP_NAME/DEP_NAME run "python manage.py syncdb" ~~~ ## Databases diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index 9eaa978..d7a771e 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -90,13 +90,13 @@ DATABASES = { Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform: ~~~bash -$ exoapp APP_NAME create python +$ ironcliapp APP_NAME create python ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ exoapp APP_NAME/default push +$ ironcliapp APP_NAME/default push Counting objects: 31, done. Delta compression using up to 8 threads. Compressing objects: 100% (25/25), done. @@ -121,14 +121,14 @@ To ssh://APP_NAME@app.exo.io/repository.git Add MySQLs Add-on with `free` plan to your deployment and deploy it: ~~~bash -$ exoapp APP_NAME/default addon.add mysqls.free -$ exoapp APP_NAME/default deploy +$ ironcliapp APP_NAME/default addon.add mysqls.free +$ ironcliapp APP_NAME/default deploy ~~~ Finally, prepare the database using the [Run command][ssh-session] (when prompted create admin user): ~~~bash -$ exoapp APP_NAME/default run "python manage.py syncdb" +$ ironcliapp APP_NAME/default run "python manage.py syncdb" ~~~ You can login to the admin console at `APP_NAME.app.exo.io/admin`, create some polls and see them at `APP_NAME.app.exo.io/polls`. diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index cb10b58..4236774 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 exoscale platform: ~~~bash -$ exoapp APP_NAME create python +$ ironcliapp APP_NAME create python ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ exoapp APP_NAME/default push +$ ironcliapp 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@app.exo.io/repository.git ~~~ -Last but not least deploy the latest version of the app with the exoapp deploy command: +Last but not least deploy the latest version of the app with the ironcliapp deploy command: ~~~bash -$ exoapp APP_NAME/default deploy +$ ironcliapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.app.exo.io`. diff --git a/Guides/Python/Tornado.md b/Guides/Python/Tornado.md index ca891a8..a0d260c 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 exoscale platform: ~~~bash -$ exoapp APP_NAME create python +$ ironcliapp APP_NAME create python ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ exoapp APP_NAME/default push +$ ironcliapp 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@app.exo.io/repository.git + [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the exoapp +Last but not least deploy the latest version of the app with the ironcliapp deploy command. ~~~bash -$ exoapp APP_NAME/default deploy +$ ironcliapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Tornado app running at `http://APP_NAME.app.exo.io`. diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index 6460b73..bd9ce20 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://community.exoscale.ch/tutorial/custom-config-add-on/): ~~~bash -$ exoapp APP_NAME/default config.add AWS_ACCESS_KEY_ID=[YOUR_SECRET_KEY] AWS_SECRET_ACCESS_KEY=[YOUR_ACCESS_KEY] AWS_REGION='eu-west-1' +$ ironcliapp 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 cecde44..de4bb40 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 -$ exoapp APP_NAME/DEP_NAME config.add SET_ENV_VARS=false +$ ironcliapp 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 -$ exoapp APP_NAME/DEP_NAME addon.creds +$ ironcliapp 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 266e26f..51deb5b 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 exoscale platform: ~~~bash -$ exoapp APP_NAME create ruby +$ ironcliapp APP_NAME create ruby ~~~ Push your code to the application's repository, which triggers the deployment image build process: ~~~bash -$ exoapp APP_NAME/default push +$ ironcliapp 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@app.exo.io/repository.git * [new branch] master -> master ~~~ -Last but not least deploy the latest version of the app with the exoapp deploy command: +Last but not least deploy the latest version of the app with the ironcliapp deploy command: ~~~bash -$ exoapp APP_NAME/default deploy +$ ironcliapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME.app.exo.io`. diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index 924b957..1557439 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 exoscale platform: ~~~bash -$ exoapp APP_NAME create ruby +$ ironcliapp APP_NAME create ruby ~~~ Push your code to the application's repository, which triggers the deployment image build process (do it with `mysql` deployment name since we use the same branch in application repo): ~~~bash -$ exoapp APP_NAME/mysql push +$ ironcliapp APP_NAME/mysql 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@app.exo.io/repository.git Add MySQLs Add-on with `free` plan to your deployment and deploy it: ~~~bash -$ exoapp APP_NAME/mysql addon.add mysqls.free -$ exoapp APP_NAME/mysql deploy +$ ironcliapp APP_NAME/mysql addon.add mysqls.free +$ ironcliapp APP_NAME/mysql deploy ~~~ Finally, prepare the database by running migrations using the [Run command][run command]: ~~~bash -$ exoapp APP_NAME/mysql run "rake db:migrate" +$ ironcliapp APP_NAME/mysql run "rake db:migrate" ~~~ Congratulations, you can now access the app at http://mysql-APP_NAME.app.exo.io. diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index f604854..96e22cc 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 `RAKE_ENV` environment variables with the [Custom Config addon](https://community.exoscale.ch/tutorial/custom-config-add-on/). For example: ~~~ -exoapp APP_NAME/DEP_NAME config.add RACK_ENV=some_env RAILS_ENV=some_env +ironcliapp APP_NAME/DEP_NAME 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 6c8aff3..8d62fd6 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 -$ exoapp APP_NAME/DEP_NAME run "rake db:migrate" +$ ironcliapp APP_NAME/DEP_NAME run "rake db:migrate" ~~~ To run rails console: ~~~bash -$ exoapp APP_NAME/DEP_NAME run "rails c" +$ ironcliapp APP_NAME/DEP_NAME run "rails c" ~~~ Here is a full example in which multiple commands are run in remote bash session: ~~~ -$ exoapp APP_NAME/DEP_NAME run bash +$ ironcliapp 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 sshforwarder.app.exo.io closed. The same could be accomplished if the multiple individual commands were chained: ~~~ -$ exoapp APP_NAME/DEPLOYMENT run "rails g scaffold Post title:string content:text && rake db:migrate && rails c" +$ ironcliapp 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/Third-Party Buildpacks.md b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md index 59897a8..10d8bb0 100644 --- a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md +++ b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md @@ -29,7 +29,7 @@ Here is a list of verified and recommended buildpacks for the exoscale 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 -$ exoapp APP_NAME create custom --buildpack BUILDPACK_URL +$ ironcliapp 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 e4bea01..e4ae213 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -8,9 +8,9 @@ * 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 *exoapp* and *exouser*. 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 *ironcliapp* and *ironcliuser*. 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 exoscale platform. The CLI consists of 2 parts: *exoapp* and *exouser*. 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 exoscale platform. The CLI consists of 2 parts: *ironcliapp* and *ironcliuser*. To get help for the command line client, just append --help or -h to any of the commands. Installing the command line clients is easy and works on Mac/Linux as well as on Windows. @@ -56,13 +56,13 @@ An app consists of a repository (with branches) and deployments. Creating an app is easy. Simply specify a name and the desired type to determine which [buildpack](#buildpacks-and-the-procfile) to use. ~~~ -$ exoapp APP_NAME create php +$ ironcliapp APP_NAME create php ~~~ You can always list your existing apps using the command line client too. ~~~ -$ exoapp -l +$ ironcliapp -l Apps Nr Name Type 1 myfirstapp php @@ -76,23 +76,23 @@ 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, exoapp will offer to create one. +line client. If no default key can be found, ironcliapp will offer to create one. ~~~ -$ exouser key.add +$ ironcliuser key.add ~~~ You can also list the available key ids and remove existing keys using the key id. ~~~ -$ exouser key +$ ironcliuser key Keys Dohyoonuf7 -$ exouser key Dohyoonuf7 +$ ironcliuser key Dohyoonuf7 ssh-rsa AAA[...] -$ exouser key.remove Dohyoonuf7 +$ ironcliuser key.remove Dohyoonuf7 ~~~ ### Deployments @@ -107,7 +107,7 @@ Please refer to the section about [development, staging and production environme You can list all the deployments with the *details* command. ~~~ -$ exoapp APP_NAME details +$ ironcliapp APP_NAME details App Name: APP_NAME Type: php Owner: EMAIL_ADDRESS Repository: ssh://APP_NAME@app.exo.io/repository.git @@ -137,16 +137,16 @@ 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 exoapp push command or git's push command. Please +You can either use the ironcliapp push command or git'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 exoapp: -$ exoapp APP_NAME/dev push +# with ironcliapp: +$ ironcliapp APP_NAME/dev push -# get the REPO_URL from the output of exoapp APP_NAME details +# get the REPO_URL from the output of ironcliapp APP_NAME details # with git: $ git remote add exo REPO_URL @@ -215,7 +215,7 @@ At the end of the buildpack process, the image is ready to be deployed. The exoscale platform supports zero downtime deploys for all deployments. To deploy a new version use either the *web console* or the `deploy` command. ~~~ -$ exoapp APP_NAME/DEP_NAME deploy +$ ironcliapp APP_NAME/DEP_NAME deploy ~~~ To deploy a specific version, append your version control systems identifier (full commit-SHA1). @@ -236,7 +236,7 @@ first request is served. All following requests will perform normally. You can see the state of your application with the following command: ~~~ -$ exoapp APP_NAME/DEP_NAME details +$ ironcliapp APP_NAME/DEP_NAME details Deployment name: APP_NAME/DEP_NAME [...] @@ -252,13 +252,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: ~~~ -$ exoapp APP_NAME/DEP_NAME rollback +$ ironcliapp 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: ~~~ -$ exoapp APP_NAME/DEP_NAME deploy THE_LAST_WORKING_VERSION_HASH +$ ironcliapp APP_NAME/DEP_NAME deploy THE_LAST_WORKING_VERSION_HASH ~~~ @@ -335,23 +335,23 @@ 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 `exoapp addon.list` command. +You can see the available Add-on plans on the Add-on marketplace website or with the `ironcliapp addon.list` command. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.list +$ ironcliapp APP_NAME/DEP_NAME addon.list [...] ~~~ Adding an Add-on is just as easy. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.add ADDON_NAME.ADDON_OPTION +$ ironcliapp 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. ~~~ -$ exoapp APP_NAME/DEP_NAME addon +$ ironcliapp APP_NAME/DEP_NAME addon Addon : alias.free Addon : config.free @@ -368,9 +368,9 @@ To upgrade or downgrade an Add-on use the respective command followed by the Add ~~~ # upgrade -$ exoapp APP_NAME/DEP_NAME addon.upgrade FROM_SMALL_ADDON TO_BIG_ADDON +$ ironcliapp APP_NAME/DEP_NAME addon.upgrade FROM_SMALL_ADDON TO_BIG_ADDON # downgrade -$ exoapp APP_NAME/DEP_NAME addon.downgrade FROM_BIG_ADDON TO_SMALL_ADDON +$ ironcliapp 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. @@ -403,7 +403,7 @@ different languages To see the format and contents of the credentials file locally, use the `addon.creds` command. ~~~ -$ exoapp APP_NAME/DEP_NAME addon.creds +$ ironcliapp APP_NAME/DEP_NAME addon.creds { "CONFIG": { "CONFIG_VARS": { @@ -426,10 +426,10 @@ $ exoapp 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 exoapp 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 ironcliapp log command. The log command initially shows the last 500 log messages and then appends new messages as they arrive. ~~~ -$ exoapp APP_NAME/DEP_NAME log [access,error,worker,deploy] +$ ironcliapp APP_NAME/DEP_NAME log [access,error,worker,deploy] [...] ~~~ @@ -471,7 +471,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: ~~~ -$ exoapp APP_NAME/DEP_NAME config.add RSYSLOG_REMOTE=custom_remote.cfg +$ ironcliapp 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. @@ -699,7 +699,7 @@ image and deployment image and does also provides the Add-on credentials. To start a shell (e.g. bash) use the `run` command. ~~~ -$ exoapp APP_NAME/DEP_NAME run bash +$ ironcliapp 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" @@ -714,7 +714,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. ~~~ -$ exoapp APP_NAME/DEP_NAME run "env | sort" +$ ironcliapp 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 @@ -770,9 +770,9 @@ stack for its specific purpose on our platform. * **Pinky** based on [Ubuntu 12.04 LTS Precise Pangolin] -Details about the current stack are available via the `exoapp` command line interface. +Details about the current stack are available via the `ironcliapp` command line interface. ~~~ -$ exoapp APP_NAME/DEP_NAME details +$ ironcliapp APP_NAME/DEP_NAME details name: APP_NAME/DEP_NAME stack: pinky [...] diff --git a/Quickstart.md b/Quickstart.md index cf5506f..a38ed7a 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -13,7 +13,7 @@ placeholders are marked by being written all uppercase. ### Requirements * git version control system -* the exouser/ exoapp command line clients +* the ironcliuser/ ironcliapp command line clients ### Install git @@ -40,7 +40,7 @@ You can register on [exoscale.ch](http://exoscale.ch). ## Add a Public Key ~~~bash -$ exouser key.add +$ ironcliuser key.add Email : EMAIL Password: PASSWORD ~~~ @@ -54,7 +54,7 @@ Create a new application on the exoscale platform by giving it an unique `TYPE`. ~~~bash -$ exoapp APP_NAME create [java, php, python, ruby, nodejs] +$ ironcliapp APP_NAME create [java, php, python, ruby, nodejs] ~~~ If the `APP_NAME` is already taken, please pick another one. @@ -90,7 +90,7 @@ $ git clone https://github.com/cloudControl/nodejs-express-example-app.git $ cd nodejs-express-example-app # now push -$ exoapp APP_NAME push +$ ironcliapp APP_NAME push ~~~ The push fires a hook that prepares your application for deployment like @@ -102,7 +102,7 @@ in your terminal. Deploy your app with ~~~bash -$ exoapp APP_NAME deploy +$ ironcliapp APP_NAME deploy ~~~ **Congratulations, your app is now up and running.** From 1906f0a23d86e08a4f992fd19a59f1e430919b7b Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Tue, 10 Mar 2015 15:16:12 +0100 Subject: [PATCH 21/22] Update platform domain --- Add-on Documentation/Data Storage/MySQLs.md | 2 +- Add-on Documentation/Deployment/Alias.md | 14 +++--- Add-on Documentation/Deployment/Cron.md | 6 +-- Add-on Documentation/Deployment/SSL.md | 8 ++-- Guides/Java/Java - HelloWorld.md | 4 +- Guides/Java/Java - Spring.md | 4 +- Guides/NodeJS/HelloWorld.md | 4 +- Guides/NodeJS/Sailsjs.md | 4 +- Guides/PHP/HelloWorld.md | 4 +- Guides/PHP/Kohana 3.2.0.md | 4 +- Guides/PHP/Symfony 1.4.md | 4 +- Guides/PHP/Yii 1.1.10.md | 2 +- Guides/PHP/Zend 2.md | 6 +-- Guides/PHP/Zend Framework 1.11.md | 2 +- Guides/Python/Django.md | 4 +- Guides/Python/HelloWorld.md | 4 +- Guides/Python/Tornado.md | 4 +- Guides/Ruby/HelloWorld.md | 4 +- Guides/Ruby/Ruby on Rails.md | 4 +- Guides/Ruby/RunCommand.md | 2 +- Platform Documentation.md | 50 ++++++++++----------- Quickstart.md | 4 +- 22 files changed, 72 insertions(+), 72 deletions(-) diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 9b56cf3..2ee1c95 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -83,7 +83,7 @@ Addon : mysqls.512mb Settings MYSQLS_DATABASE : SOME_DATABASE_NAME -MYSQLS_HOSTNAME : mysql.app.exo.io +MYSQLS_HOSTNAME : mysql.dionepaas.com MYSQLS_PORT : 3306 MYSQLS_PASSWORD : SOME_SECRET_PASSWORD MYSQLS_USERNAME : SOME_SECRET_USERNAME diff --git a/Add-on Documentation/Deployment/Alias.md b/Add-on Documentation/Deployment/Alias.md index f0f4e2d..d72a1d7 100644 --- a/Add-on Documentation/Deployment/Alias.md +++ b/Add-on Documentation/Deployment/Alias.md @@ -8,7 +8,7 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro The verification code is unique to the owner of the app. To get it simply use the alias command. ~~~ - $ ironcliapp APP_NAME/default alias APP_NAME.app.exo.io + $ ironcliapp APP_NAME/default alias APP_NAME.dionepaas.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. @@ -22,29 +22,29 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro 68b676e063eadb350876ae291e9ae43748d6e51c85ecd3c4cc026c869acc9d2d" ~~~ - Since we are going to use a CNAME to point the custom domain to the provided `.app.exo.io` 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 `.dionepaas.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 `.app.exo.io` subdomain. + 1. Add a CNAME pointing to the provided `.dionepaas.com` subdomain. - In addition to the TXT record, go ahead and also add a CNAME pointing to your apps `.app.exo.io` 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 `.dionepaas.com` subdomain. Use the command line client's alias command to show the one specific to your deployment. ~~~ # for the default deployment $ ironcliapp APP_NAME/default alias Aliases name default verified - APP_NAME.app.exo.io 1 1 + APP_NAME.dionepaas.com 1 1 # for any additional deployment $ ironcliapp APP_NAME/DEP_NAME alias Aliases name default verified - DEP_NAME.APP_NAME.app.exo.io 1 1 + DEP_NAME.APP_NAME.dionepaas.com 1 1 ~~~ The resulting CNAME record should look something like this example. ~~~ - www.example.com. 1593 IN CNAME APP_NAME.app.exo.io. + www.example.com. 1593 IN CNAME APP_NAME.dionepaas.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 e824f40..e675589 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -38,9 +38,9 @@ To call an URL with the specific interval you write it as the parameter: ~~~ # for the default deployment -$ ironcliapp APP_NAME/default cron.add http[s]://[user:password@]APP_NAME.app.exo.io +$ ironcliapp APP_NAME/default cron.add http[s]://[user:password@]APP_NAME.dionepaas.com # for any additional deployment -$ ironcliapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.app.exo.io +$ ironcliapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.dionepaas.com ~~~ You can only add cron jobs calling a verified alias of the deployment. It is @@ -62,7 +62,7 @@ Get the details of a specific Cron job: $ ironcliapp APP_NAME/DEP_NAME cron CRON_ID Cronjob job_id : jobkqy7rdmg - url : http://APP_NAME.app.exo.io + url : http://APP_NAME.dionepaas.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/Add-on Documentation/Deployment/SSL.md b/Add-on Documentation/Deployment/SSL.md index 6c372d1..d01570a 100644 --- a/Add-on Documentation/Deployment/SSL.md +++ b/Add-on Documentation/Deployment/SSL.md @@ -9,11 +9,11 @@ Overview: Secure Socket Layer (SSL) encryption is available for improved security when transmitting passwords and other sensitive data. -As part of the provided `.app.exo.io` subdomain, all deployments have -access to piggyback SSL using a `*.app.exo.io` wildcard certificate. +As part of the provided `.dionepaas.com` subdomain, all deployments have +access to piggyback SSL using a `*.dionepaas.com` wildcard certificate. To use this, simply point your browser to: -* `https://APP_NAME.app.exo.io` for the default deployment -* `https://DEP_NAME-APP_NAME.app.exo.io` for non-default deployments +* `https://APP_NAME.dionepaas.com` for the default deployment +* `https://DEP_NAME-APP_NAME.dionepaas.com` for non-default deployments Please note the **dash** between DEP_NAME and APP_NAME. diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index 39cb021..b02b22c 100644 --- a/Guides/Java/Java - HelloWorld.md +++ b/Guides/Java/Java - HelloWorld.md @@ -114,7 +114,7 @@ $ ironcliapp APP_NAME/default push -----> Building image -----> Uploading image (39M) -To ssh://APP_NAME@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git 54b0da2..d247825 master -> master ~~~ @@ -124,7 +124,7 @@ Last but not least deploy the latest version of the app with the ironcliapp depl $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.app.exo.io`. +Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.dionepaas.com`. [Jetty]: http://jetty.codehaus.org/jetty/ [exoscale]: https://www.exoscale.ch/ diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index 8d7a7e1..ac799c3 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@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git * [new branch] master -> master ~~~ @@ -143,7 +143,7 @@ $ ironcliapp 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.app.exo.io` . +Et voila, the app is now up and running at `http[s]://APP_NAME.dionepaas.com` . [Spring Roo petclinic]: http://static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sample diff --git a/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index 2177f75..a94e6c1 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -91,7 +91,7 @@ Total 307 (delta 18), reused 307 (delta 18) -----> Building image -----> Uploading image (4.3M) -To ssh://APP_NAME@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git * [new branch] master -> master ~~~ @@ -102,7 +102,7 @@ $ ironcliapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Node.js app running at -`http[s]://APP_NAME.app.exo.io`. +`http[s]://APP_NAME.dionepaas.com`. [Node.js]: http://nodejs.org/ diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index da8a8c9..b771fa7 100644 --- a/Guides/NodeJS/Sailsjs.md +++ b/Guides/NodeJS/Sailsjs.md @@ -126,7 +126,7 @@ Total 73 (delta 30), reused 73 (delta 30) -----> Building image -----> Uploading image (17M) -To ssh://APP_NAME@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git * [new branch] master -> master ~~~ @@ -141,7 +141,7 @@ $ ironcliapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Sails.js application running at -`http://APP_NAME.app.exo.io`. +`http://APP_NAME.dionepaas.com`. [Node.js]: http://nodejs.org/ [Sails.js]: http://sailsjs.org/ diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 4938921..71d85f1 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@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git * [new branch] master -> master ~~~ @@ -108,7 +108,7 @@ Last but not least deploy the latest version of the app with the ironcliapp depl $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.app.exo.io`. +Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.dionepaas.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 415f6f7..22aba3e 100644 --- a/Guides/PHP/Kohana 3.2.0.md +++ b/Guides/PHP/Kohana 3.2.0.md @@ -109,7 +109,7 @@ When you do this, you'll see output similar to the following: >> Building image >> Uploading image (772K) - To ssh://APP_NAME@app.exo.io/repository.git + To ssh://APP_NAME@dionepaas.com/repository.git f98a87c..a685cd6 master -> master Note the following lines: @@ -539,7 +539,7 @@ 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. Point your browser to `APP_NAME.app.exo.io/hello.php` to see the result. +In this view file, we output some simple HTML and then iterate the value of the users that we retrieved in the controller before. Point your browser to `APP_NAME.dionepaas.com/hello.php` to see the result. ##7. Review the Deployment diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index df8d1c2..25df9ee 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -108,7 +108,7 @@ When you do this, you'll see output similar to the following: >> Building image >> Uploading image (3.0M) - To ssh://APP_NAME@app.exo.io/repository.git + To ssh://APP_NAME@dionepaas.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_exoscale session_cookie_path: / - session_cookie_domain: APP_NAME.app.exo.io + session_cookie_domain: APP_NAME.dionepaas.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 c03c60d..bf165a7 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://APP_NAME@app.exo.io/repository.git + To ssh://APP_NAME@dionepaas.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 c886847..290ad2b 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@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git * [new branch] master -> master ~~~ @@ -199,10 +199,10 @@ $ ironcliapp APP_NAME/default addon.add mysqls.free $ ironcliapp APP_NAME/default run "php code/public/index.php init-session-table" Connecting... [SUCCESS] Session table created. -Connection to sshforwarder.app.exo.io closed. +Connection to sshforwarder.dionepaas.com closed. ~~~ -Et voila, the app is now up and running at `http[s]://APP_NAME.app.exo.io`. +Et voila, the app is now up and running at `http[s]://APP_NAME.dionepaas.com`. [PHP buildpack]: https://github.com/cloudControl/buildpack-php [exoscale]: https://www.exoscale.ch/ diff --git a/Guides/PHP/Zend Framework 1.11.md b/Guides/PHP/Zend Framework 1.11.md index 0d440e2..6997396 100644 --- a/Guides/PHP/Zend Framework 1.11.md +++ b/Guides/PHP/Zend Framework 1.11.md @@ -110,7 +110,7 @@ You'll see output similar to the following: >> Building image >> Uploading image (3.6M) - To ssh://APP_NAME@app.exo.io/repository.git + To ssh://APP_NAME@dionepaas.com/repository.git dde253a..7b040e2 testing -> testing ##4. Initialise the Required Add-ons diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index d7a771e..7164671 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -115,7 +115,7 @@ Total 31 (delta 3), reused 24 (delta 0) -----> Building image -----> Uploading image (30M) -To ssh://APP_NAME@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git * [new branch] master -> master ~~~ @@ -131,7 +131,7 @@ Finally, prepare the database using the [Run command][ssh-session] (when prompte $ ironcliapp APP_NAME/default run "python manage.py syncdb" ~~~ -You can login to the admin console at `APP_NAME.app.exo.io/admin`, create some polls and see them at `APP_NAME.app.exo.io/polls`. +You can login to the admin console at `APP_NAME.dionepaas.com/admin`, create some polls and see them at `APP_NAME.dionepaas.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 4236774..52b7dd1 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@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git * [new branch] master -> master ~~~ @@ -77,7 +77,7 @@ Last but not least deploy the latest version of the app with the ironcliapp depl $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.app.exo.io`. +Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.dionepaas.com`. [Flask]: http://flask.pocoo.org/ [exoscale]: http://www.exoscale.ch diff --git a/Guides/Python/Tornado.md b/Guides/Python/Tornado.md index a0d260c..9f2d253 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@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git + [new branch] master -> master ~~~ @@ -123,7 +123,7 @@ deploy command. $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Tornado app running at `http://APP_NAME.app.exo.io`. +Congratulations, you can now see your Tornado app running at `http://APP_NAME.dionepaas.com`. [Tornado]: http://www.tornadoweb.org [exoscale]: http://www.exoscale.ch diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index 51deb5b..6936366 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@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git * [new branch] master -> master ~~~ @@ -82,7 +82,7 @@ Last but not least deploy the latest version of the app with the ironcliapp depl $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME.app.exo.io`. +Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME.dionepaas.com`. [sinatra]: http://www.sinatrarb.com/ diff --git a/Guides/Ruby/Ruby on Rails.md b/Guides/Ruby/Ruby on Rails.md index 1557439..e748af1 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@app.exo.io/repository.git +To ssh://APP_NAME@dionepaas.com/repository.git * [new branch] mysql -> mysql ~~~ @@ -179,7 +179,7 @@ Finally, prepare the database by running migrations using the [Run command][run $ ironcliapp APP_NAME/mysql run "rake db:migrate" ~~~ -Congratulations, you can now access the app at http://mysql-APP_NAME.app.exo.io. +Congratulations, you can now access the app at http://mysql-APP_NAME.dionepaas.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/Ruby/RunCommand.md b/Guides/Ruby/RunCommand.md index 8d62fd6..8ecc437 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 sshforwarder.app.exo.io closed. +Connection to sshforwarder.dionepaas.com closed. ~~~ The same could be accomplished if the multiple individual commands were chained: diff --git a/Platform Documentation.md b/Platform Documentation.md index e4ae213..c3d81e9 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -110,7 +110,7 @@ You can list all the deployments with the *details* command. $ ironcliapp APP_NAME details App Name: APP_NAME Type: php Owner: EMAIL_ADDRESS - Repository: ssh://APP_NAME@app.exo.io/repository.git + Repository: ssh://APP_NAME@dionepaas.com/repository.git [...] @@ -481,12 +481,12 @@ From now on all the new logs should be visible in your custom syslog remote. **TL;DR:** - * Each deployment is provided with both a `*.app.exo.io` and `*.fastapp.exo.io` subdomain. + * Each deployment is provided with both a `*.dionepaas.com` and `*.fastdionepaas.com` subdomain. * Custom domains are supported via the Alias Add-on. -Each deployment is provided per default with both a `*.app.exo.io` and `*.fastapp.exo.io` subdomain. The `APP_NAME.app.exo.io` or `APP_NAME.fastapp.exo.io` will point to the `default` deployment while any additional deployment can be accessed with a prefixed subdomain: `DEP_NAME-APP_NAME.app.exo.io` or `DEP_NAME-APP_NAME.fastapp.exo.io`. +Each deployment is provided per default with both a `*.dionepaas.com` and `*.fastdionepaas.com` subdomain. The `APP_NAME.dionepaas.com` or `APP_NAME.fastdionepaas.com` will point to the `default` deployment while any additional deployment can be accessed with a prefixed subdomain: `DEP_NAME-APP_NAME.dionepaas.com` or `DEP_NAME-APP_NAME.fastdionepaas.com`. -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.app.exo.io` or `awesomeapp.fastapp.exo.io`. 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.dionepaas.com` or `awesomeapp.fastdionepaas.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 exoscale verification code as a TXT record. @@ -514,13 +514,13 @@ 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 `*.app.exo.io` or `*.fastapp.exo.io` subdomains. - * The `*.app.exo.io` subdomain provides WebSocket support. - * The `*.fastapp.exo.io` subdomain provides support for HTTP caching via Varnish. + * Within the routing tier, you can choose to route requests via the `*.dionepaas.com` or `*.fastdionepaas.com` subdomains. + * The `*.dionepaas.com` subdomain provides WebSocket support. + * The `*.fastdionepaas.com` subdomain provides support for HTTP caching via Varnish. * 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 `*.app.exo.io` or `*.fastapp.exo.io` 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 `*.dionepaas.com` or `*.fastdionepaas.com` subdomains. 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. @@ -534,13 +534,13 @@ Given that client requests don't hit your application directly, but are forwarde ### 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 `*.app.exo.io` and `*.fastapp.exo.io` 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. The values differ slightly between the `*.dionepaas.com` and `*.fastdionepaas.com` subdomains. 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. * __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 `*.app.exo.io` subdomain: +#### Timeouts for `*.dionepaas.com` subdomain: |Parameter|Value [s]| |:---------|:----------:| @@ -548,7 +548,7 @@ Our routing tier uses a cluster of reverse proxy loadbalancers to manage the acc |Send timeout|55| |Read timeout|55| -#### Timeouts for `*.fastapp.exo.io` subdomain: +#### Timeouts for `*.fastdionepaas.com` subdomain: |Parameter|Value [s]| |:---------|:----------:| @@ -562,19 +562,19 @@ Our smart [DNS](https://en.wikipedia.org/wiki/Domain_Name_System) provides a fas ### High Availability -The routing tier provides two mechanisms to ensure high availability, depending on the provided subdomain. These are Health Checker (for the `*.app.exo.io` subdomain) and Failover (for the `*.fastapp.exo.io` 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. +The routing tier provides two mechanisms to ensure high availability, depending on the provided subdomain. These are Health Checker (for the `*.dionepaas.com` subdomain) and Failover (for the `*.fastdionepaas.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. -#### `*.app.exo.io` subdomain +#### `*.dionepaas.com` subdomain -For the `*.app.exo.io` 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 `*.dionepaas.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. -#### `*.fastapp.exo.io` subdomain +#### `*.fastdionepaas.com` subdomain -For the `*.fastapp.exo.io` 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. +For the `*.fastdionepaas.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. ## Scaling @@ -616,9 +616,9 @@ After you have reduced the total number of requests, it's recommended to cache a #### 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 `*.fastapp.exo.io` 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. +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 `*.fastdionepaas.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.fastapp.exo.io` subdomain `A` record. Then you can update your web application's configuration to serve static resources from your new domain. +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.fastdionepaas.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. @@ -628,16 +628,16 @@ When caching requests on client side or in a caching proxy, the URL is usually u 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. -### Caching in app.exo.io subdomain +### Caching in dionepaas.com subdomain -Requests via the `*.app.exo.io` 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 `*.fastapp.exo.io`subdomain. For example, you can serve the dynamic requests of your application via www.example.com (a CNAME FOR `example.app.exo.io`) and serve the static assets like CSS, JS and images via `static.example.com` (a CNAME for `example.fastapp.exo.io`). +Requests via the `*.dionepaas.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 `*.fastdionepaas.com`subdomain. For example, you can serve the dynamic requests of your application via www.example.com (a CNAME FOR `example.dionepaas.com`) and serve the static assets like CSS, JS and images via `static.example.com` (a CNAME for `example.fastdionepaas.com`). ## WebSockets **TL;DR:** - * WebSockets are supported via the `*.app.exo.io` subdomain. + * WebSockets are supported via the `*.dionepaas.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://`. @@ -662,7 +662,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 `*.app.exo.io` 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 `*.dionepaas.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 @@ -707,7 +707,7 @@ interactive commands work as well u25832@DEP_ID-25832:~/www$ exit exit Connection to 10.62.45.100 closed. -Connection to sshforwarder.app.exo.io closed. +Connection to sshforwarder.dionepaas.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. @@ -721,7 +721,7 @@ CRED_FILE=/srv/creds/creds.json DEP_ID=DEP_ID DEP_NAME=APP_NAME/DEP_NAME DEP_VERSION=9d5ada800eff9fc57849b3102a2f27ff43ec141f -DOMAIN=app.exo.io +DOMAIN=dionepaas.com GEM_PATH=vendor/bundle/ruby/1.9.1 HOME=/srv HOSTNAME=DEP_ID-10346 @@ -745,7 +745,7 @@ TMPDIR=/srv/tmp USER=u10346 WRK_ID=WRK_ID Connection to 10.250.134.126 closed. -Connection to sshforwarder.app.exo.io closed. +Connection to sshforwarder.dionepaas.com closed. ~~~ ## Stacks diff --git a/Quickstart.md b/Quickstart.md index a38ed7a..87361e1 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -50,7 +50,7 @@ The command line client will determine if you already have a public key and uplo ## Create the First Application on exoscale Create a new application on the exoscale platform by giving it an unique -`APP_NAME` (the name is used as the `.app.exo.io` subdomain) and choosing the +`APP_NAME` (the name is used as the `.dionepaas.com` subdomain) and choosing the `TYPE`. ~~~bash @@ -108,7 +108,7 @@ $ ironcliapp APP_NAME deploy **Congratulations, your app is now up and running.** ~~~bash -http[s]://APP_NAME.app.exo.io +http[s]://APP_NAME.dionepaas.com ~~~ ## Cheatsheet From 0d2bfc15c3f36341f47971c938f54a6ead1abe13 Mon Sep 17 00:00:00 2001 From: Mateusz Korszun Date: Tue, 10 Mar 2015 15:44:51 +0100 Subject: [PATCH 22/22] Rebranding --- .../Data Processing/Worker.md | 2 +- Add-on Documentation/Data Storage/MySQLs.md | 8 +- Add-on Documentation/Deployment/Alias.md | 14 +-- Add-on Documentation/Deployment/Cron.md | 14 +-- Add-on Documentation/Deployment/SSL.md | 12 +- Guides/Java/AWS S3.md | 2 +- Guides/Java/Add-on credentials.md | 16 +-- Guides/Java/Java - HelloWorld.md | 16 +-- Guides/Java/Java - Spring.md | 22 ++-- Guides/NodeJS/AWS S3.md | 2 +- Guides/NodeJS/Add-on credentials.md | 10 +- Guides/NodeJS/HelloWorld.md | 16 +-- Guides/NodeJS/Sailsjs.md | 24 ++-- Guides/PHP/Add-on credentials.md | 10 +- Guides/PHP/CakePHP 2.2.1.md | 24 ++-- Guides/PHP/Drupal 7.md | 12 +- Guides/PHP/HelloWorld.md | 18 +-- Guides/PHP/Joomla 2.5.md | 14 +-- Guides/PHP/Kohana 3.2.0.md | 26 ++--- Guides/PHP/Symfony 1.4.md | 22 ++-- Guides/PHP/Yii 1.1.10.md | 20 ++-- Guides/PHP/Zend 2.md | 18 +-- Guides/PHP/Zend Framework 1.11.md | 18 +-- ...le_init.sql => drupal_cloudkilat_init.sql} | 0 Guides/Python/AWS S3.md | 2 +- Guides/Python/Add-on credentials.md | 12 +- Guides/Python/Django notes.md | 16 +-- Guides/Python/Django.md | 37 +++--- Guides/Python/HelloWorld.md | 14 +-- Guides/Python/Tornado.md | 14 +-- Guides/Ruby/AWS S3.md | 2 +- Guides/Ruby/Add-on credentials.md | 10 +- Guides/Ruby/HelloWorld.md | 18 +-- Guides/Ruby/Ruby on Rails.md | 28 ++--- Guides/Ruby/RubyNotes.md | 6 +- Guides/Ruby/RunCommand.md | 2 +- .../Third-Party Buildpacks.md | 8 +- Platform Documentation.md | 108 +++++++++--------- Quickstart.md | 26 ++--- README | 4 +- ...heatsheet.pdf => cloudkilat_cheatsheet.pdf | Bin 729006 -> 730299 bytes 41 files changed, 324 insertions(+), 323 deletions(-) rename Guides/PHP/{drupal_exoscale_init.sql => drupal_cloudkilat_init.sql} (100%) rename exo_cheatsheet.pdf => cloudkilat_cheatsheet.pdf (79%) diff --git a/Add-on Documentation/Data Processing/Worker.md b/Add-on Documentation/Data Processing/Worker.md index 124df3c..6af2921 100644 --- a/Add-on Documentation/Data Processing/Worker.md +++ b/Add-on Documentation/Data Processing/Worker.md @@ -75,7 +75,7 @@ For more details refer to the [PHP example](#php-worker-example) below. ## Worker log -As already explained in the [Logging section](https://community.exoscale.ch/apps/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. +As already explained in the [Logging section](/Platform Documentation.md/#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. ~~~ $ ironcliapp APP_NAME/DEP_NAME log worker diff --git a/Add-on Documentation/Data Storage/MySQLs.md b/Add-on Documentation/Data Storage/MySQLs.md index 2ee1c95..fcfc551 100644 --- a/Add-on Documentation/Data Storage/MySQLs.md +++ b/Add-on Documentation/Data Storage/MySQLs.md @@ -1,7 +1,7 @@ # MySQLs: Shared MySQL Add-on Every deployment can access a highly available shared MySQL add-on with -databases guaranteed to be located in exoscale datacenters in Switzerland. +databases guaranteed to be located in CloudKilat datacenters in Indonesia. ## Adding the MySQLs Add-on @@ -52,7 +52,7 @@ 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://community.exoscale.ch/apps/documentation/#add-ons) +[Add-on Credentials](/Platform Documentation.md/#add-ons) in the general documentation. Most database drivers provide a reconnect on connection issues when you add **autoReconnect=true** parameter to your database uri. This should be enabled to have the most stable setup. For example with Java: @@ -65,7 +65,7 @@ jdbc:mysql://{MYSQLS_HOSTNAME}:{MYSQLS_PORT}/{MYSQLS_DATABASE}?autoReconnect=tru External access to the MySQLs add-on is available through an SSL encrypted connection by following these simple steps. - 1. Download the [certificate file](https://community.exoscale.ch/static/apps/ca-cert.pem) to your local machine. + 1. Download the [certificate file](TODO) to your local machine. 1. Connect to the database using an SSL encrypted connection. The following example uses the MySQL command line tool. @@ -83,7 +83,7 @@ Addon : mysqls.512mb Settings MYSQLS_DATABASE : SOME_DATABASE_NAME -MYSQLS_HOSTNAME : mysql.dionepaas.com +MYSQLS_HOSTNAME : mysql.kilatiron.net MYSQLS_PORT : 3306 MYSQLS_PASSWORD : SOME_SECRET_PASSWORD MYSQLS_USERNAME : SOME_SECRET_USERNAME diff --git a/Add-on Documentation/Deployment/Alias.md b/Add-on Documentation/Deployment/Alias.md index d72a1d7..e5ee037 100644 --- a/Add-on Documentation/Deployment/Alias.md +++ b/Add-on Documentation/Deployment/Alias.md @@ -8,7 +8,7 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro The verification code is unique to the owner of the app. To get it simply use the alias command. ~~~ - $ ironcliapp APP_NAME/default alias APP_NAME.dionepaas.com + $ ironcliapp APP_NAME/default alias APP_NAME.kilatiron.net ~~~ 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. @@ -22,29 +22,29 @@ Adding custom domains to a deployment is supported via the Alias add-on. The pro 68b676e063eadb350876ae291e9ae43748d6e51c85ecd3c4cc026c869acc9d2d" ~~~ - Since we are going to use a CNAME to point the custom domain to the provided `.dionepaas.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 `.kilatiron.net` 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 `.dionepaas.com` subdomain. + 1. Add a CNAME pointing to the provided `.kilatiron.net` subdomain. - In addition to the TXT record, go ahead and also add a CNAME pointing to your apps `.dionepaas.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 `.kilatiron.net` subdomain. Use the command line client's alias command to show the one specific to your deployment. ~~~ # for the default deployment $ ironcliapp APP_NAME/default alias Aliases name default verified - APP_NAME.dionepaas.com 1 1 + APP_NAME.kilatiron.net 1 1 # for any additional deployment $ ironcliapp APP_NAME/DEP_NAME alias Aliases name default verified - DEP_NAME.APP_NAME.dionepaas.com 1 1 + DEP_NAME.APP_NAME.kilatiron.net 1 1 ~~~ The resulting CNAME record should look something like this example. ~~~ - www.example.com. 1593 IN CNAME APP_NAME.dionepaas.com. + www.example.com. 1593 IN CNAME APP_NAME.kilatiron.net. ~~~ 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 e675589..458693f 100644 --- a/Add-on Documentation/Deployment/Cron.md +++ b/Add-on Documentation/Deployment/Cron.md @@ -4,8 +4,8 @@ ## What are cronjobs? On UNIX systems [cronjobs](http://en.wikipedia.org/wiki/Cron) are commands that -are periodically executed. On exoscale however, there is no one node that -the cronjob can run on. Therefore cronjobs on exoscale are periodical calls +are periodically executed. On CloudKilat however, there is no one node that +the cronjob can run on. Therefore cronjobs on CloudKilat are periodical calls to a URL you specify. ## How does it work? @@ -20,7 +20,7 @@ timelimit. If you need more control over when and how often tasks are run and/or have tasks that take longer than 55 seconds we recommend using the -[Worker](https://community.exoscale.ch/tutorial/worker-add-on) Add-on. +[Worker](/Add-on Documentation/Data Processing/Worker.md) Add-on. ## Adding the Cron Add-on @@ -30,7 +30,7 @@ Before you can add a Cron job, the Add-on itself has to be added: $ ironcliapp APP_NAME/DEP_NAME addon.add cron.OPTION ~~~ -As always the different options are listed on the [Cron Add-on](https://community.exoscale.ch/tutorial/cron-add-on) page. +As always the different options are listed on the [Cron Add-on](/Add-on Documentation/Deployment/Cron.md) page. ## Adding a url for the Cron job @@ -38,9 +38,9 @@ To call an URL with the specific interval you write it as the parameter: ~~~ # for the default deployment -$ ironcliapp APP_NAME/default cron.add http[s]://[user:password@]APP_NAME.dionepaas.com +$ ironcliapp APP_NAME/default cron.add http[s]://[user:password@]APP_NAME.kilatiron.net # for any additional deployment -$ ironcliapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.dionepaas.com +$ ironcliapp APP_NAME/DEP_NAME cron.add http[s]://[user:password@]DEP_NAME.APP_NAME.kilatiron.net ~~~ You can only add cron jobs calling a verified alias of the deployment. It is @@ -62,7 +62,7 @@ Get the details of a specific Cron job: $ ironcliapp APP_NAME/DEP_NAME cron CRON_ID Cronjob job_id : jobkqy7rdmg - url : http://APP_NAME.dionepaas.com + url : http://APP_NAME.kilatiron.net 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/Add-on Documentation/Deployment/SSL.md b/Add-on Documentation/Deployment/SSL.md index d01570a..9c01304 100644 --- a/Add-on Documentation/Deployment/SSL.md +++ b/Add-on Documentation/Deployment/SSL.md @@ -9,11 +9,11 @@ Overview: Secure Socket Layer (SSL) encryption is available for improved security when transmitting passwords and other sensitive data. -As part of the provided `.dionepaas.com` subdomain, all deployments have -access to piggyback SSL using a `*.dionepaas.com` wildcard certificate. +As part of the provided `.kilatiron.net` subdomain, all deployments have +access to piggyback SSL using a `*.kilatiron.net` wildcard certificate. To use this, simply point your browser to: -* `https://APP_NAME.dionepaas.com` for the default deployment -* `https://DEP_NAME-APP_NAME.dionepaas.com` for non-default deployments +* `https://APP_NAME.kilatiron.net` for the default deployment +* `https://DEP_NAME-APP_NAME.kilatiron.net` for non-default deployments Please note the **dash** between DEP_NAME and APP_NAME. @@ -160,12 +160,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] + $ ironcliapp 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 + $ ironcliapp APP_NAME/DEP_NAME addon ssl.host Addon : ssl.host Settings diff --git a/Guides/Java/AWS S3.md b/Guides/Java/AWS S3.md index f6ba4ad..38e9bca 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://community.exoscale.ch/tutorial/custom-config-add-on/): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](/Add-on Documentation/Deployment/Custom Config.md): ~~~bash $ ironcliapp 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 9f9e2be..e65cf6e 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 $ ironcliapp APP_NAME/DEP_NAME addon.creds ~~~ -We provide a small [exoscale credentials helper class] to get the Add-on credentials from the file. +We provide a small [CloudKilat 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 -exoscale offers a number of data storage solutions via the [Add-on Marketplace]. +CloudKilat 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. @@ -74,10 +74,10 @@ String password = System.getenv("MYSQLS_PASSWORD"); Remember, you can always refer to the addon.creds command to see the actual variable names and values. [Java application with MySQL]: https://github.com/cloudControl/java-mysql-example-app -[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ -[environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables -[Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials -[cred-env-vars]: https://community.exoscale.ch/apps/documentation/#enablingdisabling-credentials-environment-variables +[Add-on Marketplace]: http://www.cloudkilat.com/ +[environment variables]: /Platform%20Documentation.md/#environment-variables +[Add-on credentials]: /Platform%20Documentation.md/#add-on-credentials +[cred-env-vars]: /Platform%20Documentation.md/#enablingdisabling-credentials-environment-variables [json-simple]: http://code.google.com/p/json-simple/ -[exoscale credentials helper class]: https://gist.github.com/b350762c61fcc069b427 -[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ +[CloudKilat credentials helper class]: https://gist.github.com/b350762c61fcc069b427 +[MySQL Shared Add-on]: /Add-on%20Documentation/Data%20Storage/MySQLs.md diff --git a/Guides/Java/Java - HelloWorld.md b/Guides/Java/Java - HelloWorld.md index b02b22c..14cc5e6 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 [exoscale]. You can find the [source code on Github](https://github.com/cloudControl/java-jetty-jsp-example-app.git) 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 [CloudKilat]. You can find the [source code on Github](https://github.com/cloudControl/java-jetty-jsp-example-app.git) and check out the [Java buildpack] for supported features. ## The Jetty Application Explained @@ -70,7 +70,7 @@ To create this application we had to provide Spring framework and Log4j as Maven ~~~ ### Process Type Definition -exoscale uses a [Procfile] to know how to start your processes. +CloudKilat 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: @@ -82,7 +82,7 @@ The `web` process type is required and specifies the command that will be execut The java command starts the 'com.exo.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 exoscale platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create java @@ -114,7 +114,7 @@ $ ironcliapp APP_NAME/default push -----> Building image -----> Uploading image (39M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git 54b0da2..d247825 master -> master ~~~ @@ -124,12 +124,12 @@ Last but not least deploy the latest version of the app with the ironcliapp depl $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.dionepaas.com`. +Congratulations, you can now see your Jetty Application running at `http[s]://APP_NAME.kilatiron.net`. [Jetty]: http://jetty.codehaus.org/jetty/ -[exoscale]: https://www.exoscale.ch/ +[CloudKilat]: http://www.cloudkilat.com/ [Java buildpack]: https://github.com/cloudControl/buildpack-java -[exoscale-command-line-client]: https://community.exoscale.ch/apps/documentation/#command-line-client-web-console-and-api +[CloudKilat-command-line-client]: /Platform%20Documentaion.md/#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://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile +[Procfile]: /Platform%20Documentaion.md/#buildpacks-and-the-procfile diff --git a/Guides/Java/Java - Spring.md b/Guides/Java/Java - Spring.md index ac799c3..8bed6cb 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 [exoscale]. 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 [CloudKilat]. The example app is a ready to deploy project based on the [Spring Roo petclinic] example. ## The Spring Application Explained @@ -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 exoscale can pick up all the messages and provide them to you via the [log command]. This is how the file looks now: +Then CloudKilat 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 @@ -74,7 +74,7 @@ log4j.appender.stdout.layout.ConversionPattern=%p [%t] (%c) - %m%n% ### Process Type Definition -exoscale uses the `Procfile` to start the application. The `Procfile` in the project root therefore specifies the command which executes the Jetty Runner: +CloudKilat 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 exoscale platform: +Choose a unique name (from now on called APP_NAME) for your application and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create java @@ -130,7 +130,7 @@ Total 223 (delta 107), reused 0 (delta 0) -----> Building image -----> Uploading image (84M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] master -> master ~~~ @@ -143,13 +143,13 @@ $ ironcliapp 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.dionepaas.com` . +Et voila, the app is now up and running at `http[s]://APP_NAME.kilatiron.net` . [Spring Roo petclinic]: http://static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sample -[Database credentials]: https://community.exoscale.ch/tutorial/java-app-add-on-credentials +[Database credentials]: /Guides/Java/Add-on%20credentials.md [Jetty Runner]: http://wiki.eclipse.org/Jetty/Howto/Using_Jetty_Runner -[exoscale]: http://exoscale.ch -[file system]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem -[log command]: https://community.exoscale.ch/apps/documentation/#logging -[Shared MySQL Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ +[CloudKilat]: http://www.cloudkilat.com/ +[file system]: /Platform%20Documentation.md/#non-persistent-filesystem +[log command]: /Platform%20Documentation.md//#logging +[Shared MySQL Add-on]: /Add-on%20Documentation/Data%20Storage/MySQLs.md diff --git a/Guides/NodeJS/AWS S3.md b/Guides/NodeJS/AWS S3.md index de9c555..7c3d5be 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://community.exoscale.ch/tutorial/custom-config-add-on/ +[Config Add-on]: /Add-on%20Documentation/Deployment/Custom%20Config.md diff --git a/Guides/NodeJS/Add-on credentials.md b/Guides/NodeJS/Add-on credentials.md index 150fe38..41a102f 100644 --- a/Guides/NodeJS/Add-on credentials.md +++ b/Guides/NodeJS/Add-on credentials.md @@ -44,7 +44,7 @@ var param3 = creds.ADDON_NAME.ADDON_NAME_PARAMETER3; # Examples -exoscale offers a number of data storage solutions via the [Add-on Marketplace]. Below you can see how to access Add-on credentials for MySQL. +CloudKilat offers a number of data storage solutions via the [Add-on Marketplace]. Below you can see how to access Add-on credentials for MySQL. ##MySQL To add a MySQL database, use the [MySQL Shared Add-on]. @@ -68,7 +68,7 @@ var port = creds.MYSQLS.MYSQLS_PORT; Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ -[environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables -[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ -[Add-on credentials]:https://community.exoscale.ch/apps/documentation/#add-on-credentials +[Add-on Marketplace]: http://www.cloudkilat.com/ +[environment variables]: /Platform%20Documentation.md/#environment-variables +[MySQL Shared Add-on]: /Add-on%20Documentation/Data%20Storage/MySQLs.md +[Add-on credentials]: /Platform%20Documentation.md/#add-on-credentials diff --git a/Guides/NodeJS/HelloWorld.md b/Guides/NodeJS/HelloWorld.md index a94e6c1..4f5a649 100644 --- a/Guides/NodeJS/HelloWorld.md +++ b/Guides/NodeJS/HelloWorld.md @@ -1,7 +1,7 @@ # Deploying a Node.js Application [Node.js] is a platform built on Chrome's JavaScript runtime for building fast and scalable network applications. Its event-driven, non-blocking I/O model 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 [exoscale]. Check out the [Node.js buildpack] for supported features. +This tutorial demonstrates how to build and deploy a simple Hello World Node.js application on [CloudKilat]. Check out the [Node.js buildpack] for supported features. ## The Node.js App Explained @@ -39,7 +39,7 @@ app looks like this: You should always specify the versions of your dependencies if you want your 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 exoscale 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: +A [Procfile] is required to start processes on the CloudKilat 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: ~~~ web: node web.js @@ -49,7 +49,7 @@ Left from the colon, we specified the **required** process type called `web` fol ## Pushing and Deploying your App Choose a unique name to replace the `APP_NAME` placeholder for your application -and create it on the exoscale platform: +and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create nodejs @@ -91,7 +91,7 @@ Total 307 (delta 18), reused 307 (delta 18) -----> Building image -----> Uploading image (4.3M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] master -> master ~~~ @@ -102,12 +102,12 @@ $ ironcliapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Node.js app running at -`http[s]://APP_NAME.dionepaas.com`. +`http[s]://APP_NAME.kilatiron.net`. [Node.js]: http://nodejs.org/ [npm]: https://npmjs.org/ -[exoscale]: http://www.exoscale.ch +[CloudKilat]: http://www.cloudkilat.com/ [Node.js buildpack]: https://github.com/cloudControl/buildpack-nodejs -[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile -[platform documentation]: https://community.exoscale.ch/apps/documentation/ +[Procfile]: /Platform%20Documentation.md/#buildpacks-and-the-procfile +[platform documentation]: /Platform%20Documentation.md diff --git a/Guides/NodeJS/Sailsjs.md b/Guides/NodeJS/Sailsjs.md index b771fa7..8fbf7d2 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 [exoscale]. 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 [CloudKilat]. 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 -exoscale uses a [Procfile] to start the application processes. The `Procfile` can be found at the root level of your repository. +CloudKilat 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 exoscale [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 CloudKilat [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]. For more details, take a look at the [exoscale websockets documentation]. +In Sails.js, client-backend communication is done using [websockets]. For more details, take a look at the [CloudKilat 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 exoscale 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 CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create nodejs @@ -126,7 +126,7 @@ Total 73 (delta 30), reused 73 (delta 30) -----> Building image -----> Uploading image (17M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] master -> master ~~~ @@ -141,16 +141,16 @@ $ ironcliapp APP_NAME/default deploy ~~~ Congratulations, you can now see your Sails.js application running at -`http://APP_NAME.dionepaas.com`. +`http://APP_NAME.kilatiron.net`. [Node.js]: http://nodejs.org/ [Sails.js]: http://sailsjs.org/ [Sails getting started page]: http://sailsjs.org/#!getStarted [Ruby on Rails]: http://rubyonrails.org/ [npm]: https://npmjs.org/ -[exoscale]: http://www.exoscale.ch -[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile -[get the MySQL credentials]: https://community.exoscale.ch/tutorial/nodejs-app-add-on-credentials/ +[CloudKilat]: http://www.cloudkilat.com/ +[Procfile]: /Platform%20Documentation.md/#buildpacks-and-the-procfile +[get the MySQL credentials]: /Guides/NodeJS/Add-on%20credentials.md [websockets]: http://socket.io/ -[exoscale websockets documentation]: https://community.exoscale.ch/apps/documentation/#websockets -[Shared MySQL Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ +[CloudKilat websockets documentation]: /Platform%20Documentation.md/#websockets +[Shared MySQL Add-on]: /Add-on%20Documentation/Data%20Storage/MySQLs.md diff --git a/Guides/PHP/Add-on credentials.md b/Guides/PHP/Add-on credentials.md index 975bf62..7d44f3b 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 -exoscale offers a number of data storage solutions via the [Add-on Marketplace]. +CloudKilat offers a number of data storage solutions via the [Add-on Marketplace]. Below you can see how to access Add-on credentials for MySQL. ## MySQL @@ -58,7 +58,7 @@ $password = $creds['MYSQLS']['MYSQLS_PASSWORD']; Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[env-vars]: https://community.exoscale.ch/apps/documentation/#environment-variables -[Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials -[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ -[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ +[env-vars]: /Platform%20Documentation.md/#environment-variables +[Add-on credentials]: /Platform%20Documentation.md/#add-on-credentials +[Add-on Marketplace]: http://www.cloudkilat.com/ +[MySQL Shared Add-on]: /Add-on%20Documentation/Data%20Storage/MySQLs.md diff --git a/Guides/PHP/CakePHP 2.2.1.md b/Guides/PHP/CakePHP 2.2.1.md index b978144..82e1c82 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 exoscale platform](http://www.exoscale.ch). +In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the CloudKilat platform](http://www.CloudKilat.ch). ##Prerequisites @@ -29,14 +29,14 @@ 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 exoscale deployment. These changes are as follows: +A few changes need to be made to the default CakePHP configuration and code to accommodate CloudKilat 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 exoscale. +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 CloudKilat. 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. @@ -46,7 +46,7 @@ Thankfully, CakePHP is written in a very straight-forward and configurable manne 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 exoscale, 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 CloudKilat, 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 @@ -74,7 +74,7 @@ That will show output similar to below: master * testing -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale account and push and deploy both deployments. +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform. Now, we need to make our first deployment of both branches to the CloudKilat platform. To do this we checkout the master branch, create the application in our CloudKilat account and push and deploy both deployments. By running the following commands, this will all be done: // switch to the master branch @@ -148,7 +148,7 @@ We then create a new class, **BASE_CONFIG**, that the database config, will late 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 exoscale 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 CloudKilat 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. @@ -175,7 +175,7 @@ We then look in there for a value called **CAKE_ENV**, which determines the acti return $environment; } -Now that we're able to know the environment that we're operating in, we setup the database configuration appropriately. If we're in development, then we use the development configuration in ``app/Config/database.php``. If we're not, then we retrieve the options from the ``CRED_FILE`` that is available to all exoscale environments. +Now that we're able to know the environment that we're operating in, we setup the database configuration appropriately. If we're in development, then we use the development configuration in ``app/Config/database.php``. If we're not, then we retrieve the options from the ``CRED_FILE`` that is available to all CloudKilat environments. 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. It's really handy as we don't need to do too much to make use of the options. @@ -234,7 +234,7 @@ An example is provided below: 'host' => 'localhost', 'login' => 'cc_dev', 'password' => 'cc _dev', - 'database' => 'exoscale_cakephp', + 'database' => 'CloudKilat_cakephp', 'prefix' => '', 'encoding' => 'utf8', ); @@ -243,7 +243,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 exoscale 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 CloudKilat 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: @@ -355,7 +355,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_exoscale_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_CloudKilat_init.sql``, ready to be used to initialise the database next. CREATE TABLE `cake_sessions` ( `id` varchar(255) NOT NULL DEFAULT '', @@ -392,7 +392,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_exoscale_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < cakephp_CloudKilat_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: @@ -428,7 +428,7 @@ With that completed, then have a look at both your deployments to ensure that th If you see any errors, then double check your database configuration settings and run through commit and deploy again. -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 exoscale Github repository. If you have any issues, feel free to email [support@exoscale.ch](mailto:support@exoscale.ch). +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 CloudKilat Github repository. If you have any issues, feel free to email [support@CloudKilat.ch](mailto:support@CloudKilat.ch). ##Links diff --git a/Guides/PHP/Drupal 7.md b/Guides/PHP/Drupal 7.md index f393ebc..2f279ec 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 exoscale platform](http://www.exoscale.ch). +In this tutorial, we're going to take you through deploying Drupal 7 to [the CloudKilat platform](http://www.CloudKilat.ch). ##Prerequisites @@ -64,7 +64,7 @@ That will show output similar to below: master * testing -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale account and *push* and *deploy* both deployments. By running the following commands, this will all be done: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform. Now, we need to make our first deployment of both branches to the CloudKilat platform. To do this we checkout the master branch, create the application in our CloudKilat 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 @@ -155,7 +155,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 exoscale 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 CloudKilat 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,. @@ -233,13 +233,13 @@ Two examples are provided below: 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](/static/apps/drupal_exoscale_init.sql), ready to be used to initialise the database. +Drupal stores. Download [the file](/static/apps/drupal_CloudKilat_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_exoscale_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < drupal_CloudKilat_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: @@ -296,5 +296,5 @@ Now that that's done, commit the changes we made earlier and push and deploy bot With that completed, then you'll be able to have a look at both your deployments to ensure that they're working. -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@exoscale.ch](mailto:support@exoscale.ch). +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@cloudkilat.com](mailto:support@cloudkilat.com). diff --git a/Guides/PHP/HelloWorld.md b/Guides/PHP/HelloWorld.md index 71d85f1..d5c3241 100644 --- a/Guides/PHP/HelloWorld.md +++ b/Guides/PHP/HelloWorld.md @@ -1,10 +1,10 @@ -#Deploying a Silex application on exoscale +#Deploying a Silex application on CloudKilat [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 -[exoscale]. You can find the [source code on Github][example-app] and check +[CloudKilat]. You can find the [source code on Github][example-app] and check out the [php buildpack] for supported features. @@ -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 exoscale platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create php ~~~ @@ -99,7 +99,7 @@ Total 29 (delta 5), reused 18 (delta 0) -----> Building image -----> Uploading image (14M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] master -> master ~~~ @@ -108,15 +108,15 @@ Last but not least deploy the latest version of the app with the ironcliapp depl $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.dionepaas.com`. +Congratulations, you can now see your Silex app running at `http[s]://APP_NAME.kilatiron.net`. [silex]: http://silex.sensiolabs.org/ -[exoscale]: http://www.exoscale.ch -[exoscale-doc-user]: https://community.exoscale.ch/apps/documentation/#user-accounts -[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/documentation/#command-line-client-web-console-and-api "documentation of the exoscale-command-line-client" +[CloudKilat]: http://www.cloudkilat.com/ +[CloudKilat-doc-user]: /Platform%20Documentation/#user-accounts +[CloudKilat-doc-cmdline]: /Platform%20Documentation/#command-line-client-web-console-and-api "documentation of the CloudKilat-command-line-client" [php buildpack]: https://github.com/cloudControl/buildpack-php -[procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile +[procfile]: /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 32d06d5..12b50b7 100644 --- a/Guides/PHP/Joomla 2.5.md +++ b/Guides/PHP/Joomla 2.5.md @@ -1,4 +1,4 @@ -#Deploying Joomla 2.5 to exoscale +#Deploying Joomla 2.5 to CloudKilat ![Successful Deployment](/static/apps/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 exoscale platform](http://www.exoscale.ch). +In this tutorial, we're going to take you through deploying Joomla v2.5 to [the CloudKilat platform](http://www.CloudKilat.ch). ##Prerequisites @@ -32,7 +32,7 @@ Once you have a copy of the Joomla source available locally, setup a VHost (or e ##2. Update the Configuration -A few changes need to be made to the default Joomla configuration and code to accommodate exoscale deployment. These changes are as follows: +A few changes need to be made to the default Joomla configuration and code to accommodate CloudKilat deployment. These changes are as follows: * Store sessions in the database * Store Cache Information in APC @@ -59,7 +59,7 @@ 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 exoscale 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 CloudKilat 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. @@ -153,7 +153,7 @@ That will show output similar to below: master * testing -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale account and push and deploy both deployments. By running the following commands, this will all be done: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform. Now, we need to make our first deployment of both branches to the CloudKilat platform. To do this we checkout the master branch, create the application in our CloudKilat 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 @@ -221,12 +221,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_exoscale_init.sql + mysqldump -u -p > joomla_CloudKilat_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_exoscale_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < joomla_CloudKilat_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: diff --git a/Guides/PHP/Kohana 3.2.0.md b/Guides/PHP/Kohana 3.2.0.md index 22aba3e..444e350 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 exoscale platform](http://www.exoscale.ch). 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 CloudKilat platform](http://www.cloudkilat.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 @@ -36,7 +36,7 @@ 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 exoscale 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 CloudKilat 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. @@ -46,7 +46,7 @@ Thankfully, Kohana is written in a very straight-forward and configurable manner 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 exoscale, 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 CloudKilat, 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 @@ -74,7 +74,7 @@ That will show output similar to below: master * testing -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale account and push and deploy both deployments. By running the following commands, this will all be done: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform. Now, we need to make our first deployment of both branches to the CloudKilat platform. To do this we checkout the master branch, create the application in our CloudKilat 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 @@ -109,7 +109,7 @@ When you do this, you'll see output similar to the following: >> Building image >> Uploading image (772K) - To ssh://APP_NAME@dionepaas.com/repository.git + To ssh://APP_NAME@kilatiron.net/repository.git f98a87c..a685cd6 master -> master Note the following lines: @@ -208,7 +208,7 @@ After you've found it, replace them with the following. I'll go through the code 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 exoscale 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 CloudKilat 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. @@ -260,7 +260,7 @@ Create a new file under ``application/config`` called ``cache.php``. In that fil ), ); -What that does is to tell Kohana that the cache will be using APC as the backend, which exoscale provides out of the box and sets the default expiry period to be **3600 seconds**, or **60 minutes**. +What that does is to tell Kohana that the cache will be using APC as the backend, which CloudKilat provides out of the box and sets the default expiry period to be **3600 seconds**, or **60 minutes**. ###5.3 Configuring Database Connections @@ -308,7 +308,7 @@ Create a new file under ``application/config`` called ``database.php``. In that 'username' => 'cc_dev', 'password' => 'cc_dev', 'persistent' => FALSE, - 'database' => 'exoscale_kohana', + 'database' => 'CloudKilat_kohana', ), 'table_prefix' => '', 'charset' => 'utf8', @@ -401,13 +401,13 @@ Ok, after all this is done, we need to load the database schema in to each of ou 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_exoscale_init.sql``. +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_CloudKilat_init.sql``. Now, in the shell, we're going to load the schema in to the remote mysql instance that we created earlier with the mysqls add-on. To do so, run the following command, changing the respective options with your configuration settings: mysql -u -p \ -h mysqlsdb.co8hm2var4k9.eu-west-1.rds.amazonaws.com \ - --ssl-ca=mysql-ssl-ca-cert.pem < kohana_exoscale_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < kohana_CloudKilat_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: @@ -522,7 +522,7 @@ Now create a file called ``site.php`` under ``application/views/``. In it, add t -

    Welcome to Kohana on exoscale

    +

    Welcome to Kohana on CloudKilat

    @@ -539,10 +539,10 @@ 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. Point your browser to `APP_NAME.dionepaas.com/hello.php` to see the result. +In this view file, we output some simple HTML and then iterate the value of the users that we retrieved in the controller before. Point your browser to `APP_NAME.kilatiron.net/hello.php` to see the result. ##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. -With that, you should be up and running, ready to create your next, amazing, PHP web application, using Kohana and exoscale. If you have any issues, feel free to email [support@exoscale.ch](mailto:support@exoscale.ch). +With that, you should be up and running, ready to create your next, amazing, PHP web application, using Kohana and CloudKilat. If you have any issues, feel free to email [support@cloudkilat.com](mailto:support@cloudkilat.com). diff --git a/Guides/PHP/Symfony 1.4.md b/Guides/PHP/Symfony 1.4.md index 25df9ee..5d181d8 100644 --- a/Guides/PHP/Symfony 1.4.md +++ b/Guides/PHP/Symfony 1.4.md @@ -1,4 +1,4 @@ -#Deploying Symfony 1.4 to exoscale +#Deploying Symfony 1.4 to CloudKilat ![Successful Deployment](/static/apps/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 exoscale platform](http://www.exoscale.ch). +In this tutorial, we're going to take you through deploying CakePHP v2.2.1 to [the CloudKilat platform](http://www.cloudkilat.com/). ##Prerequisites @@ -38,7 +38,7 @@ 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 exoscale 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 CloudKilat 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. @@ -74,7 +74,7 @@ That will show output similar to below: master * testing -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale account and push and deploy both deployments. By running the following commands, this will all be done: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform. Now, we need to make our first deployment of both branches to the CloudKilat platform. To do this we checkout the master branch, create the application in our CloudKilat 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 @@ -108,7 +108,7 @@ When you do this, you'll see output similar to the following: >> Building image >> Uploading image (3.0M) - To ssh://APP_NAME@dionepaas.com/repository.git + To ssh://APP_NAME@kilatiron.net/repository.git d90506c..4078c78 master -> master Note the following lines: @@ -116,7 +116,7 @@ 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 exoscale 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 CloudKilat 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 @@ -197,9 +197,9 @@ Under ``apps/frontend/config`` open the file ``factories.yaml``. In that file, w storage: class: sfCacheSessionStorage param: - session_name: symfony1_exoscale + session_name: symfony1_CloudKilat session_cookie_path: / - session_cookie_domain: APP_NAME.dionepaas.com + session_cookie_domain: APP_NAME.kilatiron.net session_cookie_lifetime: +30 days session_cookie_secure: false session_cookie_http_only: true @@ -256,7 +256,7 @@ And then replace it with the following '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 exoscale 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 CloudKilat 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. @@ -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=exoscale_symfony1' + dsn: 'mysql:host=localhost;dbname=CloudKilat_symfony1' username: cc_dev password: cc_dev encoding: utf8 @@ -334,7 +334,7 @@ After this, stage all the files in Git and commit them with a suitable commit me With that completed, then have a look at both your deployments to ensure that they're working. -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@exoscale.ch](mailto:support@exoscale.ch). +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@CloudKilat.ch](mailto:support@CloudKilat.ch). ##Links diff --git a/Guides/PHP/Yii 1.1.10.md b/Guides/PHP/Yii 1.1.10.md index bf165a7..f084508 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 exoscale +#Deploying Yii 1.1.10 to CloudKilat ![Successful Deployment](/static/apps/images/yii-framework-logo.png) @@ -10,7 +10,7 @@ If you're looking for a lightning fast, light and effective PHP Framework for yo * Loads 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 exoscale platform](http://www.exoscale.ch). +In this tutorial, we're going to take you through deploying the Yii Framework v1.1.11 to [the CloudKilat platform](http://www.cloudkilat.com/). ##Prerequisites @@ -28,7 +28,7 @@ So now that you have the prerequisites in place, download a copy of the latest, ##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 exoscale. +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 CloudKilat. ##2. Amend the Code @@ -40,7 +40,7 @@ Ok, now that you have your test application created and running, we need to modi ###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 exoscale 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 CloudKilat 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. @@ -50,7 +50,7 @@ Thankfully, Yii Framework is written in a very straight-forward and configurable 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 exoscale, 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 CloudKilat, 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 @@ -78,7 +78,7 @@ That will show output similar to below: master * testing -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale account and push and deploy both deployments. By running the following commands, this will all be done: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform. Now, we need to make our first deployment of both branches to the CloudKilat platform. To do this we checkout the master branch, create the application in our CloudKilat 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 @@ -111,7 +111,7 @@ You should see output as below: >> Building image >> Uploading image (4.1M) - To ssh://APP_NAME@dionepaas.com/repository.git + To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] master -> master ##4. Initialise the Required Add-ons @@ -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_exoscale_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_CloudKilat_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_exoscale_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < Yii Framework_CloudKilat_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: @@ -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 exoscale Github repository. If you have any issues, feel free to email [support@exoscale.ch](mailto:support@exoscale.ch). +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 CloudKilat Github repository. If you have any issues, feel free to email [support@cloudkilat.com](mailto:support@cloudkilat.com). ##Links diff --git a/Guides/PHP/Zend 2.md b/Guides/PHP/Zend 2.md index 290ad2b..4d4725e 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 [exoscale]. +In this tutorial we're going to show you how to deploy a Zend2 application on [CloudKilat]. 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 exoscale PaaS read the credentials +// If the app is running on the CloudKilat 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 exoscale. Additionally the filesystem on exoscale 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 CloudKilat. Additionally the filesystem on CloudKilat 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 exoscale platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create php @@ -174,7 +174,7 @@ Total 2208 (delta 1087), reused 2208 (delta 1087) -----> Building image -----> Uploading image (3.1M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] master -> master ~~~ @@ -188,7 +188,7 @@ $ ironcliapp 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://community.exoscale.ch/tutorial/mysqls-add-on/). It provides a free shared database for testing and development. +We are going to use [the MySQLs Add-on's free plan](https://community.CloudKilat.ch/tutorial/mysqls-add-on/). 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: @@ -199,12 +199,12 @@ $ ironcliapp APP_NAME/default addon.add mysqls.free $ ironcliapp APP_NAME/default run "php code/public/index.php init-session-table" Connecting... [SUCCESS] Session table created. -Connection to sshforwarder.dionepaas.com closed. +Connection to sshforwarder.kilatiron.net closed. ~~~ -Et voila, the app is now up and running at `http[s]://APP_NAME.dionepaas.com`. +Et voila, the app is now up and running at `http[s]://APP_NAME.kilatiron.net`. [PHP buildpack]: https://github.com/cloudControl/buildpack-php -[exoscale]: https://www.exoscale.ch/ +[CloudKilat]: http://www.cloudkilat.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 6997396..feb5627 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 exoscale +#Deploying Zend Framework 1.11 to CloudKilat ![Successful Deployment](/static/apps/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 exoscale platform](http://www.exoscale.ch). +In this tutorial, we're going to take you through deploying Zend Framework v1.11 to [the CloudKilat platform](http://www.cloudkilat.com/). ##Prerequisites @@ -36,7 +36,7 @@ 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 exoscale 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 CloudKilat 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 @@ -55,7 +55,7 @@ If we were deploying the application in a simple, configurable VHost, then we'd SetEnv APPLICATION_ENV development -When using exoscale, we need to do this in a slightly different way. It involves, for each environment, setting an environment variable with the ironcliapp config add-on, then reading that information from the environment at runtime. We'll come to this shortly. +When using CloudKilat, we need to do this in a slightly different way. It involves, for each environment, setting an environment variable with the ironcliapp 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 @@ -83,7 +83,7 @@ That will show output similar to below: master * testing -Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the exoscale platform. Now, we need to make our first deployment of both branches to the exoscale platform. To do this we checkout the master branch, create the application in our exoscale account and push and deploy both deployments. By running the following commands, this will all be done: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform. Now, we need to make our first deployment of both branches to the CloudKilat platform. To do this we checkout the master branch, create the application in our CloudKilat 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 @@ -110,7 +110,7 @@ You'll see output similar to the following: >> Building image >> Uploading image (3.6M) - To ssh://APP_NAME@dionepaas.com/repository.git + To ssh://APP_NAME@kilatiron.net/repository.git dde253a..7b040e2 testing -> testing ##4. Initialise the Required Add-ons @@ -213,7 +213,7 @@ Ok, let's start looking over the bootstrap plugin resources that will help us co ####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 exoscale environments, for the options for mysql. +In the database configuration, if we're **not** in the local development environment, we need to consult the ``CRED_FILE`` variable, available in all CloudKilat 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. @@ -402,7 +402,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_exoscale_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_CloudKilat_init.sql``, ready to be used to initialise the database next. -- table structure CREATE TABLE `session` ( @@ -433,7 +433,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_exoscale_init.sql + --ssl-ca=mysql-ssl-ca-cert.pem < zendframework_CloudKilat_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: diff --git a/Guides/PHP/drupal_exoscale_init.sql b/Guides/PHP/drupal_cloudkilat_init.sql similarity index 100% rename from Guides/PHP/drupal_exoscale_init.sql rename to Guides/PHP/drupal_cloudkilat_init.sql diff --git a/Guides/Python/AWS S3.md b/Guides/Python/AWS S3.md index aa1d9e7..75f93f0 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://community.exoscale.ch/tutorial/custom-config-add-on/): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](/Add-on%20Documentation/Deployment/Custom%20Config.md): ~~~bash $ ironcliapp 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 ba2a955..5063f8c 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 -exoscale offers a number of data storage solutions via the [Add-on Marketplace]. +CloudKilat offers a number of data storage solutions via the [Add-on Marketplace]. Below you can see how to access Add-on credentials for MySQL. ## MySQL @@ -83,8 +83,8 @@ db_config = { Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[env-vars]: https://community.exoscale.ch/apps/documentation/#environment-variables -[Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials -[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ -[Custom Config Add-on]: https://community.exoscale.ch/tutorial/custom-config-add-on/ -[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ +[env-vars]: /Platform%20Documentation.md/#environment-variables +[Add-on credentials]: /Platform%20Documentation.md/#add-on-credentials +[Add-on Marketplace]: http://www.cloudkilat.com/ +[Custom Config Add-on]: /Add-on%20Documentation/Deployment/Custom%20Config.md +[MySQL Shared Add-on]: /Add-on%20Documentation/Data%20Storage/MySQLs.md diff --git a/Guides/Python/Django notes.md b/Guides/Python/Django notes.md index 8ae5ee1..e7a952e 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 [exoscale]. +This document contains information for Django programmers deploying their applications on [CloudKilat]. ## 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 -exoscale 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. +CloudKilat 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: ~~~ @@ -22,11 +22,11 @@ ironcliapp APP_NAME/DEP_NAME run "python manage.py syncdb" ## Databases To use a database, have a look at the [Shared MySQL Add-on][Shared MySQL Add-on]. To get the credentials of your database, refer to the [Add-on credentials][add-on-credentials] article. -[SSH-session]: https://community.exoscale.ch/apps/documentation/#secure-shell-ssh +[SSH-session]: /Platform%20Documentation.md/#secure-shell-ssh [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ -[procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile -[Shared MySQL Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ -[add-on-credentials]: https://community.exoscale.ch/tutorial/python-app-add-on-credentials -[exoscale]: https://www.exoscale.ch/ -[worker]: https://community.exoscale.ch/apps/documentation/#scheduled-jobs-and-background-workers +[procfile]: /Platform%20Documentation.md/#buildpacks-and-the-procfile +[Shared MySQL Add-on]: /Add-on%20Documentation/Data%20Storage/MySQLs.md +[add-on-credentials]: /Guides/Python/Add-on%20credentials.md +[CloudKilat]: http://www.cloudkilat.com/ +[worker]: /Add-on%20Documentation/Data%20Processing/Worker.md diff --git a/Guides/Python/Django.md b/Guides/Python/Django.md index 7164671..b0ef2b6 100644 --- a/Guides/Python/Django.md +++ b/Guides/Python/Django.md @@ -1,6 +1,6 @@ # Deploying a Django Application -In this tutorial we're going to show you how to deploy a Django application on [exoscale]. 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. +In this tutorial we're going to show you how to deploy a Django application on [CloudKilat]. 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. ## The Django Application Explained @@ -37,7 +37,7 @@ INSTALLED_APPS = ( ### Process Type Definition -exoscale 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: +CloudKilat 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: ~~~ web: python manage.py run_gunicorn -b 0.0.0.0:$PORT @@ -47,7 +47,7 @@ Left from the colon we specified the **required** process type called `web` foll ### Production Database -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 exoscale because the filesystem is [not persistent][filesystem]. To use a database, you should choose a data storage Add-on from [the available addons][data-storage-addons]. +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 CloudKilat because the filesystem is [not persistent][filesystem]. To use a database, you should choose a data storage Add-on from [the available addons][data-storage-addons]. In this tutorial we use the [Shared MySQL Add-on][mysqls]. Have a look at `mysite/settings.py` so you can find out how to [get the MySQL credentials][get-conf] provided by MySQLs Add-on: @@ -87,7 +87,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 exoscale platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create python @@ -115,7 +115,7 @@ Total 31 (delta 3), reused 24 (delta 0) -----> Building image -----> Uploading image (30M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] master -> master ~~~ @@ -131,28 +131,29 @@ Finally, prepare the database using the [Run command][ssh-session] (when prompte $ ironcliapp APP_NAME/default run "python manage.py syncdb" ~~~ -You can login to the admin console at `APP_NAME.dionepaas.com/admin`, create some polls and see them at `APP_NAME.dionepaas.com/polls`. +You can login to the admin console at `APP_NAME.kilatiron.net/admin`, create some polls and see them at `APP_NAME.kilatiron.net/polls`. For additional information take a look at [Django Notes][django-notes] and other [python-specific documents][python-guides]. [django]: https://www.djangoproject.com/ -[exoscale]: http://www.exoscale.ch -[exoscale-doc-user]: https://community.exoscale.ch/apps/documentation/#user-accounts -[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/documentation/#command-line-client-web-console-and-api -[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile +[CloudKilat]: http://www.cloudkilat.com/ +[CloudKilat]: http://www.cloudkilat.com/ +[CloudKilat-doc-user]: /Platform%20Documentation.md/#user-accounts +[CloudKilat-doc-cmdline]: /Platform%20Documentation.md/#command-line-client-web-console-and-api +[Procfile]: /Platform%20Documentation.md/#buildpacks-and-the-procfile [git]: https://help.github.com/articles/set-up-git -[filesystem]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem -[data-storage-addons]: https://community.exoscale.ch/apps/addons/ -[mysqls]: https://community.exoscale.ch/tutorial/mysqls-add-on/ +[filesystem]: /Platform%20Documentation.md/#non-persistent-filesystem +[data-storage-addons]: /Add-on%20Documentation/Data%20Storage +[mysqls]: /Add-on%20Documentation/Data%20Storage/MySQLs.md [example-app]: https://github.com/cloudControl/python-django-example-app -[django-notes]: https://community.exoscale.ch/tutorial/python-app-django-notes -[get-conf]: https://community.exoscale.ch/tutorial/python-app-add-on-credentials +[django-notes]: /Guides/Python/Django%20notes.md +[get-conf]: /Guides/Python/Add-on%20credentials.md [Django tutorial]: https://docs.djangoproject.com/en/1.4/intro/tutorial01/ -[python-guides]: https://community.exoscale.ch/tutorials/tagged/python +[python-guides]: /Guides/Python [python buildpack]: https://github.com/cloudControl/buildpack-python [pip]: http://www.pip-installer.org/ [gunicorn]: http://gunicorn.org/ -[worker]: https://community.exoscale.ch/apps/documentation/#scheduled-jobs-and-background-workers +[worker]: /Platform%20Documentation.md/#scheduled-jobs-and-background-workers [db-commit]: https://github.com/cloudControl/python-django-example-app/commit/983f45e46ce0707476cec167ea062e19adcb53c9 -[ssh-session]: https://community.exoscale.ch/apps/documentation/#secure-shell-ssh +[ssh-session]: /Platform%20Documentation.md/#secure-shell-ssh [mysql-driver]: https://pypi.python.org/pypi/MySQL-python/1.2.4 diff --git a/Guides/Python/HelloWorld.md b/Guides/Python/HelloWorld.md index 52b7dd1..4d545f1 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 [exoscale]. You can find the [source code on Github][example_app] and check out the [Python buildpack] for +application on [CloudKilat]. 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 -exoscale uses a [Procfile] to know how to start your processes. +CloudKilat 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 exoscale platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create python @@ -66,7 +66,7 @@ Total 16 (delta 2), reused 16 (delta 2) -----> Building image -----> Uploading image (25M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] master -> master ~~~ @@ -77,10 +77,10 @@ Last but not least deploy the latest version of the app with the ironcliapp depl $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.dionepaas.com`. +Congratulations, you can now see your Flask app running at `http[s]://APP_NAME.kilatiron.net`. [Flask]: http://flask.pocoo.org/ -[exoscale]: http://www.exoscale.ch +[CloudKilat]: http://www.cloudkilat.com/ [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile +[Procfile]: /Platform%20Documentation.md/#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 9f2d253..32ac669 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 [exoscale]. +application on [CloudKilat]. ## The Example App Explained @@ -29,7 +29,7 @@ tornado==2.4.1 ~~~ ### Process Type Definition -exoscale uses a [Procfile] to know how to start the app's processes. +CloudKilat 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 exoscale platform: +and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create python ~~~ @@ -113,7 +113,7 @@ Total 7 (delta 0), reused 7 (delta 0) -----> Building image -----> Uploading image (25M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git + [new branch] master -> master ~~~ @@ -123,9 +123,9 @@ deploy command. $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Tornado app running at `http://APP_NAME.dionepaas.com`. +Congratulations, you can now see your Tornado app running at `http://APP_NAME.kilatiron.net`. [Tornado]: http://www.tornadoweb.org -[exoscale]: http://www.exoscale.ch +[CloudKilat]: http://www.cloudkilat.com/ [Python buildpack]: https://github.com/cloudControl/buildpack-python -[Procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile +[Procfile]: /Platform%20Documentation.md/#buildpacks-and-the-procfile diff --git a/Guides/Ruby/AWS S3.md b/Guides/Ruby/AWS S3.md index bd9ce20..55a480f 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://community.exoscale.ch/tutorial/custom-config-add-on/): +The recommended way to provide your AWS credentials to your app is via environment variables. To do this, use the [Config Add-on](https://community.CloudKilat.ch/tutorial/custom-config-add-on/): ~~~bash $ ironcliapp 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 de4bb40..3fb4c97 100644 --- a/Guides/Ruby/Add-on credentials.md +++ b/Guides/Ruby/Add-on credentials.md @@ -57,7 +57,7 @@ end # Examples -exoscale offers a number of data storage solutions via the [Add-on Marketplace]. +CloudKilat offers a number of data storage solutions via the [Add-on Marketplace]. Below you can see how to access Add-on credentials for MySQL. ## MySQL @@ -78,7 +78,7 @@ db_config = { Remember, you can always refer to the `addon.creds` command to see the actual variable names and values. -[Add-on credentials]: https://community.exoscale.ch/apps/documentation/#add-on-credentials -[environment variables]: https://community.exoscale.ch/apps/documentation/#environment-variables -[Add-on Marketplace]: https://community.exoscale.ch/apps/addons/ -[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on/ +[Add-on credentials]: /Platform%20Documentation.md/#add-on-credentials +[environment variables]: /Platform%20Documentation.md/#environment-variables +[Add-on Marketplace]: http://www.cloudkilat.com/ +[MySQL Shared Add-on]: /Add-on%20Documentation/Data%20Storage/MySQLs.md diff --git a/Guides/Ruby/HelloWorld.md b/Guides/Ruby/HelloWorld.md index 6936366..5c25f2a 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 -[exoscale]. You can find the [source code on Github][example-app] and check out the [Ruby buildpack] for supported features. +[CloudKilat]. 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 -exoscale uses a [Procfile] to know how to start your processes. +CloudKilat 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 exoscale platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create ruby ~~~ @@ -73,7 +73,7 @@ Total 14 (delta 0), reused 14 (delta 0) -----> Building image -----> Uploading image (31M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] master -> master ~~~ @@ -82,15 +82,15 @@ Last but not least deploy the latest version of the app with the ironcliapp depl $ ironcliapp APP_NAME/default deploy ~~~ -Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME.dionepaas.com`. +Congratulations, you can now see your Sinatra App running at `http[s]://APP_NAME.kilatiron.net`. [sinatra]: http://www.sinatrarb.com/ -[exoscale]: http://www.exoscale.ch -[exoscale-doc-user]: https://community.exoscale.ch/apps/documentation/#user-accounts -[exoscale-doc-cmdline]: https://community.exoscale.ch/apps/documentation/#command-line-client-web-console-and-api +[CloudKilat]: http://www.cloudkilat.com/ +[CloudKilat-doc-user]: /Platform%20Documentation.md/#user-accounts +[CloudKilat-doc-cmdline]: /Platform%20Documentation.md/#command-line-client-web-console-and-api [ruby buildpack]: https://github.com/cloudControl/buildpack-ruby -[procfile]: https://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile +[procfile]: /Platform%20Documentation.md/#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 e748af1..4dca6e3 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 [exoscale]. 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 [CloudKilat]. 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 exoscale. +Now that the app is working, lets have a look at changes we have made to deploy it on CloudKilat. ### Process Type Definition -exoscale 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: +CloudKilat 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 exoscale because the filesystem is [not persistent][filesystem]. +By default, Rails 3 uses SQLite for all the environments. However, it is not recommended to use SQLite on CloudKilat because the filesystem is [not persistent][filesystem]. In this tutorial we use MySQL with the [MySQL Shared Add-on]. This is why we have modified the `Gemfile` by moving the `sqlite3` line to ":development, :test" block and added a new ":production" group with "mysql2" 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 exoscale platform: +Choose a unique name to replace the `APP_NAME` placeholder for your application and create it on the CloudKilat platform: ~~~bash $ ironcliapp APP_NAME create ruby @@ -162,7 +162,7 @@ Total 62 (delta 2), reused 0 (delta 0) -----> Building image -----> Uploading image (34M) -To ssh://APP_NAME@dionepaas.com/repository.git +To ssh://APP_NAME@kilatiron.net/repository.git * [new branch] mysql -> mysql ~~~ @@ -179,21 +179,21 @@ Finally, prepare the database by running migrations using the [Run command][run $ ironcliapp APP_NAME/mysql run "rake db:migrate" ~~~ -Congratulations, you can now access the app at http://mysql-APP_NAME.dionepaas.com. +Congratulations, you can now access the app at http://mysql-APP_NAME.kilatiron.net. 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/ -[exoscale]: http://www.exoscale.ch +[CloudKilat]: http://www.cloudkilat.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://community.exoscale.ch/apps/documentation/#buildpacks-and-the-procfile -[filesystem]: https://community.exoscale.ch/apps/documentation/#non-persistent-filesystem -[run command]: https://community.exoscale.ch/tutorial/ruby-app-runcommand -[rails-notes]: https://community.exoscale.ch/tutorial/ruby-app-rubynotes -[ruby-guides]: https://community.exoscale.ch/tutorials/tagged/ruby +[Procfile]: /Platform%20Documentation.md/#buildpacks-and-the-procfile +[filesystem]: /Platform%20Documentation.md/#non-persistent-filesystem +[run command]: /Guides/Ruby/RunCommand.md +[rails-notes]: /Guides/Ruby/RubyNotes.md +[ruby-guides]: /Guides/Ruby [gem itself]: http://rubygems.org/gems/cloudcontrol-rails -[MySQL Shared Add-on]: https://community.exoscale.ch/tutorial/mysqls-add-on +[MySQL Shared Add-on]: /Add-on%20Documentation/Data%20Storage/MySQLs.md diff --git a/Guides/Ruby/RubyNotes.md b/Guides/Ruby/RubyNotes.md index 96e22cc..add7771 100644 --- a/Guides/Ruby/RubyNotes.md +++ b/Guides/Ruby/RubyNotes.md @@ -3,7 +3,7 @@ ## Procfile -The exoscale platform uses a file named `Procfile` to determine how to run your +The CloudKilat platform uses a file named `Procfile` to determine how to run your application. This `Procfile` uses the YAML format to specify the desired configuration. @@ -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 `RAKE_ENV` environment variables with the [Custom Config addon](https://community.exoscale.ch/tutorial/custom-config-add-on/). 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 `RAKE_ENV` environment variables with the [Custom Config addon](https://community.CloudKilat.ch/tutorial/custom-config-add-on/). For example: ~~~ ironcliapp APP_NAME/DEP_NAME 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://community.exoscale.ch/apps/documentation/#version-control-images +[procfile]: /Platform%20Documentation.md/#version-control-images [rails-procfile]: #rails-procfile [ruby-buildpack]: https://github.com/cloudControl/buildpack-ruby diff --git a/Guides/Ruby/RunCommand.md b/Guides/Ruby/RunCommand.md index 8ecc437..2e40bf7 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 sshforwarder.dionepaas.com closed. +Connection to sshforwarder.kilatiron.net closed. ~~~ The same could be accomplished if the multiple individual commands were chained: diff --git a/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md b/Guides/Third-Party Buildpacks/Third-Party Buildpacks.md index 10d8bb0..b713767 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 -[exoscale] officially supports the following application types via the [Pinky Stack][PinkyStack]. +[CloudKilat] officially supports the following application types via the [Pinky Stack][PinkyStack]. - Java-based (Java with Maven, Gradle, Grails, Scala, Play! or Clojure) - Ruby @@ -12,7 +12,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 exoscale platform covering the following languages and technologies: +Here is a list of verified and recommended buildpacks for the CloudKilat platform covering the following languages and technologies: |Technology|Buildpack URL| |:---------|:----------:| @@ -38,8 +38,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. -[exoscale]: https://www.exoscale.ch -[PinkyStack]: https://community.exoscale.ch/apps/documentation/#stacks +[CloudKilat]: http://www.cloudkilat.com/ +[PinkyStack]: /Platform%20Documentation.md/#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 c3d81e9..1da68b5 100644 --- a/Platform Documentation.md +++ b/Platform Documentation.md @@ -1,4 +1,4 @@ -# exoscale Apps Documentation +# CloudKilat Documentation ## Platform Access @@ -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 *ironcliapp* and *ironcliuser*. 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 exoscale platform. The CLI consists of 2 parts: *ironcliapp* and *ironcliuser*. 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 CloudKilat platform. The CLI consists of 2 parts: *ironcliapp* and *ironcliuser*. To get help for the command line client, just append --help or -h to any of the commands. Installing the command line clients is easy and works on Mac/Linux as well as on Windows. @@ -23,19 +23,19 @@ For Windows we offer an installer. Please download [the latest version] of the i On Linux and Mac OS we recommend installing and updating the command line clients via pip. They require [Python 2.6+]. ~~~ -$ sudo pip install -U cctrl +$ sudo pip install -U ironcli ~~~ If you don't have pip you can install pip via easy_install (on Linux usually part of the python-setuptools package): ~~~ $ sudo easy_install pip -$ sudo pip install -U cctrl +$ sudo pip install -U ironcli ~~~ ## User Accounts -User accounts are created on [exoscale.ch](http://exoscale.ch). +User accounts are created on [www.cloudkilat.com](http://www.cloudkilat.com/). ## Apps and Deployments @@ -45,7 +45,7 @@ User accounts are created on [exoscale.ch](http://exoscale.ch). * 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 branch. -exoscale PaaS uses a distinct set of naming conventions. To understand how to +CloudKilat 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. @@ -110,7 +110,7 @@ You can list all the deployments with the *details* command. $ ironcliapp APP_NAME details App Name: APP_NAME Type: php Owner: EMAIL_ADDRESS - Repository: ssh://APP_NAME@dionepaas.com/repository.git + Repository: ssh://APP_NAME@kilatiron.net/repository.git [...] @@ -179,11 +179,11 @@ spec 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 exoscale platform. With custom buildpacks, +be prepared for deployment on the CloudKilat 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 -exoscale and other platforms. +CloudKilat 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, @@ -212,7 +212,7 @@ At the end of the buildpack process, the image is ready to be deployed. ## Deploying New Versions -The exoscale platform supports zero downtime deploys for all deployments. To deploy a new version use either the *web console* or the `deploy` command. +The CloudKilat platform supports zero downtime deploys for all deployments. To deploy a new version use either the *web console* or the `deploy` command. ~~~ $ ironcliapp APP_NAME/DEP_NAME deploy @@ -270,7 +270,7 @@ $ ironcliapp 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 exoscale platform have access to a writable filesystem. This +Deployments on the CloudKilat 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. @@ -291,7 +291,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 exoscale platform is designed from the +staging and production phases. The CloudKilat 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 @@ -395,11 +395,11 @@ this feature. The guides section has detailed examples about how to get the credentials in different languages -([Ruby](https://community.exoscale.ch/tutorial/ruby-app-add-on-credentials), -[Python](https://community.exoscale.ch/tutorial/python-app-add-on-credentials), -[Node.js](https://community.exoscale.ch/tutorial/nodejs-app-add-on-credentials), -[Java](https://community.exoscale.ch/tutorial/java-app-add-on-credentials), -[PHP](https://community.exoscale.ch/tutorial/php-app-add-on-credentials)). +([Ruby](/Guides/Ruby/Add-on credentials.md), +[Python](/Guides/Python/Add-on credentials.md), +[Node.js](/Guides/NodeJS/Add-on credentials.md), +[Java](/Guides/Java/Add-on credentials.md), +[PHP](/Guides/PHP/Add-on credentials.md)). To see the format and contents of the credentials file locally, use the `addon.creds` command. ~~~ @@ -481,14 +481,14 @@ From now on all the new logs should be visible in your custom syslog remote. **TL;DR:** - * Each deployment is provided with both a `*.dionepaas.com` and `*.fastdionepaas.com` subdomain. + * Each deployment is provided with both a `*.kilatiron.net` and `*.kilatiron.com` subdomain. * Custom domains are supported via the Alias Add-on. -Each deployment is provided per default with both a `*.dionepaas.com` and `*.fastdionepaas.com` subdomain. The `APP_NAME.dionepaas.com` or `APP_NAME.fastdionepaas.com` will point to the `default` deployment while any additional deployment can be accessed with a prefixed subdomain: `DEP_NAME-APP_NAME.dionepaas.com` or `DEP_NAME-APP_NAME.fastdionepaas.com`. +Each deployment is provided per default with both a `*.kilatiron.net` and `*.kilatiron.com` subdomain. The `APP_NAME.kilatiron.net` or `APP_NAME.kilatiron.com` will point to the `default` deployment while any additional deployment can be accessed with a prefixed subdomain: `DEP_NAME-APP_NAME.kilatiron.net` or `DEP_NAME-APP_NAME.kilatiron.com`. -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.dionepaas.com` or `awesomeapp.fastdionepaas.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.kilatiron.net` or `awesomeapp.kilatiron.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 exoscale 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 CloudKilat 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. @@ -514,13 +514,13 @@ 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 `*.dionepaas.com` or `*.fastdionepaas.com` subdomains. - * The `*.dionepaas.com` subdomain provides WebSocket support. - * The `*.fastdionepaas.com` subdomain provides support for HTTP caching via Varnish. + * Within the routing tier, you can choose to route requests via the `*.kilatiron.net` or `*.kilatiron.com` subdomains. + * The `*.kilatiron.net` subdomain provides WebSocket support. + * The `*.kilatiron.com` subdomain provides support for HTTP caching via Varnish. * 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 `*.dionepaas.com` or `*.fastdionepaas.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 `*.kilatiron.net` or `*.kilatiron.com` subdomains. 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. @@ -534,13 +534,13 @@ Given that client requests don't hit your application directly, but are forwarde ### 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 `*.dionepaas.com` and `*.fastdionepaas.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. The values differ slightly between the `*.kilatiron.net` and `*.kilatiron.com` subdomains. 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. * __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 `*.dionepaas.com` subdomain: +#### Timeouts for `*.kilatiron.net` subdomain: |Parameter|Value [s]| |:---------|:----------:| @@ -548,7 +548,7 @@ Our routing tier uses a cluster of reverse proxy loadbalancers to manage the acc |Send timeout|55| |Read timeout|55| -#### Timeouts for `*.fastdionepaas.com` subdomain: +#### Timeouts for `*.kilatiron.com` subdomain: |Parameter|Value [s]| |:---------|:----------:| @@ -562,19 +562,19 @@ Our smart [DNS](https://en.wikipedia.org/wiki/Domain_Name_System) provides a fas ### High Availability -The routing tier provides two mechanisms to ensure high availability, depending on the provided subdomain. These are Health Checker (for the `*.dionepaas.com` subdomain) and Failover (for the `*.fastdionepaas.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. +The routing tier provides two mechanisms to ensure high availability, depending on the provided subdomain. These are Health Checker (for the `*.kilatiron.net` subdomain) and Failover (for the `*.kilatiron.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. -#### `*.dionepaas.com` subdomain +#### `*.kilatiron.net` subdomain -For the `*.dionepaas.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 `*.kilatiron.net` 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. -#### `*.fastdionepaas.com` subdomain +#### `*.kilatiron.com` subdomain -For the `*.fastdionepaas.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. +For the `*.kilatiron.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. ## Scaling @@ -584,7 +584,7 @@ For the `*.fastdionepaas.com` subdomain, failed requests are automatically re-ro * 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 exoscale 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 CloudKilat loadbalancing and [routing tier](#routing-tier) ensures efficient distribution of incoming requests accross all available containers. ### Horizontal Scaling @@ -616,9 +616,9 @@ After you have reduced the total number of requests, it's recommended to cache a #### 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 `*.fastdionepaas.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. +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 `*.kilatiron.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.fastdionepaas.com` subdomain `A` record. Then you can update your web application's configuration to serve static resources from your new domain. +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.kilatiron.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. @@ -628,16 +628,16 @@ When caching requests on client side or in a caching proxy, the URL is usually u 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. -### Caching in dionepaas.com subdomain +### Caching in kilatiron.net subdomain -Requests via the `*.dionepaas.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 `*.fastdionepaas.com`subdomain. For example, you can serve the dynamic requests of your application via www.example.com (a CNAME FOR `example.dionepaas.com`) and serve the static assets like CSS, JS and images via `static.example.com` (a CNAME for `example.fastdionepaas.com`). +Requests via the `*.kilatiron.net` 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 `*.kilatiron.com`subdomain. For example, you can serve the dynamic requests of your application via www.example.com (a CNAME FOR `example.kilatiron.net`) and serve the static assets like CSS, JS and images via `static.example.com` (a CNAME for `example.kilatiron.com`). ## WebSockets **TL;DR:** - * WebSockets are supported via the `*.dionepaas.com` subdomain. + * WebSockets are supported via the `*.kilatiron.net` 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://`. @@ -662,7 +662,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 `*.dionepaas.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 `*.kilatiron.net` 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 @@ -686,7 +686,7 @@ Tasks that will take longer than 55s to execute, or that are triggered by a user ## Secure Shell (SSH) -The distributed nature of the exoscale platform means it's not possible to SSH +The distributed nature of the CloudKilat 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. @@ -707,7 +707,7 @@ interactive commands work as well u25832@DEP_ID-25832:~/www$ exit exit Connection to 10.62.45.100 closed. -Connection to sshforwarder.dionepaas.com closed. +Connection to sshforwarder.kilatiron.net 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. @@ -721,7 +721,7 @@ CRED_FILE=/srv/creds/creds.json DEP_ID=DEP_ID DEP_NAME=APP_NAME/DEP_NAME DEP_VERSION=9d5ada800eff9fc57849b3102a2f27ff43ec141f -DOMAIN=dionepaas.com +DOMAIN=kilatiron.net GEM_PATH=vendor/bundle/ruby/1.9.1 HOME=/srv HOSTNAME=DEP_ID-10346 @@ -729,7 +729,7 @@ LANG=en_US.UTF-8 LOGNAME=u10346 MAIL=/var/mail/u10346 OLDPWD=/srv -PAAS_VENDOR=exoscale +PAAS_VENDOR=CloudKilat PATH=bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin PORT=10346 PWD=/srv/www @@ -745,7 +745,7 @@ TMPDIR=/srv/tmp USER=u10346 WRK_ID=WRK_ID Connection to 10.250.134.126 closed. -Connection to sshforwarder.dionepaas.com closed. +Connection to sshforwarder.kilatiron.net closed. ~~~ ## Stacks @@ -779,21 +779,21 @@ $ ironcliapp APP_NAME/DEP_NAME details ~~~ [generating SSH keys]: https://help.github.com/articles/generating-ssh-keys -[Custom Config Add-on]: https://community.exoscale.ch/tutorial/custom-config-add-on/ -[web console]: https://portal.exoscale.ch/applications +[Custom Config Add-on]: /Add-on%20Documentation/Deployment/Custom%20Config.md +[web console]: http://www.cloudkilat.com/ [API libraries]: https://github.com/cloudControl [the latest version]: https://www.cloudcontrol.com/download/win [Python 2.6+]: http://python.org/download/ [quick Git tutorial]: http://rogerdudler.github.com/git-guide/ [Heroku buildpack API]: https://devcenter.heroku.com/articles/buildpack-api -[guides]: https://community.exoscale.ch/tutorials/tagged/apps/ -[Add-on marketplace]: https://community.exoscale.ch/apps/addons/ +[guides]: /Guides +[Add-on marketplace]: http://www.cloudkilat.com/ [rsyslog]: http://www.rsyslog.com/ [TLS]: http://en.wikipedia.org/wiki/Transport_Layer_Security -[Alias Add-on]: https://community.exoscale.ch/tutorial/alias-add-on/ +[Alias Add-on]: /Add-on%20Documentation/Deployment/Alias.md [Varnish]: https://www.varnish-cache.org/ -[Cron Add-on]: https://community.exoscale.ch/tutorial/cron-add-on/ -[Cron Add-on documentation]: https://community.exoscale.ch/tutorial/cron-add-on/ -[Worker Add-on]: https://community.exoscale.ch/tutorial/worker-add-on/ -[Worker Add-on documentation]: https://community.exoscale.ch/tutorial/worker-add-on/ +[Cron Add-on]: /Add-on%20Documentation/Deployment/Cron.md +[Cron Add-on documentation]: /Add-on%20Documentation/Deployment/Cron.md +[Worker Add-on]: /Add-on%20Documentation/Data%20Processing/Worker.md +[Worker Add-on documentation]: /Add-on%20Documentation/Data%20Processing/Worker.md [Ubuntu 12.04 LTS Precise Pangolin]: http://releases.ubuntu.com/precise/ diff --git a/Quickstart.md b/Quickstart.md index 87361e1..075400b 100644 --- a/Quickstart.md +++ b/Quickstart.md @@ -1,7 +1,7 @@ -# exoscale Apps Quickstart +# CloudKilat Quickstart -It's easy to start with exoscale. Follow this 5 minute quickstart to get your -first app running on exoscale PaaS. +It's easy to start with CloudKilat. Follow this 5 minute quickstart to get your +first app running on CloudKilat 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 @@ -28,14 +28,14 @@ installer and Git bash. Come back when you are done. ~~~bash # if you don't have pip yet $ sudo easy_install pip -$ sudo pip install cctrl +$ sudo pip install ironcli ~~~ **Windows:** Please download the provided [installer]. ## Create a User Account (if you haven't already) -You can register on [exoscale.ch](http://exoscale.ch). +You can register on [www.cloudkilat.com](http://www.cloudkilat.com/). ## Add a Public Key @@ -47,10 +47,10 @@ 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 exoscale +## Create the First Application on CloudKilat -Create a new application on the exoscale platform by giving it an unique -`APP_NAME` (the name is used as the `.dionepaas.com` subdomain) and choosing the +Create a new application on the CloudKilat platform by giving it an unique +`APP_NAME` (the name is used as the `.kilatiron.net` subdomain) and choosing the `TYPE`. ~~~bash @@ -66,7 +66,7 @@ $ cd PATH_TO/YOUR_WORKDIR ~~~ Clone one of the example apps in your preferred programming language and push -it to the exoscale platform. +it to the CloudKilat platform. ~~~bash # for Java @@ -97,7 +97,7 @@ 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 exoscale +## Deploy Your Application on CloudKilat Deploy your app with @@ -108,18 +108,18 @@ $ ironcliapp APP_NAME deploy **Congratulations, your app is now up and running.** ~~~bash -http[s]://APP_NAME.dionepaas.com +http[s]://APP_NAME.kilatiron.net ~~~ ## Cheatsheet -Grab [our cheatsheet (PDF)](/static/apps/exo_cheatsheet.pdf) +Grab [our cheatsheet (PDF)](/cloudkilat_cheatsheet.pdf) to have the most important command line client commands handy at all times. ## 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://community.exoscale.ch/apps/documentation/). +[platform documentation](/Platform Documentation.md). [installer]: https://www.cloudcontrol.com/download/win diff --git a/README b/README index 4ef4dbc..4bb243f 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -exoscale Documentation +CloudKilat Documentation -Markdown source of the exoscale documentation online at https://community.exoscale.ch/apps +Markdown source of the CloudKilat documentation online at http://www.cloudkilat.com/ For corrections or suggestions please send a pull request. diff --git a/exo_cheatsheet.pdf b/cloudkilat_cheatsheet.pdf similarity index 79% rename from exo_cheatsheet.pdf rename to cloudkilat_cheatsheet.pdf index 0db4655638b2fbbe67c39d8016e521566e488bb0..98d0a2072c99dcdfc33524d53e6012f3bc55aafb 100644 GIT binary patch delta 136807 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%0AG!C6Bx{&h)tmyJ2;C_=p2_c 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 delta 136131 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


    QIJJ*xZjq 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

    Q8Gby-z^=~biy^SP$rz)#O$ANd? z1^RX_W^ZV++<=Dt|PDF%Ni$oiL9oX08|;+3I-k zYJe_`O-5@Af}9?HAs-CxeABAS^n{mOgMDADkHpY z!J**eV`heEp!;>iI{+E)6Fbkb*LYsu-78w3JTo{PkJoCJW>2R58A5>>>83mV(+k^8 z@WMHF#hQ~3r}?JN?J;}3r)MXv(NpH6?c!mBPDM!?YbnvGHSg3-ftTx7_z~SJTo2FQ zmsks>w(Z&rht3RGp4K9-vrY@qwkz8R-HyKn5*!)jfysjgypC$d1|x-m0DAyP3@LMh z4MAFe!KOp400DDs$N+u-S~mp$mRcYrogTmkIWGJk%HMJfd8h|)L1qB~JXmP-yT4+- zY}5zbMYie!crqRca-aa70N;DaCwhN95+lP&u^_1VbimeKq^bVjQIHz0ScE8sYJeX< zve5&ej+&bR$nqln(gD2aME?Ti7DvWlVOb-4s(zFH)>c8JVz7UMu7Y7`w7aNSOg;n@ z`VW28C?UNBPPyR0!b-pyKMuH86f=OvAr^cWK!P*E>SF{2IK zy_?zAMk@k^i|1kpuKpaJAD^4jebNjZmi3Dk%=4#C3+=aRD{2?tJ6p?#Y;yg8)%G|s z3^wt77Kd1mSbUvvcIS4R54-Sw507_gw(8#&CWH=wiF3my-u~ZQA&)^JwoM-^PKtS1KD^o#7o8o)^t(?2fWKC*Ewt-=WX0i zj{iQo7Fw_=w!6xpHkPSQYV+ALmZ^F>=_(dsj<7My^#pkJ_*?Wb&!s3e=x$TD2VKpfu!Np*z2|sL zmxSY!F5pYXn!xX;n$qPSD(Qx?PHPN)ZJ~(ySu$#9#R#De1|;qY*ga(l9NzcBZgcYa zRF-)S7kz{!p^<7WCXsazA7St8&0o^DHld;67x_W$^r7$hZWW6=dOw!vqM`TKh==qv z&d4;7 zO!y+j-5`blWq-@c1LXv~59OXMwDBk5aE7^aKZLIzvZ{;4-_a}Kf03_5a01PEP!=Rj zxTVogRbZhv`R$rOtijpYoQ_o~yG~MmQ)&14@+X^t6}C$c9627o`uwS?h@7u9Ol?Ed zF2thns|hkbKa+@R=-2*bqQULilpXsw#eKWag?q#itDQ^X!MQ(G1|46V$Q2*+gU+&k zlFckzCHNnYw->DctAC?A`K>V2hT^c8Dk6&IZP!%d*+HoWIkSu>woP%p)y7%Nnt$}L zHI*}_aNZ8>`4L~(URjvgQ{i%15~J@k1H>#YXENPwnuqjm(SZzmSKj~$#7y}6j)WPKfj1nU zKmRJ&meLZmlLW0WL&X!qx)WOSpxK?R%XHnnhT}ow$)v?0dQ$DyVrILHEz<-g0fch5 z-?*A=8ZvQGb%yuhK*Kn0e`k$uIkpx&m=Vjj*Y)b9BRu0 zwN*>4P%5L$V;{{M_wLn_5=?p;Bhn)*MBnEfb}@T8m?%AGIn*OQAWaGGD>3Euf8xoU zdiz7r!_kV7pp?MXPtzs0qmAhsHU*8nsvgulTWHZ3mr__Djnc*>}2wS?(*NJ^( zW&R{87N0<>yKkA>^E?FJvxl6V?=o`zg6k~)8qL=E8ey%X+^J&cl79Mi85iaSKaObY z9hIrFN?#6*VR&MRE>H^|Ab4~&`c3)ZlV{_q zqQw>1_PXfN7m~0+s%%P);6~8zTx&K-a0u%WnU^-3ToXVvpE%A=J3M>oB{6z_Uxh6z z!Xne!sXAO)(`Y;!d6@S_>`>%k@nkF(*!_)!jU^V_^)Pqo4-%2aVHB31May@dgNJI2 zfwjG2Fq;Xx*8yLJi!|xp`2WbV7XV$`5-K_3*7g1Bnyuu0_|vr(ff(9eQSnrna}sTG zwm^?iL(lmn6N?q+TFsYqgHmxz-JY7Cm8_ZO9(~@b>%J<7hG07oZ*_&E(M*gS?*kI~ zTrMx7eOQ+e&6{0clIzTA=zMiAPqu%zj4wBm`H8Z4HZCQvcL8w~^VKYyuBO69i2A(7zM@6)FCDzIy=z5gIR9|XdH2RJ(ERzh2R@% zG3n2v^}&pSJJSS_txAS=Olhhs$Ku}D&W=|Z@5*lmKM@TqW}3i4c*p9&jf46*br-^y zla2Ry@#PV9c7eWB+J~`K=F|<(Z*MzrcJ~Sfy6>xV<-3(LtMd?UOY6M+eD20LfN}5^ zCyT~DhTxv+7uqf#)~m0Zr2-%w!(xXc8p@T0sZpT(!%==+kxOJOaWGER zJoLIJl4Q<-0oMyQMy#vaZF0b)MMrxItx3=M^~FhFE0$-PIeBorri zZtV_4fG$0NU#ZYQNwP&rhfYXs_BUtY(&|z=#q%E)tK;}wR%iPj*anpt1yJ1hTP4Bu z6l6*o_LmFeZ-4od(mHBq`{L&2(`{4pZYa3~6Bt+O9~5-Hzl`T0fVw8q4_snC9}t>l zq9A*EiixM}L~Qsy#Rri()_R>`L1V3lEy+HC2pcTe4YS#B7%|}~>$P{MurD=Z;X&da zdHalSFBUzMHI0pzyMK^Z@MT^Mmyc?Xa}$dP-++OU@40`NKZ8j8P3pPucEOXl7Krw@G^Il4aW`&Ak>5hip7E z1k0=F+*83vVqq#gkUafUbb1{MOm%&zvNv{o+pnKSum1X#kPw?z-0S~{+BxBE?XHF( zQ5v1XYfCL%70Feamv45lhTO6EcW)|uLZ6%`fK4rt;jfjM&wH8HsSRGqGD}crW~U{D z^>vTwUg)z1OK24Guh0JYJT&?Wp9kiTi|DQsR$ljL$VKhRjNoy{;j%g1E1y(&FZC{@ zUV@NhD|JSn67Wr__`#i0kF{yG%&4C2n!b?$QciYbrO7>CR1Kc6>qCFYV@@@al=+J% zlAl-3J~0h&4TS&;Zmw!Q?EXyUY#AAMdD&& z;NwcsBEx0?693knbCAqfSif~~Via2W_PL8($HL-8PPJo0P-?tbc4Wv{lD~pEP`}_< zcwnRoDVE6ZRRBFo(-rHA6M4Y%ui)%7EcD)oYB-iU^2rQZV_#{*vS2`Bx?-uL(9g28 zNR>1!4HW$m77jD=NgI~v-@1M*88(0cDK&%jTXX-11q2BFZ2{r`Q)ka6s>|o0j+~p9 zr@;Pr#?J>}SH8JjG85S-56zzmn4R$mEO%4{aVwp#w>B-@7}-8DZ|{C+u+1{K%U&LQ zi7-%mXBv~!L0xFQ>cK7v&Zn9O!LPLNsY1Z zq(PiZYXiK~A`IhlZ>L3xqj#X6KfS$!xa_%%_IZBMYT71T_Snm&_;J3UW3bGtw;;_B zDO_6FuFNV!e}Yc$lF~%xfsCGoS}8P&o%ut80=v~l9;tA}Z{;vMMSPV|%L1}wb;+?7 zc@x!0zUn=9V(qt?E}bzx%VKRVlV#rW??EruT1Zts9ta5Y-~`9ayihtMu>StC4zVSh z$w4lf)MeOEFeSvK%96Q%*9Bu$wPIF+J0@{3>m%^XYGi!_VrqVn{89$&gcQY$H?>zf zyi?}TqAE^uEZf{n>Ba88#?{ zbQ|pcD#?4<)mJt5f|vN0-~f`{iwL2aP#6%`Yom#C?B!{wL&frS0RKK7ot>9B&oKFz zGfkROJ{Q1*e%YDbiSBpVHyJyU=r^f0?!?}U+3y77_faSrBw6b#JeuL=+#x94b7K)> zEq-C<>58ZPW03GYaoVP&^+{&PegnqD8a(?(=3;BS%-ll&UIZuAnN*TlK(O+WWz%L> zzL6773$^wnlK7BJDZ|Cf!J#GR6L=nzE*ySm)sTphIN&9=ggtqK)kd{5CI!R6GS^j( z)XPNLnk*b-sYhPQut6lj>yyso=&?_raH466GS-_7Z*nz@3#3z1?4~t3B_G`|W$EgN zyPIbGI?YV;vJ+B&vQ$lm}-{kra;OF)&B0Q+SWxG|Iv=Lbf$vLV0p~gaV7_KaR47d z8Joa_QC0oqgTRUPR<^R4lhG^rhL2mraMa%31h> zT5HU=tUe2sh-Y}Gc9Hx)lKQJ2HxXkL6ABv;CL2bw(#A!B4!Nc<1{W zP}!N~-u$Y!IoWVFnw0EwuPQry6^8Ef7Yy+hrjM#01gZbBxBZ2my*(FjTa{Dfw6QcX ztW^_oV-a(ddX@Izn15Xu6Bna()9nkgV!&}%dak+yjzCQ{HYx~mdokB8#6P-_cv4;-D+o(%k5+O z955@A8~&jKJkKBS9A`Za_n~DV_nd75vt#Sbx0B1`kgD;Dn7(b?+eqe^-jbWiWpTtJ z-h0Ln&%^yz?5E7VqtBfS&GPCz4Esq~*FqM|yIEh3&7|iK0b^+?e7@Z!)lNnm$fVg8 zCcqer5(c`e{B=3tzCGtDiOx>?Aeg77?hESIkiC26@!uV3ZsUC^y-^}2pXpS}gyQ{< zBanI-#~9hsTutS?m^zJ({o}Iw7DkA5dxi11;9gKwpUsp+2bQ>=ByL*_<)j;F zp?cr^CvVHLy~U018htgSsL0Dyo%fK<%KceXFj=R5U>n4tE&GFH5vm@?wtL^U$Sm=J|{^KG&J`YA5e#BP#~y zuyyKBeTt`?GG1ZP{uoNyYP^@u+w$21&QqZ=YZ#j3N&Bu0?VX7RSLxqjL61JgiI)dd zmoWTv573Y;6>O{dpqfLegMSi0*5SsOd*J>OEJK4*?d1W){LzS~<{hzs z6e5y)ncen5baguyRF>lsmkaj3TA!A$H11DKFGrZ4M}3&}CP=RKCO`kV*1Pegps%x* zEb<#2D?~FdJd#IBvoB2SXBXz%V7Q&06K|mirPU4c5N~cb!#7VB751PB!+P)Mka?kA zN!-(})bL$9E0=a`I*hkC0A(#?q!Bh+ZGin{$NSfJ3K-glu5$=IOaF6t7@#{NkX-$% zD+7~qBnE@82_@yr^V{J>4vB|t4Kq!AS*pxnvYcYamI0}f(UzONoGiEHfhG6gcADc+Z0IKqt6KPde>J2c0m)j3-<2mJ)dvA1Lt@wp8g_I*Ia40h$p7m} z?M_dpk+k;HQ(q?AUUDIY=+{N!%#}60uMjkra2%bxA29A`bKK`V7x6j=@H{T1$wu&J zIzJ_oBOPAT2*SeEw0V}!bhxippE%d)^=?>!;N1iW?ixE{HjyC85I3l1l(NiNAOI#6tP2(-%G=4~<4DWk6%Ygq@$6wVrl)KP8>5|~W! z?YPK`>3G5Qe%OOP24H>97u&;+L<|=4HuLHc_ANM$v0$#u$ruy=JEA{~6&(@7H7WkG z%5G#aQkqcChAuBH_O84mixqRG=zwO85wi~PBWyE7+hkko^N`TRYgH730=^VO`wF)m z?xgUNQS#H9^Y=LHnM>jg!{J8o0>A^)9f{uN$^kG*MTmn^#2uCc6Nn)ljKxA#E~`wS z2YD3u_`!#<4XEtdersZl0|mFn=f$h)!#?DBnAG*7Q2L2*=i4-(-fdsgZQt#A+*&@` zz8?7TBMb5%`L8kbw?_q%2n}bB1q1(|V<>Aby#zhQ1VZs}8gxKxK^QpHN7pP~QH)%^ zAW?(5hC0|5kp^n$_TxS-YVR*w{>|4nV>|7}*Jb%@0ctQ<14lv!u8e`10iTf5%fv`X|XhhLEZ$i^Cwmvoktxm@V$+WqE3{Oiy`{Yq_cpIIQ_=AIgjFa0 zC;(BDU^5mM%v{)c9a=k8Am5y7J*3)-cY+~ogYjCxvubDD!u{&d9-O_`kBWKAjU&HK zvtmRxPxep?I1;OJM4X-a(6_-2UmT8 zh%MK4xr%o-Dw1>!HXZu&aD8>qU4ifS)1O;6OOvih$-TPXAnj9t4;odu&9Cd4(as*Q zz5rofjSDV>O^W2kg6I;&K-P4{~Da+oj)*TA^{?eV|h*`XmY{IT+ zxrl2nlF4ASW4O(~rm)6%z4oaPSyGEF2|%y%(2A8L+R^z)55R{2f&V#m{JYz8XUQv~lsm z7d{3UBg2}bNF4Et-aM}oB4EcZgnbqoC9U-1;ng+X+75bCF8+Bw zCQ+Fxo4bO>iS}tZu4iQ9Hw(nB<-FiWl6fKk!95KBmM5%3%cSlP+v7Y-C$r-&%`#JpR$1-6tGBDt^{=$xfUERv{pzP_ctjqzWUAJ0ny9rxEv)qOK?0jer<KOp$K9cEQI_jcMjSbj*stHXlopfhi4#}BtOBj#Bg_c`wkzQ+$%8dGgA zm*zFVhQ$*Z%|(0Tik9#0g95F=LCwEY!E#FGcn3URW7&rH7) zVZ+6)7BS2WmUBev4*b?aqUQ;e$*UUL_+l9#S?6!s{Pw|*-d)PRY(e$DJRjwq>Yo?q zw4I+mingndm{xr4Y0-Ihs-Utq+^XGM{VkBRlBI8{0cT&*!C(O)flGF@wzSOM3nLG- zyJHZ{hB=OiX`g)4@{m43+ckpu8M}P`R$Q~tQ3!e4+qvJLOAl%v0EjUxbDuzw-y5(c zkyG91&!TsWFbM%5Ad=h}Q{YdFh2f0P8XtLEMi50JMpgEkkGM5X-M6>Fv>X!N4tz&) z;Ij|s`bEWgxGCQ^ME>U+V|xx7`3rs8z|Vx?%co}rmk~F>Sv9r^r@abnT89F|gSk=^ z$p@_54Tr59$*jWjRQD3=VILM671%{j<1h~I(UGlp4 znMnL9d(eh$WNe_wv63NbAWy$YE>;gJTDc=snaBRb_#_Z~8Uaqnw9gMSYAM4gxk`5h};%z5V@AXDp z1UBm{yvs9}V6tXUqR+m1))I}oPv&63&GUj=#uAea+wwNATTs3k!K|wM`AJl37n>2t zgZa}q2Y92KA9&|$0ULTx@unJW7r)xbU?WjllO4hESHjjjb6?1QKuwHt;Frm=K(#Yx zwdiQy2<)l&7(_&r!*-q2L!EfFw60>(nG%LFsvJi04ZzAi7!|2c-B{3*TvoCUw^QQH z{F*!vI^I=VyxeVqXhJ;h3hd>3G3klIyPCzxg_?AHe(kb8^5W@=ZBR$8-22wZcz!}v zq@dZD1M5ypSZLz8kWtH{w1B&MM-SgChKX93G@2aVIa1kK)Ms5+Jc;=n({z!{`G`KM zOu*XDaLmH1KOoenk<6H{1=9)Z!b?6r?V6v48^DW$nv=7%Mx zeX3YpPNJc%+*3`H?A9Hxm{kMOdIzEHO&oVI_3Ljq%G9L{=B)ip`>8_z7hN+TcjCH` zMmIk_Yx|iH4r1bq`@6R+6=i0D`ns-CEpGyKtFm&hC5rS^wfNPv#V-6Q_oKIl90FwD z8fF;%G}vu>EiC%!tabHL3Gd*i)8+#!hDKzF&+9K1qBUz2zzd$`)I)``D}w1F0v*wa zz+B-)#RpOSWq#%Dp_x`~5Ci}+On7pQw`mp2G<3L^5k|6_z-QT_e!TrawFqvInxCu~I8YyyC+lk{>xX-~)^SZfh5tebAk`0Kh&HW=#(IEScx?CC7|(t><_g&Vc(w_8ecb=@Gu;ydrdn^=On z8J-b*uJdeQ(%mB~EZe6h-@@U(@J8SKUBoND!bKMf=h&FCajB2-^|RaA*0RSTAiV^T zL-((651dNH({F;6$e`@$fO;m#!JI)>ZyM)5!WVdQ$=GICke=Dvi?R4ROIulXrIbK9?( zR99Ku&07ealzv*W!?1c!^9LC3(GHge!H|$~>lCW=tG9sMINVAaf827etp9+{@|`)} zMt;S!qztl0goYD|-*zn(T#DNoVQ+Rry0SGz0gZV&BN?Xyg8=O!v#I89vfMsR70 zCZ!RR70PVLwc1C4!WAzK7`vT1HxGYuBZgpT`;uwSCLuDf6sNNIo z4R)mI5H>NXjj#Q0f9!v|bobKXsG{9*DClv*@Ba4I_Ox{&k(3mc{UcfhJ&q>YoxJFd z3R3zm4k@!J1jzdP{{8pw|Nnme{fl(Fi{pR^L{8qtQAa1P!+^s=4*Fda3le*ehrhEB zg=QQPGtz)XfaqO^{|tfs4#5Yq{#A7}+6e;=7bS=l{?ABa$Vdhp4m{{@Dk}`>&45Ff z@r(ElI%#PE^3l#bPd&SpJ*WN+g z8EM0YLyZL9!(n1YZ{31|U@#FNda3w-WrK3Rhm!>Ov#P&&fFkC?vBM;>5AyW2vvIQ* za`t%m5GlZg!-zt1<4|D%prU{66Nnq(!$IG;=o=4xFx5z+rCG~%zG4u*<=L4VW^3HADjWh!D6C+uoWx@ zh5y;pAwVb?{zo1VAOeQ2-aktX0m4D>KN5rh#encXYJ#STiTqJx2zrc&{Lw$qG??h0 zd4M2L`0r-=&HsP19|D5F#r|kJ2pCQKvoH{J{r)Tr1OgKKqv?J($bWGG0)e8Zu>bV8 zzuF%i5zVjvA^r|U(_nwL=WiPP&)T8o$DczH9S{Cr+=4*FAb$uSbi4;*|D7OOX#TGf z{#_WD2>1^!z`!st6oh=hL3Gy^3KLe5HX$n$KHVi O1cH)qaw=#klKekgXAQUj

    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