2011-06-10 18 views
7

Actualmente estoy usando MaintenanceModeMiddleware para poner mi sitio en modo de mantenimiento, pero requiere que realice el cambio en el archivo settings.py en el servidor remoto. Me gustaría utilizar el tejido para poner el sitio de forma remota en modo de mantenimiento. ¿Hay una manera de lograr esto? ¿O hay un método mejor para hacer esto? Gracias.¿Hay alguna forma de poner un sitio django en modo de mantenimiento usando fabric?

[ACTUALIZACIÓN]

Gracias por la que todos retroalimentación al final esto es lo que hice y funciona muy bien para mí, http://garthhumphreys.com/2011/06/11/painless-django-maintenance-mode-with-fabric/ - Me gusta la idea de líneas descomenta pero con mi configuración si fuera hacer eso en el servidor de producción se sobrescribirá una vez que empujé la nueva versión, por lo que al final poner el sitio en modo de mantenimiento desde el nivel del servidor y no el nivel django funciona mucho mejor y es realmente más fácil y flexible, para al menos :)

+0

esta [pregunta] (http://stackoverflow.com/questions/6237514/write-to-a-remote-file-with-fabric) puede estar relacionada. No sé mucho sobre tejidos, y no quiero sonar grosero, pero ¿no es bastante sencillo usar SSH y cambiar una línea de configuración? Es un método remoto –

+0

Encontré que el enfoque de Garth Humphreys no era excelente debido al caché del navegador.Esto condujo a situaciones en las que: - páginas de modo no de mantenimiento se vieron durante el modo de mantenimiento - la página de modo de mantenimiento se ve cuando no está en modo de mantenimiento Pondré mi solución retocada en una respuesta separada. – seddonym

Respuesta

8

La tela tiene comandos para ayudarlo a comentar o descomentar líneas en un archivo dado en fabric.contrib.files. Vea los documentos aquí: http://docs.fabfile.org/en/1.0.1/api/contrib/files.html

Personalmente prefiero manejar esto en el proxy front-end en lugar de en un middleware Django. Me gustaría echar un vistazo a esta pregunta Show a custom 503 page if upstream is down que configura Nginx para usar una página personalizada cuando el upstream está fuera de servicio.

+0

pero ¿pueden los usuarios de administración/personal seguir sin 503? El middleware parece bastante bueno, especialmente para aquellos de nosotros que tienden a desarrollarse en el servidor de producción. El Nginx 503 sería bueno cuando el proyecto de Django es realmente malo. –

+0

@j_syk no hay ninguna razón por la cual no puedas usar ambos. Si el servidor de Django no está funcionando, entonces el middleware no funcionará y Nginx se activará. –

+0

Gracias por los comentarios, al final esto es lo que hice y funciona muy bien para mí, http://garthhumphreys.com/2011/06/11/painless-django-maintenance-mode-with-fabric/- Me gusta la idea de las líneas de descompresión, pero con mi configuración, si tuviera que hacer eso en el servidor de producción, se sobrescribiría una vez que presioné la nueva versión fuera, así que al final poner el sitio en modo de mantenimiento desde el nivel del servidor y no el nivel django funciona mucho mejor y es realmente más fácil y flexible, al menos para mí :) –

2

Hay un fork of django-maintenancemode que permite activar/desactivar el modo de mantenimiento estableciendo un valor en la base de datos. De esta forma, puede, por ejemplo, crear un comando de administración simple para alternar el modo de mantenimiento y llamarlo a través de un tejido. Creo que es más flexible que usar mod_rewrite.

+0

Eso debe significar que cada página servida a través de django requiere un golpe adicional a la base de datos? – Matt

4

Mi solución:

  1. crear una plantilla de modo de mantenimiento y enlazar con él a través de una URLconf, por lo que cuando se visita/bajo mantenimiento/se muestra una página de mantenimiento.
  2. Luego, configure apache para probar la presencia de un archivo 'maintenance-mode-on', y si está presente haga un 302 redirigir a la url de la página de modo de mantenimiento.
  3. Configure apache para redirigir desde la URL del modo de mantenimiento a la página de inicio, si el archivo 'maintenance-mode-off' está presente.
  4. Secuencia de comandos de la tela para facilitar el cambio de archivos entre modo de mantenimiento y modo de mantenimiento apagado.

Aquí está la sección correspondiente del archivo de configuración de Apache:

RewriteEngine On 
# If this file (toggle file) exists then put the site into maintenance mode 
RewriteCond /path/to/toggle/file/maintenance-mode-on -f 
RewriteCond %{REQUEST_URI} !^/static.* 
RewriteCond %{REQUEST_URI} !^/admin.* 
RewriteCond %{REQUEST_URI} !^/under-maintenance/ 
# redirect to the maintenance mode page 
RewriteRule ^(.*) /under-maintenance/ [R,L] 

#If not under maintenance mode, redirect away from the maintenance page 
RewriteCond /path/to/toggle/file/maintenance-mode-off -f 
RewriteCond %{REQUEST_URI} ^/under-maintenance/ 
RewriteRule ^(.*)/[R,L] 

A continuación, las partes pertinentes de la escritura de la tela:

env.var_dir = '/path/to/toggle/file/' 

def is_in_mm(): 
    "Returns whether the site is in maintenance mode" 
    return files.exists(os.path.join(env.var_dir, 'maintenance-mode-on')) 

@task 
def mm_on(): 
    """Turns on maintenance mode""" 
    if not is_in_mm(): 
     with cd(env.var_dir): 
      run('mv maintenance-mode-off maintenance-mode-on') 
      utils.fastprint('Turned on maintenance mode.') 
    else: 
     utils.error('The site is already in maintenance mode!') 


@task 
def mm_off(): 
    """Turns off maintenance mode""" 
    if is_in_mm(): 
     with cd(env.var_dir): 
      run('mv maintenance-mode-on maintenance-mode-off') 
      utils.fastprint('Turned off maintenance mode.') 
    else: 
     utils.error('The site is not in maintenance mode!') 

Esto funciona bien, a pesar de que no depende de la manipulación de Django solicitudes durante el modo de mantenimiento; Sería bueno solo servir un archivo estático.

Cuestiones relacionadas