[{"data":1,"prerenderedAt":1319},["ShallowReactive",2],{"post:\u002F2017\u002F12\u002F28\u002Fruby-on-rails-part-6-f-ck-it-well-do-it-live":3},{"id":4,"title":5,"body":6,"date":1311,"description":12,"extension":1312,"meta":1313,"navigation":126,"path":1314,"seo":1315,"stem":1316,"subtitle":1317,"__hash__":1318},"posts\u002F2017\u002F12\u002F28\u002Fruby-on-rails-part-6-f-ck-it-well-do-it-live.md","Ruby on Rails: Part 6 - f*ck it we'll do it live",{"type":7,"value":8,"toc":1309},"minimark",[9,13,16,19,34,37,198,207,314,317,332,335,434,437,455,458,473,476,520,523,537,544,573,576,579,601,604,655,658,661,676,682,754,761,872,879,915,922,1086,1089,1175,1182,1252,1267,1289,1296,1299,1305],[10,11,12],"p",{},"So It's Christmas, and my liver looks looks like it's done 12 rounds with Tyson, so lets begin.",[10,14,15],{},"I was going to go ahead and delve deep into the realm of some sort of site wide self moderation for the images. But that would require more brainpower than my body is currently capable, so we're going to host the site instead. Another one to add to the long list of mistakes I've made.",[10,17,18],{},"This is the first time I've set up a web server, I mean really set one up. No hand holding, no Heroku, just balls-to-the-wall linux server and all the heartache and pride that goes with it.",[10,20,21,22,29,30],{},"Lets start with the service:\nThe service I decided to go with is ",[23,24,28],"a",{"href":25,"rel":26},"https:\u002F\u002Fwww.digitalocean.com\u002F",[27],"nofollow","Digital Ocean"," for the sole reason that I had a bunch of credit for free because I'm still a student. Its also pretty good, and has great scalability and is relatively cheap so long as you keep an eye on your traffic. So I went ahead and set up a Ubuntu 16.04 server with 1gb of ram and 30gb of storage and created a new super user called ",[31,32,33],"code",{},"deploy",[10,35,36],{},"first things first, lets install ruby on our new server.",[38,39,44],"pre",{"className":40,"code":41,"language":42,"meta":43,"style":43},"language-shell shiki shiki-themes github-dark","curl -sL https:\u002F\u002Fdeb.nodesource.com\u002Fsetup_8.x | sudo -E bash -\ncurl -sS https:\u002F\u002Fdl.yarnpkg.com\u002Fdebian\u002Fpubkey.gpg | sudo apt-key add -\necho \"deb https:\u002F\u002Fdl.yarnpkg.com\u002Fdebian\u002F stable main\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fyarn.list\n\nsudo apt-get update\nsudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev nodejs yarn\n","shell","",[31,45,46,79,102,121,128,140],{"__ignoreMap":43},[47,48,51,55,59,63,67,70,73,76],"span",{"class":49,"line":50},"line",1,[47,52,54],{"class":53},"svObZ","curl",[47,56,58],{"class":57},"sDLfK"," -sL",[47,60,62],{"class":61},"sU2Wk"," https:\u002F\u002Fdeb.nodesource.com\u002Fsetup_8.x",[47,64,66],{"class":65},"snl16"," |",[47,68,69],{"class":53}," sudo",[47,71,72],{"class":57}," -E",[47,74,75],{"class":61}," bash",[47,77,78],{"class":61}," -\n",[47,80,82,84,87,90,92,94,97,100],{"class":49,"line":81},2,[47,83,54],{"class":53},[47,85,86],{"class":57}," -sS",[47,88,89],{"class":61}," https:\u002F\u002Fdl.yarnpkg.com\u002Fdebian\u002Fpubkey.gpg",[47,91,66],{"class":65},[47,93,69],{"class":53},[47,95,96],{"class":61}," apt-key",[47,98,99],{"class":61}," add",[47,101,78],{"class":61},[47,103,105,108,111,113,115,118],{"class":49,"line":104},3,[47,106,107],{"class":57},"echo",[47,109,110],{"class":61}," \"deb https:\u002F\u002Fdl.yarnpkg.com\u002Fdebian\u002F stable main\"",[47,112,66],{"class":65},[47,114,69],{"class":53},[47,116,117],{"class":61}," tee",[47,119,120],{"class":61}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fyarn.list\n",[47,122,124],{"class":49,"line":123},4,[47,125,127],{"emptyLinePlaceholder":126},true,"\n",[47,129,131,134,137],{"class":49,"line":130},5,[47,132,133],{"class":53},"sudo",[47,135,136],{"class":61}," apt-get",[47,138,139],{"class":61}," update\n",[47,141,143,145,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195],{"class":49,"line":142},6,[47,144,133],{"class":53},[47,146,136],{"class":61},[47,148,149],{"class":61}," install",[47,151,152],{"class":61}," git-core",[47,154,155],{"class":61}," curl",[47,157,158],{"class":61}," zlib1g-dev",[47,160,161],{"class":61}," build-essential",[47,163,164],{"class":61}," libssl-dev",[47,166,167],{"class":61}," libreadline-dev",[47,169,170],{"class":61}," libyaml-dev",[47,172,173],{"class":61}," libsqlite3-dev",[47,175,176],{"class":61}," sqlite3",[47,178,179],{"class":61}," libxml2-dev",[47,181,182],{"class":61}," libxslt1-dev",[47,184,185],{"class":61}," libcurl4-openssl-dev",[47,187,188],{"class":61}," python-software-properties",[47,190,191],{"class":61}," libffi-dev",[47,193,194],{"class":61}," nodejs",[47,196,197],{"class":61}," yarn\n",[10,199,200,201,206],{},"Im also going to use ",[23,202,205],{"href":203,"rel":204},"https:\u002F\u002Frvm.io\u002F",[27],"rvm",".",[38,208,210],{"className":40,"code":209,"language":42,"meta":43,"style":43},"sudo apt-get install libgdbm-dev libncurses5-dev automake libtool bison libffi-dev\ngpg --keyserver hkp:\u002F\u002Fkeys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3\ncurl -sSL https:\u002F\u002Fget.rvm.io | bash -s stable\nsource ~\u002F.rvm\u002Fscripts\u002Frvm\nrvm install 2.5.0\nrvm use 2.5.0 --default\nruby -v\n",[31,211,212,238,255,275,283,292,305],{"__ignoreMap":43},[47,213,214,216,218,220,223,226,229,232,235],{"class":49,"line":50},[47,215,133],{"class":53},[47,217,136],{"class":61},[47,219,149],{"class":61},[47,221,222],{"class":61}," libgdbm-dev",[47,224,225],{"class":61}," libncurses5-dev",[47,227,228],{"class":61}," automake",[47,230,231],{"class":61}," libtool",[47,233,234],{"class":61}," bison",[47,236,237],{"class":61}," libffi-dev\n",[47,239,240,243,246,249,252],{"class":49,"line":81},[47,241,242],{"class":53},"gpg",[47,244,245],{"class":57}," --keyserver",[47,247,248],{"class":61}," hkp:\u002F\u002Fkeys.gnupg.net",[47,250,251],{"class":57}," --recv-keys",[47,253,254],{"class":61}," 409B6B1796C275462A1703113804BB82D39DC0E3\n",[47,256,257,259,262,265,267,269,272],{"class":49,"line":104},[47,258,54],{"class":53},[47,260,261],{"class":57}," -sSL",[47,263,264],{"class":61}," https:\u002F\u002Fget.rvm.io",[47,266,66],{"class":65},[47,268,75],{"class":53},[47,270,271],{"class":57}," -s",[47,273,274],{"class":61}," stable\n",[47,276,277,280],{"class":49,"line":123},[47,278,279],{"class":57},"source",[47,281,282],{"class":61}," ~\u002F.rvm\u002Fscripts\u002Frvm\n",[47,284,285,287,289],{"class":49,"line":130},[47,286,205],{"class":53},[47,288,149],{"class":61},[47,290,291],{"class":57}," 2.5.0\n",[47,293,294,296,299,302],{"class":49,"line":142},[47,295,205],{"class":53},[47,297,298],{"class":61}," use",[47,300,301],{"class":57}," 2.5.0",[47,303,304],{"class":57}," --default\n",[47,306,308,311],{"class":49,"line":307},7,[47,309,310],{"class":53},"ruby",[47,312,313],{"class":57}," -v\n",[10,315,316],{},"Last thing we need to do is install bundler",[38,318,320],{"className":40,"code":319,"language":42,"meta":43,"style":43},"gem install bundler\n",[31,321,322],{"__ignoreMap":43},[47,323,324,327,329],{"class":49,"line":50},[47,325,326],{"class":53},"gem",[47,328,149],{"class":61},[47,330,331],{"class":61}," bundler\n",[10,333,334],{},"I was reading on goRails that Phusion, the company that develops Passenger recently put out an ubuntu package that ships with Passenger pre-installed. So lets go with that",[38,336,338],{"className":40,"code":337,"language":42,"meta":43,"style":43},"sudo apt-key adv --keyserver hkp:\u002F\u002Fkeyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7\nsudo apt-get install -y apt-transport-https ca-certificates\n\n# Add Passenger APT repository\nsudo sh -c 'echo deb https:\u002F\u002Foss-binaries.phusionpassenger.com\u002Fapt\u002Fpassenger xenial main > \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fpassenger.list'\nsudo apt-get update\n\n# Install Passenger & Nginx\nsudo apt-get install -y nginx-extras passenger\n",[31,339,340,359,376,380,386,399,407,411,417],{"__ignoreMap":43},[47,341,342,344,346,349,351,354,356],{"class":49,"line":50},[47,343,133],{"class":53},[47,345,96],{"class":61},[47,347,348],{"class":61}," adv",[47,350,245],{"class":57},[47,352,353],{"class":61}," hkp:\u002F\u002Fkeyserver.ubuntu.com:80",[47,355,251],{"class":57},[47,357,358],{"class":61}," 561F9B9CAC40B2F7\n",[47,360,361,363,365,367,370,373],{"class":49,"line":81},[47,362,133],{"class":53},[47,364,136],{"class":61},[47,366,149],{"class":61},[47,368,369],{"class":57}," -y",[47,371,372],{"class":61}," apt-transport-https",[47,374,375],{"class":61}," ca-certificates\n",[47,377,378],{"class":49,"line":104},[47,379,127],{"emptyLinePlaceholder":126},[47,381,382],{"class":49,"line":123},[47,383,385],{"class":384},"sAwPA","# Add Passenger APT repository\n",[47,387,388,390,393,396],{"class":49,"line":130},[47,389,133],{"class":53},[47,391,392],{"class":61}," sh",[47,394,395],{"class":57}," -c",[47,397,398],{"class":61}," 'echo deb https:\u002F\u002Foss-binaries.phusionpassenger.com\u002Fapt\u002Fpassenger xenial main > \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fpassenger.list'\n",[47,400,401,403,405],{"class":49,"line":142},[47,402,133],{"class":53},[47,404,136],{"class":61},[47,406,139],{"class":61},[47,408,409],{"class":49,"line":307},[47,410,127],{"emptyLinePlaceholder":126},[47,412,414],{"class":49,"line":413},8,[47,415,416],{"class":384},"# Install Passenger & Nginx\n",[47,418,420,422,424,426,428,431],{"class":49,"line":419},9,[47,421,133],{"class":53},[47,423,136],{"class":61},[47,425,149],{"class":61},[47,427,369],{"class":57},[47,429,430],{"class":61}," nginx-extras",[47,432,433],{"class":61}," passenger\n",[10,435,436],{},"And just like that you can start nginx",[38,438,440],{"className":40,"code":439,"language":42,"meta":43,"style":43},"sudo service nginx start\n",[31,441,442],{"__ignoreMap":43},[47,443,444,446,449,452],{"class":49,"line":50},[47,445,133],{"class":53},[47,447,448],{"class":61}," service",[47,450,451],{"class":61}," nginx",[47,453,454],{"class":61}," start\n",[10,456,457],{},"Next we need to point passenger to the version of ruby we're using, so open up nano (or vim if your so inclined)",[38,459,461],{"className":40,"code":460,"language":42,"meta":43,"style":43},"sudo nano \u002Fetc\u002Fnginx\u002Fnginx.conf\n",[31,462,463],{"__ignoreMap":43},[47,464,465,467,470],{"class":49,"line":50},[47,466,133],{"class":53},[47,468,469],{"class":61}," nano",[47,471,472],{"class":61}," \u002Fetc\u002Fnginx\u002Fnginx.conf\n",[10,474,475],{},"And uncomment these lines:",[38,477,479],{"className":40,"code":478,"language":42,"meta":43,"style":43},"##\n# Phusion Passenger\n##\n# Uncomment it if you installed ruby-passenger or ruby-passenger-enterprise\n##\n\ninclude \u002Fetc\u002Fnginx\u002Fpassenger.conf;\n",[31,480,481,486,491,495,500,504,508],{"__ignoreMap":43},[47,482,483],{"class":49,"line":50},[47,484,485],{"class":384},"##\n",[47,487,488],{"class":49,"line":81},[47,489,490],{"class":384},"# Phusion Passenger\n",[47,492,493],{"class":49,"line":104},[47,494,485],{"class":384},[47,496,497],{"class":49,"line":123},[47,498,499],{"class":384},"# Uncomment it if you installed ruby-passenger or ruby-passenger-enterprise\n",[47,501,502],{"class":49,"line":130},[47,503,485],{"class":384},[47,505,506],{"class":49,"line":142},[47,507,127],{"emptyLinePlaceholder":126},[47,509,510,513,516],{"class":49,"line":307},[47,511,512],{"class":53},"include",[47,514,515],{"class":61}," \u002Fetc\u002Fnginx\u002Fpassenger.conf",[47,517,519],{"class":518},"s95oV",";\n",[10,521,522],{},"ave and exit, then open the file below with nano",[38,524,526],{"className":40,"code":525,"language":42,"meta":43,"style":43},"sudo nano \u002Fetc\u002Fnginx\u002Fpassenger.conf\n",[31,527,528],{"__ignoreMap":43},[47,529,530,532,534],{"class":49,"line":50},[47,531,133],{"class":53},[47,533,469],{"class":61},[47,535,536],{"class":61}," \u002Fetc\u002Fnginx\u002Fpassenger.conf\n",[10,538,539,540,543],{},"And change the passenger _ruby to use the right version. Heads up because I screwed this up, if you type in ",[31,541,542],{},"which ruby"," into the command line it will give you the correct file path.",[38,545,547],{"className":40,"code":546,"language":42,"meta":43,"style":43},"passenger_ruby \u002Fhome\u002Fdeploy\u002F.rbenv\u002Fshims\u002Fruby; # If you use rbenv\n# passenger_ruby \u002Fhome\u002Fdeploy\u002F.rvm\u002Fwrappers\u002Fruby-2.1.2\u002Fruby; # If use use rvm, be sure to change the version number\n# passenger_ruby \u002Fusr\u002Fbin\u002Fruby; # If you use ruby from source\n",[31,548,549,563,568],{"__ignoreMap":43},[47,550,551,554,557,560],{"class":49,"line":50},[47,552,553],{"class":53},"passenger_ruby",[47,555,556],{"class":61}," \u002Fhome\u002Fdeploy\u002F.rbenv\u002Fshims\u002Fruby",[47,558,559],{"class":518},"; ",[47,561,562],{"class":384},"# If you use rbenv\n",[47,564,565],{"class":49,"line":81},[47,566,567],{"class":384},"# passenger_ruby \u002Fhome\u002Fdeploy\u002F.rvm\u002Fwrappers\u002Fruby-2.1.2\u002Fruby; # If use use rvm, be sure to change the version number\n",[47,569,570],{"class":49,"line":104},[47,571,572],{"class":384},"# passenger_ruby \u002Fusr\u002Fbin\u002Fruby; # If you use ruby from source\n",[10,574,575],{},"Next we need to do our database, Im using PostgreSQL for this, so if your following this for yourself (which I hope your not) you have to too.",[10,577,578],{},"Lets get Postgres",[38,580,582],{"className":40,"code":581,"language":42,"meta":43,"style":43},"sudo apt-get install postgresql postgresql-contrib libpq-dev\n",[31,583,584],{"__ignoreMap":43},[47,585,586,588,590,592,595,598],{"class":49,"line":50},[47,587,133],{"class":53},[47,589,136],{"class":61},[47,591,149],{"class":61},[47,593,594],{"class":61}," postgresql",[47,596,597],{"class":61}," postgresql-contrib",[47,599,600],{"class":61}," libpq-dev\n",[10,602,603],{},"And lets create a Super User to create our database",[38,605,607],{"className":40,"code":606,"language":42,"meta":43,"style":43},"sudo su - postgres\ncreateuser --pwprompt deploy\ncreatedb -O deploy my_app_name_production # change \"my_app_name\" to your app's name which we'll also use later on\nexit\n",[31,608,609,622,633,650],{"__ignoreMap":43},[47,610,611,613,616,619],{"class":49,"line":50},[47,612,133],{"class":53},[47,614,615],{"class":61}," su",[47,617,618],{"class":61}," -",[47,620,621],{"class":61}," postgres\n",[47,623,624,627,630],{"class":49,"line":81},[47,625,626],{"class":53},"createuser",[47,628,629],{"class":57}," --pwprompt",[47,631,632],{"class":61}," deploy\n",[47,634,635,638,641,644,647],{"class":49,"line":104},[47,636,637],{"class":53},"createdb",[47,639,640],{"class":57}," -O",[47,642,643],{"class":61}," deploy",[47,645,646],{"class":61}," my_app_name_production",[47,648,649],{"class":384}," # change \"my_app_name\" to your app's name which we'll also use later on\n",[47,651,652],{"class":49,"line":123},[47,653,654],{"class":57},"exit\n",[10,656,657],{},"Ok, now you're beginning to see why I regret doing this, it takes ages. But I am in blood stepped in so far that should I wade no more, Returning were as tedious as go o'er.",[10,659,660],{},"Back to the slog, run this baby to get generate the required Capistrano files",[38,662,664],{"className":40,"code":663,"language":42,"meta":43,"style":43},"cap install STAGES=production\n",[31,665,666],{"__ignoreMap":43},[47,667,668,671,673],{"class":49,"line":50},[47,669,670],{"class":53},"cap",[47,672,149],{"class":61},[47,674,675],{"class":61}," STAGES=production\n",[10,677,678,679],{},"Go ahead and add these lines into your swanky new ",[31,680,681],{},"capfile",[38,683,686],{"className":684,"code":685,"language":310,"meta":43,"style":43},"language-ruby shiki shiki-themes github-dark","require 'capistrano\u002Frails'\nrequire 'capistrano\u002Fpassenger'\n\n# If you are using rbenv add these lines:\n# require 'capistrano\u002Frbenv'\n# set :rbenv_type, :user\n# set :rbenv_ruby, '2.5.0'\n\n# If you are using rvm add these lines:\n# require 'capistrano\u002Frvm'\n# set :rvm_type, :user\n# set :rvm_ruby_version, '2.5.0'\n",[31,687,688,696,703,707,712,717,722,727,731,736,742,748],{"__ignoreMap":43},[47,689,690,693],{"class":49,"line":50},[47,691,692],{"class":65},"require",[47,694,695],{"class":61}," 'capistrano\u002Frails'\n",[47,697,698,700],{"class":49,"line":81},[47,699,692],{"class":65},[47,701,702],{"class":61}," 'capistrano\u002Fpassenger'\n",[47,704,705],{"class":49,"line":104},[47,706,127],{"emptyLinePlaceholder":126},[47,708,709],{"class":49,"line":123},[47,710,711],{"class":384},"# If you are using rbenv add these lines:\n",[47,713,714],{"class":49,"line":130},[47,715,716],{"class":384},"# require 'capistrano\u002Frbenv'\n",[47,718,719],{"class":49,"line":142},[47,720,721],{"class":384},"# set :rbenv_type, :user\n",[47,723,724],{"class":49,"line":307},[47,725,726],{"class":384},"# set :rbenv_ruby, '2.5.0'\n",[47,728,729],{"class":49,"line":413},[47,730,127],{"emptyLinePlaceholder":126},[47,732,733],{"class":49,"line":419},[47,734,735],{"class":384},"# If you are using rvm add these lines:\n",[47,737,739],{"class":49,"line":738},10,[47,740,741],{"class":384},"# require 'capistrano\u002Frvm'\n",[47,743,745],{"class":49,"line":744},11,[47,746,747],{"class":384},"# set :rvm_type, :user\n",[47,749,751],{"class":49,"line":750},12,[47,752,753],{"class":384},"# set :rvm_ruby_version, '2.5.0'\n",[10,755,756,757,760],{},"Now that we have capistrano installed we need to setup our ",[31,758,759],{},"config\u002Fdeploy.rb"," file",[38,762,764],{"className":684,"code":763,"language":310,"meta":43,"style":43},"set :application, \"my_app_name\"\nset :repo_url, \"git@example.com:me\u002Fmy_repo.git\"\n\nset :deploy_to, '\u002Fhome\u002Fdeploy\u002Fmy_app_name'\n\nappend :linked_files, \"config\u002Fdatabase.yml\", \"config\u002Fsecrets.yml\"\nappend :linked_dirs, \"log\", \"tmp\u002Fpids\", \"tmp\u002Fcache\", \"tmp\u002Fsockets\", \"vendor\u002Fbundle\", \"public\u002Fsystem\", \"public\u002Fuploads\"\n",[31,765,766,780,792,796,808,812,830],{"__ignoreMap":43},[47,767,768,771,774,777],{"class":49,"line":50},[47,769,770],{"class":518},"set ",[47,772,773],{"class":57},":application",[47,775,776],{"class":518},", ",[47,778,779],{"class":61},"\"my_app_name\"\n",[47,781,782,784,787,789],{"class":49,"line":81},[47,783,770],{"class":518},[47,785,786],{"class":57},":repo_url",[47,788,776],{"class":518},[47,790,791],{"class":61},"\"git@example.com:me\u002Fmy_repo.git\"\n",[47,793,794],{"class":49,"line":104},[47,795,127],{"emptyLinePlaceholder":126},[47,797,798,800,803,805],{"class":49,"line":123},[47,799,770],{"class":518},[47,801,802],{"class":57},":deploy_to",[47,804,776],{"class":518},[47,806,807],{"class":61},"'\u002Fhome\u002Fdeploy\u002Fmy_app_name'\n",[47,809,810],{"class":49,"line":130},[47,811,127],{"emptyLinePlaceholder":126},[47,813,814,817,820,822,825,827],{"class":49,"line":142},[47,815,816],{"class":518},"append ",[47,818,819],{"class":57},":linked_files",[47,821,776],{"class":518},[47,823,824],{"class":61},"\"config\u002Fdatabase.yml\"",[47,826,776],{"class":518},[47,828,829],{"class":61},"\"config\u002Fsecrets.yml\"\n",[47,831,832,834,837,839,842,844,847,849,852,854,857,859,862,864,867,869],{"class":49,"line":307},[47,833,816],{"class":518},[47,835,836],{"class":57},":linked_dirs",[47,838,776],{"class":518},[47,840,841],{"class":61},"\"log\"",[47,843,776],{"class":518},[47,845,846],{"class":61},"\"tmp\u002Fpids\"",[47,848,776],{"class":518},[47,850,851],{"class":61},"\"tmp\u002Fcache\"",[47,853,776],{"class":518},[47,855,856],{"class":61},"\"tmp\u002Fsockets\"",[47,858,776],{"class":518},[47,860,861],{"class":61},"\"vendor\u002Fbundle\"",[47,863,776],{"class":518},[47,865,866],{"class":61},"\"public\u002Fsystem\"",[47,868,776],{"class":518},[47,870,871],{"class":61},"\"public\u002Fuploads\"\n",[10,873,874,875,878],{},"And in our  ",[31,876,877],{},"config\u002Fdeploy\u002Fproduction.rb"," were going to add",[38,880,882],{"className":40,"code":881,"language":42,"meta":43,"style":43},"# Replace 127.0.0.1 with your server's IP address!\nserver '127.0.0.1', user: 'deploy', roles: %w{app db web}\n",[31,883,884,889],{"__ignoreMap":43},[47,885,886],{"class":49,"line":50},[47,887,888],{"class":384},"# Replace 127.0.0.1 with your server's IP address!\n",[47,890,891,894,897,900,903,906,909,912],{"class":49,"line":81},[47,892,893],{"class":53},"server",[47,895,896],{"class":61}," '127.0.0.1',",[47,898,899],{"class":61}," user:",[47,901,902],{"class":61}," 'deploy',",[47,904,905],{"class":61}," roles:",[47,907,908],{"class":61}," %w{app",[47,910,911],{"class":61}," db",[47,913,914],{"class":61}," web}\n",[10,916,917,918,921],{},"Oh my god this is taking ages, its ok though, final hurdle (almost)\nIn our ",[31,919,920],{},"\u002Fetc\u002Fnginx\u002Fsites-enabled\u002Fdefault"," file back on the server we're going to add these configuration settings",[38,923,925],{"className":684,"code":924,"language":310,"meta":43,"style":43},"server {\n        listen 80;\n        listen [::]:80 ipv6only=on;\n\n        server_name mydomain.com;\n        passenger_enabled on;\n        rails_env    production;\n        root         \u002Fhome\u002Fdeploy\u002Fmy_app_name\u002Fcurrent\u002Fpublic;\n\n        # redirect server error pages to the static page \u002F50x.html\n        error_page   500 502 503 504  \u002F50x.html;\n        location = \u002F50x.html {\n            root   html;\n        }\n}\n",[31,926,927,932,942,958,962,972,977,982,1012,1016,1021,1049,1068,1074,1080],{"__ignoreMap":43},[47,928,929],{"class":49,"line":50},[47,930,931],{"class":518},"server {\n",[47,933,934,937,940],{"class":49,"line":81},[47,935,936],{"class":518},"        listen ",[47,938,939],{"class":57},"80",[47,941,519],{"class":518},[47,943,944,947,949,952,955],{"class":49,"line":104},[47,945,946],{"class":518},"        listen [::]:",[47,948,939],{"class":57},[47,950,951],{"class":518}," ipv6only",[47,953,954],{"class":65},"=",[47,956,957],{"class":518},"on;\n",[47,959,960],{"class":49,"line":123},[47,961,127],{"emptyLinePlaceholder":126},[47,963,964,967,970],{"class":49,"line":130},[47,965,966],{"class":518},"        server_name mydomain.",[47,968,969],{"class":53},"com",[47,971,519],{"class":518},[47,973,974],{"class":49,"line":142},[47,975,976],{"class":518},"        passenger_enabled on;\n",[47,978,979],{"class":49,"line":307},[47,980,981],{"class":518},"        rails_env    production;\n",[47,983,984,987,990,993,995,997,999,1002,1004,1007,1010],{"class":49,"line":413},[47,985,986],{"class":518},"        root         ",[47,988,989],{"class":65},"\u002F",[47,991,992],{"class":518},"home",[47,994,989],{"class":65},[47,996,33],{"class":518},[47,998,989],{"class":65},[47,1000,1001],{"class":518},"my_app_name",[47,1003,989],{"class":65},[47,1005,1006],{"class":518},"current",[47,1008,1009],{"class":65},"\u002Fpublic",[47,1011,519],{"class":518},[47,1013,1014],{"class":49,"line":419},[47,1015,127],{"emptyLinePlaceholder":126},[47,1017,1018],{"class":49,"line":738},[47,1019,1020],{"class":384},"        # redirect server error pages to the static page \u002F50x.html\n",[47,1022,1023,1026,1029,1032,1035,1038,1041,1044,1047],{"class":49,"line":744},[47,1024,1025],{"class":518},"        error_page   ",[47,1027,1028],{"class":57},"500",[47,1030,1031],{"class":57}," 502",[47,1033,1034],{"class":57}," 503",[47,1036,1037],{"class":57}," 504",[47,1039,1040],{"class":65},"  \u002F",[47,1042,1043],{"class":518},"50x.",[47,1045,1046],{"class":53},"html",[47,1048,519],{"class":518},[47,1050,1051,1055,1058,1061,1063,1065],{"class":49,"line":750},[47,1052,1054],{"class":1053},"s9osk","        location",[47,1056,1057],{"class":65}," =",[47,1059,1060],{"class":65}," \u002F",[47,1062,1043],{"class":518},[47,1064,1046],{"class":53},[47,1066,1067],{"class":518}," {\n",[47,1069,1071],{"class":49,"line":1070},13,[47,1072,1073],{"class":518},"            root   html;\n",[47,1075,1077],{"class":49,"line":1076},14,[47,1078,1079],{"class":518},"        }\n",[47,1081,1083],{"class":49,"line":1082},15,[47,1084,1085],{"class":518},"}\n",[10,1087,1088],{},"We're so close now, Ive ordered Chinese so lets wrap this up. Its time to connect the database. Lets remove the database files from the repo and put them on the server manually. Look at me thinking of security.",[38,1090,1092],{"className":40,"code":1091,"language":42,"meta":43,"style":43},"echo \"config\u002Fdatabase.yml\\nconfig\u002Fsecrets.yml\" >> .gitignore\ngit add .gitignore\ngit mv config\u002Fsecrets.yml config\u002Fsecrets.yml.example\ngit mv config\u002Fdatabase.yml config\u002Fdatabase.yml.example\ngit commit -m \"Only store example secrets and database configs\"\ncp config\u002Fsecrets.yml.example config\u002Fsecrets.yml\ncp config\u002Fdatabase.yml.example config\u002Fdatabase.yml\n",[31,1093,1094,1107,1116,1129,1141,1154,1165],{"__ignoreMap":43},[47,1095,1096,1098,1101,1104],{"class":49,"line":50},[47,1097,107],{"class":57},[47,1099,1100],{"class":61}," \"config\u002Fdatabase.yml\\nconfig\u002Fsecrets.yml\"",[47,1102,1103],{"class":65}," >>",[47,1105,1106],{"class":61}," .gitignore\n",[47,1108,1109,1112,1114],{"class":49,"line":81},[47,1110,1111],{"class":53},"git",[47,1113,99],{"class":61},[47,1115,1106],{"class":61},[47,1117,1118,1120,1123,1126],{"class":49,"line":104},[47,1119,1111],{"class":53},[47,1121,1122],{"class":61}," mv",[47,1124,1125],{"class":61}," config\u002Fsecrets.yml",[47,1127,1128],{"class":61}," config\u002Fsecrets.yml.example\n",[47,1130,1131,1133,1135,1138],{"class":49,"line":123},[47,1132,1111],{"class":53},[47,1134,1122],{"class":61},[47,1136,1137],{"class":61}," config\u002Fdatabase.yml",[47,1139,1140],{"class":61}," config\u002Fdatabase.yml.example\n",[47,1142,1143,1145,1148,1151],{"class":49,"line":130},[47,1144,1111],{"class":53},[47,1146,1147],{"class":61}," commit",[47,1149,1150],{"class":57}," -m",[47,1152,1153],{"class":61}," \"Only store example secrets and database configs\"\n",[47,1155,1156,1159,1162],{"class":49,"line":142},[47,1157,1158],{"class":53},"cp",[47,1160,1161],{"class":61}," config\u002Fsecrets.yml.example",[47,1163,1164],{"class":61}," config\u002Fsecrets.yml\n",[47,1166,1167,1169,1172],{"class":49,"line":307},[47,1168,1158],{"class":53},[47,1170,1171],{"class":61}," config\u002Fdatabase.yml.example",[47,1173,1174],{"class":61}," config\u002Fdatabase.yml\n",[10,1176,1177,1178,1181],{},"SSH back into the server and make your way to ",[31,1179,1180],{},"\u002Fhome\u002Fdeploy\u002Fmy_app_name\u002Fshared\u002Fconfig\u002Fdatabase.yml","\nand",[38,1183,1185],{"className":684,"code":1184,"language":310,"meta":43,"style":43},"production:\n  adapter: postgresql\n  host: 127.0.0.1\n  database: my_app_name_production\n  username: deploy\n  password: YOUR_POSTGRES_PASSWORD\n  encoding: unicode\n  pool: 5\n",[31,1186,1187,1192,1200,1213,1221,1228,1236,1244],{"__ignoreMap":43},[47,1188,1189],{"class":49,"line":50},[47,1190,1191],{"class":57},"production:\n",[47,1193,1194,1197],{"class":49,"line":81},[47,1195,1196],{"class":57},"  adapter:",[47,1198,1199],{"class":518}," postgresql\n",[47,1201,1202,1205,1208,1210],{"class":49,"line":104},[47,1203,1204],{"class":57},"  host:",[47,1206,1207],{"class":57}," 127.0",[47,1209,206],{"class":518},[47,1211,1212],{"class":57},"0.1\n",[47,1214,1215,1218],{"class":49,"line":123},[47,1216,1217],{"class":57},"  database:",[47,1219,1220],{"class":518}," my_app_name_production\n",[47,1222,1223,1226],{"class":49,"line":130},[47,1224,1225],{"class":57},"  username:",[47,1227,632],{"class":518},[47,1229,1230,1233],{"class":49,"line":142},[47,1231,1232],{"class":57},"  password:",[47,1234,1235],{"class":57}," YOUR_POSTGRES_PASSWORD\n",[47,1237,1238,1241],{"class":49,"line":307},[47,1239,1240],{"class":57},"  encoding:",[47,1242,1243],{"class":518}," unicode\n",[47,1245,1246,1249],{"class":49,"line":413},[47,1247,1248],{"class":57},"  pool:",[47,1250,1251],{"class":57}," 5\n",[10,1253,1254,1255,1258,1259,1262,1263,1266],{},"Now for the ",[31,1256,1257],{},"secrets.yml"," file. Create the file ",[31,1260,1261],{},"\u002Fhome\u002Fdeploy\u002Fmy_app_name\u002Fshared\u002Fconfig\u002Fsecrets.yml"," and Back on your development machine run ",[31,1264,1265],{},"rake secret"," and pate that below where it says YOUR_SECRET_KEY.",[38,1268,1270],{"className":684,"code":1269,"language":310,"meta":43,"style":43},"# \u002Fhome\u002Fdeploy\u002Fmy_app_name\u002Fshared\u002Fconfig\u002Fsecrets.yml\nproduction:\n  secret_key_base: YOUR_SECRET_KEY\n",[31,1271,1272,1277,1281],{"__ignoreMap":43},[47,1273,1274],{"class":49,"line":50},[47,1275,1276],{"class":384},"# \u002Fhome\u002Fdeploy\u002Fmy_app_name\u002Fshared\u002Fconfig\u002Fsecrets.yml\n",[47,1278,1279],{"class":49,"line":81},[47,1280,1191],{"class":57},[47,1282,1283,1286],{"class":49,"line":104},[47,1284,1285],{"class":57},"  secret_key_base:",[47,1287,1288],{"class":57}," YOUR_SECRET_KEY\n",[10,1290,1291,1292,1295],{},"Now on your machine run ",[31,1293,1294],{},"cap production deploy"," and watch with bitten lip every line run down that page. Restart your server if needs be and you should be good to go! you have a website running live on a production server.",[10,1297,1298],{},"Next time Part 7 - I give up programming",[10,1300,1301,1302],{},"ppffttt who are we kidding, next time ",[23,1303,1304],{"href":989},"Part 7 - The Mailer!",[1306,1307,1308],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":43,"searchDepth":81,"depth":81,"links":1310},[],"2017-12-28 22:34","md",{},"\u002F2017\u002F12\u002F28\u002Fruby-on-rails-part-6-f-ck-it-well-do-it-live",{"title":5,"description":12},"2017\u002F12\u002F28\u002Fruby-on-rails-part-6-f-ck-it-well-do-it-live",null,"cGY9AIUb23YAyqsOxfZLppQxMxoeoiu52IjvP9pEiI0",1791634646177]