.. Copyright 2014 tsuru authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. +++++++++++++++++++++++++ Deploying Go applications +++++++++++++++++++++++++ Overview ======== This document is a hands-on guide to deploying a simple Go web application in tsuru. Creating the app ================ To create an app, you use the command `app-create`: .. highlight:: bash :: $ tsuru app-create For Go, the platform name is ``go``! Let's be over creative and develop a hello world tutorial-app, let's call it "helloworld": .. highlight:: bash :: $ tsuru app-create helloworld go To list all available platforms, use the command `platform-list`. You can see all your applications using the command `app-list`: .. highlight:: bash :: $ tsuru app-list +-------------+-------------------------+--------------------------------+ | Application | Units State Summary | Address | +-------------+-------------------------+--------------------------------+ | helloworld | 0 of 0 units in-service | helloworld.192.168.50.4.nip.io | +-------------+-------------------------+--------------------------------+ Application code ================ A simple web application in Go `main.go`: .. highlight:: go :: package main import ( "fmt" "net/http" "os" ) func main() { http.HandleFunc("/", hello) fmt.Println("listening...") err := http.ListenAndServe(":" + os.Getenv("PORT"), nil) if err != nil { panic(err) } } func hello(res http.ResponseWriter, req *http.Request) { fmt.Fprintln(res, "hello, world!") } Git deployment ============== When you create a new app, tsuru will display the Git remote that you should use. You can always get it using the command `app-info`: .. highlight:: bash :: $ tsuru app-info --app helloworld Application: helloworld Repository: git@192.168.50.4.nip.io:helloworld.git Platform: go Teams: admin Address: helloworld.192.168.50.4.nip.io Owner: admin@example.com Team owner: admin Deploys: 0 Pool: theonepool App Plan: +---------------+--------+------+-----------+---------+ | Name | Memory | Swap | Cpu Share | Default | +---------------+--------+------+-----------+---------+ | autogenerated | 0 MB | 0 MB | 100 | false | +---------------+--------+------+-----------+---------+ The git remote will be used to deploy your application using git. You can just push to tsuru remote and your project will be deployed: .. highlight:: console :: $ git push git@192.168.50.4.nip.io:helloworld.git master Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 430 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: tar: Removing leading `/' from member names remote: / remote: remote: ---- Building application image ---- remote: ---> Sending image to repository (5.57MB) remote: ---> Cleaning up remote: remote: ---- Starting 1 new unit ---- remote: ---> Started unit b21298a64e... remote: remote: ---- Binding and checking 1 new units ---- remote: ---> Bound and checked unit b21298a64e remote: remote: ---- Adding routes to 1 new units ---- remote: ---> Added route to unit b21298a64e remote: remote: OK To git@192.168.50.4.nip.io:helloworld.git * [new branch] master -> master If you get a "Permission denied (publickey).", make sure you're member of a team and have a public key added to tsuru. To add a key, use the command `key-add`: .. highlight:: bash :: $ tsuru key-add mykey ~/.ssh/id_rsa.pub You can use ``git remote add`` to avoid typing the entire remote url every time you want to push: .. highlight:: bash :: $ git remote add tsuru git@192.168.50.4.nip.io:helloworld.git Then you can run: .. highlight:: bash :: $ git push tsuru master Everything up-to-date And you will be also able to omit the ``--app`` flag from now on: .. highlight:: bash :: $ tsuru app-info Application: helloworld Repository: git@192.168.50.4.nip.io:helloworld.git Platform: go Teams: admin Address: helloworld.192.168.50.4.nip.io Owner: admin@example.com Team owner: admin Deploys: 1 Pool: theonepool Units: 1 +------------+---------+ | Unit | State | +------------+---------+ | b21298a64e | started | +------------+---------+ App Plan: +---------------+--------+------+-----------+---------+ | Name | Memory | Swap | Cpu Share | Default | +---------------+--------+------+-----------+---------+ | autogenerated | 0 MB | 0 MB | 100 | false | +---------------+--------+------+-----------+---------+ Handling dependencies ===================== If your app is split in packages, you should set the `GO_PKG_PATH` environment variable with the package name of your app: .. highlight:: bash :: $ tsuru env-set GO_PKG_PATH=github.com/tsuru/helloworld --app helloworld If you have external dependencies, you should add them as vendored packages. An alternative solution is building your app locally and deploying it using the app deploy command. In this case, you would also need a Procfile: .. highlight:: bash :: $ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o helloworld $ echo "web: ./helloworld" > ./Procfile $ tsuru app-deploy --app helloworld ./helloworld ./Procfile If your app has other files to include in the deploy command, like tsuru.yaml, include them as parameters in the above command as well. Running the application ======================= tsuru will compile and run the application automatically, but it's possible to customize how tsuru compiles and runs the application. For more details, check the README of the Go platform: https://github.com/tsuru/basebuilder/blob/master/go/README.md. Now that the app is deployed, you can access it from your browser, getting the IP or host listed in ``app-list`` and opening it. For example, in the list below: :: $ tsuru app-list +-------------+-------------------------+--------------------------------+ | Application | Units State Summary | Address | +-------------+-------------------------+--------------------------------+ | helloworld | 1 of 1 units in-service | helloworld.192.168.50.4.nip.io | +-------------+-------------------------+--------------------------------+ It's done! Now we have a simple go project deployed on tsuru. Now we can access your app in the URL displayed in `app-list` ("helloworld.192.168.50.4.nip.io" in this case). Going further ============= For more information, you can dig into `tsuru docs `_, or read `complete instructions of use for the tsuru command `_.