SSD Nodes Learn 🎉 VPS $5.50/aydan başlayan
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-21

HRConvert2 ile kendi dosya dönüştürücünüzü kurun

HRConvert2 kullanarak dosyalarınızı üçüncü taraf sitelere yüklemeden yerel sunucunuzda dönüştürün. Docker veya Apache kurulumu, bubblewrap koruması ve dosya temizleme rehberi.

Neden kendi dosya dönüştürücünüzü barındırmalısınız

Kendi kendine barındırılan bir dosya dönüştürücü, dosyayı kendi diskinizde tutar. Bunu çalıştırmanın tek nedeni budur. Ücretsiz bir dönüştürücü sitesi yüklemeyi alır ve sonrasında dosyaya ne olduğu konusunda size hiçbir bilgi vermez. Dosya imzalı bir müşteri sözleşmesi veya taranmış bir tıbbi kayıt olduğunda, yüklemenin kendisi bir güvenlik ihlalidir. HRConvert2, PHP ile yazılmış ve GPLv3 lisansına sahip, sürükle-bırak yöntemiyle çalışan bir dosya dönüştürme sunucusudur. 3.7.4 sürümü 18 Ağustos 2026 tarihinde yayınlanmıştır ve proje 488 formatın desteklendiğini belirtmektedir.

Veritabanı, hesap sistemi veya çerez kullanımı yoktur. Her kullanıcı geçici bir dizinden ibarettir. Her dönüştürme işlemi, işi yapan yerel bir komut satırı aracı ile gerçekleştirilir: belgeler için LibreOffice, ses ve video için FFmpeg, görseller için ImageMagick, optik karakter tanıma (OCR) için Tesseract ve geri kalan formatlar için çok sayıda küçük araç kullanılır. HRConvert2; yükleme sayfası, işlem hattı ve bunların etrafındaki temizlik süreçlerinden oluşur.

Dosyayı bir formattan diğerine dönüştürür. Tarayıcı tabanlı bir ofis paketi değildir; bu nedenle insanların bir sekme üzerinde belge düzenlemesini istiyorsanız, kendi kendine barındırılan OnlyOffice ve Collabora seçeneklerini karşılaştırın. Ayrıca bir depolama alanı da değildir. Dönüştürülen çıktıların silinmesi amaçlanmıştır; bu yüzden dosyaların bir yerde kalıcı olması gerekiyorsa, bu iş kendi kendine barındırılan bir dosya yöneticisi tarafından yapılmalıdır.

Gereksinimler

Debian veya Ubuntu, Apache 2.4, PHP 8 veya üzeri ve bubblewrap gereklidir. Bubblewrap (bwrap) sandbox ortamını sağlar ve isteğe bağlı değildir: sandbox oluşturamayan bir sunucu, korumasız çalışmak yerine dönüştürme işlemini reddeder. Upstream README dosyası, Raspberry Pi Model B+ cihazının PHP kısmı için yeterli olduğunu belirtir. Dönüştürücü ikili dosyaları gerçek donanım bütçenizi belirler; bu konu aşağıda ayrıntılı olarak ele alınmıştır.

Sisteme başlamanın iki yolu vardır. Docker imajı hemen çalışmaya hazırdır. Apache ve PHP kurulumu ise bir akşamınızı alır ve sunucuda tam olarak nelerin yüklü olduğunu görmenizi sağlar.

Docker ile bu gece çalıştırın

İmaj, tüm dönüştürücü ikili dosyalarını içerdiğinden boyut olarak büyüktür: Ağustos 2026 itibarıyla yaklaşık 3 GB. İmajı çekmeden önce diskte yeterli alan olup olmadığını kontrol edin.

Burada etiketler önemlidir. 17 Ağustos 2026 itibarıyla Docker Hub üzerinde yayınlanan en yeni etiket v3.7.2 iken, en yeni GitHub sürümü v3.7.4'tür. latest etiketi sürekli güncellenmektedir ve bu uygulama geniş bir ayrıştırıcı yüzeyine sahip olduğundan, belirli bir sürümü sabitleyin ve yükseltmeleri bilinçli olarak yapın.

docker pull zelon88/hrconvert2:v3.7.2
docker run -d --name hrconvert2 \
  -p 127.0.0.1:8080:80 \
  --security-opt seccomp=unconfined \
  zelon88/hrconvert2:v3.7.2
docker ps
curl -I http://127.0.0.1:8080/

Sağlıklı bir container Up durumunda kalır ve curl komutu HTTP/1.1 200 OK değerini döndürür. Sürekli yeniden başlayan bir container'ın başlatma sorunu vardır; bu nedenle başka bir şeyi değiştirmeden önce docker logs hrconvert2 dosyasını okuyun.

İki bayrak (flag) önem taşır. -p 127.0.0.1:8080:80, portu yalnızca loopback üzerinde yayınlar; bu sayede siz bilinçli olarak önüne bir proxy koyana kadar dışarıdan kimse dönüştürücüye erişemez. Projenin kendi örneği, genel arayüz dahil tüm arayüzleri dinleyen -p 8080:80 -p 8443:443 değerini eşler. --security-opt seccomp=unconfined bayrağı gereklidir çünkü bubblewrap, Docker'ın varsayılan seccomp profilinin engellediği kullanıcı ad alanı (user namespace) ve mount sistem çağrılarını kullanarak kendi korumalı alanını (sandbox) oluşturur. Bu bayrak olmadan dönüştürme işlemleri başarısız olur ve uygulama size nedenini şu şekilde bildirir: A sandbox blocks the required syscalls unless it was started with the correct options.

Bu bayrak önemli bir takastır. Uygulamanın kendi içinde daha sıkı bir korumalı alan oluşturabilmesi için container'ın sistem çağrısı filtresini gevşetirsiniz. Davranışı belirleyen iki ayar, varsayılan olarak TRUE ve FALSE olan Resources/config.php dosyasındaki $RequireSandbox ve $RequireSandboxOnDocker değerleridir. Docker gereksinimi varsayılan olarak kapalı olduğundan, seccomp bayrağı olmayan bir container herhangi bir korumalı alan olmadan dönüştürme yapabilir. Bayrak eklendiğinde $RequireSandboxOnDocker = TRUE; ayarını yapın; böylece container içinde reddetme davranışını geri kazanırsınız.

Eğer bu makinede Docker yeniyse, önce daemon kurulumunu yapın. VPS üzerinde Docker çalıştırma rehberi; kurulumu, depolama sürücüsünü ve Docker'ın kendi güvenlik duvarı kurallarını nasıl yazdığını kapsar.

Apache ve PHP üzerinde kurulum

Depodaki Documentation/INSTALLATION_INSTRUCTIONS.txt dosyası temel referanstır ve dokuz adımdan oluşur. Süreç şu şekildedir. Web sunucusu, dil ve sandbox ile başlayın:

sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-all-dev php8.3-zip php8.3-gd bubblewrap

php8.3-* isimleri Ubuntu 24.04 ile uyumludur. php -v komutunu çalıştırın ve sürümünüze uygun ön eki kullanın; paket isimleri her PHP sürümünde değişir ve yanlış paket seçimi Unable to locate package hatasına yol açar.

Ardından dönüştürücüler gelir. Bu adım; belge, görsel, ses, video ve OCR işlemlerini kapsar ki kullanıcıların gerçekleştirdiği dönüştürmelerin çoğu bunlardır:

sudo apt install -y imagemagick ffmpeg libreoffice-common libreoffice-java-common \
  default-jre ghostscript poppler-utils libgxps-utils tesseract-ocr inkscape \
  xvfb clamav curl tar libxcb-cursor0

Arşiv formatları, 3D modeller, e-kitaplar ve önyüklenebilir ISO imajları daha fazla paket gerektirir ve bunların bazıları Ubuntu'nun multiverse bileşeninde yer alır. Resmi talimatların 3. ve 5. adımları tam listeyi sırasıyla içerir. İki bağımlılık apt paketi değildir: depo, kodlayıcılara veya Ubuntu'nun paketlemediği bir ImageMagick 7 sürümüne ihtiyaç duyanlar için Documentation/Build/ffmpeg-build.sh ve Documentation/Build/build-imagemagick-v7.sh dosyalarını sunar. E-kitap desteği, talimatlarda tek satır olarak verilen calibre'nin kendi yükleyicisinden gelir:

sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin

Bu, root yetkisiyle bir shell'e yönlendirilen bir üretici betiğidir. Bu, yukarı akış (upstream) yöntemidir ve isteğe bağlıdır: bu adımı atlarsanız yalnızca e-kitap dönüştürme özelliğini kaybedersiniz.

Sırada PHP limitleri var. Dönüştürme işlemleri yavaştır ve dosyalar büyüktür, bu nedenle varsayılan değerler yetersiz kalır. Proje, bu değerleri php.ini dosyasında şu şekilde ayarlar:

max_execution_time = 1200
max_input_time = 90
memory_limit = 512M
post_max_size = 5000M
upload_max_filesize = 5000M
max_file_uploads = 100
display_errors = Off
zlib.output_compression = On

Bu sayılar, yeterli kaynağa sahip bir makineyi varsayar. Küçük bir VPS kullanacaksanız bu değerleri düşürün; çünkü upload_max_filesize = 5000M ve max_file_uploads = 100 ile yapılan tek bir istek, 40 GB'lık bir diskin kapasitesinden çok daha fazlasını yazabilir. Apache'yi yeniden başlatın ve PHP'nin hangi değerleri yüklediğini doğrulayın:

sudo service apache2 restart
php -i | grep -E "upload_max_filesize|post_max_size|memory_limit"

Şimdi çalışma dizini. Resources/config.php içindeki $ConvertLoc bu dizini tanımlar ve varsayılan değer /DATA/HRConvert2 şeklindedir. Web sunucusu kullanıcısının bu dizin üzerinde sahiplik yetkisi olmalıdır:

sudo mkdir -p /DATA/HRConvert2
sudo chmod -R 0755 /DATA/HRConvert2
sudo chown -R www-data:www-data /DATA/HRConvert2

Sürümü Apache belge kök dizininizin altına açın. Varsayılan düzen onu bir HRProprietary/HRConvert2 klasörüne yerleştirir ve Resources/config.php içindeki $InstLoc, dosyaları yerleştirdiğiniz gerçek yolu belirtmelidir. Ardından, eksik bir bağımlılığı kullanıcı fark etmeden bulmanın en hızlı yolu olan yerleşik tanılama aracını çalıştırın:

sudo php /path/to/HRConvert2/convertCore.php -v

-v tüm kurulumu denetler: çekirdek sürümleri, bağımlılık kontrolleri, sandbox durumu ve dil paketleri. Dosya dönüştürme işlemleri komut satırından desteklenmez, bu nedenle bu argüman seti yalnızca yönetimsel amaçlıdır.

Neden yeni bir Ubuntu 24.04 kurulumunda her dönüştürme işlemi başarısız oluyor?

Bunun nedeni sandbox mekanizmasıdır ve bu, ilk gün karşılaşılan en yaygın sorundur. Ubuntu 24.04 ve Debian 12, varsayılan olarak ayrıcalıksız kullanıcı ad alanlarını (user namespaces) kısıtlar. Bubblewrap, sandbox ortamını oluşturmak için bir kullanıcı ad alanına ihtiyaç duyar; bu nedenle bwrap başlatılamaz. Uygulama, sandbox olmadan dönüştürme yapmayı reddettiği için tüm işler başarısız olur.

Durumu doğrudan kontrol edin:

bwrap --ro-bind / / --dev /dev /bin/true && echo sandbox ok

"Permission denied" (Erişim reddedildi) hatası, ad alanının engellendiği anlamına gelir. Çözüm, bwrap ikili dosyası için bir AppArmor profili oluşturmaktır. Öncelikle ABI dosyalarını listeleyin ve mevcut en yüksek numarayı not edin:

ls /etc/apparmor.d/abi/

Ardından /etc/apparmor.d/bwrap dosyasını yazın ve 4.0 ifadesini bu en yüksek numara ile değiştirin:

abi <abi/4.0>,
include <tunables/global>

profile bwrap /usr/bin/bwrap flags=(unconfined) {
  userns,
  include if exists <local/bwrap>
}

Profili yükleyin:

sudo apparmor_parser -r /etc/apparmor.d/bwrap

Çıktı alınmaması, profilin başarıyla yüklendiği anlamına gelir. bwrap kontrolünü tekrar çalıştırın; bu kez sandbox ok çıktısını vermesi gerekir. Dönüştürme işlemleri bu noktadan itibaren çalışacaktır.

Genel kullanıma açık bir dönüştürücü, yabancılara sunulan bir ayrıştırıcıdır

Bu bölüm, yazının geri kalanının varlık sebebidir. İnternetten erişilebilen bir dosya dönüştürücü, anonim bir kullanıcıdan rastgele bir dosya kabul eder ve bunu LibreOffice, ImageMagick, FFmpeg veya Ghostscript'e iletir. Bunlar, uzun bir ayrıştırıcı hatası geçmişine sahip büyük C ve C++ kod tabanlarıdır. Dosyayı yükleyen kişi formatı seçer; bu da yükleme yapan kişinin hangi ayrıştırıcının çalışacağını ve o ayrıştırıcı içindeki hangi kod yolunun izleneceğini seçtiği anlamına gelir.

HRConvert2'nin buna yanıtı, her bağımlılığı bir bubblewrap namespace içinde çalıştırmaktır. Her dönüştürme işlemi iki dizin görür: salt okunur olarak bağlanan girdi dizini ve çıktının alındığı dizin. Ağ paylaşımı kaldırılmıştır; projenin ifadesiyle closes every URL handler in every dependency at once. Bu, kulağa geldiğinden daha önemlidir. Hem ImageMagick hem de Ghostscript, URL getiren referansları kabul eder; bir dönüştürücü, ağınızın içinden bir bulut meta veri uç noktasına ulaşmak için bu şekilde bir sunucu taraflı istek sahteciliği (SSRF) aracına dönüşür. Namespace içinde ağ olmadığında, bu getirme işlemi gerçekleşemez.

Reddetme, işin diğer yarısıdır: A server that cannot build a sandbox refuses the conversion rather than quietly running without one. Kapalı durumda başarısız olan bir araç, kimsenin okumadığı bir günlükte sizi uyaran bir araçtan daha değerlidir. Yukarıdaki AppArmor adımının isteğe bağlı olmamasının ve $RequireSandboxOnDocker konusunun, konteyneri dış dünyaya açmadan önce incelenmeyi hak etmesinin nedeni de budur.

ImageMagick'i policy.xml ile sıkılaştırma

ImageMagick'in kendi ilke dosyası, sandbox altında ikinci bir katman görevi görür ve yapılandırılması önemlidir. Ubuntu 24.04 üzerinde ImageMagick 6 ile bu dosya /etc/ImageMagick-6/policy.xml konumundadır. Mevcut aktif ayarları görüntüleyin:

identify -list policy

Proje, Documentation/Build/policy.xml konumunda iyi bir model teşkil eden bir ilke dosyası sunar. Bu dosya PS, PS2, PS3, EPS, XPS ve MVG kodlayıcılarını reddeder; URL, HTTPS, HTTP ve gs delegelerini engellerken PDF kullanımına izin verir:

<policy domain="coder" rights="none" pattern="PS" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="delegate" rights="none" pattern="URL" />
<policy domain="delegate" rights="none" pattern="gs" />
<policy domain="coder" rights="read|write" pattern="PDF" />

gs satırı kritik öneme sahiptir. ImageMagick, PostScript'i kendi başına ayrıştırmaz. İşlemi Ghostscript'e devreder ve bilinen ImageMagick uzaktan kod yürütme (RCE) açıkları bu delege noktasında ortaya çıkar. Bu delegeyi reddettiğinizde, dosya ne iddia ederse etsin, ImageMagick yüklenen dosyayı hiçbir şekilde gs uygulamasına iletmez.

Aynı ilke dosyası kaynak sınırlarını da belirler; bu sayede özel olarak hazırlanmış bir görselin sunucu kaynaklarını tüketmesi engellenir:

<policy domain="resource" name="memory" value="256MiB"/>
<policy domain="resource" name="map" value="512MiB"/>
<policy domain="resource" name="disk" value="1GiB"/>
<policy domain="resource" name="width" value="16KP"/>
<policy domain="resource" name="height" value="16KP"/>
<policy domain="resource" name="area" value="128MP"/>

Decompression bomb (sıkıştırma bombası), çok büyük boyutlar bildiren küçük bir dosyadır. width, height ve area limitleri, bellek tahsisi gerçekleşmeden önce bu dosyayı reddeder; böylece çekirdek bir süreci sonlandırmak zorunda kalmadan işlem kendiliğinden çıkar.

Diğer tarafta bir tuzak bulunmaktadır. Ubuntu'nun varsayılan ilkesi PDF kodlayıcısını doğrudan reddeder; bu nedenle müdahale edilmemiş bir sistemde PDF işlemleri attempt to perform an operation not allowed by the security policy 'PDF' hatasıyla başarısız olur. Bu hata dizgesi, ilkenin görevini yaptığını gösterir. Kodlayıcıya tekrar izin vermek bilinçli bir karardır ve bunu yaptığınızda gs delegesini reddedilmiş durumda tutmalısınız.

Küçük bir VPS üzerinde bağımlılık zincirinin maliyeti

Boşta çalışırken bunların hiçbiri maliyetli değildir. Apache ve PHP birkaç on megabaytlık yer kaplar ve dönüştürücü ikili dosyaları hiç çalışmaz. Tüm maliyet, bir dosya sisteme ulaştığı anda ortaya çıkar.

Bir belge dönüştürme işlemi, bir Java çalışma zamanı başlatan LibreOffice'i tetikler. Bir görsel dönüştürme işlemi, ImageMagick'e 256 MiB bellek ve yukarıdaki politikaya göre 512 MiB bellek eşlemesi (memory map) sağlar. Bir video dönüştürme işlemi ise FFmpeg'e sahip olduğunuz tüm çekirdekleri tahsis eder; çünkü FFmpeg video işlerken bunu yapar. PHP'nin kendi memory_limit değeri, proje yapılandırmasında 512M olarak belirlenmiştir. Bu rakamlar, tek bir iş sırasında işletim sistemi ve web sunucusunun üzerine eklenir.

Bu nedenle 1 GB RAM'e sahip bir VPS, ilk gerçek belgede takas (swap) alanına geçer ve ardından performans kaybı yaşar. Bellek tükendiğinde, çekirdeğin "out of memory killer" mekanizması, en büyük yerleşik boyuta (resident size) sahip süreci sonlandırır. Bu genellikle soffice.bin olur ve kullanıcı, hiçbir anlamlı hata mesajı almadan başarısız olan bir dönüştürme işlemiyle karşılaşır. Bazen bu süreç apache2 olur ve tüm site erişilemez hale gelir. Durumu olay sonrasında dmesg -T | grep -i "killed process" ile doğrulayabilirsiniz.

Bu bir kıyaslama (benchmark) değil, boyutlandırma rehberidir: 4 GB RAM ve iki çekirdek küçük bir ekip için yeterlidir; yükünüz belge ve görsellerden oluşuyorsa ve bekleme süresini kabul ediyorsanız 2 GB RAM ve bir swap dosyası iş görür. Swap dosyası dönüştürme işlemini hızlandırmaz. Sadece ani bellek yüklenmelerini ölümcül bir hata yerine yavaş bir sürece dönüştürür; bu da donmuş bir sayfa ile tamamen kesintiye uğramış bir servis arasındaki farktır. Diske gerektiğinden fazla alan ayırın; çünkü 3 GB'lık bir görsel, yüksek bir yükleme limiti ve dönüştürülmüş çıktı, diğer tüm kaynaklarınız tükenmeden önce diski hızla dolduracaktır.

Dönüştürme işlemleri doğası gereği ani yüklenmelere (bursty) neden olur. Aynı anda video yükleyen iki kişi tüm çekirdekleri kullanacaktır ve bir sonraki istek onların arkasında bekleyecektir. Bunun önünde bir iş kuyruğu bulunmadığından, sahip olduğunuz tek kontrol mekanizması limitlerdir.

Tek bir yüklemenin diski doldurmasını engelleyen limitleri ayarlayın

Önce PHP değerlerini kısıtlayın. upload_max_filesize = 512M, post_max_size = 512M ve max_file_uploads = 20 gibi değerler, 4 GB belleğe sahip paylaşımlı bir sunucu için makul bir başlangıç noktasıdır. max_execution_time = 1200 değerinin, tek bir PHP isteğinin yirmi dakika boyunca çalışmasına izin verdiğini unutmayın; uzun süren bir video dönüştürme işlemi için bu süre gereklidir ancak bu durum, yavaş bir yüklemenin bir worker sürecini yirmi dakika boyunca meşgul edeceği anlamına gelir.

Ardından, istek PHP'ye ulaşmadan önce proxy katmanında boyut ve hız sınırlamalarını zorunlu kılın:

limit_req_zone $binary_remote_addr zone=convert:10m rate=6r/m;

server {
    listen 443 ssl;
    server_name convert.example.com;

    client_max_body_size 512M;
    client_body_timeout 300s;

    location / {
        limit_req zone=convert burst=4 nodelay;
        proxy_pass http://127.0.0.1:8080;
        proxy_read_timeout 1200s;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

client_max_body_size, dönüştürmek istediğiniz en büyük dosyadan en az o kadar büyük olmalıdır; aksi takdirde nginx 413 Request Entity Too Large hatası verir ve PHP yüklemeyi hiçbir zaman görmez. proxy_read_timeout, en uzun dönüştürme sürenizden daha yüksek olmalıdır; aksi takdirde proxy arkasında sorunsuz çalışan bir iş, tarayıcıya 504 Gateway Time-out hatası döndürür. TLS (transport layer security) sonlandırma dahil olmak üzere sunucu bloğunun geri kalanı, satır satır açıklanan bir nginx reverse proxy yapılandırması içerisinde ele alınmıştır.

Dönüştürülen dosyaların silinmesi

Her dönüştürme işlemi, hassas bir dosyanın kopyasını web sunucusunun okuyabileceği bir dizinde bırakır. Temizlik işlemi, bir dönüştürücüyü, üzerinde dönüştürülen her şeyin arşivlendiği bir depodan ayıran temel farktır.

$DeleteThreshold içindeki Resources/config.php, bir oturumun sona erme süresini dakika cinsinden belirler ve varsayılan değeri 60'tır. İçerik hassas olduğunda bu değeri 15'e düşürün. Temizlik işleminin kendisi, çekirdek üzerinde bir komut satırı argümanıdır:

sudo -u www-data php /path/to/HRConvert2/convertCore.php -c
sudo -u www-data php /path/to/HRConvert2/convertCore.php -c=15

-c, yapılandırılmış eşik değerini kullanarak süresi dolmuş oturumları her iki veri konumundan da temizler. -c=15, yalnızca o çalıştırma için on beş dakikalık süreyi kullanır. -c=now, o anda bir kullanıcının dönüştürme işlemi yapıp yapmadığına bakılmaksızın tüm oturumları siler; bu nedenle bu komutu yalnızca bakım işlemleri için saklayın. Aynı argümanlar, docker exec aracılığıyla container içinde de çalışır.

Temizlik işleminin bir sayfanın yüklenmesine bağlı kalmaması için onu bir zamanlayıcıya ekleyin. /etc/cron.d/hrconvert2 içindeki bir satır yeterlidir:

*/10 * * * * www-data php /path/to/HRConvert2/convertCore.php -c

Birkaç dakika sonra ls /DATA/HRConvert2 ile kontrol edin ve eski oturum dizinlerinin silindiğini gözlemleyin. Web sunucusu kullanıcısı o dizinin sahibi olduğu için, istismar edilmiş bir ayrıştırıcı (parser) tam olarak bu hesabı ele geçirecektir; bu nedenle bu hesabın sahip olduğu başka değerli bir dosya bulunmamalıdır. VPS üzerinde en az yetkili kullanıcı hesapları genel bir modeldir ve burada her zamankinden daha fazla önem taşır.

Genel erişim hedeflenmiyorsa kimlik doğrulama arkasına alın

Varsayılan kurulum, tasarım gereği herhangi bir hesap içermez. Sayfaya erişebilen herkes dosya yükleyebilir ve dönüştürücü binary dosyalarınızı çalıştırabilir; hız sınırlamaları (rate limits) bu durumu yalnızca yavaşlatır. Bu nedenle hangi durumda olduğunuzu belirleyin.

Eğer uygulama sadece siz ve birkaç iş arkadaşınız içinse, dış dünyaya kesinlikle açmayın. Container'ı yukarıda gösterildiği gibi loopback arayüzüne bağlayın ve özel bir ağ veya SSH tüneli üzerinden erişin. Bu durumda internet üzerindeki hiçbir şey dosya gönderemez; bu da saldırı yüzeyini filtrelemek yerine tamamen ortadan kaldırır.

Eğer tarayıcı üzerinden erişilebilir olması gerekiyorsa, proxy katmanının önüne kimlik doğrulama ekleyin. Basic auth yalnızca iki komuttan oluşur ve yükleme formunu yabancılardan uzak tutar:

sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd alice
location / {
    auth_basic "Converter";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://127.0.0.1:8080;
}

Nginx yapılandırmasını yeniden yükleyin ve sayfayı açın. Bir parola istemi çıkması işlemin çalıştığını gösterir; istem çıkmıyorsa düzenlediğiniz location bloğu isteği karşılayan blok değildir. Paylaşımlı bir parola yerine gerçek kullanıcı hesapları kullanmak istiyorsanız, tek oturum açma (SSO) sağlayıcısı ile sonlandırma yapın: kendi sunucunuzda barındırdığınız bir Authentik SSO sunucusu, kendi giriş sistemi olmayan bir uygulamanın önüne ileri yönlendirmeli kimlik doğrulama (forward authentication) eklemenizi sağlar.

Eğer gerçekten herkese açık bir dönüştürücü hedefleniyorsa, bunun getirdiği riskleri kabul edin ve buna göre plan yapın. Sandbox ortamının taranacağını varsayın. Image etiketini (tag) sabit tutun, ImageMagick politikasını sıkılaştırın, yükleme sınırlarını düşük tutun ve uygulamayı içinde başka önemli verinizin bulunmadığı bir VPS üzerinde çalıştırın.

Hata modları ve karşılaşacağınız dizgeler

Tüm dönüştürme işlemleri anında başarısız oluyor. Sandbox oluşturulamıyor. Normal bir kurulumda bu durum AppArmor profilinden kaynaklanır. Docker içinde ise eksik olan --security-opt seccomp=unconfined değeridir. Uygulama bunu A sandbox blocks the required syscalls unless it was started with the correct options. olarak adlandırır ve See --Require Sandbox-- & --Require Sandbox On Docker-- in config.php. adresini işaret eder.

Yalnızca görsel dönüştürmeleri başarısız oluyor. Bubblewrap is missing or non functional, so this image conversion cannot be isolated! hatası, bwrap aracının eksik olduğunu veya web sunucusu kullanıcısının yolunda (PATH) bulunamadığını gösterir.

Bir format başarısız oluyor ancak diğerleri çalışıyor. Eksik bir ikili dosya açıkça şu şekilde raporlanır: ImageMagick may not be installed, or may not be reachable on the system path used by the web server user.. Aynı mesaj hem FFmpeg hem de LibreOffice için geçerlidir. Kurulumun neleri bulabildiğini görmek için convertCore.php -v komutunu çalıştırın ve Apache çalışanının PATH değişkeninin, sizin oturum açtığınız kabuğun PATH değişkeniyle aynı olmadığını unutmayın.

PDF işlemleri bir politika hatasıyla başarısız oluyor. attempt to perform an operation not allowed by the security policy 'PDF' hatası HRConvert2'den değil, ImageMagick'in policy.xml dosyasından kaynaklanır.

Büyük yüklemeler 413 hatası döndürüyor. nginx client_max_body_size değeri dosyadan daha küçüktür. Zincirde üç farklı limit bulunur; biri nginx, ikisi PHP tarafındadır ve en küçük olan değer geçerli olur.

Dönüştürme işlemleri duruyor ve görünürde hiçbir şey değişmedi. The device where data is stored has an insufficient amount of storage space available. hatası. Boş disk alanını kontrol edin ve temizleme işleminin (cleanup sweep) gerçekten çalışıp çalışmadığını doğrulayın.

Temizleme işlemi günlük kayıtlarında hata veriyor. Could not clean the temporary location! ve Could not clean the convert location! sahiplik sorunlarıdır. Web sunucusu kullanıcısı, $ConvertLoc tarafından belirtilen dizinin sahibi olmalıdır.

FAQ

Self-hosted bir dosya dönüştürücüyü internete açmak güvenli midir?

Yabancılara açık bir ayrıştırıcı (parser) olarak değerlendirdiğiniz sürece yeterince güvenlidir. Her yükleme LibreOffice, ImageMagick, FFmpeg veya Ghostscript araçlarına iletilir ve yüklemeyi yapan kişi hangisinin kullanılacağını seçer. HRConvert2 bu araçları ağ erişimi olmayan ve salt okunur bir girdi dizinine sahip bir bubblewrap ad alanında çalıştırır; sandbox içine alamadığı hiçbir dönüştürme işlemini kabul etmez, bu güçlü bir varsayılan ayardır. Yine de kimlik doğrulama zorunlu tutulmalı, yükleme limitleri düşük tutulmalı ve uygulama içinde başka değerli veri bulunmayan bir VPS üzerinde çalıştırılmalıdır.

Neden yeni bir Ubuntu 24.04 kurulumunda tüm dönüştürme işlemleri başarısız oluyor?

Ubuntu 24.04 ve Debian 12, ayrıcalıksız kullanıcı ad alanlarını kısıtlar; bubblewrap ise sandbox oluşturmak için buna ihtiyaç duyar. Uygulama, sandbox olmadan dönüştürme yapmayı reddettiği için, işlemlerin bir kısmı yerine tamamı başarısız olur. /usr/bin/bwrap için flags=(unconfined) ile bir AppArmor profili yazın, sudo apparmor_parser -r /etc/apparmor.d/bwrap ile yükleyin ve ardından bwrap --ro-bind / / --dev /dev /bin/true ile doğrulayın.

Neden dönüştürme işlemleri Docker içinde başarısız olurken normal kurulumda çalışıyor?

Docker'ın varsayılan seccomp profili, bubblewrap'in kullandığı sistem çağrılarını engeller; bu nedenle sandbox container içinde oluşturulamaz. Uygulamayı, projenin kendi çalıştırma komutunda da yer alan --security-opt seccomp=unconfined ile başlatın. $RequireSandboxOnDocker değerinin varsayılan olarak FALSE olduğunu unutmayın; bu nedenle bayrak eklenmemiş bir container, hiçbir sandbox olmadan dönüştürme yapabilir. Seccomp bayrağı yerleştirildikten sonra bu değeri TRUE olarak ayarlayın.

Bir dosya dönüştürme sunucusu ne kadar RAM'e ihtiyaç duyar?

Boştayken tüketim düşüktür ancak aktif bir dönüştürme işlemi sırasında yüksektir. LibreOffice bir Java çalışma zamanı başlatır, ImageMagick varsayılan politikada 256 MiB bellek ve 512 MiB eşleme (map) kullanır, PHP'nin kendi sınırı ise 512M'dir. 1 GB'lık bir VPS üzerinde bu kombinasyon swap kullanımına yol açar ve out of memory killer, soffice.bin veya apache2 sürecini sonlandırır. Küçük bir ekip için 4 GB RAM ve iki çekirdek planlayın; dönüştürme işlemi mesaj vermeden sonlandığında dmesg -T | grep -i "killed process" dosyasını kontrol edin.

Dönüştürülen dosyalar nereye gider ve ne zaman silinir?

Dosyalar, Resources/config.php içindeki $ConvertLoc tarafından belirtilen çalışma dizinine gider; varsayılan değer /DATA/HRConvert2'dur. $DeleteThreshold, bir oturumun kaç dakika sonra sona ereceğini belirler ve varsayılan değer 60'tır. Temizlik komut satırından çalıştırılır: php convertCore.php -c süresi dolmuş oturumları temizler, -c=now ise aktif olanlar dahil tüm oturumları anında siler. Silme işleminin siteye ziyaretçi gelmesine bağlı kalmaması için -c komutunu bir cron girdisine veya systemd zamanlayıcısına ekleyin.