{"id":1645,"date":"2016-05-20T18:05:54","date_gmt":"2016-05-20T10:05:54","guid":{"rendered":"http:\/\/magicalbits.net\/?p=1645"},"modified":"2016-05-20T18:05:54","modified_gmt":"2016-05-20T10:05:54","slug":"notes-for-setting-up-a-ghost-blog-on-docker-with-dropbox-backup","status":"publish","type":"post","link":"https:\/\/magicalbits.net\/?p=1645","title":{"rendered":"Notes for setting up a Ghost blog on Docker, with Dropbox backup"},"content":{"rendered":"<h2>Blog server\u00a0provisioning<\/h2>\n<ol>\n<li>DigitalOcean: Docker One-Click image<\/li>\n<li>Install docker-compose<\/li>\n<li>Follow [this tutorial] to get ghost up and running http:\/\/nknu.net\/how-to-deploy-your-ghost-blog-using-docker-machine-and-docker-compose\/<\/li>\n<\/ol>\n<pre><code>mkdir ghost\n# install docker-compose binary\n# Follow the turorial. Relevant scripts:\n\n$ wget https:\/\/ghost.org\/zip\/ghost-latest.zip\n$ unzip ghost-latest.zip \"content\/*\"\n$ rm -f ghost-latest.zip\n\nnano docker-compose.yml\n\n# paste the following\nblog:\nimage: ghost\ncommand: npm start\nvolumes:\n- content:\/var\/lib\/ghost\nports:\n- 9999:2368\n<\/code><\/pre>\n<ol>\n<li>Insetall nginx<\/li>\n<\/ol>\n<pre><code>apt-get install nginx\ncd \/etc\/nginx\/sites-available\nnano ghost\n\n# Paste this script\nserver {\nlisten 0.0.0.0:80;\nserver_name fundamentallyhuman.com;\naccess_log \/var\/log\/nginx\/*your-domain-name*.log;\nclient_max_body_size 100m;\n\nlocation \/ {\nproxy_set_header X-Real-IP $remote_addr;\nproxy_set_header HOST $http_host;\nproxy_set_header X-NginX-Proxy true;\n\nproxy_pass http:\/\/127.0.0.1:9999;\nproxy_redirect off;\n}\n}\n\n# End of pasting\n\ncd ..\/sites\/enabled\nrm default\nln -s ..\/sites-available\/ghost\nservice nginx restart\n\n<\/code><\/pre>\n<ol>\n<li>Backup<\/li>\n<\/ol>\n<pre><code>apt-get install sqlite3\n\ncd \/ghost\n\n# https:\/\/github.com\/andreafabrizi\/Dropbox-Uploader\ncurl \"https:\/\/raw.githubusercontent.com\/andreafabrizi\/Dropbox-Uploader\/master\/dropbox_uploader.sh\" -o dropbox_uploader.sh\n\n# set up\n$chmod +x dropbox_uploader.sh\n$.\/dropbox_uploader.sh\n\nnano backup.sh\n# paste\n#!\/bin\/sh\nrsync -av --progress content\/ backup\/ --exclude data\/\nrm -f backup\/ghost-dev.db.bak\nsqlite3 content\/data\/ghost-dev.db \".backup backup\/ghost-dev.db.bak\"\n\nname=$(date '+%y-%m-%d')\ntar -zcvf --overwrite \"$name.tar.gz\" backup\/\n.\/dropbox_uploader.sh upload \"$name.tar.gz\" \"$name.tar.gz\"\n\n# done\n\n# set up cron job\n\n# http:\/\/stackoverflow.com\/questions\/14710257\/running-a-cron-job-at-230-am-every-day\n# back up every day at night\ncrontab -e\n\n# add\n30 2 * * * \/root\/ghost\/backup.sh\n\n<\/code><\/pre>\n<ol>\n<li>Start after reboot<\/li>\n<\/ol>\n<pre><code><br \/># ghost\/start.sh\n\n#!\/bin\/sh\ndocker-compose up -d\n\n# end\n\ncrontab -e\n\n# add\n@reboot \/root\/ghost\/start.sh\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Blog server\u00a0provisioning DigitalOcean: Docker One-Click image Install docker-compose Follow [this tutorial] to get ghost up and running http:\/\/nknu.net\/how-to-deploy-your-ghost-blog-using-docker-machine-and-docker-compose\/ mkdir ghost # install docker-compose binary # Follow the turorial. Relevant scripts: $ wget https:\/\/ghost.org\/zip\/ghost-latest.zip $ unzip ghost-latest.zip &#8220;content\/*&#8221; $ rm -f ghost-latest.zip nano docker-compose.yml # paste the following blog: image: ghost command: npm start volumes: &#8211; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ep_exclude_from_search":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1645","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/magicalbits.net\/index.php?rest_route=\/wp\/v2\/posts\/1645","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/magicalbits.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/magicalbits.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/magicalbits.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/magicalbits.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1645"}],"version-history":[{"count":1,"href":"https:\/\/magicalbits.net\/index.php?rest_route=\/wp\/v2\/posts\/1645\/revisions"}],"predecessor-version":[{"id":1646,"href":"https:\/\/magicalbits.net\/index.php?rest_route=\/wp\/v2\/posts\/1645\/revisions\/1646"}],"wp:attachment":[{"href":"https:\/\/magicalbits.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1645"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/magicalbits.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1645"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/magicalbits.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1645"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}