Arkadaşlar,

uzunca bir süredir linux tabanlı bir developer yüklemesi nasıl yapılır onun üzerine araştırmalar yaptım ve bulduklarımı not aldım. Detaylı bir belge oldu ve bunu burada sizlerle paylaşmak istiyorum.

KULLANILAN TEKNOLOJİLER:

  • Ubuntu 12.04 LTS Server Sürümü
  • Zend Server
  • Apache Http Server
  • PHP
  • MySQL
  • Ruby
  • Java
  • Node.JS, Npm
  • Git
  • Memcached
  • Samba

NOT:
$ ile başlayan satırlar komut satırlarıdır ve console dan çalışırlar.

soruldu: 09 Haz '13, 04:53

O%C4%9Fuz%20%C3%87elikdemir's gravatar image

Oğuz Çelikdemir
2.0k52234
cevap kabul oranı: 13%

değiştirildi: 09 Haz '13, 09:42

Ubuntu Server üzerinde bir Developer ortamı mı kuruyorsunuz? Neden masaüstü versiyonunu kullanmıyorsunuz? Bu arada 14.04 LTS versiyonunu tavsiye ederim.

(14 Haz '14, 12:39) Dkyc Dkyc's gravatar image

UBUNTU TEMEL YÜKLEME DİREKTİFLERİ
Ubuntuyu normal yöntemlerle install ettikten sonra aşağıdaki direktifleri takip edin. Ubuntu yüklemesi yaparken, size hangi paketleri yüklemek istediğinizi sorar, bu bölümde sadece Open SSH seçin, diğerlerini boş bırakın. Geriye kalan uygulamaları manuel olarak yükleyeceğiz. Sisteme yükleme yaparken belirtmiş olduğunuz kullanıcı ile login olun ve aşağıdaki direktifleri takip edin.

  1. Root kullanıcısını aktif etme
    $ sudo su
    $ sudo passwd su // root kullanıcısı için bir şifre belirleyin

  2. Network ayarlarını değiştirme, DNS sunucularını belirleme :
    $ vim /etc/network/interfaces // editör olarak vim seçtim fakat nano da kullanabilirsiniz.

    Açılan dosyada aşağıdaki değişiklikleri set edin. DHCP de kullanabilirsiniz fakat ilerleyen safhalarda IP ile işimiz olacağı için devamlı IP adresim neydi diye bakmak yerine kendi belirleyeceğimiz IP adresini kullanacağız. Ubuntu, 12 sürümünden itibaren otomatik DNS resulotion yapmıyor dolayısıyla DNS serverlerimizi manuel belirlemek zorundayız. Ben Google DNS tercih ettim.

    iface eth0 inet static
    address 192.168.0.10 // bu tercih ettiğiniz IP adresi
    netmask 255.255.255.0
    network 192.168.0.0
    broadcast 192.168.0.255
    gateway 192.168.0.1
    dns-nameservers 8.8.4.4 8.8.8.8

    $ /etc/init.d/networking restart // ayarlarımızı aktif etmek için network'ü restart ediyoruz

Kullanmak istediğimiz hostname i set ediyoruz. Burada herhangi bir domain olabilir, tercih size kalıyor.
$ vim/etc/hosts
192.168.0.10 developer.web.tr developer
$ echo developer.web.tr > /etc/hostname
$ /etc/init.d/hostname restart
$ hostname // çıktısı developer.web.tr olmalı
$ hostname -f // yine çıktı developer.web.tr olmalı

permanent link

cevaplandı: 09 Haz '13, 05:15

O%C4%9Fuz%20%C3%87elikdemir's gravatar image

Oğuz Çelikdemir
2.0k52234
cevap kabul oranı: 13%

değiştirildi: 09 Haz '13, 23:59

3
  1. SSH Portunu Değiştirme ( standart port herkesçe bilinen porttur o nedenle değiştirmek istedim )
    $ vim /etc/ssh/sshd_config
    Port 19722

  2. Apparmor servisini kaldırma

    $ /etc/init.d/apparmor stop
    $ update-rc.d –f apparmor remove
    $ aptitude remove apparmor apparmor-utils

  3. Kullandığımız shell' i değiştiriyoruz

    $ dpkg-reconfigure dash // karşınıza bir ekran çıkar, burda tab tuşu ile NO seçin

  4. Ubuntu repositoryleri ( uygulama yükleme adresleri ) güncelleyip yüklüyoruz.

    $ aptitude clean // önce repository temizliği
    $ aptitude purge // daha önce yüklenen repositoryleri kaldırıyoruz
    $ aptitude update // güncel repositoryleri alıyoruz
    $ aptitude full-upgrade // yeni yükleme olduğu için full-upgrade yapıyoruz, üzerinde uygulama geliştirmiş iseniz full-upgrade bazı uygulamalarınız da versiyon farklılığı yaratabilir, dikkatli olun!

  5. Ben vim-nox u seçtim editör olarak ki biraz daha fazla özelliğe sahip

    $ aptitude install vim-nox

  6. Sistem saatimizi senkronize ediyoruz. Dilerseniz kullandığınız sanallaştırma uygulamasının özelliklerinden sistemin saatini kullan diyebilirsiniz.

    $ aptitude install ntp ntpdate
    $ /etc/init.d/ntp stop
    $ ntpdate tr.pool.ntp.org
    $ /etc/init.d/ntp start
    $ vim /etc/ntp.conf // aşağıdaki değişikleri yapın
    server 0.tr.pool.ntp.org
    server 1.tr.pool.ntp.org
    server 2.tr.pool.ntp.org
    server 3.tr.pool.ntp.org

(09 Haz '13, 05:36) Oğuz Çelikdemir O%C4%9Fuz%20%C3%87elikdemir's gravatar image
3
  1. Bazı uygulamalar, temel derleme ve paket araçlarına ihtiyaç duyarlar. Ubuntu da bunlar için hazırlanmış bir uygulama da vardır ve build-essential olarak geçer.

    $ aptitude install build-essential autoconf automake zip unzip libtool safe-rm geoip-bin libgeoip1 libgeoip-dev libcurl4-openssl-dev imageMagick libMagickWand-dev iftop htop nmap netpipe-tcp libice-dev libsm-dev libx11-dev libxext-dev libxp-dev libxt-dev libxtst-dev libaio-dev

    Sırasıyla bu uygualamalar:
    ~ safe-rm bazı dizinleri kazara silmenizi engellemek için kullanılır
    ~ geoip-bin, libgeoipl, libgeoip-dev yer bildirimi uygulamalarınız için kullanılan kütüphanedir
    ~ libcurl-openssl-dev hepinizin bildiği curl uygulamasının kütüphanesidir
    ~ imageMagick görsel dosyalar üzerinde işlem yapabilmek için kullanılan kütüphane
    ~ htop linux' un Task Manager uygulamasıdır
    ~ iftop kim ne kadar network kaynağı kullanıyor bunu görüntüleyen uygulama
    ~ nmap Networkünüze dair bilgiler sunar - ki içinde portlarınızın durumunu da gösterir
    ~ libaio-dev Linux asenkron I/O işlemleri kütüphanesi. Bir I/O işlemi gerçekleşirken kuyruktaki işlemleri beklemeye alır, dolayısıyla gecikmelere neden olur, özellikle MySQL için. Bunu giderebilmek için bu kütüphaneden faydalanıyoruz.

  2. Lünux' un partition formatları EXT3 ve EXT4 tür, Bizde EXT4 partition üzerinde birkaç değişiklik yaparak performans kazanmaya çalışıyoruz. Öncelikle, aşağıdaki komutu girdiğinizde karşınıza çıkan ekradan hangi partition' un root olduğunu bulmanız gerekir. Root partition "/" sembolü ile gösterilir bu satırı bularak aşağıdaki değerleri girin.

    $ vim/etc/fstab
    errors=remount-ro,noatime,nodiratime,data=writeback,barrier=0,commit=30,nouser_xattr

    $ df –h // bu komutla hangi partition' un root yani "/" olduğunu buluyoruz.

    tune2fs –o journal_data_writeback /dev/mapper/developer-root // buradaki "/dev/mapper/developer-root" yukarıdaki komutun çıktısından bulduğumuz değer

    $ vim /etc/default/grub // grub bootloader uygulamasına hangi tekniği kullanacağımızı belirtiyoruz. Dikkat, sakın bu işlemi uygulamadan restart işlemi yapmayın. Aşağıdaki satırı bulun ve gerekli değişikliği yapın

    GRUB_CMDLINE_LINUX = "rootflags=data=writeback"

    $ update-grub // güncelleştirmeleri kabul edip yeni grub dosyası oluşturuyoruz.

(09 Haz '13, 05:59) Oğuz Çelikdemir O%C4%9Fuz%20%C3%87elikdemir's gravatar image
3

REPOSITORY İŞLEMLERİ

Ubuntu için PPA dediğimiz bazı ek repositorylere ihtiyacımız var. Bu repositoryler yardımıyla, normal Ubuntu repositorylerinde olmayan uygulamaları kuracağız.

  1. Java ve Zend Repositoryleri
    $ aptitude install python-software-properties software-properties-common
    $ vim /etc/apt/sources.list.d/launchpad.list // dosyaya aşağıdaki satırları ekleyip kaydedin
    deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main
    deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main
    $ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
    Burada kullandığımız EEA14886 webupd8team isimli repository'nin key' i, problem oluşturursa ilgili keyi bulup güncelleyin.

    Zend Server için repository bilgileri. Neden Zend diye soran arkadaşlar olursa, belgenin adı üzerinde, bir developer makinası kurmak ( belki biraz daha geliştirerek bir VPS sunucu da olabilir ) dolayısıyla, low level işlemlerle uğraşmamamız gerekir. Yani, istesek Apache server' ıda, PHP' yide derleyip kullanabilirdik. Birde, derli toplu bir arayüz her zaman tercihim olmuştur, boşyere vakit kaybederek PHP' deki bir ayarı değiştirmek için dakikalarımı vermek istemedim.

    $ vim /etc/apt/sources.list.d/zendserver.list
    deb http://repos.zend.com/zend-server/deb server non-free
    deb http://repos.zend.com/zend-server/5.6.0_ubuntu1204/deb server non-free
    $ wget http://repos.zend.com/zend.key -O- |apt-key add -

  2. MySQL Server Kurulumu

    $ aptitude install mysql-server mysql-client mysql-common
    Size MySQL bağlantısı için hangi şifreyi kullanacağınızı soracaktır.

  3. Apache Kurulumu

    $ aptitude install apache2 apache2-mpm-prefork apache2-utils apache2.2-common apache2.2-bin
    Kullandığımız Zend Server ( PHP ) thread safe olmadığı için mpm-prefork tercih etmek zorundayız

    $ a2dismod authz_user authz_groupfile auth_basic authn_file authz_default authz_user status cgi autoindex info version
    Kullanmadığımız Apache modüllerini kaldırıyoruz çünki Apache' ye yük bindiriyor

    $ a2enmod alias authz_host deflate dir env expires filter headers mime negotiation proxy proxy_http reqtimeout rewrite setenvif ssl unique_id vhost_alias
    Kullanacağımız modülleri ise aktif ediyoruz. proxy modüllerini, Java tabanlı Tomcat sunucusu kullandığımızda, port kargaşasını ortadan kaldırmak için aktif ediyoruz. Böylelikle, localhost:8090 gibi gereksiz kargaşaların içine girmiyoruz. Talepleri Apache Httpd karşılıyor ve yönlendiriyor.

  4. Zend Server Kurulumu

    $ aptitude install zend-server-ce-php-5.3 php-5.3-extra-extensions-zend-server php-5.3-loader-zend-server zend-server-framework-extras php-5.3-apc-zend-server
    Ben PHP 5.3 tercih ettim fakat trait falan kullanmak istiyorum derseniz o zaman PHP 5.4 sürümünü kurmanız gerekir. Kurulum için Zend Server belgesine başvurun.

    Aşağıdaki satırı /usr/local/zend/share/ZendFramework/bin/zf.sh dosyasına
    if test "@php_bin@" != '@'php_bin'@'; then satırından hemen önce gelecek şekilde düzenleyin.
    $ vim /usr/local/zend/share/ZendFramework/bin/zf.sh
    LANG=C
    export LANG

    LD_LIBRARY_PATH ortam değişkenini ( environment variable ) set edin.
    $ echo "/usr/local/zend/lib" | tee /etc/ld.so.conf.d/zend.conf
    $ ldconfig –v
    $ ldconfig –p
    $ /etc/init.d/zend-server restart

  5. Java Kurulumu ( JDK )

    $ vim /etc/wgetrc
    wgetrc dosyasında bir değişiklik yapmamız gerekiyor çünki anlayamadığım bir nedenden ötürü Oracle yüklemesinde key hatası veriyor, dolayısıyla geçici olarak key kontrolünü kapatıyoruz.
    check_certificate = off

    $ aptitude install oracle-java7-installer
    $ update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/java-7-oracle/bin/java" 1

    Aşağıdaki komut size hangi Java sürümünü seçmek istiyorsunuz diye soracaktır, ben JDK olanı seçiyorum, yani 2 giriyorum. Sizde farklı olabilir, tercihinizi ona göre yapabilirsiniz.
    $ update-alternatives --config java

    Java için ortam değişkeni değerlerimizi giriyoruz. Bazı uygulamalarda region ve dil seçiminden ötürü hata ile karşılaştım dolayısıyla US ve en tercih ediyorum.
    $ vim /etc/environment
    PATH=”/usr/lib/jvm/java-7-oracle/bin:/usr/lib/jvm/java-7-oracle/jre/bin”
    JAVA_HOME=”/usr/lib/jvm/java-7-oracle”
    JAVA_OPTS=”-Duser.language=en -Duser.region=US”

  6. Ruby Yüklemesi

    $ aptitude install ruby1.9.3 rubygems libopenssl-ruby libdbd-mysql-ruby libmysql-ruby ruby-libxml libxslt-dev

    Aşağıdaki komutlar ile hangi sürümleri kullanacağımızı belirtiyoruz, size uygun olan sürümleri seçiniz.
    $ update-alternatives --config ruby
    $ update-alternatives --config gem

  7. Node.JS Kurulumu

    $ add-apt-repository ppa:chris-lea/node.js
    $ aptitude update
    $ aptitude install nodejs npm

  8. Git Sürüm Kontrol Uygulaması

    $ aptitude install git-core git-doc git-svn git-cvs

(09 Haz '13, 09:24) Oğuz Çelikdemir O%C4%9Fuz%20%C3%87elikdemir's gravatar image

@oguz-celikdemir oracle-java7-installer paketi ubuntu icinde yok extra bir repository mu ekliyorsun?

(10 Haz '13, 03:12) CemIkta ♦ CemIkta's gravatar image

evet dostum, yukarda dikkat ettiysen webupd8team isminde bir repository ekledim. Bu repository de belirtmiş olduğun oracle yüklemesi yer alıyor.

(10 Haz '13, 05:07) Oğuz Çelikdemir O%C4%9Fuz%20%C3%87elikdemir's gravatar image

SUNUCU DİL BİLGİLERİ

Ubuntu, yükleme dilini ingilizce seçtiğiniz de ( ben Türkçe tercümeleri anlamıyorum arkadaşlar ve bugüne kadar hiç Türkçe işletim sistemi veya program ile çalışmadım), yerel dil ayarlarını düzgün set etmiyor. Dolayısıyla, dil tercihlerimizi değiştirmemiz gerekiyor. Bunun için;

$ locale-gen tr_TR.UTF-8
$ locale-gen en_US.UTF-8
$ aptitude install localepurge
$ vim /etc/default/locale
    LANG="tr_TR.utf8"
    LANGUAGE="en_US.utf8"
    LC_NUMERIC="tr_TR.utf8"
    LC_TIME"tr_TR.utf8"
    LC_MONETARY="tr_TR.utf8"
    LC_PAPER="tr_TR.utf8"
    LC_NAME="tr_TR.utf8"
    LC_ADDRESS="tr_TR.utf8"
    LC_TELEPHONE="tr_TR.utf8"
    LC_MEASUREMENT="tr_TR.utf8"
    LC_ALL=
$ localedef --list-archive
$ locale-gen --purge tr_TR.utf8 en_US.utf8

değişikliklerini yapıyoruz. Yukarıda yer alan son komut satırı, belirttiğiniz dil seçimlerinin haricindeki tüm dil setlerini siler, zaten ispanyolca, almanca gibi dil setlerine de ihtiyacımız yok.

SAFE-RM AYARLARINI YAPMAK
safe-rm, güvenli silme uygulamasıdır. Belirteceğimiz uygulama ve dizinleri silmeye teşebbüs ettiğimizde bize uyarı verecektir ( kazara başımızı ağrıtmamak için ). Kullanımıda çok basittir. Koruma altına almak istediğimiz dizin veya uygulamayı echo komutu ile bildiriyoruz. Dilerseniz vim editörü ile bu dosyayı düzenleyebilirsiniz de.

$ echo "usr/bin" >> /etc/safe-rm.conf

KULLANMADIĞIMIZ KERNELLERİ SİLİYORUZ
Upgrade işleminden sonra, bir önceki kernel sistemde bırakılır. Dolayısıyla gereksiz alan kaplar, bundan kurtulmak için;

$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\\(.*\\)-\\([^0-9]\\+\\)/\\1/")"'/d;s/^[^ ]* [^ ]* \\([^ ]*\\).*/\\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

komutunu giriyoruz.

SİSTEM TUNING
sysctl dosyasında bazı değişiklikler yaparak sistem performansı kazanmaya, kullanmayacağımız özellikleri kaldırmaya ve güvenlik elde etmeye çalışıyoruz. Örneğin, ipv6 gibi...

$ vim /etc/sysctl.conf
    vm.swappiness = 20
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    net.ipv6.conf.lo.disable_ipv6 = 1
    net.ipv4.icmp_echo_ignore_broadcasts = 1
    net.ipv4.icmp_ignore_bogus_error_responses = 1
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_max_syn_backlog = 2048
    net.ipv4.tcp_synack_retries = 2
    net.ipv4.conf.all.log_martians = 1
    net.ipv4.conf.default.log_martians = 1
    net.ipv4.conf.all.accept_source_route = 0
    net.ipv4.conf.default.accept_source_route = 0
    net.ipv4.conf.all.forwarding = 0
    net.ipv4.conf.all.rp_filter = 1
    net.ipv4.conf.default.rp_filter = 1
    net.ipv4.conf.eth0.rp_filter = 1
    net.ipv4.conf.default.accept_redirects = 0
    net.ipv4.conf.all.secure_redirects = 0
    net.ipv4.conf.default.secure_redirects = 0
    net.ipv4.conf.eth0.accept_source_route = 0
    net.ipv4.conf.default.accept_source_route = 0
    net.ipv4.ip_forward = 0
    net.ipv4.conf.default.send_redirects = 0
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.lo.accept_redirects = 0
    net.ipv4.conf.eth0.accept_redirects = 0
    net.ipv4.conf.default.accept_redirects = 0
    net.inet.tcp.blackhole = 2
    net.inet.udp.blackhole = 1
    net.core.somaxconn = 1024
    kernel.sysrq = 0
    kernel.core_uses_pid = 1
    net.ipv4.icmp_echo_ignore_broadcasts = 1
    kernel.randomize_va_space = 1
    net.ipv4.tcp_fin_timeout = 15
    net.ipv4.tcp_keepalive_time = 1800

$ sysctl –p

INTRUSION DETECTION SYSTEM ( Sistem Tecavüzlerini Yakalama )
Temiz bir yükleme yapıp gerekli ayarları yaptıktan sonra AIDE isimli uygulama ile alacağınız bir sistem kontrol yedeği sisteminize karşı olan tecavüzlerden sizi haberdar edebilir. Dikkat etmeniz gereken, alacağınız bu yedeği sistem üzerinde tutmamanız. Güvenli bir yere taşıyın ve orada koruma altına alın.

Ne zaman birşeylerden şüphelendiniz, bu dosya aracılığı ile yapacağınız kontrol de, sisteminizde o güne kadar olan tüm değişiklikleri görüntüleyebilirsiniz.

Bu arada, aklınızda bulunsun. Çok fazla dosya değişikliği olan dizinlerde, örneğin www dizininde, bu işlemi uygulamanız sizi biraz zorlayabilir. O nedenle bu dizini istisna olarak sistem kontrolüne eklememeniz gerekir.

$ aptitude install aide
$ vim /etc/aide/aide.conf
    Rule = p+i+u+g+n+s+md5
      /etc p+i+u+g
      /sbin Rule
      /bin Rule
      /boot Rule
      /sbin Rule
      /etc/apache2/conf Rule
      /etc/apache2/conf.d Rule
      /usr/bin Rule
      /usr/local Rule
      !/usr/local/zend/.*
      !/etc/lvm/cache/.*
      !/run/udev/watch/.*
      !/var/spool/.*
      !/var/log/.*
      !/var/lock/.*
      !/var/run/.*
      !/var/www/.*
      !/tmp/.*

Ne yaptık!
Rule satırı ile kullanmak istediğimiz kuralları belirledik. Belirttiğimiz dizinler bu kurallar ile koruma altına alınır. Sırasıyla:

p: Permission ( yetkiler )  
i: inode  
n: number of links ( symlinkler )  
u: user ( kullanıcı )  
g: group ( kullanıcı grubu )  
s: size ( boyut )  
b: block count  
m: mtime ( değiştirilme tarihi )  
a: atime ( erişim tarihi )  
c: ctime ( oluşturulma tarihi )  
md5: md5 checksum ( md5 algoritması ile kontrol )

Yani, bu rule' lar ile neleri nasıl saklamak istediğimizi belirtiyoruz. Başında ! olan satırlar, bu dizinleri dikkate alma demektir.

Sırada, AIDE veritabanımızı oluşturmak var.

$ chmod 600 /etc/aide/aide.conf
$ aideinit
$ cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
$ aide -c /etc/aide/aide.conf –check
$ scp /var/lib/aide/aide.db* /usr/bin/aide /etc/aide/aide.conf /etc/aide/aide.conf.d/* user@offsite.server.com:/path/to/dir

Son satır ile oluşturduğumuz AIDE veritabanını güvenli bir ortama taşıyoruz. Tavsiyem, bu dosyayı aynı makina üzerinde tutmamanız, USB belleğe alıp saklayabilirsiniz. Diğer türlü aynı makina üzerinde olursa, sistem sızmalarında işi bilen kişiler bu dosyayı sizin anlayamayacağınız şekle dönüştürebilir!

Sistemi AIDE ile kontrol etmek
Bir müddet sonra, sistemde neler olup bitiyor öğrenmek istiyoruz. Bunun için aşağıdaki adımları takip ediyoruz. Tabi güvenli alana taşıdığımız dosyalara ihtiyacımız var. Bunları gerekli dizine kopyalıyoruz.

$ aideinit
$ cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
$ aide -c /etc/aide/aide.conf –check

Bir rapor oluşturulacaktır, bu raporda nelerin olup bittiği yer almakta. Kontrol edip neler olup bittiğini anlayabilirsiniz.

(15 Haz '13, 09:08) Oğuz Çelikdemir O%C4%9Fuz%20%C3%87elikdemir's gravatar image

Yukarıda i: inode kısmına açıklama eklemeyi unutmuşum. inode linux dosya sisteminde, dosyanın, ismi hariç tüm bilgilerinin tutulduğu kısımdır.

(26 Haz '13, 08:22) Oğuz Çelikdemir O%C4%9Fuz%20%C3%87elikdemir's gravatar image
7 yorumdan 5 tanesi gösteriliyor hepsini göster
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×42
×29
×3

Soruldu: 09 Haz '13, 04:53

Görüntüleme: 1,738 kez

Son güncelleme: 14 Haz '14, 12:39

powered by BitNami OSQA