Anda mendapat sebuah server dengan IP publik. Server ini akan dipakai untuk web server oleh banyak user yang akan upload situs mereka dengan domainnya masing-masing. Saatnya menggunakan Virtualmin.
Pemasangan Ubuntu
Gunakanlah Ubuntu Hardy Server Edition (8.04 LTS). Kalau mesin Anda Intel Core 2 Duo, ada baiknya pakai edisi 64 bit. Saat pemasangan, pastikan openssh-server disertakan. Atur IP-nya, dan cobalah diakses dari komputer lain menuju IP publik server tersebut. Jika berhasil hingga Anda bisa sudo su secara remotely, silahkan keluar dari Gedung Cyber, dan mulailah konfigurasi selanjutnya dari tempat lain.
Anda juga bisa mencobanya dulu dengan distro yang memiliki Desktop, seperti Ubuntu Hardy Desktop Edition. Distro ini sudah dilengkapi dengan Firefox. Jika Anda masih enggan memasangnya di partisi harddisk, silahkan pasang di VirtualBox.
Karena nanti setiap user adalah user sistem Linux (bukan virtual user), maka sebaiknya Anda perhatikan permission pada home directory Anda sendiri. Secara default Ubuntu akan memberikan hak akses 755 pada home directory user, misalkan /home/grananda:
# ls -l /home drwxr-xr-x 57 grananda grananda 4096 2009-08-29 16:30 grananda
# chmod 750 /home/grananda # ls -l /home drwxr-x--- 57 grananda grananda 4096 2009-08-29 16:30 grananda
$ sudo su # sh install.sh
# tail -f /root/virtualmin-install.log
# apt-get install libapache2-mod-suphp
docroot=/home
# a2enmod rewrite # a2enmod suphp
# a2dismod php5
# apt-get install php5-pgsql
# apt-get install php5-gd
max_execution_time = 1000 max_input_time = 1000 memory_limit = 128M post_max_size = 100M upload_max_filesize = 1000M
# /etc/init.d/apache2 restart
submission inet n - - - - smtpd smtps inet n - - - - smtpd
# adduser postfix sasl
MECHANISMS="shadow"
# /etc/init.d/saslauthd restart # /etc/init.d/postfix restart
disable_plaintext_auth = no
# /etc/init.d/dovecot restart
Kenyamanan SSH
Anda juga ingin memberikan kenyamanan bagi user bila mereka menggunakan konsole melalui ssh ? Silahkan ikuti petunjuk ini untuk pengaturan vim dan bash autocompletion. Untuk memudahkan user mengunduh aplikasi dari GitHub dan Bitbucket pasang paket berikut ini:
# apt-get install git-core mercurial
Database
Ada baiknya Anda memberikan fasilitas procedural language pada database user. Ini penting agar mereka bisa membuat function dan trigger.
# su postgres -c "createlang plpgsql template1"
host all all 202.59.201.67/32 md5
202.59.201.67 adalah IP dimana PostgreSQL terpasang. Pada /etc/postgresql/8.3/main/postgresql.conf aktifkan baris berikut ini:
listen_addresses = '*'
# /etc/init.d/postgresql-8.3 restart
nameserver 127.0.0.1
nameserver 192.168.0.1
Setelah selesai Anda diminta untuk cek ulang konfigurasi. Klik tombol Recheck and refresh configuration. Proses pengecekan berlangsung hingga Anda menemukan kalimat
your system is ready to use by Virtualmin
Khusus administrator domain bersangkutan, IMAP login tidak memerlukan @domain. Lebih jelasnya Anda bisa lihat di menu Edit Mail and FTP users kolom IMAP/FTP login, setelah Anda membuat domain nanti.
Berikan Bash
Bila nanti user baru Anda login menggunakan ssh, ia akan mendapat shell sederhana, yaitu /bin/sh. Terus terang, shell ini kurang nyaman, dimana tidak memiliki history dan autocompletion. Sebaiknya Anda memberikan /bin/bash.
Klik menu System Customization, Custom Shell, Custom shells below. Gantilah /bin/sh menjadi /bin/bash, lalu klik Save.
Pendaftaran Domain
Selanjutnya kita mulai seolah ada pelanggan yang ingin hosting di server ini. Pelanggan Anda meminta Internet domain reymanx.web.id. Karena .id, Anda bisa mendaftarkannya di Pandi. Ikutilah petunjuknya. Yang terpenting arahkan domain tersebut ke IP publik server ini. Namun Anda juga bisa mengabaikan pendaftaran ke Pandi jika hanya untuk latihan.
Setelah urusan administrasi selesai, kembali ke Virtualmin untuk membuat ruang bagi domain ini. Klik Create Virtual Server, dan isilah:
Domain name: reymanx.web.id Administration password: 1234
Izin Pembuatan Subdomain (update 21-07-2011)
Izinkan user membuat sub-domain-nya sendiri. Ini bisa dilakukan per user / domain, yaitu melalui menu Administration Options, Edit Owner Limits:
Maximum allowed virtual servers: unlimited
Untuk pembuatan database, user terlebih dahulu login ke Virtualmin melalui http://admin.reymanx.web.id. Selanjutnya masuk ke menu Edit Databases. User hanya bisa membuat database melalui menu ini. Dengan kata lain ia tidak dapat melakukannya melalui perintah CREATE DATABASE.
PhpPgAdmin (update 21-07-2011)
Kenyamanan lain yang cukup penting adalah Database Browser. Pasang paketnya:
$ sudo apt-get install phppgadmin
Lalu buatlah subdomain db di domain hosting Anda, contoh: db.sabilawebhost.com. Nantinya http://db.sabilawebhost.com akan di-redirect ke https://db.sabilahost.com untuk menghindari penyadapan, dan akhirnya menampilkan halaman PhpPgAdmin.
Sekarang ssh ke server, edit /etc/apache2/sites-available/db.sabilawebhost.com.conf:
<VirtualHost 202.59.201.67:80> ... Redirect / https://db.sabilahost.com DocumentRoot ... </VirtualHost>
Lalu buat symlink-nya:
# cd /home/sabilawebhost/domains/db.sabilawebhost.com # rm -rf public_html # ln -s /usr/share/phppgadmin public_html
Pastikan setelah user login di PhpPgAdmin database yang tampil hanya miliknya. Edit /etc/phppgadmin/config.inc.php:
$conf['owned_only'] = true;
Jangan lupa beritahukan user Anda mengenai url Database Browser ini.
Upload
Bila domain sudah aktif, Anda bisa memberi instruksi ke pelanggan untuk mengirim file-file PHP, HTML, dan dokumen lainnya untuk pembuatan situs ke direktori public_html, atau menurut contoh di atas ke /home/reymanx/public_html. Mereka bisa menggunakan WinSCP atau Konqueror (KDE). Di Konqueror mereka bisa ke URL sftp://reymanx.web.id, masukkan username dan password, lalu mulailah upload.
User juga bisa menghemat bandwidth dengan menggunakan ssh atau putty. Misalkan akan memasang Drupal 6, gunakan wget untuk mengunduhnya:
$ wget http://openstorage.gunadarma.ac.id/cms/drupal/drupal.org_Community-plumbing/ftp.drupal.org/files/projects/drupal-6.13.tar.gz
$ mv public_html public_html.orig $ tar xfz drupal-6.13.tar.gz $ mv drupal-6.13 public_html
$ psql Welcome to psql 8.3.7, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit reymanx=>
wget -O - -q http://reymanx.web.id/cron.php
Sedangkan untuk outgoing (SMTP):
Python (update 15-06-2011)
Mungkin user Anda ada yang ingin situsnya dibuat dengan bahasa Python. Misalnya menggunakan Django. Siapkanlah modul wsgi di Apache:
$ sudo apt-get install libapache2-mod-wsgi
Lalu di konfigurasi Apache bersangkutan - misalnya reymanx.web.id.conf - isi baris berikut ini:
<VirtualHost ....> .. WSGIScriptAlias / /home/reymanx/wsgi/wsgi_handler.py WSGIDaemonProcess reymanx.web.id user=reymanx group=reymanx threads=15 WSGIProcessGroup reymanx.web.id # User-uploaded media: MEDIA_URL = '/media/' Alias /media/ /home/reymanx/wsgi/media/ # django-staticfiles: STATIC_URL = '/static/' Alias /static/ /home/reymanx/wsgi/static/ </VirtualHost>
Restart Apache:
$ sudo /etc/init.d/apache2 restart
Sampai di sini tugas Anda sebagai admin sudah selesai.
User Space
Selanjutnya user reymanx bisa membuat direktorinya:
$ cd $ mkdir -p wsgi/media wsgi/static
Lalu buat /home/reymanx/wsgi/wsgi_handler.py:
def application(environ, start_response): status = '200 OK' output = 'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
Lalu cobalah di browser ke url http://reymanx.web.id, seharusnya tampil:
Hello World!
Django
Sebuah fungsi sederhana seperti di atas tentu saja merepotkan untuk membuat aplikasi web. User reymanx bisa melanjutkan instalasi Django sebagai web framework:
$ cd $ wget http://media.djangoproject.com/releases/1.3/Django-1.3.tar.gz
$ tar xfvz Django-1.3.tar.gz $ cp -r Django-1.3/django/ wsgi/ $ cp wsgi/django/bin/django-admin.py wsgi/
$ cd wsgi $ ./django-admin.py startproject public
import os import sys import time import signal import threading import atexit import Queue _interval = 1.0 _times = {} _files = [] _running = False _queue = Queue.Queue() _lock = threading.Lock() def _restart(path): _queue.put(True) prefix = 'monitor (pid=%d):' % os.getpid() print >> sys.stderr, '%s Change detected to \'%s\'.' % (prefix, path) print >> sys.stderr, '%s Triggering process restart.' % prefix os.kill(os.getpid(), signal.SIGINT) def _modified(path): try: # If path doesn't denote a file and were previously # tracking it, then it has been removed or the file type # has changed so force a restart. If not previously # tracking the file then we can ignore it as probably # pseudo reference such as when file extracted from a # collection of modules contained in a zip file. if not os.path.isfile(path): return path in _times # Check for when file last modified. mtime = os.stat(path).st_mtime if path not in _times: _times[path] = mtime # Force restart when modification time has changed, even # if time now older, as that could indicate older file # has been restored. if mtime != _times[path]: return True except: # If any exception occured, likely that file has been # been removed just before stat(), so force a restart. return True return False def _monitor(): while 1: # Check modification times on all files in sys.modules. for module in sys.modules.values(): if not hasattr(module, '__file__'): continue path = getattr(module, '__file__') if not path: continue if os.path.splitext(path)[1] in ['.pyc', '.pyo', '.pyd']: path = path[:-1] if _modified(path): return _restart(path) # Check modification times on files which have # specifically been registered for monitoring. for path in _files: if _modified(path): return _restart(path) # Go to sleep for specified interval. try: return _queue.get(timeout=_interval) except: pass _thread = threading.Thread(target=_monitor) _thread.setDaemon(True) def _exiting(): try: _queue.put(True) except: pass _thread.join() atexit.register(_exiting) def track(path): if not path in _files: _files.append(path) def start(interval=1.0): global _interval if interval < _interval: _interval = interval global _running _lock.acquire() if not _running: prefix = 'monitor (pid=%d):' % os.getpid() print >> sys.stderr, '%s Starting change monitor.' % prefix _running = True _thread.start() _lock.release()
Script ini berguna untuk memantau perubahan pada file. Jika ada file yang berubah maka monitor.py akan mengakhiri daemon Django. Sehingga saat diakses kembali oleh browser, Apache akan menghidupkan kembali daemon tersebut, dan - tentu saja - sudah menggunakan file terbaru.
Tanpa monitor.py ini, jika Anda mengubah salah satu file maka Apache harus di-reload. Selain merepotkan saat development, aktivitas reload Apache jelas bukan wilayahnya user reymanx.
import os, sys sys.stdout = sys.stderr sys.path.append(os.path.dirname(os.path.abspath(__file__))) os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler() import monitor monitor.start(interval=1.0)
$ ln -s public/settings.py $ ln -s . wsgi
$ cd $ rm -rf Django-1.3 Django-1.3.tar.gz
Lalu di browser kembali ke url http://reymanx.web.id, seharusnya kini tampil:
It worked!
Jika di browser tampil error yang kurang informatif, silahkan pesan yang lebih lengkap di /home/reymanx/logs/error_log:
$ tail /home/reymanx/logs/error_log
Mezzanine
Instalasi Django di atas baru sebatas sebagai web framework. Masih banyak pekerjaan yang harus dilakukan untuk menjadi sebuah CMS (Content Management System). Agar lebih mudah, sebaiknya kita pasang salah satu CMS yang berbasis Django, yaitu Mezzanine.
Supaya bersih, backup direktori wsgi menjadi wsgi.1:
$ cd $ mv wsgi wsgi.1
Salin lagi direktori dan script yang masih diperlukan:
$ mkdir wsgi $ cd wsgi.1 $ cp -r django monitor.py wsgi_handler.py ../wsgi/
Unduh Mezzanine dari Bitbucket:
$ cd $ hg clone https://bitbucket.org/stephenmcd/mezzanine $ cp -r mezzanine/mezzanine wsgi/
Buat project:
$ cd wsgi $ cp mezzanine/bin/mezzanine_project.py . $ python mezzanine_project.py public $ mv public/* . $ rmdir public
Edit local_settings.py pada bagian DATABASES (sesuaikan):
DATABASES = { "default": { "ENGINE": "postgresql_psycopg2", "NAME": "reymanx", "USER": "reymanx", "PASSWORD": "1234", "HOST": "", "PORT": "", } }
$ python manage.py syncdb
You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'reymanx'): admin E-mail address: info@reymanx.web.id Password: Password (again): Superuser created successfully.
Lalu ada lagi pertanyaan untuk membuat content awal, jawab lagi dengan yes:
Would you like to install some initial content? Eg: About page, Blog, Contact form. (yes/no): yes Creating initial content (About page, Blog, Contact form). Installed 16 object(s) from 2 fixture(s) Installing custom SQL ... Installing indexes ... No fixtures found.
Pembuatan tabel selesai. Berikutnya menyesuaikan /media dan /static sebagaimana /etc/apache2/sites-available/reymanx.web.id.conf:
$ mv site_media media $ mkdir static $ cd static $ ln -s ../django/contrib/admin/media admin $ cd ..
Ubah settings.py pada ADMIN_MEDIA_PREFIX:
ADMIN_MEDIA_PREFIX = "/static/admin/"
MEDIA_URL = "/media"
Buat symlink wsgi ke dirinya sendiri, untuk menghindari error:
$ ln -s . wsgi
Selesai. Silahkan coba di browser ke http://reymanx.web.id dan http://reymanx.web.id/admin.
Update 13-07-2011
Oh iya, Mezzanine tidak lengkap tanpa Grappelli dan Filebrowser. Silahkan ikuti petunjuk pemasangannya.
Selamat mencoba.
Referensi:
Lampiran | Ukuran |
---|---|
monitor.py_.gz | 1.08 KB |
wsgi_handler.py_.gz | 233 bita |
Komentar
boleh minta tolong ajarin
boleh minta tolong ajarin pake virtualmin ga? :)
pliss nid help
Masalahnya apa ya ?
Masalahnya apa ya ?
usernamenya itu harus sama
usernamenya itu harus sama dengan web yg dibuat ya?klo nanti user mau ganti alamat webnya gmna?
Defaultnya memang sama, tapi
Defaultnya memang sama, tapi bisa diubah saat pembuatan. Satu user bisa punya beberapa alamat web.
mas, saya ngecek di
mas, saya ngecek di virtualmin demo pagenya, pas di preview website kok dia ga muncullin forbidden ya?gmn caranya?
mas, klo mau install
mas, klo mau install virtualmin pake file install.sh tapi melewati proxy gmna caranya ya?
soaolnya pas mau coba diinstal keluar pesan:
Coba buat file
Coba buat file /etc/apt/apt.conf.d/70proxy, isinya:
atau kalau wajib login:
Sesuaikan host, port, user, dan pass.
Lalu jalankan lagi install.sh
Biasanya harus ada index.html
Biasanya harus ada index.html atau index.php di direktori public_html.
klo mau nyetting supaya
klo mau nyetting supaya setiap domain baru punya kuota 75MB gmn?
Setahu saya quota itu melekat
Setahu saya quota itu melekat di user bukan domain. Memang sih umumnya 1 domain 1 user. Mengenai perubahan default quota, sayangnya saya juga belum pernah menelusuri. Mungkin petunjuk ini bisa membantu:
atau
Kalau terlalu banyak persempit di direktori /etc:
Mudah-mudahan ketemu.