diff --git a/Dockerfile b/Dockerfile index 90353a2..a73b125 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,19 @@ FROM fukamachi/qlot -# 作業ディレクトリ WORKDIR /app - -# ソース全体をコピー COPY . /app -# Tailwind CLI をダウンロード&インストール +RUN apt-get update && apt-get install -y --no-install-recommends build-essential curl libev-dev + RUN mkdir -p ./bin \ && curl -sLO https://github.com/tailwindlabs/tailwindcss/releases/latest/download/tailwindcss-linux-x64 \ && chmod +x tailwindcss-linux-x64 \ && mv tailwindcss-linux-x64 ./bin/tailwindcss -# Tailwind CSS をビルド(global.css -> dist.css) RUN ./bin/tailwindcss -i ./public/style/global.css -o ./public/style/dist.css --minify -# Qlot依存関係のインストール -RUN qlot install +RUN qlot install --quiet -# ポート開放 EXPOSE 3000 -# アプリ起動 -CMD [".qlot/bin/clackup", "--system", "hp", "--server", "woo", "--port", "3000", "src/app.lisp"] +ENTRYPOINT [".qlot/bin/clackup", "--system", "hp", "--server", "woo", "--address", "0.0.0.0", "--port", "3000", "src/app.lisp"] diff --git a/public/style/global.css b/public/style/global.css index 1ec4792..671406c 100644 --- a/public/style/global.css +++ b/public/style/global.css @@ -1,6 +1,4 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import "tailwindcss"; :root { font-family: 'Noto Sans JP Variable', sans-serif; diff --git a/qlfile b/qlfile index 5baf28a..5a2c45f 100644 --- a/qlfile +++ b/qlfile @@ -1,11 +1,11 @@ ql fiveam ql cl-jingle -git hsx https://github.com/skyizwhite/hsx.git -git ningle-fbr https://github.com/skyizwhite/ningle-fbr.git -git lack-mw https://github.com/skyizwhite/lack-mw.git ql cl-ppcre -ql trivial-backtrace ql trivia ql cl-str ql quri ql clack +git hsx https://github.com/skyizwhite/hsx.git +git ningle-fbr https://github.com/skyizwhite/ningle-fbr.git +git lack-mw https://github.com/skyizwhite/lack-mw.git +git trivial-backtrace https://github.com/hraban/trivial-backtrace.git \ No newline at end of file diff --git a/qlfile.lock b/qlfile.lock index 4b4d73b..ac6ecd1 100644 --- a/qlfile.lock +++ b/qlfile.lock @@ -10,26 +10,10 @@ (:class qlot/source/ql:source-ql :initargs (:%version :latest) :version "ql-2023-10-21")) -("hsx" . - (:class qlot/source/git:source-git - :initargs (:remote-url "https://github.com/skyizwhite/hsx.git") - :version "git-4ff1c97e3ff727aa332995f5be4dcfb138a45d5f")) -("ningle-fbr" . - (:class qlot/source/git:source-git - :initargs (:remote-url "https://github.com/skyizwhite/ningle-fbr.git") - :version "git-bc87e5de01959cd99364bc14ad3eaf88e52e4478")) -("lack-mw" . - (:class qlot/source/git:source-git - :initargs (:remote-url "https://github.com/skyizwhite/lack-mw.git") - :version "git-77a0f436635e5beadaba3765492832704a015a3c")) ("cl-ppcre" . (:class qlot/source/ql:source-ql :initargs (:%version :latest) :version "ql-2024-10-12")) -("trivial-backtrace" . - (:class qlot/source/ql:source-ql - :initargs (:%version :latest) - :version "ql-2023-02-14")) ("trivia" . (:class qlot/source/ql:source-ql :initargs (:%version :latest) @@ -46,3 +30,19 @@ (:class qlot/source/ql:source-ql :initargs (:%version :latest) :version "ql-2024-10-12")) +("hsx" . + (:class qlot/source/git:source-git + :initargs (:remote-url "https://github.com/skyizwhite/hsx.git") + :version "git-4ff1c97e3ff727aa332995f5be4dcfb138a45d5f")) +("ningle-fbr" . + (:class qlot/source/git:source-git + :initargs (:remote-url "https://github.com/skyizwhite/ningle-fbr.git") + :version "git-bc87e5de01959cd99364bc14ad3eaf88e52e4478")) +("lack-mw" . + (:class qlot/source/git:source-git + :initargs (:remote-url "https://github.com/skyizwhite/lack-mw.git") + :version "git-77a0f436635e5beadaba3765492832704a015a3c")) +("trivial-backtrace" . + (:class qlot/source/git:source-git + :initargs (:remote-url "https://github.com/hraban/trivial-backtrace.git") + :version "git-7f90b4a4144775cca0728791e4b92ac2557b07a1")) diff --git a/src/app.lisp b/src/app.lisp index 07bebf9..6c2881a 100644 --- a/src/app.lisp +++ b/src/app.lisp @@ -1,8 +1,11 @@ (defpackage #:hp/app (:use #:cl) - (:local-nicknames (#:jg #:jingle)) - (:local-nicknames (#:fbr #:ningle-fbr)) - (:local-nicknames (#:env #:hp/env)) + (:import-from #:jingle + #:make-app + #:install-middleware + #:configure) + (:import-from #:ningle-fbr + #:set-routes) (:import-from #:hp/middlewares/recoverer #:*recoverer*) (:import-from #:hp/middlewares/trailing-slash @@ -13,12 +16,12 @@ (:export #:*app*)) (in-package #:hp/app) -(defparameter *app* (jg:make-app :address env:*address* - :port env:*port*)) +(defparameter *app* + (let ((app (make-app))) + (set-routes app :system :hp :target-dir-path "routes") + (install-middleware app *recoverer*) + (install-middleware app *trim-trailing-slash*) + (install-middleware app *public-server*) + (configure app))) -(fbr:set-routes *app* :system :hp :target-dir-path "routes") -(jg:install-middleware *app* *recoverer*) -(jg:install-middleware *app* *trim-trailing-slash*) -(jg:install-middleware *app* *public-server*) - -(jg:configure *app*) +*app* diff --git a/src/env.lisp b/src/env.lisp deleted file mode 100644 index b32c3f4..0000000 --- a/src/env.lisp +++ /dev/null @@ -1,25 +0,0 @@ -(defpackage #:hp/env - (:use #:cl) - (:export #:dev-mode-p - #:prod-mode-p - #:*port* - #:*address*)) -(in-package #:hp/env) - -(defmacro defenv (name env &key default parser) - (let ((env-val (gensym "env-val"))) - `(defparameter ,name - (let ((,env-val (uiop:getenv ,env))) - (if ,env-val - (funcall ,(or parser '#'identity) ,env-val) - ,default))))) - -(defenv *env* "HP_ENV" :default "dev") -(defenv *address* "HP_ADDRESS" :default "localhost") -(defenv *port* "HP_PORT" :default 3000 :parser #'parse-integer) - -(defun dev-mode-p () - (string= *env* "dev")) - -(defun prod-mode-p () - (string= *env* "prod")) diff --git a/src/main.lisp b/src/main.lisp index 17327df..121202b 100644 --- a/src/main.lisp +++ b/src/main.lisp @@ -1,8 +1,7 @@ (defpackage #:hp (:nicknames #:hp/main) (:use #:cl) - (:local-nicknames (#:jg #:jingle)) - (:local-nicknames (#:env #:hp/env)) + (:import-from #:clack) (:import-from #:hp/app #:*app*) (:export #:start @@ -10,11 +9,22 @@ #:reload)) (in-package #:hp) +(defparameter *handler* nil) + (defun start () - (jg:start *app*)) + (if *handler* + (format t "The server is already running.~%") + (setf *handler* (clack:clackup *app* + :server :hunchentoot + :address "localhost" + :port 3000)))) (defun stop () - (jg:stop *app*)) + (if *handler* + (progn + (clack:stop *handler*) + (setf *handler* nil)) + (format t "The server is not running.~%"))) (defun reload () (stop) diff --git a/src/middlewares/recoverer.lisp b/src/middlewares/recoverer.lisp index 3722d50..44079d2 100644 --- a/src/middlewares/recoverer.lisp +++ b/src/middlewares/recoverer.lisp @@ -1,8 +1,8 @@ (defpackage #:hp/middlewares/recoverer (:use #:cl #:hsx) - (:local-nicknames (#:tb #:trivial-backtrace)) - (:local-nicknames (#:env #:hp/env)) + (:import-from #:trivial-backtrace + #:print-backtrace) (:export #:*recoverer*)) (in-package #:hp/middlewares/recoverer) @@ -14,10 +14,10 @@ (body (main (h1 "500 Internal Server Error") - (when (env:dev-mode-p) + (when (string= (uiop:getenv "HP_ENV") "dev") (hsx (pre - (code (tb:print-backtrace condition :output nil)))))))))) + (code (print-backtrace condition :output nil)))))))))) (defparameter *recoverer* (lambda (app) diff --git a/src/middlewares/trailing-slash.lisp b/src/middlewares/trailing-slash.lisp index 902a953..3acf158 100644 --- a/src/middlewares/trailing-slash.lisp +++ b/src/middlewares/trailing-slash.lisp @@ -1,6 +1,6 @@ (defpackage #:hp/middlewares/trailing-slash (:use #:cl) - (:local-nicknames (#:qu #:quri)) + (:import-from :quri) (:export #:*trim-trailing-slash*)) (in-package #:hp/middlewares/trailing-slash) @@ -10,8 +10,8 @@ (defparameter *trim-trailing-slash* (lambda (app) (lambda (env) - (let* ((req-uri (qu:uri (getf env :request-uri))) - (req-path (qu:uri-path req-uri)) + (let* ((req-uri (quri:uri (getf env :request-uri))) + (req-path (quri:uri-path req-uri)) (req-method (getf env :request-method)) (response (funcall app env)) (res-status (first response))) @@ -19,7 +19,7 @@ (eq req-method :get) (not (string= req-path "/")) (string= (last-string req-path) "/")) - (let ((red-uri (qu:copy-uri req-uri + (let ((red-uri (quri:copy-uri req-uri :path (string-right-trim "/" req-path)))) - `(301 (:location ,(qu:render-uri red-uri)))) + `(301 (:location ,(quri:render-uri red-uri)))) response))))) diff --git a/src/renderer.lisp b/src/renderer.lisp index 4f5623d..4f9ba83 100644 --- a/src/renderer.lisp +++ b/src/renderer.lisp @@ -2,10 +2,9 @@ (:use #:cl #:hsx #:trivia) - (:local-nicknames (#:jg #:jingle)) + (:import-from :jingle) (:import-from #:hsx/element - #:element) - (:local-nicknames (#:env #:hp/env))) + #:element)) (in-package #:hp/renderer) (defun bust-cache (url) @@ -70,12 +69,12 @@ (main :class "flex-1 h-full" children))))) -(defmethod jg:process-response ((app jg:app) result) - (jg:set-response-header :content-type "text/html; charset=utf-8") - (when (env:dev-mode-p) - (jg:set-response-header :cache-control "no-store, no-cache, must-revalidate") - (jg:set-response-header :pragma "no-cache") - (jg:set-response-header :expires "0")) +(defmethod jingle:process-response ((app jingle:app) result) + (jingle:set-response-header :content-type "text/html; charset=utf-8") + (when (string= (uiop:getenv "HP_ENV") "dev") + (jingle:set-response-header :cache-control "no-store, no-cache, must-revalidate") + (jingle:set-response-header :pragma "no-cache") + (jingle:set-response-header :expires "0")) (call-next-method app (hsx:render-to-string (match result diff --git a/src/routes/not-found.lisp b/src/routes/not-found.lisp index f1301af..2246e59 100644 --- a/src/routes/not-found.lisp +++ b/src/routes/not-found.lisp @@ -1,7 +1,7 @@ (defpackage #:hp/routes/not-found (:use #:cl #:hsx) - (:local-nicknames (#:jg #:jingle)) + (:import-from :jingle) (:export #:handle-not-found)) (in-package #:hp/routes/not-found) @@ -15,5 +15,5 @@ (h1 "404 Not Found")))) (defun handle-not-found () - (jg:set-response-status :not-found) + (jingle:set-response-status :not-found) (list (~page) *metadata*))