2012-07-07 33 views
8

Tôi đã tạo một chương trình Django proyect với 20 trang web (một tên miền khác nhau trên mỗi trang web) cho 20 quốc gia khác nhau. Các trang web chia sẻ mọi thứ: codebase, cơ sở dữ liệu, url, mẫu, v.v.Nhiều trang web Django với codebase dùng chung và DB

Điều duy nhất chúng không chia sẻ là các tùy chỉnh nhỏ (logo, màu nền của chủ đề CSS, mã ngôn ngữ, v.v.) mỗi tệp cài đặt trang (mỗi trang có một tệp cài đặt và tất cả các tệp này đều nhập tệp cài đặt chung chung với các công cụ phổ biến). Ngay bây giờ, để chạy các trang web trong chế độ phát triển tôi sẽ thực hiện:

django-admin.py runserver 8000 --settings=config.site_settings.site1 
django-admin.py runserver 8001 --settings=config.site_settings.site2 
... 
django-admin.py runserver 8020 --settings=config.site_settings.site20 

Tôi có một vài câu hỏi:

  1. Tôi đã đọc rằng nó có thể tạo ra một máy chủ ảo cho mỗi trang web (tên miền) và chuyển nó vào tệp settings.py của trang web. Tuy nhiên, tôi sợ điều này sẽ tạo ra một cá thể Django trên mỗi trang web. Tôi có đúng không?
  2. Có cách triển khai hiệu quả hơn không? Tôi đã đọc về django-dynamicsites nhưng tôi không chắc đó có phải là cách đi đúng không.
  3. Nếu tôi quyết định triển khai sử dụng Heroku, có vẻ như Heroku chỉ mong đợi một tệp cài đặt cho mỗi ứng dụng, vì vậy tôi cần có 20 ứng dụng. Có một giải pháp cho điều đó không?

Cảm ơn!

+0

Tôi đang gặp vấn đề tương tự khi tìm giải pháp tốt nhất. Hãy xem xét điều này: http://www.huyng.com/posts/franchising-running-multiple-sites-from-one-django-codebase/ –

+1

Cảm ơn câu trả lời của bạn. Tôi đã sử dụng https://github.com/wardi/django-dynamicsites-lite – Alex

Trả lời

6

Vì vậy, gần đây tôi đã làm điều tương tự và nhận thấy rằng chiến lược dưới đây là lựa chọn tốt nhất. Tôi sẽ giả định rằng bạn đã quen thuộc với việc phân nhánh git vào thời điểm này, cũng như điều khiển từ xa Heroku. Nếu bạn không, bạn nên đọc đầu tiên: https://devcenter.heroku.com/articles/git#multiple-remotes-and-environments

Chiến lược chính Tôi đang tham gia là phải có một codebase đơn (một Git repo đơn) với:

  • Chi nhánh master có chứa tất cả mã được chia sẻ của bạn: mẫu, lượt xem, URL.
  • Nhiều chi nhánh site, dựa trên master, chứa tất cả các tùy chỉnh theo trang web cụ thể: css, hình ảnh, tệp cài đặt (nếu chúng rất khác nhau).

Cách làm việc này là như vậy:

Trước tiên, hãy chắc chắn rằng bạn đang ở trên nhánh master.

Thứ hai, tạo chi nhánh git mới cho một trong các miền của bạn, ví dụ: git checkout -b somedomain.com.

Thứ ba, tùy chỉnh chi nhánh somedomain.com của bạn để trông giống như cách bạn muốn.

Tiếp theo, triển khai somedomain.com trực tiếp đến Heroku, bằng cách chạy heroku create somedomain.com --remote somedomain.com.

Bây giờ, hãy đẩy mã chi nhánh somedomain.com của bạn vào ứng dụng Heroku mới của bạn: git push somedomain.com somedomain.com:master. Điều này sẽ triển khai mã của bạn trên Heroku.

Bây giờ bạn đã có chi nhánh somedomain.com bạn triển khai với ứng dụng Heroku riêng của mình, bạn có thể làm tất cả những thứ Heroku bình thường bằng cách thêm --remote somedomain.com để Heroku bình thường của bạn lệnh, ví dụ:

  • heroku pg:info --remote somedomain.com
  • heroku addons:add memcache:5mb --remote somedomain.com
  • v.v.

Vì vậy, bây giờ bạn về cơ bản có hai chi nhánh: chi nhánh master, và chi nhánh somedomain.com.

Quay lại chi nhánh master và tạo một chi nhánh mới cho miền tiếp theo của bạn: git checkout master; git checkout -b anotherdomain.com. Sau đó, tùy chỉnh nó theo ý thích của bạn (css, các công cụ cụ thể cho trang web) và triển khai giống như cách chúng tôi đã làm ở trên.

Bây giờ tôi chắc chắn rằng bạn có thể thấy nơi này sẽ diễn ra ngay bây giờ. Chúng tôi có một nhánh git cho mỗi tùy chỉnh domains và mỗi miền của chúng tôi có ứng dụng Heroku riêng. Lợi ích (rõ ràng) là mỗi tùy chỉnh dự án này dựa trên chi nhánh master, có nghĩa là bạn có thể dễ dàng thực hiện cập nhật cho tất cả trang web cùng một lúc.

Giả sử bạn cập nhật một trong các chế độ xem của mình trong chi nhánh master - cách bạn có thể triển khai nó thành tất cả các trang web tùy chỉnh cùng một lúc? Dễ dàng!

Chỉ cần chạy:

  • git checkout somedomain.com
  • git merge master
  • git push somedomain.com somedomain.com:master # triển khai những thay đổi

Và lặp lại cho mỗi người trong lĩnh vực của bạn. Trong môi trường của tôi, tôi đã viết một kịch bản thực hiện điều này, nhưng thật dễ dàng để làm thủ công nếu bạn muốn.

Nhưng dù sao, hy vọng điều đó sẽ hữu ích.

+2

Cách rất thông minh để làm điều đó mà tôi không nghĩ đến. Tuy nhiên, trong trường hợp của tôi, tôi không chắc chắn nếu nó sẽ tốt hơn vì tôi sẽ cần phải có N heroku ứng dụng và tôi sẽ cần phải trả N lần cho các addons trả tiền. Cách tiếp cận của tôi là đưa tất cả dữ liệu cụ thể của trang web (rất ít thực sự) vào DB với [tùy chọn django] (http://github.com/praekelt/django-preferences). BTW, thật buồn cười khi tôi chỉ đọc trang web tuyệt vời [deploydjango.com] (http://www.deploydjango.com/) và tôi chỉ thấy phản hồi của bạn :) – Alex

+0

Nó làm tăng chi phí khi các trang web N tăng chi phí trở thành 'N x chi phí' cho mỗi ứng dụng. –

Các vấn đề liên quan