ownCloud 5.0 dan NGINX, Kericuhan Waktu Upgrade

Submitted by w41lf0x on Mon, 04/01/2013 - 07:10

ownCloud LogoBenar-benar sebuah kecelakaan. Ajaibnya, selesai dengan sendirinya.

Kejadian itu bermula pada saat saya memperbarui instalasi program PHP di server FreeBSD. Seperti biasanya saya memperbarui program-program di FreeBSD setelah mendapatkan informasi adanya celah keamanan pada program yang terpasang. Saya bukanlah penggemar program-program terbaru. Mungkin karena lama berkawan dengan Slackware dan FreeBSD sehingga saya lebih menyukai program yang stabil. Meskipun tidak baru tetapi aman digunakan sehari-hari, apalagi untuk server-server yang melayani banyak pengguna. Bug keamanan bukanlah sesuatu yang dapat ditoleransi.

Kembali ke PHP. Karena FreeBSD menganut sistem resolusi dependensi paket program, maka pada saat saya memperbarui program PHP melalui port PHP, program yang membutuhkan PHP akan dicek apakah ada versi terbaru atau tidak. Jika tidak ada versi baru, maka program tersebut mungkin hanya akan diubah informasi dependensinya atau dibangun ulang. Nah, pada kasus ini program ownCloud ternyata sudah diperbarui ke versi 5.0.0.

Saya tidak menyadarinya karena proses pembaruan paket PHP sendiri sudah memakan banyak waktu dan juga layar. Membangun sekian puluh program dari bundel kode sumber jelas membuat isi di layar berubah-ubah dengan cepat sehingga tak sempatlah mata ini mengikuti bahwa ternyata ownCloud ikut diperbarui. Saya baru mengetahuinya setelah mengecek log perbaruan paket (log dari portupgrade). Nasi sudah jadi bubur.

Lalu kericuhan dimulai. ownCloud 5.0.0 memiliki struktur database yang berbeda dengan versi 4.5.x. Jadi ownCloud akan berusaha untuk memperbarui struktur database sekaligus memindahkan data-data di database ke struktur barunya. Proses ini akan dimulai jika ada satu saja pengguna yang berusaha mengakses aplikasi ownCloud. Pengguna akan diberi informasi bahwa ownCloud akan memulai pembaruan database.

Celakanya, tidak hanya struktur database yang berubah. Struktur program juga berubah. Konfigurasi web server untuk ownCloud 4.5.x tidaklah mendukung struktur yang baru. Mekanisme rewrite untuk menghasilkan alamat skrip sesuai kebutuhan pengguna gagal untuk berjalan. Mekanisme rewrite tersebut juga menyediakan fungsi untuk mengirimkan kode javascript yang diperlukan untuk memperbarui database. Alhasil mekanisme pembaruan database yang menggunakan AJAX seketika itu juga ikut berhenti dan database gagal diperbarui. Lebih celaka lagi, karena proses pembaruan database gagal, informasi lokasi generator skrip antarmuka AJAX ownCloud juga ikut tidak tersimpan dalam database. Akhir kata, seluruh fungsi AJAX dari aplikasi tidak dapat digunakan. Saya masih dapat login tetapi selain antarmuka berantakan karena kode css tidak dapat dibentuk oleh ownCloud, semua fungsi administrasi juga tidak berjalan.

Mulailah saya merunuti satu-persatu konfigurasi dan daftar laporan bug ownCloud di github. Hal pertama yang harus saya lakukan adalah memulihkan mekanisme rewrite untuk ownCloud di nginx. Tidak mudah memang karena model rewrite nginx berbeda dengan apache. Entah sudah berapa model rewrite saya terapkan dan hasilnya nihil. Tetap saja ownCloud tidak dapat menghasilkan $PATH/remote.php/core.css. Lokasi tersebut bukanlah lokasi fisik, melainkan sebuah path virtual yang seharusnya dibuat oleh minimizer.php saat dipanggil oleh remote.php.

Lalu saya mendapatkan petunjuk tentang fungsi DEBUG pada konfigurasi ownCloud.

<?php

define("DEBUG", true);

$CONFIG = array(
/* Flag to indicate ownCloud is successfully installed (true = installed) */
"installed" => tru,

/* Type of database, can be sqlite, mysql or pgsql */
"dbtype" => "mysql",

/* Name of the ownCloud database */

Dalam komentarnya, bsavelev memasukkan secara manual informasi generator skrip css dan javascript sehingga akhirnya ownCloud-nya dapat bekerja normal. Patut dicoba nih, toh konfigurasi rewrite model apapun ternyata belum berhasil. Dan saya masukkan dua nilai tentang lokasi minimizer.php secara manual ke dalam tabel oc_appconfig. Setelah itu saya restart servis nginx dan php-fpm, menghapus cache browser dan mencoba membuka ownCloud kembali. Masih tetap sama. Antarmuka ownCloud masih berantakan.

Akhirnya saya bergerilya mencari-cari kembali contekan model rewrite yang dapat digunakan. Sampai akhirnya saya berhasil menyusun konfigurasi yang dapat menjalankan fungsi rewrite untuk ownCloud dengan benar. Asal konfigurasinya dari mana saya sudah lupa soalnya terlalu banyak konfigurasi yang saya coba. Bahkan model konfigurasi milik Joomla! saya coba gara-gara membantu seorang kawan memasang Joomla! di komputernya. Jadi beginilah rupa konfigurasi baru untuk ownCloud 5.0.0 milik saya:

location /owncloud {
    alias /usr/local/www/owncloud;
    index index.html index.php;

    rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
    rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
    rewrite ^/apps/calendar/caldav.php /remote.php/caldav/ last;
    rewrite ^/apps/contacts/carddav.php /remote.php/carddav/ last;
    rewrite ^/apps/([^/]*)/(.*\.(css|php))$ /index.php?app=$1&getfile=$2 last;
    rewrite ^/core/doc([^\/]+/)$ $1/index.html;

    try_files $uri $uri/ index.php;

    error_page 403 = /core/templates/403.php;
    error_page 404 = /core/templates/404.php;
}

location ~ ^/owncloud/(data|config|\.ht|db_structure\.xml|README) {
    deny all;
    access_log off;
}

location ~ ^/owncloud(.+?\.php)(/.*)?$ {
    alias            /usr/local/www/owncloud/$1;
    fastcgi_index    index.php;
    fastcgi_split_path_info   ^(.+\.php)(/.*)$;
    fastcgi_param    SCRIPT_FILENAME /usr/local/www$fastcgi_script_name;
    fastcgi_pass     php-fpm;
    include          fastcgi_params;
    fastcgi_param    HTTPS on;
    fastcgi_intercept_errors  on;
}

location /owncloud.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|svg)$ {
    expires max;
    access_log off;
}

Jangan lupa untuk mengaktifkan cgi.fix_pathinfo = 1 pada php.ini atau biarkan tertutup (terkomentari ; ) karena secara default PHP akan mengaktifkannya, lalu restart servis nginx dan php-fpm, dan hapus cache browser. Sejauh ini tidak ada permasalahan apa-apa. ownCloud desktop client juga tidak melaporkan suatu kesalahan, dan proses sinkronisasi berjalan normal bahkan sangat cepat. Sila bandingkan konfigurasi ini dengan konfigurasi terdahulu.

Selamat mencoba.