🚀 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)
- Domain:
ozturk.ai - Service:
wf_buildbox - Internal Port:
8080 - TLS: Let’s Encrypt (Cloudflare DNS only → gri bulut)
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
https://ozturk.aiaçılıyor,- TLS sertifikası EasyPanel tarafından yönetiliyor,
base_urlvehostayarları doğru,- Console’da hata yok.
12. 💡 Ek Notlar
- Admin kullanıcı oluşturmak için:
bash /srv/wf/bin/writefreely -c /srv/wf/data/config.ini --create-admin admin:GucluSifre - Reverse proxy’yi EasyPanel yönetiyor → WF tarafında HTTPS kapalı olmalı.
- Volume yedeğini almak yeterli (
/srv/wf/data).
🎉 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ı.