Resmi PostgreSQL Docker görüntüsünün yapılandırma dosyası nasıl özelleştirilir?


103

Yapılandırmasını özelleştirmeye çalışırken resmi Postgres Docker görüntüsünü kullanıyorum . Bu amaçla, seddeğiştirmek max_connectionsiçin komutu kullanıyorum, örneğin:

sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf

Bu yapılandırmayı uygulamak için iki yöntem denedim. Birincisi, komutları bir betiğe eklemek ve onu "/docker-entrypoint-initdb.d" init klasörüne kopyalamaktır. İkinci yöntem ise onları Dockerfile dosyamda "RUN" komutuyla çalıştırmaktır (bu yöntem, "/ etc / postgres / ..." yapılandırma dosyasına farklı bir yol içeren resmi olmayan bir Postgresql görüntüsünde iyi çalıştı). Her iki durumda da yapılandırma dosyası eksik olduğu için değişiklikler başarısız oluyor (sanırım henüz oluşturulmadı).

Yapılandırmayı nasıl değiştirmeliyim?

Düzenleme 1:

Görüntüyü oluşturmak için kullanılan Dockerfile şu şekildedir:

# Database (http://www.cs3c.ma/)

FROM postgres:9.4
MAINTAINER Sabbane <contact@cs3c.ma>

ENV TERM=xterm

RUN apt-get update
RUN apt-get install -y nano

ADD scripts /scripts
# ADD scripts/setup-my-schema.sh /docker-entrypoint-initdb.d/

# Allow connections from anywhere.
RUN sed -i -e"s/^#listen_addresses =.*$/listen_addresses = '*'/" /var/lib/postgresql/data/postgresql.conf
RUN echo "host    all    all    0.0.0.0/0    md5" >> /var/lib/postgresql/data/pg_hba.conf

# Configure logs
RUN sed -i -e"s/^#logging_collector = off.*$/logging_collector = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_directory = 'pg_log'.*$/log_directory = '\/var\/log\/postgresql'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_filename = 'postgresql-\%Y-\%m-\%d_\%H\%M\%S.log'.*$/log_filename = 'postgresql_\%a.log'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_file_mode = 0600.*$/log_file_mode = 0644/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_truncate_on_rotation = off.*$/log_truncate_on_rotation = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_rotation_age = 1d.*$/log_rotation_age = 1d/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_min_duration_statement = -1.*$/log_min_duration_statement = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_checkpoints = off.*$/log_checkpoints = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_connections = off.*$/log_connections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_disconnections = off.*$/log_disconnections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^log_line_prefix = '\%t \[\%p-\%l\] \%q\%u@\%d '.*$/log_line_prefix = '\%t \[\%p\]: \[\%l-1\] user=\%u,db=\%d'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_lock_waits = off.*$/log_lock_waits = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_temp_files = -1.*$/log_temp_files = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#statement_timeout = 0.*$/statement_timeout = 1800000        # in milliseconds, 0 is disabled (current 30min)/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^lc_messages = 'en_US.UTF-8'.*$/lc_messages = 'C'/" /var/lib/postgresql/data/postgresql.conf

# Performance Tuning
RUN sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^shared_buffers =.*$/shared_buffers = 16GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#effective_cache_size = 128MB.*$/effective_cache_size = 48GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#work_mem = 1MB.*$/work_mem = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#maintenance_work_mem = 16MB.*$/maintenance_work_mem = 2GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_segments = .*$/checkpoint_segments = 32/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_completion_target = 0.5.*$/checkpoint_completion_target = 0.7/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#wal_buffers =.*$/wal_buffers = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#default_statistics_target = 100.*$/default_statistics_target = 100/" /var/lib/postgresql/data/postgresql.conf


VOLUME ["/var/lib/postgresql/data", "/var/log/postgresql"]

CMD ["postgres"]

Bu Dockerfile ile derleme işlemi hatayı gösterir: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory


1
bir yöntem başlatmak, resmi görüntüyü kullanmaktır ile bağlantı içine docker exec -it container_id bashsonra modifikasyonlar, daha sonra do docker commit container_id myuser/myimage_myPostegresql:myversiondoc bkz docs.docker.com/reference/commandline/cli/#commit
user2915097

2
Docker paradigmasının avantajlarından birinin tüm derleme sürecini otomatikleştirmek olduğunu düşünüyorum. Başka bir görüntüde belirtildiği gibi paintedfox/postgresql, yapılandırmayı doğrudan Dockerfile içinde değiştirmek mümkündür. Bunun resmi resimle de mümkün olması gerektiğini düşünüyorum.
Sakr

sed yöntemi çalışmalı, Dcokerfile'ınızı veya tam bir çoğaltıcıyı gönderebilir misiniz?
user2915097

Yanıtlar:


55

postgres:9.4Eğer miras ettik görüntü bir hacme beyan /var/lib/postgresql/data. Bu, esas olarak, görüntünüzdeki o yola herhangi bir dosya kopyalayamayacağınız anlamına gelir; değişiklikler atılacaktır.

Birkaç seçeneğiniz var:

  • Sadece kendi yapılandırma dosyalarınızı çalışma zamanında bir birim olarak ekleyebilirsiniz docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf .... Bununla birlikte, bunun mevcut birimle nasıl etkileşime gireceğinden tam olarak emin değilim.

  • Dosyayı, kapsayıcı başlatıldığında kopyalayabilirsiniz. Bunu yapmak için, dosyanızı birimin altında olmayan bir konumdaki yapıya kopyalayın, ardından giriş noktasından veya cmd'den dosyayı doğru konuma kopyalayacak ve postgres'i başlatacak bir komut dosyası çağırın.

  • Projeyi Postgres resmi görüntüsünün arkasına kopyalayın ve VOLUME bildirilmeden önce kendi yapılandırma dosyanızı eklemek için Dockerfile'ı düzenleyin (VOLUME komutu çalışma zamanında otomatik olarak kopyalanmadan önce eklenen her şey).

  • Docker-compose dosyasındaki komut seçeneğindeki tüm yapılandırma değişikliklerini iletin

sevmek:

services:
  postgres:
    ...  
    command:
      - "postgres"
      - "-c"
      - "max_connections=1000"
      - "-c"
      - "shared_buffers=3GB"
      - "-c"
      ...

3
İşte buydu, değişiklikler Dockerfile içinde olmamalı. Onları bir komut dosyasına taşıdım ve giriş noktasından çağırdım ve şimdi iyi çalıştı. Cevap için teşekkür ederim.
Sakr

5
Komut dosyasını "/docker-entrypoint-initdb.d/" init klasörüne kopyaladım ve bu sefer de iyi çalıştı. Bu garip ama görünen o ki çoğu görüntüde yaptığım gibi Dockerfile ile görüntüyü ayarlamaya o kadar odaklanmıştım ki, init betiğini kullanarak ilk denemelerimde bir şeyi kaçırdım.
Sakr

"Bu, esasen görüntünüzdeki o yola herhangi bir dosya kopyalayamayacağınız anlamına gelir; değişiklikler atılır." Neden böyle olduğunu açıklar mısınız lütfen?
isco

@isco resmi belgelerde ciltlere bakın. Temelde birimler görüntüde değil ana bilgisayarda depolanır, bu nedenle veriler görüntüde değil ana bilgisayarda saklanır. Verileri saklamak için kabı aynı birim eklenmiş olarak başlatmanız gerekir.
Adrian Mouat

/var/lib/postgres/data/pg_hba.conf dosyasında değiştiriyorum, sadece bağlantı kabul etmek için tüm 192.168.0.0/0 md5'i barındırıyorum ve tüm md5'i yorum ana bilgisayarı (varsayılandır). Ama efekti değiştirme
Lucas Resende

83

Docker Compose ile

Docker Compose ile çalışırken, Postgres'i yapılandırmak command: postgres -c option=valueiçin kullanabilirsiniz docker-compose.yml.

Örneğin, bu Postgres'in bir dosyaya günlük kaydını yapar:

command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs

Vojtech Vitek'in cevabını uyarlayarak kullanabilirsiniz

command: postgres -c config_file=/etc/postgresql.conf

Postgres'in kullanacağı yapılandırma dosyasını değiştirmek için. Özel yapılandırma dosyanızı bir birimle bağlarsınız:

volumes:
   - ./customPostgresql.conf:/etc/postgresql.conf

İşte docker-compose.ymlPostgres'in nasıl yapılandırılacağını gösteren uygulamam:

# Start the app using docker-compose pull && docker-compose up to make sure you have the latest image
version: '2.1'
services:
  myApp:
    image: registry.gitlab.com/bullbytes/myApp:latest
    networks:
      - myApp-network
  db:
     image: postgres:9.6.1
     # Make Postgres log to a file.
     # More on logging with Postgres: https://www.postgresql.org/docs/current/static/runtime-config-logging.html
     command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs
     environment:
       # Provide the password via an environment variable. If the variable is unset or empty, use a default password
       - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-4WXUms893U6j4GE&Hvk3S*hqcqebFgo!vZi}
     # If on a non-Linux OS, make sure you share the drive used here. Go to Docker's settings -> Shared Drives
     volumes:
       # Persist the data between container invocations
       - postgresVolume:/var/lib/postgresql/data
       - ./logs:/logs
     networks:
       myApp-network:
         # Our application can communicate with the database using this hostname
         aliases:
           - postgresForMyApp
networks:
  myApp-network:
    driver: bridge
# Creates a named volume to persist our data. When on a non-Linux OS, the volume's data will be in the Docker VM
# (e.g., MobyLinuxVM) in /var/lib/docker/volumes/
volumes:
  postgresVolume:

Günlük dizinine yazma izni

Linux'tayken, ana bilgisayardaki günlük dizininin doğru izinlere sahip olması gerektiğini unutmayın. Aksi takdirde biraz yanıltıcı bir hata alırsınız

FATAL: "/logs/postgresql-2017-02-04_115222.log" günlük dosyası açılamadı: İzin reddedildi

Yanıltıcı diyorum, çünkü gerçekte ana bilgisayardaki dizin yazmaya izin vermiyorsa , hata mesajı konteynerdeki dizinin yanlış izne sahip olduğunu gösteriyor.

Bunu düzeltmek için, kullanarak ana bilgisayarda doğru izinleri ayarlıyorum

chgroup ./logs docker && chmod 770 ./logs

Stdout yerine bir dosyaya postgres günlüğü oluşturmanızı ve bununla başa çıkmak için docker günlükleri komutlarını kullanmanızı önerir misiniz? github konusunda çapraz bağlantı için tebrikler !
jpic

1
Dosyaya günlüğe kaydetmenin mi yoksa Docker günlüklerini kullanmanın mı tercih edileceğine karar vermedim, jpic.
Matthias Braun

muhtemelen burada gizlemek isteyeceğiniz şifreyi
eklediniz

3
@vidstige: Bu rastgele dizeyi bir parola olarak kullanmıyorum, sadece gösteri amaçlı.
Matthias Braun

1
@Gherman: Bunu Dockerfile'ınıza eklediniz mi? Çünkü yapmamalısın. Cevabım kullanır docker-compose.yml.
Matthias Braun

39

Özel postgresql.conf dosyasını postgres Docker kapsayıcısına enjekte edin

Varsayılan postgresql.confdosya PGDATAdir ( /var/lib/postgresql/data) içinde bulunur, bu da özellikle postgres konteynerini ilk kez çalıştırırken işleri daha karmaşık hale getirir, çünkü docker-entrypoint.shsarmalayıcı initdb, PGDATAdir başlatma adımını çağırır .

Docker'da PostgreSQL yapılandırmasını tutarlı bir şekilde özelleştirmek için config_filepostgres seçeneğini Docker hacimleriyle birlikte şu şekilde kullanmanızı öneririm :

Üretim veritabanı (Kalıcı Hacim olarak PGDATA dir)

docker run -d \
-v $CUSTOM_CONFIG:/etc/postgresql.conf \
-v $CUSTOM_DATADIR:/var/lib/postgresql/data \
-e POSTGRES_USER=postgres \
-p 5432:5432 \
--name postgres \
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

Test veritabanı (PGDATA dizini daha sonra silinecektir docker rm)

docker run -d \
-v $CUSTOM_CONFIG:/etc/postgresql.conf \
-e POSTGRES_USER=postgres \
--name postgres \
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

Hata ayıklama

  1. Sunucu günlüklerini doğrudan görmek için -d(ayır seçeneği) docker runkomutunu kaldırın .
  2. Psql istemcisi ile postgres sunucusuna bağlanın ve yapılandırmayı sorgulayın:

    docker run -it --rm --link postgres:postgres postgres:9.6 sh -c 'exec psql -h $POSTGRES_PORT_5432_TCP_ADDR -p $POSTGRES_PORT_5432_TCP_PORT -U postgres'
    
    psql (9.6.0)
    Type "help" for help.
    
    postgres=# SHOW all;

30

Eğer resmi giriş noktasını çalıştırdığınızda (kapsayıcıyı başlattığınızda AKA), bu çalıştırır initdbiçinde $PGDATA( /var/lib/postgresql/datavarsayılan olarak), ve sonra şu 2 dosya bu dizinde saklar:

  • postgresql.conf varsayılan manuel ayarlarla.
  • postgresql.auto.confayarları ALTER SYSTEMkomutlarla otomatik olarak geçersiz kılar .

Giriş noktası ayrıca herhangi bir /docker-entrypoint-initdb.d/*.{sh,sql}dosyayı çalıştırır .

Tüm bunlar, bu klasörde sunucuyu bir sonraki önyükleme için yapılandıran bir kabuk / SQL betiği sağlayabileceğiniz anlamına gelir (bu, DB başlatıldıktan hemen sonra veya kapsayıcıyı bir sonraki önyüklemenizde olacaktır).

Misal:

conf.sql dosya:

ALTER SYSTEM SET max_connections = 6;
ALTER SYSTEM RESET shared_buffers;

Dockerfile dosya:

FROM posgres:9.6-alpine
COPY *.sql /docker-entrypoint-initdb.d/
RUN chmod a+r /docker-entrypoint-initdb.d/*

Ve sonra conf.sqlzaten var olan veritabanlarında manuel olarak yürütmeniz gerekecek . Konfigürasyon birimde depolandığından, yeniden yapılanmalardan sağ kalacaktır.


Başka bir alternatif de -cbayrağı istediğiniz kadar geçirmektir :

docker container run -d postgres -c max_connections=6 -c log_lock_waits=on

Bu şekilde yeni bir imaj oluşturmanıza gerek kalmaz ve halihazırda var olan veya olmayan veritabanları ile ilgilenmenize gerek kalmaz; hepsi etkilenecek.


2
Bu sonuncusu, -c'yi geçerken, benim favorim. Bu, farklı ortamlar için oluşturmak çok temiz ve basit.
epic_fil

10

postgresql.confÖzelinizi kapsayıcı içindeki geçici bir dosyaya koyabilir ve çalışma zamanında varsayılan yapılandırmanın üzerine yazabilirsiniz.

Bunu yapmak için :

  • Özelinizi postgresql.confkapsayıcınızın içine kopyalayın
  • updateConfig.shDosyayı içine kopyalayın/docker-entrypoint-initdb.d/

Dockerfile

FROM postgres:9.6

COPY postgresql.conf      /tmp/postgresql.conf
COPY updateConfig.sh      /docker-entrypoint-initdb.d/_updateConfig.sh

updateConfig.sh

#!/usr/bin/env bash

cat /tmp/postgresql.conf > /var/lib/postgresql/data/postgresql.conf

Çalışma zamanında, kapsayıcı içindeki komut dosyasını çalıştıracak /docker-entrypoint-initdb.d/ve sizin özel yapılandırmanızla varsayılan yapılandırmanın üzerine yazacaktır.


neden ikinci kopya komutundaki "_"? olması gerekmiyor /docker-entrypoint-initdb.d/updateConfig.shmu :?
Fernando Castilla Ospina

3
Bunun nedeni docker-entrypoint-initdb.d / klasörünün komut dosyalarını alfabetik sırada çalıştırmasıdır. Ve bu senaryoyu diğerlerinden önce uygulamak istiyorum.
alphayax

tnx kopyanın alt
çizgiyi

9

Tüm cevaplara baktım ve başka bir seçenek kaldı. CMD değerinizi docker dosyasında değiştirebilirsiniz (bu en iyisi değildir, ancak yine de hedefinize ulaşmanın olası yoludur).

Temelde ihtiyacımız var

  • Docker konteynerinde yapılandırma dosyasını kopyalayın
  • Yazı sonrası başlangıç ​​seçeneklerini geçersiz kıl

Docker dosyası örneği:

FROM postgres:9.6
USER postgres

# Copy postgres config file into container
COPY postgresql.conf /etc/postgresql

# Override default postgres config file
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]

Ben kullanarak düşünüyorum rağmen command: postgres -c config_file=/etc/postgresql/postgresql.confsizin de docker-compose.ymlönerdiği dosyanın Matthias Braun en iyi seçenektir.


2

Bu soruna oldukça düşük teknolojili bir çözüm, hizmeti (AWS ve bir yaml dosyasında swarm kullanıyorum) veritabanı dosyalarınız kalıcı bir birime (burada AWS EFS, cloudtor ile belirtildiği gibi: aws sürücüsü) bağlayarak bildirmek gibi görünüyor. Şartname).

  version: '3.3'
  services:
    database:
      image: postgres:latest
      volumes:
        - postgresql:/var/lib/postgresql
        - postgresql_data:/var/lib/postgresql/data
    volumes:
       postgresql:
         driver: "cloudstor:aws" 
       postgresql_data:
         driver: "cloudstor:aws"
  1. Db, görüntü varsayılan ayarlarıyla başlatılmış olarak gelir.
  2. Konfigürasyon ayarlarını kabın içinde düzenlersiniz, örneğin yeniden başlatma gerektiren maksimum eşzamanlı bağlantı sayısını artırmak istiyorsanız
  3. çalışan konteyneri durdurun (veya hizmeti sıfıra ve sonra tekrar bire ölçeklendirin)
  4. sürü, bu sefer kalıcı konfigürasyon ayarlarınızı toplayıp neşeyle uygulayan yeni bir konteynır ortaya çıkarır.

Yapılandırmanızı sürdürmenin hoş bir yan etkisi, veritabanlarınızın da devam etmesidir (veya tam tersi miydi) ;-)


2

Çözümüm, docker-entrypoint-initdb'yi başlatmadan önce konfigürasyonda değişiklik yapması gereken meslektaşlar içindir.

'Shared_preload_libraries' ayarını değiştirmem gerekiyordu, bu yüzden postgres çalışma sırasında yeni kitaplık önceden yüklenmiş ve docker-entrypoint-initdb.d'deki kod bunu kullanabilir.

Bu yüzden Dockerfile'daki postgresql.conf.sample dosyasını yamaladım:

RUN echo "shared_preload_libraries='citus,pg_cron'" >> /usr/share/postgresql/postgresql.conf.sample
RUN echo "cron.database_name='newbie'" >> /usr/share/postgresql/postgresql.conf.sample

Ve bu yama ile docker-entrypoint-initdb.d / içindeki .sql dosyasına uzantı eklemek mümkün hale geldi:

CREATE EXTENSION pg_cron;

1

Bu benim için çalışıyor:

FROM postgres:9.6
USER postgres

# Copy postgres config file into container
COPY postgresql.conf /etc/postgresql

# Override default postgres config file
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]

Bu neden herhangi bir olumlu oy almadı? Buradaki en mantıklı teklif bu ... Teşekkürler.
Paflow

0

Docker compose kullanarak bir birimi postgresql.auto.conf. Misal:

version: '2'

services:
  db:
    image: postgres:10.9-alpine
    volumes:
      - postgres:/var/lib/postgresql/data:z
      - ./docker/postgres/postgresql.auto.conf:/var/lib/postgresql/data/postgresql.auto.conf
    ports:
      - 5432:5432

postgresql.auto.confÜzerine yazıldığı için düzenlememelisiniz . postgresql.confAynı yerde kullanın .
Baschdl

0

Ayrıca resmi image ( FROM postgres) kullanıyordum ve aşağıdaki komutları uygulayarak yapılandırmayı değiştirebildim.

İlk şey, PostgreSQL yapılandırma dosyasını bulmaktır. Bu, çalışan veritabanınızda bu komutu çalıştırarak yapılabilir.

SHOW config_file;

Benim durumum geri dönüyor /data/postgres/postgresql.conf.

Bir sonraki adım, çalışan PostgreSQL docker konteynerinizin karmasını bulmaktır.

docker ps -a

Bu, çalışan tüm kapların bir listesini döndürmelidir. Benim durumumda böyle görünüyor.

...
0ba35e5427d9    postgres    "docker-entrypoint.s…" ....
...

Şimdi, aşağıdakileri gerçekleştirerek kapsayıcınızın içindeki bash'a geçmelisiniz:

docker exec -it 0ba35e5427d9 /bin/bash

Kabın içinde, yapılandırmanın doğru yolda olup olmadığını kontrol edin ve görüntüleyin.

cat /data/postgres/postgresql.conf

Maksimum bağlantıları 100'den 1000'e ve paylaşılan arabelleği 128MB'den 3GB'ye değiştirmek istedim. Sed komutu ile bir arama yapabilir ve yapılandırmadaki karşılık gelen değişkenlerle değiştirebilirim.

sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /data/postgres/postgresql.conf
sed -i -e"s/^shared_buffers = 128MB.*$/shared_buffers = 3GB/" /data/postgres/postgresql.conf

Yapmamız gereken son şey, konteyner içindeki veritabanını yeniden başlatmak. PostGres'in hangi sürümünü kullandığınızı öğrenin.

cd /usr/lib/postgresql/
ls 

Benim durumumda, 12 So şimdi aşağıdaki komutu yerinde doğru sürümle çalıştırarak veritabanını yeniden başlatabilirsiniz.

su - postgres -c "PGDATA=$PGDATA /usr/lib/postgresql/12/bin/pg_ctl -w restart"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.