git / github y la configuration de implementación del server web

Estoy ejecutando un server web Apache y me preguntaba ¿cuál es la mejor forma de implementar cambios (desde github) al server web?

/ var / www / ahora solo se puede escribir por root.

¿Debo tener mi proyecto git directamente en / var / www /? (Entonces crea /var/www/.git/?)

Sin embargo, cuando necesito ejecutar commands (es decir, sudo git push) no funciona (ya que mis keys ssh no están sudo).

¿Sería mejor hacer / var / www / writable solo (y no solo root)? ¿O debería agregar keys ssh al usuario raíz? ¿O debería hacer algo completamente diferente?

Gracias.

Utilizo rsync para sincronizar los contenidos de mi máquina local con el server, y si solo está implementando en un server, entonces es bastante simple (y Capistrano es excesivo). Puse los siguientes alias en ~/.bash_profile :

 alias eget='rsync -avie ssh matt@example.com:sites/example.com/www/ ~/Projects/example/example.com/www/ --exclude .DS_Store --exclude ".git*" --delete-after' alias edep='rsync -avuie ssh ~/Projects/example/example.com/www/ matt@example.com:sites/example.com/www/ --exclude .DS_Store --exclude ".git*" --delay-updates --delete-after' 

Luego, desde el repository git en mi máquina local. Hago:

 git commit -am 'commit some changes' git pull --rebase # pull any new changes from remote (--rebase prevents an unnecessary merge commit.) eget -n # confirm which files I've changed 

Si parece sospechoso, podría hacer eget sin la -n y luego simplemente hacer un git diff -w . Entonces, podría hacer el git checkout -- path/to/file para los files para los cuales quiero save mis cambios. Luego, confirmo los cambios que estaban en el server que aún no recibí. Esto solo ocurrirá si los files en el server cambian de forma diferente a las implementaciones. De lo contrario, sabrá que su versión local siempre está más actualizada que los files en el server y, por lo tanto, no tiene que preocuparse por sobrescribir cosas en el server que aún no tiene en su server local. Continuar…

 edep -n # just see what files will be deployed/updated/etc. edep # looks good. Deploy for real. 

¡Hecho!

Consulte la página de manual de rsync (1) Mac OS X para get más información.

Otra opción es usar el gancho post-recepción de Git . Pero, tendrás que instalar Git en el server para hacer eso. Además, recomiendo colocar el directory .git fuera de su directory público de www por razones de security y limpieza. Puede hacerlo con la opción de configuration Git core.worktree . Por ejemplo, desde ~/git/example.com.git , do git init --bare; git config core.worktree ~/sites/example.com/ git init --bare; git config core.worktree ~/sites/example.com/ . Eso hace ~/git/example.com.git como el .git dir para ~/sites/example.com/ .

Cree un repository central, use la ramificación de git para crear diferentes twigs para diferentes propósitos, y nunca sirva a todo su repository públicamente, ni sirva a su directory .git públicamente (ya que eso es lo mismo que servir todo lo que alguna vez hizo con el codificar o poner en el repository al público). En lo alto de mi cabeza, aquí están los pasos que recomiendo, según mi propia experiencia:

  • Cree un repository central / concentrador para el código. (opcional, pero recomendado. Incluso mejor es usar github.com para su repository central). A continuación, puede consultar las copys locales para las implementaciones locales, por ejemplo, cuando desea recrear el sitio en su computadora portátil. No es necesario, pero es muy conveniente y se asegura de que su sitio sea portátil. Puede tener un repository de etapas y una ramificación de etapas para fines de desarrollo. También puede tener un repository y una sucursal para fines de producción.

  • Cree un directory explícitamente público en el repository que no sea la raíz del repository. Por ejemplo, cree un directory / www / o / servido / o / público / dentro del repository. Esto es material que estará públicamente disponible e indexable por los motores de búsqueda, así que tenga cuidado con lo que allí se encuentre. Supongamos que todo lo que ingresa es de conocimiento público, guardado en caching para la eternidad y será el objective de los ataques de vulnerabilidad de security (porque podría ser la verdad).

  • Cree el repository dev: git clone el repository central en el server (p. Ej., cd /home/tchal luego git clone git@github.com:tchalvak/ninjawars.git ), aunque idealmente en una carpeta que tenga permissions compartidos para su grupo de desarrolladores.

  • Cree un enlace simbólico para su sitio de desarrollo: cd /var/www/ , ln -s /url/to/shanetworking/repository/public/ nickNameForDevSiteHere , creando un enlace simbólico solo a los files servidos / públicos del sitio, creando un simple sitio de nivel de desarrollo. (opcional, pero recomendado). De esa manera, el sitio de desarrollo puede ser fácilmente accesible a través de una IP y un apodo, por ejemplo, http://10.0.1.123/publicdevelopmentsitenickname sin la necesidad de un nombre de dominio real.

  • Especifique la confirmación del código en vivo y desplegado. Es posible que desee crear una live-branch activa para cualquier código que esté actualmente "activo", solo tenga en count que esta twig probablemente tendrá que ser sobrescrita a la fuerza periódicamente, por ejemplo, git branch live-branch git push -f origin live-branch . Considérelo una instantánea de su código, y no una twig que se mantendrá estable.

  • Cuando esté seguro de que el sitio de desarrollo se ha probado lo suficiente, implemente manualmente el código de live-branch través de un script de deployment personalizado o use un repository distinto con la twig activa desprotegida, que solo sirva para el público explícito. contenido, similar al sitio dev.

    • crear un host virtual en apache para el nombre de dominio. Por ejemplo, podría usar algo como: <VirtualHost *> ServerName greatdomain.com ServerAlias www.greatdomain.com DocumentRoot /srv/greatdomain/www/ </VirtualHost> Es un tema enorme, por lo que si no tiene claro todos los detalles, recomiendo profundizar en la búsqueda de la configuration de un host virtual en apache.

    • Señale su DNS para el nombre de dominio en la ip del server.

En resumen, puede usar git para implementar fácilmente todo su código usando twigs específicas para cada tipo de deployment. No ayudará con la synchronization, por ejemplo, las bases de datos entre las implementaciones, pero ese es un paso que usted podría descubrir después de ejecutar las cosas, como un segundo nivel de implementación de un sitio, y hacerlo manualmente mientras tanto.