Compare commits

..

13 commits
cache ... main

Author SHA1 Message Date
SleeplessOne1917
b6415f828e
Merge pull request #1711 from LemmyNet/cache-dev
Fix some issues
2023-06-29 19:26:40 -04:00
SleeplessOne1917
cc184a86c8 Fix authorized route false flag 2023-06-29 18:12:22 -04:00
SleeplessOne1917
2d88e42cab Fix dev caching issue 2023-06-29 16:33:08 -04:00
Dessalines
9e7fec772d v0.18.1-rc.5 2023-06-29 16:20:38 -04:00
SleeplessOne1917
df39e0fe5d
Merge pull request #1708 from LemmyNet/cache-control
Cache static data for a day
2023-06-29 14:19:07 -04:00
SleeplessOne1917
fa41117320
Merge branch 'main' into cache-control 2023-06-29 13:35:44 -04:00
Alec Armbruster
d8ee0ec78a
change max-age to 5 for non-authed responses 2023-06-29 13:33:30 -04:00
Alec Armbruster
fead020bdc
Fix PostListing mobile margin layout issue (#1706) 2023-06-29 17:28:55 +00:00
SleeplessOne1917
339cefa2b0 Cache static data for a day 2023-06-29 13:14:48 -04:00
Dessalines
08370d4c4e Try increasing node memory. 2023-06-29 11:12:12 -04:00
Dessalines
b73cb808e4 v0.18.1-rc.4 2023-06-29 10:40:19 -04:00
Alec Armbruster
80d9aac1ca
Fix taglines on Home (#1701)
* fix taglines on home

* fix error on admin panel
2023-06-29 10:38:35 -04:00
SleeplessOne1917
751495702c
Use git hash to break cache (#1684)
* Use git hash to break cache

* Address PR feedback

* Make hash docker agnostic

* Add trailing slash

* Update .prettierignore

Co-authored-by: Alec Armbruster <35377827+alectrocute@users.noreply.github.com>

* Remove debugging log

* implement getStaticDir util

---------

Co-authored-by: Dessalines <dessalines@users.noreply.github.com>
Co-authored-by: Alec Armbruster <35377827+alectrocute@users.noreply.github.com>
2023-06-29 10:29:33 -04:00
10 changed files with 53 additions and 27 deletions

View file

@ -27,7 +27,7 @@ COPY .git .git
RUN echo "export const VERSION = '$(git describe --tag)';" > "src/shared/version.ts" RUN echo "export const VERSION = '$(git describe --tag)';" > "src/shared/version.ts"
RUN yarn --production --prefer-offline RUN yarn --production --prefer-offline
RUN yarn build:prod RUN NODE_OPTIONS="--max-old-space-size=8192" yarn build:prod
# Prune the image # Prune the image
RUN node-prune /usr/src/app/node_modules RUN node-prune /usr/src/app/node_modules

View file

@ -1,6 +1,6 @@
{ {
"name": "lemmy-ui", "name": "lemmy-ui",
"version": "0.18.1-rc.3", "version": "0.18.1-rc.5",
"description": "An isomorphic UI for lemmy", "description": "An isomorphic UI for lemmy",
"repository": "https://github.com/LemmyNet/lemmy-ui", "repository": "https://github.com/LemmyNet/lemmy-ui",
"license": "AGPL-3.0", "license": "AGPL-3.0",
@ -22,9 +22,16 @@
"translations:update": "git submodule update --remote --recursive" "translations:update": "git submodule update --remote --recursive"
}, },
"lint-staged": { "lint-staged": {
"*.{ts,tsx,js}": ["prettier --write", "eslint --fix"], "*.{ts,tsx,js}": [
"*.{css, scss}": ["prettier --write"], "prettier --write",
"package.json": ["sortpack"] "eslint --fix"
],
"*.{css, scss}": [
"prettier --write"
],
"package.json": [
"sortpack"
]
}, },
"dependencies": { "dependencies": {
"@babel/plugin-proposal-decorators": "^7.21.0", "@babel/plugin-proposal-decorators": "^7.21.0",

View file

@ -20,7 +20,13 @@ const [hostname, port] = process.env["LEMMY_UI_HOST"]
server.use(express.json()); server.use(express.json());
server.use(express.urlencoded({ extended: false })); server.use(express.urlencoded({ extended: false }));
server.use(getStaticDir(), express.static(path.resolve("./dist"))); server.use(
getStaticDir(),
express.static(path.resolve("./dist"), {
maxAge: 24 * 60 * 60 * 1000, // 1 day
immutable: true,
})
);
server.use(setCacheControl); server.use(setCacheControl);
if (!process.env["LEMMY_UI_DISABLE_CSP"] && !process.env["LEMMY_UI_DEBUG"]) { if (!process.env["LEMMY_UI_DISABLE_CSP"] && !process.env["LEMMY_UI_DEBUG"]) {

View file

@ -1,4 +1,4 @@
import type { NextFunction, Response } from "express"; import type { NextFunction, Request, Response } from "express";
import { UserService } from "../shared/services"; import { UserService } from "../shared/services";
export function setDefaultCsp({ export function setDefaultCsp({
@ -18,24 +18,33 @@ export function setDefaultCsp({
// Set cache-control headers. If user is logged in, set `private` to prevent storing data in // Set cache-control headers. If user is logged in, set `private` to prevent storing data in
// shared caches (eg nginx) and leaking of private data. If user is not logged in, allow caching // shared caches (eg nginx) and leaking of private data. If user is not logged in, allow caching
// all responses for 60 seconds to reduce load on backend and database. The specific cache // all responses for 5 seconds to reduce load on backend and database. The specific cache
// interval is rather arbitrary and could be set higher (less server load) or lower (fresher data). // interval is rather arbitrary and could be set higher (less server load) or lower (fresher data).
// //
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
export function setCacheControl({ export function setCacheControl(
res, req: Request,
next, res: Response,
}: { next: NextFunction
res: Response; ) {
next: NextFunction;
}) {
const user = UserService.Instance; const user = UserService.Instance;
let caching: string; let caching: string;
if (user.auth()) {
caching = "private"; if (
process.env.NODE_ENV === "production" &&
(req.path.match(/\.(js|css|txt|manifest\.webmanifest)\/?$/) ||
req.path.includes("/css/themelist"))
) {
// Static content gets cached publicly for a day
caching = "public, max-age=86400";
} else { } else {
caching = "public, max-age=60"; if (user.auth()) {
caching = "private";
} else {
caching = "public, max-age=5";
}
} }
res.setHeader("Cache-Control", caching); res.setHeader("Cache-Control", caching);
next(); next();

View file

@ -24,7 +24,7 @@ export async function createSsrHtml(
if (!appleTouchIcon) { if (!appleTouchIcon) {
appleTouchIcon = site?.site_view.site.icon appleTouchIcon = site?.site_view.site.icon
? `data:image/png;base64,${sharp( ? `data:image/png;base64,${await sharp(
await fetchIconPng(site.site_view.site.icon) await fetchIconPng(site.site_view.site.icon)
) )
.resize(180, 180) .resize(180, 180)

View file

@ -279,13 +279,15 @@ export class Home extends Component<any, HomeState> {
trendingCommunitiesRes, trendingCommunitiesRes,
commentsRes, commentsRes,
postsRes, postsRes,
tagline: getRandomFromList(this.state?.siteRes?.taglines ?? [])
?.content,
isIsomorphic: true, isIsomorphic: true,
}; };
HomeCacheService.postsRes = postsRes; HomeCacheService.postsRes = postsRes;
} }
this.state.tagline = getRandomFromList(
this.state?.siteRes?.taglines ?? []
)?.content;
} }
componentWillUnmount() { componentWillUnmount() {

View file

@ -141,7 +141,7 @@ export class TaglineForm extends Component<TaglineFormProps, TaglineFormState> {
handleEditTaglineClick(d: { i: TaglineForm; index: number }, event: any) { handleEditTaglineClick(d: { i: TaglineForm; index: number }, event: any) {
event.preventDefault(); event.preventDefault();
if (this.state.editingRow == d.index) { if (d.i.state.editingRow == d.index) {
d.i.setState({ editingRow: undefined }); d.i.setState({ editingRow: undefined });
} else { } else {
d.i.setState({ editingRow: d.index }); d.i.setState({ editingRow: d.index });

View file

@ -403,8 +403,9 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
createdLine() { createdLine() {
const post_view = this.postView; const post_view = this.postView;
return ( return (
<div className="small"> <div className="small mb-1 mb-md-0">
<span className="me-1"> <span className="me-1">
<PersonListing person={post_view.creator} /> <PersonListing person={post_view.creator} />
</span> </span>

View file

@ -1,5 +1,5 @@
export default function isAuthPath(pathname: string) { export default function isAuthPath(pathname: string) {
return /create_.*|inbox|settings|admin|reports|registration_applications/g.test( return /^\/create_.*|inbox|settings|admin|reports|registration_applications/g.test(
pathname pathname
); );
} }

View file

@ -14,7 +14,7 @@ const banner = `
@license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL v3.0 @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL v3.0
`; `;
function getBase(env) { function getBase(env, mode) {
return { return {
output: { output: {
filename: "js/server.js", filename: "js/server.js",
@ -54,6 +54,7 @@ function getBase(env) {
plugins: [ plugins: [
new webpack.DefinePlugin({ new webpack.DefinePlugin({
"process.env.COMMIT_HASH": `"${env.COMMIT_HASH}"`, "process.env.COMMIT_HASH": `"${env.COMMIT_HASH}"`,
"process.env.NODE_ENV": `"${mode}"`,
}), }),
new MiniCssExtractPlugin({ new MiniCssExtractPlugin({
filename: "styles/styles.css", filename: "styles/styles.css",
@ -69,7 +70,7 @@ function getBase(env) {
} }
const createServerConfig = (env, mode) => { const createServerConfig = (env, mode) => {
const base = getBase(env); const base = getBase(env, mode);
const config = merge({}, base, { const config = merge({}, base, {
mode, mode,
entry: "./src/server/index.tsx", entry: "./src/server/index.tsx",
@ -97,7 +98,7 @@ const createServerConfig = (env, mode) => {
}; };
const createClientConfig = (env, mode) => { const createClientConfig = (env, mode) => {
const base = getBase(env); const base = getBase(env, mode);
const config = merge({}, base, { const config = merge({}, base, {
mode, mode,
entry: "./src/client/index.tsx", entry: "./src/client/index.tsx",