I've been using darcs to "push" the new files to the server. Then I ssh to the server and make a new core image, with a script like this (sbcl):
(asdf:oos 'asdf:load-op 'swank) (asdf:oos 'asdf:load-op :pettomato)
(defun my-toplevel() ;; start swank (setf swank:*use-dedicated-output-stream* nil) (setf swank:*communication-style* :fd-handler) (swank:create-server :dont-close t)
;; start hunchentoot (pettomato:start)
;; start a repl (sb-impl::toplevel-repl nil))
(sb-ext:save-lisp-and-die "pettomato.core" :toplevel #'my-toplevel)
"pettomato" is the name of my website package.
Then I kill the previously running image, and start a new one running in a screen session with this script:
#!/bin/sh screen -dmS pettomato-site sbcl --core /home/astro/bin/pettomato.core --noinform
The main reason that I do it this way is because I have init scripts that launch the above script at boot time. This way it will be up-to-date and load quickly if the server reboots.
I don't update the production server very often, so this works well for me. If anyone sees any flaws with this logic, please let me know.
-austin