diff --git a/.github/workflows/Deploy.yml b/.github/workflows/Deploy.yml
index 722666b..d4b250f 100644
--- a/.github/workflows/Deploy.yml
+++ b/.github/workflows/Deploy.yml
@@ -5,8 +5,40 @@ on:
tags:
- "v*"
+env:
+ REGISTRY_IMAGE: hamster1963/nezha-dash
+ ALIYUN_REGISTRY_IMAGE: registry.cn-guangzhou.aliyuncs.com/hamster-home/nezha-dash
+
jobs:
+ changelog:
+ name: Generate Changelog
+ runs-on: ubuntu-latest
+ outputs:
+ release_body: ${{ steps.git-cliff.outputs.content }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Generate a changelog
+ uses: orhun/git-cliff-action@v4
+ id: git-cliff
+ with:
+ config: git-cliff-config/cliff.toml
+ args: -vv --latest --strip 'footer'
+ env:
+ OUTPUT: CHANGES.md
+ - name: Release
+ uses: softprops/action-gh-release@v2
+ if: startsWith(github.ref, 'refs/tags/')
+ with:
+ body: ${{ steps.git-cliff.outputs.content }}
+ token: ${{ secrets.GITHUB_TOKEN }}
+ env:
+ GITHUB_REPOSITORY: ${{ github.repository }}
+
build-and-push:
+ name: Build and push Docker image
runs-on: ubuntu-latest
environment: Production
steps:
@@ -30,7 +62,8 @@ jobs:
uses: docker/metadata-action@v5
with:
images: |
- hamster1963/nezha-dash
+ ${{ env.REGISTRY_IMAGE }}
+ ${{ env.ALIYUN_REGISTRY_IMAGE }}
tags: |
type=raw,value=latest
type=ref,event=tag
diff --git a/app/[locale]/(main)/page.tsx b/app/[locale]/(main)/page.tsx
index 1c3f65e..4de86cc 100644
--- a/app/[locale]/(main)/page.tsx
+++ b/app/[locale]/(main)/page.tsx
@@ -1,9 +1,13 @@
+import { unstable_setRequestLocale } from "next-intl/server";
import ServerList from "../../../components/ServerList";
import ServerOverview from "../../../components/ServerOverview";
-export const runtime = 'edge';
-
-export default function Home() {
+export default function Home({
+ params: { locale },
+}: {
+ params: { locale: string };
+}) {
+ unstable_setRequestLocale(locale);
return (
diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx
index 943cb32..2410b08 100644
--- a/app/[locale]/layout.tsx
+++ b/app/[locale]/layout.tsx
@@ -12,6 +12,7 @@ import { ThemeProvider } from "next-themes";
import { Viewport } from "next";
import { cn } from "@/lib/utils";
import { locales } from "@/i18n-metadata";
+import { unstable_setRequestLocale } from "next-intl/server";
const fontSans = FontSans({
subsets: ["latin"],
@@ -36,11 +37,12 @@ export const viewport: Viewport = {
userScalable: false,
};
-export function generateStaticParams() {
+export const dynamic = "force-static";
+
+export async function generateStaticParams() {
return locales.map((locale) => ({ locale }));
}
-
export default function LocaleLayout({
children,
params: { locale },
@@ -48,6 +50,8 @@ export default function LocaleLayout({
children: React.ReactNode;
params: { locale: string };
}) {
+ unstable_setRequestLocale(locale);
+
const messages = useMessages();
return (
diff --git a/git-cliff-config/cliff.toml b/git-cliff-config/cliff.toml
new file mode 100644
index 0000000..940461c
--- /dev/null
+++ b/git-cliff-config/cliff.toml
@@ -0,0 +1,83 @@
+# git-cliff ~ configuration file
+# https://git-cliff.org/docs/configuration
+#
+# Lines starting with "#" are comments.
+# Configuration options are organized into tables and keys.
+# See documentation for more information on available options.
+
+[changelog]
+# changelog header
+header = """
+# Changelog\n
+"""
+# template for the changelog body
+# https://tera.netlify.app/docs/
+body = """
+{% if version %}\
+ ## Release {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }}
+{% else %}\
+ ## [unreleased]
+{% endif %}\
+
+{% for group, commits in commits | group_by(attribute="group") %}
+ ### {{ group | upper_first }}
+ {% for commit in commits %}
+ * {{ commit.message | upper_first }} ([{{ commit.id | truncate(length=7, end="") }}]($REPO/commit/{{ commit.id }})) by [@{{ commit.author.name }}](https://github.com/{{ commit.author.name }})\
+ {% for footer in commit.footers -%}
+ , {{ footer.token }}{{ footer.separator }}{{ footer.value }}\
+ {% endfor %}\
+ {% endfor %}
+{% endfor %}\n
+"""
+# remove the leading and trailing whitespace from the template
+trim = true
+postprocessors = [
+ { pattern = '\$REPO', replace = "https://github.com/hamster1963/nezha-dash" }, # replace repository URL
+]
+# changelog footer
+footer = """
+"""
+
+
+[git]
+# parse the commits based on https://www.conventionalcommits.org
+conventional_commits = true
+# filter out the commits that are not conventional
+filter_unconventional = true
+# process each line of a commit as an individual commit
+split_commits = true
+# regex for preprocessing the commit messages
+commit_preprocessors = [
+ { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/orhun/git-cliff/issues/${2}))" },
+]
+# regex for parsing and grouping commits
+commit_parsers = [
+ { message = "^feat", group = "โฐ๏ธ Features" },
+ { message = "^fix", group = "๐ Bug Fixes" },
+ { message = "^doc", group = "๐ Documentation" },
+ { message = "^perf", group = "โก Performance" },
+ { message = "^refactor", group = "๐ Refactor" },
+ { message = "^style", group = "๐จ Styling" },
+ { message = "^test", group = "๐งช Testing" },
+ { message = "^chore\\(release\\): prepare for", skip = true },
+ { message = "^chore\\(pr\\)", skip = true },
+ { message = "^chore\\(pull\\)", skip = true },
+ { message = "^chore", group = "โ๏ธ Miscellaneous Tasks" },
+ { body = ".*security", group = "๐ก๏ธ Security" },
+ { message = "^update", group = "๐ผ Updates" },
+ { message = "^delete", group = "๐ Delete" },
+]
+# protect breaking changes from being skipped due to matching a skipping commit_parser
+protect_breaking_commits = false
+# filter out the commits that are not matched by commit parsers
+filter_commits = false
+# glob pattern for matching git tags
+tag_pattern = "v[0-20]*"
+# regex for skipping tags
+skip_tags = ""
+# regex for ignoring tags
+ignore_tags = "v.*-beta.*"
+# sort the tags topologically
+topo_order = false
+# sort the commits inside sections by oldest/newest order
+sort_commits = "oldest"
diff --git a/next.config.mjs b/next.config.mjs
index 5234c22..397de22 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -1,3 +1,9 @@
+import withBundleAnalyzer from "@next/bundle-analyzer";
+
+const bundleAnalyzer = withBundleAnalyzer({
+ enabled: process.env.ANALYZE === "true",
+});
+
import createNextIntlPlugin from "next-intl/plugin";
const withNextIntl = createNextIntlPlugin();
import withPWAInit from "@ducanh2912/next-pwa";
@@ -16,5 +22,10 @@ const withPWA = withPWAInit({
const nextConfig = {
output: "standalone",
reactStrictMode: true,
+ logging: {
+ fetches: {
+ fullUrl: true,
+ },
+ },
};
-export default withPWA(withNextIntl(nextConfig));
+export default bundleAnalyzer(withPWA(withNextIntl(nextConfig)));