Mastodon Kurulumu Nasıl Yapılır?
Önceki yazımda Mastodon hakkında bilgiler vermiştim. Şimdi ise Mastodon’ın bir sunucuya nasıl kurulumunun yapılacağını anlatacağım.
Kurulum öncesinde ön hazırlık için gerekli olan maddeleri aşağıda listeledim.
- Alan adı (domain): kendi adınıza sahip olduğunuz veya edineceğiniz bir domain.
- Mail servisi: Mailgun gibi freemium servisler başlangıçta işinizi rahatlıkla görecektir.
- Sunucu: 1 GB’lık RAM’i ve iyi bir internet erişimi olması gerekiyor. Ben kurulumlar için DigitalOcean‘ın bulut hizmetini kullandım. Siz de benzer bir bulut firmasından ilgili hizmeti alabilirsiniz.
Kurulumda işletim sistemi olarak Ubuntu 16.04.2 LTS işletim sürümünü kullanacağım.
1. Haydi başlayalım
Öncelikle aşağıdaki adımları izleyelim:
- VM oluşturalım
- Alan adımızı IP adresimize eşleyecek A kaydını oluşturalım. Ayarlarımı aşağıdaki şekilde oluşturduğumu görebilirsiniz. Sizin de benzer bir kayıt oluşturmanız gerekiyor.
- Root parolamızı belirleyelim.
- VM’imize giriş yapalım. Linux/Mac makinenizden erişiyorsanız SSH, Windows ortamındaysanız PuTTY işinizi görecektir. Eğer Android uygulaması üzerinden giriş yapmak istiyorsanız JuiceSSH’ı kullanabilirsiniz.
- Yeni bir Mastodon kullanıcısı oluşturalım:
adduser mastodon
- apt cache’ini güncelleyelim:
apt-get update
2. Bağımlılıkların yüklenmesi
Tek bir komutla ilgili tüm bağımlılıkları yükleyelim:
# apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs file git curl redis-server redis-tools postgresql postgresql-contrib autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev git-core letsencrypt nginx
İlgili yazılım paketlerinin yüklenmesi biraz zaman alacaktır. Tamamlandığında ise Node ve Yarn’ı yükleyeceğiz:
# curl -sL https://deb.nodesource.com/setup_4.x | bash -
# apt-get install nodejs
# npm install -g yarn
Ayrıca sunucumuz Redis üzerinden hizmet vereceği için Redis servisini de başlatmamız gerekiyor:
# service redis-server start
3. Veri tabanının yapılandırılması
Postgres yüklediğimiz için postgres kullanıcısına geçiş yapalım. Veri tabanımıza mastodon
kullanıcımızı oluşturalım ve veri tabanı oluşturma yetkisini verelim:
# su - postgres
$ psql
> CREATE USER mastodon CREATEDB;
> \q
$ exit
4. SSL sertifikasının oluşturulması
Nginx‘i yapılandırmadan önce SSL desteği vermemiz için ilgili dosyaları oluşturmamız gerekiyor. Nginx servisini durduralım:
# service nginx stop
Ücretsiz SSL sertifikası verdiği için ben LetsEncrypt‘i kullandım. Siz de benzer bir SSL sertifika sağlayıcısından hizmet alabilirsiniz. İlgili aşamalara geçelim:
letsencrypt certonly
komutunu çalıştıralım- Çıkan mavi ekranda mail adresimizi girelim
- İlgili şartları okuyup kabul edelim
- Kullanacağımız alan adını girelim.
Eğer alan adınız sunucunuza atandıysa (ilk aşamada gerçekleştirdiğinizi varsayıyorum) LetsEncrypt sunucunuzu bularak ilgili sertifikayı size atayacaktır. Eğer bu işlemde hata alırsanız, alan adınızın sunucunuza atanması ve LetsEncrypt’in bunu görebilmesi için bir süre beklemeniz gerekiyor.
5. Nginx’in yapılandırılması
SSL sertifikamızı aldığımıza göre artık nginx’i yapılandırmaya geçebiliriz:
# cd /etc/nginx/sites-available
# nano mastodon
Yapılandırma dosyam aşağıdaki şekilde olduğundan dolayı siz mstdntr.com
yazan kısımları (9, 15, 23, 24. satırları) kendi alan adınız ile değiştirmeniz gerekiyor:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name mstdntr.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name mstdntr.com;
ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_ecdh_curve prime256v1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_certificate /etc/letsencrypt/live/mstdntr.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mstdntr.com/privkey.pem;
keepalive_timeout 70;
sendfile on;
client_max_body_size 0;
gzip off;
root /home/mastodon/live/public;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
location / {
try_files $uri @proxy;
}
location @proxy {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass_header Server;
proxy_pass http://localhost:3000;
proxy_buffering off;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
tcp_nodelay on;
}
location /api/v1/streaming {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://localhost:4000;
proxy_buffering off;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
tcp_nodelay on;
}
error_page 500 501 502 503 504 /500.html;
}
İlgili değişiklikleri yapıp dosyayı kapattıktan sonra nginx’in yapılandırma dosyamızı okuyabilmesi için bir symlink (kısayol) oluşturalım.
# ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon
Yapılandırma ayarlarımızı nginx -t
ile kontrol edelim. Herhangi bir hata alıyorsak diğer adımlara geçmek için düzeltelim. OK
yanıtını aldıysak nginx’i ayağa kaldırabiliriz:
# service nginx start
Şimdi tarayıcımızı açalım ve alan adımıza gidelim. Aşağıdaki gibi bir ekran görüyorsak her şey yolunda demektir:
6. Systemd yapılandırılması
Mastodon web
, sidekiq
ve streaming
olmak üzere 3 servisten oluştuğundan dolayı her bir servis için ilgili yapılandırma dosyalarını oluşturmamız gerekiyor. Oluşturduğum dosyaları siz de hiçbir değişiklik yapmadan olduğu gibi kullanabilirsiniz. Önce systemd dizinine gidelim:
# cd /etc/systemd/system/
- İlk dosyamız olan
mastodon-web.service
‘i oluşturalım:
[Unit]
Description=mastodon-web
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="PORT=3000"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.target
- İkinci dosyamız olan
mastodon-sidekiq.service
‘i oluşturalım:
[Unit]
Description=mastodon-sidekiq
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="DB_POOL=5"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.target
- Nihai dosyamız olan
mastodon-streaming.service
‘i oluşturalım:
[Unit]
Description=mastodon-streaming
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="NODE_ENV=production"
Environment="PORT=4000"
ExecStart=/usr/bin/npm run start
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.target
- dosyayı da oluşturduktan sonra artık root kullanıcısı ile olan işimiz bitmiş oluyor.
7. Mastodon kullanıcısına geçiş
Eğer henüz sunucuya mastodon
olarak geçiş yapmadıysanız ikinci bir PuTTY penceresi açarak gerçekleştirebilirsiniz. mastodon
kullanıcısı ile Ruby‘i kurup Mastodon’ın kaynak kodlarını çekeğiz.
8. rbenv, rbenv-build ve Ruby’nin kurulması
mastodon
kullanıcısı olarak rbenv reposunu kendi home dizinimize klonlayalım:
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
Tamamlandığında init betiğini bash profilimize ekleyelim:
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
Üstteki kod kullandığım Linux sürümü (Ubuntu 16.04 LTS) ile geçerli olmakla birlikte kullandığınız işletim sistemine göre değişkenlik gösterebilir. ~/.rbenv/bin/rbenv init
komutunu çalıştırarak nasıl yapacağınızı öğrenebilirsiniz.
bash_profile dosyamızı kaydettikten sonra değişikliklerin geçerli olması için mastodon kullanıcısından çıkıp tekrar girelim ve aşağıdaki şekilde ruby-build
eklentisini yükleyelim:
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
Ardından Ruby v2.4.1 sürümünü yüklememiz gerekiyor. Bu yükleme kendi makinemde yaklaşık bir 15 dk kadar zaman aldı, sizde farklılık gösterebilir:
$ rbenv install 2.4.1
Yükleme tamamlandığında home
dizinimize geçiş yapalım ve Mastodon kaynak kodunu live dizinine klonlayalım:
$ cd ~
$ git clone https://github.com/tootsuite/mastodon.git live
$ cd live
Şimdi ise bağımlılıkların yüklenmesi için bundler
‘ı kuralım ve diğer tüm bağımlılıkları yükleyelim:
$ gem install bundler
$ bundle install --deployment --without development test
$ yarn install
Eğer yukarıdaki tüm adımları başarıyla geçtiyseniz, artık yapılandırma işlemleri için başlayabiliriz.
9. Mastodon’ın yapılandırılması
Yapılandırma dosyasına geçmeden önce, aşağıdaki komutu 3 defa çalıştırarak 3 adet gizli anahtar oluşturmamız gerekiyor:
$ bundle exec rake secret
Oluşan anahtarları geçici bir dosyaya kopyalayalım (daha sonra ihtiyacımız olacak). .env.production.sample
şablonunu kopyalayarak bir yapılandırma dosyası oluşturalım ve nano editörü ile dosyamızı açalım:
$ cp .env.production.sample .env.production
$ nano .env.production
Bu dosya içerisinde birkaç küçük değişiklik yapalım. Öncelikle Redis host’umuzu ve veri tabanımız ile ilgili değişkenleri atayalım:
REDIS_HOST=localhost
DB_HOST=/var/run/postgresql
DB_USER=mastodon
DB_NAME=mastodon_production
Federated Timeline‘ı açabilmek için LOCAL_DOMAIN kısmını kendi alan adımızla doldurmamız gerekiyor. mstdntr.com
yerine kendi domain adınızı giriniz.
LOCAL_DOMAIN=mstdntr.com
Şimdi önceden hazırlamış olduğumuz 3 gizli anahtarı aşağıya girebiliriz (yemek tarifi gibi oldu):
PAPERCLIP_SECRET=
SECRET_KEY_BASE=
OTP_SECRET=
Son olarak da MailGun’daki kullanıcımız ile SMTP ayarlarımızı girelim.
SMTP_LOGIN=
SMTP_PASSWORD=
Ctrl + X, Y ve Enter tuşlarına basarak dosyamızı kaydedelim ve çıkalım.
10. Yükleyicinin çalıştırılması
Bu adıma kadar her aşamayı düzgün olarak tamamladıysak, artık veri tabanı kurulumuna geçebiliriz:
$ RAILS_ENV=production bundle exec rails db:setup
Eğer üstteki komut başarıyla çalışırsa, site dosyalarını ön derleme işleminden geçirmek için aşağıdaki komutu çalıştırabiliriz:
$ RAILS_ENV=production bundle exec rails assets:precompile
Bu aşamadan sonra artık neredeyse hazırız.
11. Cronjob’ın oluşturulması
Bu aşama teknik olarak isteğe bağlı olmakla birlikte sunucumuzun iyi bir durumda tutulması için bir hayli önemli. mastodon
kullanıcısı olarak which
komutu yardımıyla bundle
komutumuzun yerini öğrenelim:
$ which bundle
Dönen değer $bundle
yerine geçecektir. Şimdi crontab
‘ımızı düzenleyelim:
$ crontab -e
Şu anki sürümde (1.3.2) sadece 1 adet günlük görevimizin bulunması yeterli:
5 0 * * * RAILS_ENV=production $bundle exec rake mastodon:daily
Kaydedelim ve Crontab’den çıkalım.
12. Root kullanıcısına geçiş
mastodon
kullancısı ile artık işimiz bitti. Çıkış yapıp root
kullanıcısına geçelim.
13. Mastodon’ın çalıştırılması
Mastodon servislerinin çalıştırılması için öncelikle aktif etmemiz gerekiyor:
# systemctl enable /etc/systemd/system/mastodon-*.service
Devamında aşağıdaki şekilde Mastdoon’ı ayağa kaldıralım:
# systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service
Şimdi tarayıcımızı açıp alan adımıza gidelim. Mastodon’ın açılması sunucumda yaklaşık 30 saniye civarı sürüyor, bu yüzden eğer hata ekranı alırsanız edişelenmeyin. Ben 30 saniye saymak yerine, servisler ile ilgili bilgiyi veren aşağıdaki komutu kullanıyorum:
journalctl -xf -u mastodon-*
Tamamlandığında ise aşağıdaki şekilde bir kullanıcı kayıt sayfası görüyor olmalıyız. Artık kendimiz için bir kullanıcı kaydı açabilir, onay mailini alıp etkinleştirebiliriz.
14. Mastodon’ın güvenli hale getirilmesi
Bu kısa dokümanda sunucu güvenliği hakkında kapsamlı bir bilgi sunamayacağım fakat aşağıdaki komutlar ile hiç değilse mastodon
kullanıcısına dışarıdan erişimi engelleyebilirsiniz. Öncelikle passwd dosyasını açalım:
# nano /etc/passwd
mastodon
kaydını bulalım (sonlara doğru olmalı). /bin/bash
yazan kısmı /usr/sbin/nologin
ile değiştirelim. Bu şekilde mastdoon kullanıcısı ile giriş yapılmasını engellemiş oluyoruz.
Firewall’u etkinleştirelim. Öncelikle aşağıdaki komutu girerek aktif mi değil mi kontrol edelim:
# ufw status
Eğer siz de benim yaptığım gibi yeni bir VM oluşturduysanız, firewall’unuz kapalı olarak gelmiş olmalıdır. SSH (22. port) ve HTTPS’e (443. port) izin verecek şekilde yapılandırma dosyamızı oluşturalım ve firewall’u etkinleştirelim.
# ufw allow 22
# ufw allow 443
# ufw enable
? y
Bu şekilde diğer port’lardan erişim yapılmasını engellemiş olduk.
15. O zaman dans
Eğer bu yazıyı beğendiyseniz, beni takip edebilirsiniz. Mastodon web arayüzündeki arama kısmına full handle’ım olan [email protected]
‘u aratarak beni bulabilirsiniz. Bu komutları kullanarak bir instance oluşturduysanız veya herhangi bir problem ile karşılaştıysanız benimle irtibata geçebilirsiniz. Sonraki yazımda görüşmek üzere. Hoşçakalın.
2 Comments
Same
17 Mayıs 2017 at 16:52Elinize sağlık, teşekkürler.
Zafer Ayan
17 Mayıs 2017 at 21:42Rica ederim, ne demek