Giới thiệu

1. Stash

Chắc hẳn mọi người ai cũng biết tới Github hay Bitbucket như là những dịch vụ lưu trữ , quản lý code và project hữu hiệu. Cả hai đều cho phép người dùng tạo project dạng public hay private. Tuy nhiên, trong môi trường doanh nghiệp, việc sử dụng những dịch vụ cloud bên ngoài như Github và Bitbucket có thể không đáp ứng được yêu cầu về bảo mật bởi tính chất public và global của các dịch vụ này. Hiểu được nhu cầu đó, Atlassian đã cung cấp Stash như một giải pháp behind the firewall, giúp doanh nghiệp có thể sử dụng hạ tầng riêng để tạo một “Bitbucket” nội bộ. Bạn có thể vào trang chủ để tìm hiểu thêm về Stash (https://www.atlassian.com/software/stash/why-stash-git-repository-management)

2. Docker

Nếu là một IT man, hay là một lập trình viên phải làm việc với nhiều Project khác nhau, mọi lúc mọi nơi, kiểu như sáng code Java, chiều code Ecmascript, tối về gặm nhấm Python =)) Việc cài đặt môi trường Project sớm muộn cũng trở thành cơn ác mộng bởi dependency rối tung, hay những câu lệnh nhàm chán cứ phải gõ đi gõ lại mỗi khi setup. Bởi vậy Docker trở thành cứu cánh, giúp chúng ta “tống” các cài đặt môi trường, application vào một Container riêng, mỗi container là một child environment của host chạy trên một process riêng, giúp isolate các môi trường khác nhau để chạy ứng dụng. Mục đích này giống với các giải pháp ảo hoá như VirtualBox, VMWare nhưng bản chất kỹ thuật thì khác nhau, giúp Docker light-weight hơn các giải pháp khác.
Ngoài ra, trong quá trình tìm hiểu, mình còn biết tới Vagrant, một giải pháp quản lý Virtual Machine hiệu quả, có thể kết hợp với Docker. Tuy nhiên mình vẫn không hiểu rõ về cái sự kết hợp này lắm :((

3. Tại sao lại có bài viết này, postgresql làm gì ở đây

Mình có nhu cầu setup một cái tools nội bộ giúp quản lý source code và project trong nội bộ, trong khi chỉ có duy nhất một con server CentOS đang chạy và setup hầm bà lằng đủ thứ. Bây giờ mà setup thêm vào nữa thì sợ dependency thành một đống hỗn loạn, default Git của centos là 1.7.1, trong khi Stash đòi git 1.7.6. Vậy thì cài Stash bằng Docker là tốt nhất. Stash cho phép lựa chọn giữa 2 loại database, internal và external. Internal dùng khi muốn test. Cài cho Production thì chọn External (Postgresql)

DIY (Do It Yourself)

Đọc và nghiên cứu hầm bà lằng đủ thứ xong rồi cũng phải gõ thôi T_T

Cài Docker trên CentOS 6.6 – 64 bit

yum install docker-io 

Cài Stash

Atlassian đã cung cấp sẵn Docker image của Stash trên Docker Hub, chỉ việc pull về tạo container và chạy
(https://bitbucket.org/atlassian/docker-atlassian-stash)

docker run -u root -v /data/stash:/var/atlassian/application-data/stash atlassian/stash chown -R daemon /var/atlassian/application-data/stash 
docker run -v /data/stash:/var/atlassian/application-data/stash --name="stash" -d -p 7990:7990 -p 7999:7999 atlassian/stash 

Ở đây 7990 là port để truy cập Stash web, 7999 là port để ssh vào container.

Sử dụng Nginx làm proxy

Ở đây mình sử dụng nginx đã cài đặt sẵn trên host để làm proxy, forward request tới port 7990 của Stash Application. Chỉ cần thêm file .conf vào thư mục /etc/nginx/conf.d/ nội dung như sau

server { listen 80; server_name stash.companydomain.com; location / { proxy_pass http://localhost:7990; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 

Xong rồi khởi động lại nginx service

service nginx restart 

Truy cập vào địa chỉ: http://stash.companydomain.com. Nếu thành công bạn sẽ thấy trang setup của Stash. Bạn sẽ được lựa chọn sử dụng giữa Internal Database và External Database. Nếu muốn dùng luôn để test, bạn có thể chọn Internal, không phải cài thêm gì nữa. Nếu muốn dùng cho production, bạn nên chọn external và thực hiện phần tiếp theo: cài đặt Postgresql container

Cài PostgreSql

Cũng như lần trước, Docker hub đã có sẵn image, chỉ việc kéo về thôi

sudo docker pull zaiste/postgresql 

Chạy luôn

sudo docker run -d -name postgres -p=5432:5432 zaiste/postgresql 

Bạn có thể list ra danh sách các container đang chạy bằng lệnh sau

docker ps -a 

Tạo database cho Stash, cả Jira luôn (mình cũng định cài luôn cả Jira cho máu :)) )
Tạo file intialise_db.sh nội dung như sau

# Creates Stash and JIRA databases and users # Get IP Address of postgres container #PSQL_IP=$(sudo docker inspect postgres | grep IPAddress| cut -d '"' -f4) PSQL_IP=$DB_PORT_5432_TCP_ADDR PSQL_PORT=$DB_PORT_5432_TCP_PORT # Saves password echo "$PSQL_IP:*:*:docker:docker" > $HOME/.pgpass chmod 0600 $HOME/.pgpass echo " CREATE ROLE stashuser WITH LOGIN PASSWORD 'jellyfish' VALID UNTIL 'infinity'; CREATE DATABASE stash WITH ENCODING='UTF8' OWNER=stashuser TEMPLATE=template0 CONNECTION LIMIT=-1; CREATE ROLE jiradbuser WITH LOGIN PASSWORD 'jellyfish' VALID UNTIL 'infinity'; CREATE DATABASE jiradb WITH ENCODING 'UNICODE' TEMPLATE=template0;"  | PGPASSWORD="docker" psql -h $PSQL_IP -p $PSQL_PORT -d docker -U docker -w 

Script mình lấy từ đây: https://bitbucket.org/atlassianlabs/atlassian-docker/src/9da1818bd2415d8cf7da4b354151cd6ad42b0f92/initialise_db.sh?at=master

Xong rồi chạy lệnh sau để run script trong posgresql container

cat initialise_db.sh | sudo docker run --rm -i --link postgres:db zaiste/postgresql bash - 

Cuối cùng là lấy thông tin IP của docker container

sudo docker inspect -f '{{ .Config.Hostname }} {{ .Config.Image }} {{ .NetworkSettings.IPAddress }}' postgres stash 

Kết quả

6960dcda94a0 zaiste/postgresql 172.17.0.9 321daabbda8c atlassian/stash 172.17.0.8 

Xong rồi, quay lại trang setup của Stash, điển thông số cho database như sau

Host: 172.17.0.9 Database: stash User: stashuser Pass: jellyfish 

Next to Finisssh !!!

Kết thúc

Quả thật việc setup diễn ra đơn giản hơn mình nghĩ nhiều. #thatkhongthetinduoc
Tuy nhiên sau bài này mĩnh sẽ nghiên cứu cách viết Dockerfile để automate lại toàn bộ quá trình cài đặt. Bạn nào có kinh nghiệm giúp mình với T_T

Bài viết tham khảo từ các hướng dẫn sau:

  1. http://blogs.atlassian.com/2013/11/docker-all-the-things-at-atlassian-automation-and-wiring/
  2. https://bitbucket.org/atlassian/docker-atlassian-stash
  3. https://github.com/ugoArangino/docker-stash

Comments

comments