2012-07-07 9 views
8

He creado un proyecto de Django con 20 sitios (un dominio diferente por sitio) para 20 países diferentes. Los sitios comparten todo: código base, base de datos, URL, plantillas, etc.Múltiples sitios de Django con base de código compartido y DB

Lo único que no comparten son pequeñas personalizaciones (logotipo, color de fondo del tema CSS, código de idioma, etc.) que configuré en cada uno de los archivos de configuración del sitio (cada sitio tiene un archivo de configuración, y todos estos archivos importan un archivo de configuración global con las cosas comunes). En este momento, con el fin de ejecutar los sitios en el modo de desarrollo que voy a hacer:

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 

Tengo un par de preguntas:

  1. He leído que es posible crear un servidor virtual para cada sitio (dominio) y pasarle el archivo settings.py del sitio. Sin embargo, me temo que esto crearía una instancia de Django por sitio. ¿Estoy en lo cierto?
  2. ¿Hay una manera más eficiente de realizar la implementación? He leído sobre django-dynamicsites, pero no estoy seguro de si es la forma correcta de hacerlo.
  3. Si decido implementar usando Heroku, parece que Heroku solo espera un archivo de configuración por aplicación, así que necesitaría tener 20 aplicaciones. ¿Hay una solución para eso?

¡Gracias!

+0

Estoy en el mismo problema buscando la mejor solución. Eche un vistazo a esto: http://www.huyng.com/posts/franchising-running-multiple-sites-from-one-django-codebase/ –

+1

Gracias por su respuesta. Terminé usando https://github.com/wardi/django-dynamicsites-lite – Alex

Respuesta

6

Por lo tanto, hace poco hice algo similar y descubrí que la siguiente estrategia es la mejor opción. Voy a suponer que ya estás familiarizado con la ramificación de git en este punto, así como con los mandos a distancia de Heroku. Si no es así, usted debe leer esto primero: https://devcenter.heroku.com/articles/git#multiple-remotes-and-environments

La principal estrategia que estoy tomando es tener una sola base de código (un único repositorio git) con:

  • Un master rama que contiene toda su código compartido: plantillas, vistas, URL.
  • Muchas ramas site, basadas en master, que contienen todas las personalizaciones específicas del sitio: css, imágenes, archivos de configuración (si son muy diferentes).

La forma en que esto funciona es así:

En primer lugar, asegúrese de que está en la rama master.

En segundo lugar, crea una nueva rama git para uno de tus dominios, por ejemplo: git checkout -b somedomain.com.

En tercer lugar, personalice su rama somedomain.com para que se vea como lo desee.

A continuación, implemente somedomain.com en vivo en Heroku, ejecutando heroku create somedomain.com --remote somedomain.com.

Ahora, inserte su código de sucursal somedomain.com en su nueva aplicación Heroku: git push somedomain.com somedomain.com:master. Esto desplegará su código en Heroku.

Ahora que usted tiene su rama somedomain.com desplegado con su propia aplicación Heroku, usted puede hacer todas las cosas normales Heroku añadiendo --remote somedomain.com a su Heroku normal de comandos, por ejemplo:

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

Así que, ahora que has básicamente de dos ramas: una rama, master y una rama somedomain.com.

Regrese a su rama master, y cree otra nueva sucursal para su próximo dominio: git checkout master; git checkout -b anotherdomain.com. Luego personalícelo a su gusto (css, material específico del sitio) y despliéguelo de la misma manera que lo hicimos anteriormente.

Ahora estoy seguro de que ya puede ver a dónde va esto. Tenemos una sucursal git para cada uno de nuestros domains personalizados, y cada dominio tiene su propia aplicación Heroku. El beneficio (obviamente) es que cada una de estas personalizaciones de proyecto se basa en la rama master, lo que significa que puede realizar fácilmente actualizaciones en todos los sitios a la vez.

Digamos que actualiza una de sus vistas en su sucursal master - ¿cómo puede implementarla en todos los sus sitios personalizados a la vez? ¡Fácilmente!

Sólo tiene que ejecutar:

  • git checkout somedomain.com
  • git merge master
  • git push somedomain.com somedomain.com:master # desplegar los cambios

y repetir para cada uno de sus dominios. En mi entorno, escribí un script que hace esto, pero es bastante fácil hacerlo manualmente si lo desea.

De todos modos, espero que eso ayude.

+2

Manera muy inteligente de hacerlo que no pensé. Sin embargo, en mi caso no estoy seguro de si sería mejor, ya que necesitaré tener N heroku aplicaciones y tendría que pagar N veces por los complementos pagados. Mi enfoque fue poner todos los datos específicos del sitio (muy poco) en la base de datos con [django-preferences] (http://github.com/praekelt/django-preferences). Por cierto, es gracioso que estaba leyendo el sitio impresionante [deploydjango.com] (http://www.deploydjango.com/) y acabo de ver la respuesta :) – Alex

+0

Aumenta el costo a medida que N sitios aumenta el costo se convierte en 'N x costo' por aplicación. –

Cuestiones relacionadas