🚀 WriteFreely’yi Docker & EasyPanel Üzerinde Kurma Rehberi

Konu: Self-hosted minimalist blog platformu olan WriteFreely’nin Go tabanlı kaynak koddan derlenerek EasyPanel üzerinde Docker Compose ile çalıştırılması
Teknolojiler:
– 🐋 Docker / Docker Compose
– 🧱 EasyPanel (PaaS yönetim arayüzü)
– 🦫 Go 1.23 (geliştirme dili)
– 🪶 SQLite (veritabanı)
– 💡 Node.js + LESS (statik varlıkların derlenmesi)
– 🌐 Reverse proxy: EasyPanel (TLS / HTTPS yönetimi)


1. 🎯 Hedef

Amaç:
– WriteFreely’yi EasyPanel üzerinde kendi domain’im (ozturk.ai) altında çalıştırmak,
– TLS sertifikasını EasyPanel üzerinden almak,
– Konfigürasyonu volume’a kalıcı yazmak,
– Gereken statik dosyaları (template, CSS) derlemek,
– Hatalarla karşılaşırsak her birini çözümlemek.


2. 🧰 Kullanılan Compose Yapısı

EasyPanel’in Docker Compose sekmesine aşağıdaki minimal yapı girildi:

services:
  wf_buildbox:
    image: golang:1.23-alpine
    user: "0:0"
    tty: true
    stdin_open: true
    working_dir: /srv/wf
    volumes:
      - wf_home:/srv/wf
    command: ["/bin/sh","-c","mkdir -p /srv/wf && tail -f /dev/null"]
    expose:
      - "8080"

volumes:
  wf_home:

Bu yapı sayesinde: – Container sürekli açık kalıyor (kapanmıyor), – Console erişimi aktif, – Tüm build çıktıları /srv/wf volume’unda kalıcı.


3. 🧱 Gerekli Araçların Kurulumu

Konsoldan (EasyPanel → Console):

apk update
apk add --no-cache git build-base nodejs npm sqlite-dev ca-certificates bash

4. 📦 Kaynak Kodun Alınması

cd /srv/wf
mkdir -p src bin data
cd src
git clone https://github.com/writefreely/writefreely.git
cd writefreely

5. 🧠 Derleme (Build)

WriteFreely artık Go 1.23 istiyor. Bu nedenle golang:1.23-alpine image’ı seçtik.
Doğru dizindeyken go.mod dosyası mevcut olmalı.

go version   # go1.23.x olmalı
go build -v -tags='sqlite' -o /srv/wf/bin/writefreely ./cmd/writefreely/

Çözümlediğimiz hata:
> ❌ go.mod file not found → yanlış klasördeydik
> ❌ go: go.mod requires go >= 1.23.0 → imaj sürümünü golang:1.23-alpine yaptık


6. 🎨 Statik Dosyaların Derlenmesi

npm i -g less less-plugin-clean-css clean-css
cd less
CSSDIR=../static/css
lessc app.less   --clean-css="--s1 --advanced" ${CSSDIR}/write.css
lessc fonts.less --clean-css="--s1 --advanced" ${CSSDIR}/fonts.css
lessc icons.less --clean-css="--s1 --advanced" ${CSSDIR}/icons.css
lessc prose.less --clean-css="--s1 --advanced" ${CSSDIR}/prose.css
cd ../prose
npm install
npm run build

7. ⚙️ Konfigürasyon ve Veritabanı

/srv/wf/bin/writefreely -c /srv/wf/data/config.ini --config
/srv/wf/bin/writefreely -c /srv/wf/data/config.ini --init-db
/srv/wf/bin/writefreely -c /srv/wf/data/config.ini --gen-keys

8. 🏃‍♂️ Çalıştırma

Önemli: working_dir repo kökü olmalı (templates ve static burada).

Yeni Compose:

services:
  wf_buildbox:
    image: golang:1.23-alpine
    user: "0:0"
    working_dir: /srv/wf/src/writefreely
    volumes:
      - wf_home:/srv/wf
    command: ["/srv/wf/bin/writefreely","-c","/srv/wf/data/config.ini"]
    expose:
      - "8080"

volumes:
  wf_home:

Çözümlediğimiz hata:
> ❌ load templates: no such file or directory
> ➤ working_dir’i /srv/wf/src/writefreely yaptık.


9. 🌐 Domain Ayarları (EasyPanel)


10. ⚠️ Karşılaşılan Hatalar ve Çözümleri

Hata Sebep Çözüm
go.mod file not found Yanlış dizin cd writefreely
requires go >= 1.23.0 Eski Go sürümü golang:1.23-alpine
Permission denied Volume yazma izni yok user: "0:0" + chmod 0777
templates: no such file Çalışma dizini yanlış working_dir: /srv/wf/src/writefreely
Using autocert on host localhost Autocert aktif autocert = false + port = 8080
URL’ler localhost:8080 base_url eksik base_url = "https://ozturk.ai"
Collection.hostName is empty! DB’de host sütunu boş UPDATE collections SET host='ozturk.ai';

11. ✅ Son Durum


12. 💡 Ek Notlar


🎉 Sonuç

Bu kurulumla: – Minimalist blog altyapısı (WriteFreely)
– Modern reverse proxy yönetimi (EasyPanel)
– Kalıcı volume ve güvenli TLS
– Hataların sistematik çözümü
başarıyla tamamlandı.