diff --git a/.gitignore b/.gitignore index bdf7a603..0f555301 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ tmp .air # Frontend asset -dist +web/dist # Dev database data diff --git a/Dockerfile b/Dockerfile index cd6de175..460e44c8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,6 +15,7 @@ RUN apk update RUN apk --no-cache add gcc musl-dev COPY . . +COPY --from=frontend /frontend-build/dist ./server/dist RUN go build \ -o memos \ @@ -25,7 +26,6 @@ FROM alpine:3.16.0 AS monolithic WORKDIR /usr/local/memos COPY --from=backend /backend-build/memos /usr/local/memos/ -COPY --from=frontend /frontend-build/dist /usr/local/memos/web/dist # Directory to store the data, which can be referenced as the mounting point. RUN mkdir -p /var/opt/memos diff --git a/server/dist/index.html b/server/dist/index.html new file mode 100644 index 00000000..04197732 --- /dev/null +++ b/server/dist/index.html @@ -0,0 +1,13 @@ + + + +
+ + + +No frontend embeded.
+ + diff --git a/server/embed_frontend.go b/server/embed_frontend.go new file mode 100644 index 00000000..3efc4e95 --- /dev/null +++ b/server/embed_frontend.go @@ -0,0 +1,37 @@ +package server + +import ( + "embed" + "io/fs" + "net/http" + + "github.com/labstack/echo/v4" +) + +//go:embed dist +var embeddedFiles embed.FS + +//go:embed dist/index.html +var indexContent string + +func getFileSystem() http.FileSystem { + fs, err := fs.Sub(embeddedFiles, "dist") + if err != nil { + panic(err) + } + + return http.FS(fs) +} + +func embedFrontend(e *echo.Echo) { + // Catch-all route to return index.html, this is to prevent 404 when accessing non-root url. + // See https://stackoverflow.com/questions/27928372/react-router-urls-dont-work-when-refreshing-or-writing-manually + e.GET("/*", func(c echo.Context) error { + return c.HTML(http.StatusOK, indexContent) + }) + + assetHandler := http.FileServer(getFileSystem()) + e.GET("/assets/*", echo.WrapHandler(assetHandler)) + e.GET("/icons/*", echo.WrapHandler(assetHandler)) + e.GET("/favicon.svg", echo.WrapHandler(assetHandler)) +} diff --git a/server/server.go b/server/server.go index d99617a7..6b72d965 100644 --- a/server/server.go +++ b/server/server.go @@ -38,12 +38,7 @@ func NewServer(profile *profile.Profile) *Server { Timeout: 30 * time.Second, })) - e.Use(middleware.StaticWithConfig(middleware.StaticConfig{ - Skipper: middleware.DefaultSkipper, - Root: "web/dist", - Browse: true, - HTML5: true, - })) + embedFrontend(e) // In dev mode, set the const secret key to make signin session persistence. secret := []byte("usememos") diff --git a/web/index.html b/web/index.html index 66590404..c7714cfe 100644 --- a/web/index.html +++ b/web/index.html @@ -2,7 +2,7 @@ - +