chore(landing): configure render static deployments
Configure landing and docs for separate Render Static Site deployments.
This commit is contained in:
parent
aa391e365b
commit
809d9ff41e
3 changed files with 44 additions and 9 deletions
|
|
@ -14,7 +14,32 @@ pnpm generate
|
||||||
pnpm preview
|
pnpm preview
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Render static sites
|
||||||
|
|
||||||
|
Landing and docs are deployed as separate Render Static Sites from the `main` branch.
|
||||||
|
|
||||||
|
Landing:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
corepack enable && pnpm install --frozen-lockfile --ignore-scripts && NUXT_PUBLIC_SITE_URL=$RENDER_EXTERNAL_URL NUXT_PUBLIC_ROBOTS="index, follow" pnpm --filter agent-teams-landing generate
|
||||||
|
```
|
||||||
|
|
||||||
|
Publish path: `landing/.output/public`
|
||||||
|
|
||||||
|
Docs:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
corepack enable && pnpm install --frozen-lockfile --ignore-scripts && VITEPRESS_BASE=/ VITEPRESS_SITE_URL=$RENDER_EXTERNAL_URL VITEPRESS_LANDING_SITE_URL=https://agent-teams-ai-landing.onrender.com pnpm --filter agent-teams-landing docs:build
|
||||||
|
```
|
||||||
|
|
||||||
|
Publish path: `landing/product-docs/.vitepress/dist`
|
||||||
|
|
||||||
|
Both sites set `NODE_VERSION=24.16.0` and `SKIP_INSTALL_DEPS=true`; the build command runs the pnpm install step explicitly with `--ignore-scripts`.
|
||||||
|
|
||||||
|
When a custom landing domain is attached, update `VITEPRESS_LANDING_SITE_URL` on the docs site. When a custom docs domain is attached, `VITEPRESS_SITE_URL=$RENDER_EXTERNAL_URL` can stay unchanged for the Render preview URL or be replaced with the custom domain for canonical SEO.
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
- Static-first (SSG) by design.
|
- Static-first (SSG) by design.
|
||||||
- Locale auto-detection: cookie -> browser settings -> fallback `en`.
|
- Locale auto-detection: cookie -> browser settings -> fallback `en`.
|
||||||
- Theme auto-detection: localStorage -> system preference -> fallback `light`.
|
- Theme auto-detection: localStorage -> system preference -> fallback `light`.
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
||||||
const defaultSeoTitle = "Agent Teams - AI Agent Orchestration for Developers";
|
const defaultSeoTitle = "Agent Teams - AI Agent Orchestration for Developers";
|
||||||
const defaultSeoDescription = "Free, open-source desktop app for AI agent teams. Start with a free model with no auth, then connect Claude, Codex, or OpenCode when you need more models.";
|
const defaultSeoDescription = "Free, open-source desktop app for AI agent teams. Start with a free model with no auth, then connect Claude, Codex, or OpenCode when you need more models.";
|
||||||
const defaultSeoImage = `${siteUrl.replace(/\/+$/, "")}/og-image-agent-teams-v6.png`;
|
const defaultSeoImage = `${siteUrl.replace(/\/+$/, "")}/og-image-agent-teams-v6.png`;
|
||||||
|
const robots = process.env.NUXT_PUBLIC_ROBOTS || "noindex, nofollow";
|
||||||
|
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
compatibilityDate: "2026-01-19",
|
compatibilityDate: "2026-01-19",
|
||||||
|
|
@ -29,7 +30,7 @@ export default defineNuxtConfig({
|
||||||
title: defaultSeoTitle,
|
title: defaultSeoTitle,
|
||||||
meta: [
|
meta: [
|
||||||
{ name: "description", content: defaultSeoDescription },
|
{ name: "description", content: defaultSeoDescription },
|
||||||
{ name: "robots", content: "noindex, nofollow" },
|
{ name: "robots", content: robots },
|
||||||
{ property: "og:title", content: defaultSeoTitle },
|
{ property: "og:title", content: defaultSeoTitle },
|
||||||
{ property: "og:description", content: defaultSeoDescription },
|
{ property: "og:description", content: defaultSeoDescription },
|
||||||
{ property: "og:type", content: "website" },
|
{ property: "og:type", content: "website" },
|
||||||
|
|
|
||||||
|
|
@ -21,15 +21,20 @@ const normalizeBase = (value: string) => {
|
||||||
const withTrailingSlash = (value: string) => `${trimTrailingSlash(value)}/`;
|
const withTrailingSlash = (value: string) => `${trimTrailingSlash(value)}/`;
|
||||||
|
|
||||||
const appBase = normalizeBase(process.env.NUXT_APP_BASE_URL || "/");
|
const appBase = normalizeBase(process.env.NUXT_APP_BASE_URL || "/");
|
||||||
const base = appBase === "/" ? "/docs/" : `${appBase}docs/`;
|
const embeddedDocsBase = appBase === "/" ? "/docs/" : `${appBase}docs/`;
|
||||||
const siteUrl = trimTrailingSlash(
|
const base = process.env.VITEPRESS_BASE ? normalizeBase(process.env.VITEPRESS_BASE) : embeddedDocsBase;
|
||||||
process.env.NUXT_PUBLIC_SITE_URL || "https://777genius.github.io/agent-teams-ai"
|
const landingSiteUrl = trimTrailingSlash(
|
||||||
|
process.env.VITEPRESS_LANDING_SITE_URL ||
|
||||||
|
process.env.NUXT_PUBLIC_SITE_URL ||
|
||||||
|
"https://777genius.github.io/agent-teams-ai"
|
||||||
);
|
);
|
||||||
const publicBaseUrl =
|
const publicBaseUrl =
|
||||||
appBase === "/" || siteUrl.endsWith(trimTrailingSlash(appBase))
|
appBase === "/" || landingSiteUrl.endsWith(trimTrailingSlash(appBase))
|
||||||
? withTrailingSlash(siteUrl)
|
? withTrailingSlash(landingSiteUrl)
|
||||||
: `${withTrailingSlash(siteUrl)}${appBase.replace(/^\/+/, "")}`;
|
: `${withTrailingSlash(landingSiteUrl)}${appBase.replace(/^\/+/, "")}`;
|
||||||
const docsUrl = `${publicBaseUrl}docs/`;
|
const docsUrl = process.env.VITEPRESS_SITE_URL
|
||||||
|
? withTrailingSlash(process.env.VITEPRESS_SITE_URL)
|
||||||
|
: `${publicBaseUrl}docs/`;
|
||||||
const downloadUrl = `${publicBaseUrl}download/`;
|
const downloadUrl = `${publicBaseUrl}download/`;
|
||||||
const ruDownloadUrl = `${publicBaseUrl}ru/download/`;
|
const ruDownloadUrl = `${publicBaseUrl}ru/download/`;
|
||||||
const ogImageUrl = `${publicBaseUrl}og-image-agent-teams-v6.png`;
|
const ogImageUrl = `${publicBaseUrl}og-image-agent-teams-v6.png`;
|
||||||
|
|
@ -130,7 +135,11 @@ const ruGuide: DefaultTheme.SidebarItem[] = [
|
||||||
];
|
];
|
||||||
|
|
||||||
const rootNav: DefaultTheme.NavItem[] = [
|
const rootNav: DefaultTheme.NavItem[] = [
|
||||||
{ text: "Guide", link: "/guide/beginner-workflow", activeMatch: "^/guide/(?!troubleshooting(?:/|$))" },
|
{
|
||||||
|
text: "Guide",
|
||||||
|
link: "/guide/beginner-workflow",
|
||||||
|
activeMatch: "^/guide/(?!troubleshooting(?:/|$))"
|
||||||
|
},
|
||||||
{ text: "Developers", link: "/developers/", activeMatch: "^/developers/" },
|
{ text: "Developers", link: "/developers/", activeMatch: "^/developers/" },
|
||||||
{ text: "Reference", link: "/reference/concepts", activeMatch: "^/reference/" },
|
{ text: "Reference", link: "/reference/concepts", activeMatch: "^/reference/" },
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue