Jak zapewne część z Was wie, jestem jednym z założycieli i liderów toruńskiego JUGa. Jednym z moich zajęć jest prowadzenie naszej strony domowej. Stronka oparta jest o framework Octopress i hostowana przez GitHub Pages. Octopress z kolei jest „opakowaniem” Jekylla, który jest narzędziem do generowania statycznych stron HTML opartym o język programowania Ruby. Po prawie roku użytkowania muszę powiedzieć, że całość nawet fajnie ze sobą współgra. Nie mniej jednak rozwiązanie to nie jest wolne od wad. Główną z nich jest konfiguracja środowiska, za którym stoi całkiem sporo różnych narzędzi i bibliotek. Za każdym razem gdy konfigurujemy środowisko od nowa musimy przechodzić przez wszystkie te kroki znowu i znowu. Ostatnie przeinstalowanie systemu skłoniło mnie do wykorzystania Vagranta, co finalnie doprowadziło mnie do startowania środowiska praktycznie jednym poleceniem.

Instalacja Vagranta i VirtualBoxa

Na początek musimy zainstalować Vagranta oraz ustawić odpowiedniego providera, co z tą dokumentacją jest naprawdę banalnie proste. Jako providera wybrałem VirtualBoxa, który jest obecnie najbardziej polecany przez twórców Vagranta.

Przygotowanie Octopressa

W następnym kroku musimy sklonować projekt Octopress:

git clone git://github.com/imathis/octopress.git octopress

Posłuży on nam za szkielet naszego nowego bloga.

Więcej informacji na temat konfiguracji i samego blogowania możecie znaleźć w dokumentacji Octopressa.

Konfiguracja Vagranta

Nadeszła pora na konfiguracje Vagranta i zamknięcie przygotowania środowiska w dwóch komendach. Będą nam potrzebne do tego dwa pliki:

  • Vagrantfile – podstawowy plik konfiguracyjny niezbędny za każdym razem do uruchomienia Vagranta
  • bootstrap.sh – skrypt bash opalany przy uruchamianiu Vagranta, konfigurujący całe środowisko pod Octopressa

Opis każdego polecenia widoczny jest w komentarzach w listingu plików poniżej.

Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# konfiguracja dla Vagranta w wersji 2
Vagrant.configure("2") do |config|

  # pobieramy odpowiedni box (tutaj Ubuntu 12.04 LTS 64-bit)
  config.vm.box = "hashicorp/precise64"

  # dajemy namiar na skrypt, który ma się uruchomić przy starcie
  config.vm.provision :shell, :path => "bootstrap.sh"

  # kopiujemy ustawienia gita z hosta na wirtualną maszynę
  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"

  # przekierowujemy port 4000 (domyślny port Jekylla) z wirtualnej maszyny na lokalną
  config.vm.network "forwarded_port", guest: 4000, host: 4000

  # dzielimy się agentem ssh z wirtualną maszyną
  config.ssh.forward_agent = true

  # synchronizujemy folder "/workspace/TorunJUG.github.io" z maszyny lokalnej z folderem "/home/vagrant/octopress" z maszyny wirtualnej - dzięki temu zmiany w projekcie możemy wprowadzać na lokalnej maszynie
  config.vm.synced_folder "/workspace/TorunJUG.github.io", "/home/vagrant/octopress", create: false

  # jeśli jako providera używamy VirtualBoxa to zmienimy kilka ustawień
  config.vm.provider :virtualbox do |vb|

    # przełącznik włączający możliwość używania linków symbolicznych w synchronizowanych folderach
    vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]

    # ustawienia ilości pamięci RAM - zalecane 1/4 pamięci fizycznej
    vb.customize ["modifyvm", :id, "--memory", 1024]

    # ustawienia ilości procesorów - zalecane dokładnie tyle ile jest fizycznych
    vb.customize ["modifyvm", :id, "--cpus", 2]

    # dwie poniższe flagi rozwiązały mi problem wolnego połączenia pomiędzy maszyną lokalną i wirtualną
    # więcej informacji: http://serverfault.com/questions/453185/vagrant-virtualbox-dns-10-0-2-3-not-working
    # enabling DNS proxy in NAT mode
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    # using the host's resolver as a DNS proxy in NAT mode
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
  end
end
bootstrap.sh

Większość poleceń z poniższego skryptu składa się na konfiguracje środowiska do Octopressa, którą możemy znaleźć pod adresem octopress.org/docs/setup/ i nie będę ich opisywał. Pozostałe wyjaśnione są w komentarzach poniżej.

HOME="/home/vagrant"
RUBY_VERSION="1.9.3-p0"
TIMEZONE="Europe/Warsaw"

# ustawienie strefy czasowej Vagranta (jakiś inny pomysł na to?)
echo $TIMEZONE | sudo tee /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata

sudo apt-get install -y git make

git clone https://github.com/sstephenson/rbenv.git $HOME/.rbenv

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.profile
echo 'eval "$(rbenv init -)"' >> $HOME/.profile

# ustawienia kodowania - inaczej Ruby się wysypuje na polskich znakach
echo 'export LC_ALL=en_US.UTF-8' >> $HOME/.profile
echo 'export LANG=en_US.UTF-8' >> $HOME/.profile

git clone https://github.com/sstephenson/ruby-build.git $HOME/.rbenv/plugins/ruby-build

$HOME/.rbenv/bin/rbenv install $RUBY_VERSION
$HOME/.rbenv/bin/rbenv local $RUBY_VERSION

sudo chown -Rf vagrant $HOME/.rbenv

# bundler podpowiada, żeby nie uruchamiać go jako root, bo może potem być problem
sudo su - vagrant -c "rbenv rehash && cd $HOME/octopress/ && gem install bundler"
sudo su - vagrant -c "cd $HOME/octopress/ && bundle install"

Uruchamianie i użytkowanie

Czas na ostateczną magię :) Uruchamiamy konsolę, przechodzimy do folderu, w którym mamy dwa powyższe pliki i odpalamy komendę vagrant up. Czekamy aż wszystko się pobierze i zainstaluje. Jeśli wszystko jest gotowe to używając plecenia vagrant ssh łączymy się ze świeżo uruchomionym wirtualnym serwerem. Będąc tam wpisujemy cd octopress, co przeniesie nas do współdzielonego folderu projektu. Teraz wystarczy wpisać rake preview, a po chwili pod adresem http://localhost:4000 możemy zobaczyć naszą stronkę w całej okazałości :) Prawda, że proste?

Credits

Przy tworzeniu własnej konfiguracji Vagranta wzorowałem się m.in. na: https://github.com/ryanlanciaux/octopress-vagrant.

Download

Powyższe pliki konfiguracyjne możecie sklonować z mojego repozytorium na GitHubie: https://github.com/prondzyn/vagrant-octopress-TorunJUG.

Disclaimer

Na koniec chciałbym zaznaczyć, że jest to moja pierwsza przygoda z Vagrantem, więc proszę o wyrozumiałość. Wszelkie uwagi i komentarze mile widziane :)