Skip to content

Commit 705245d

Browse files
RihanArfanatinuxautofix-ci[bot]
authored
feat: self hosting first (#686)
Co-authored-by: Sébastien Chopin <[email protected]> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent 714c67e commit 705245d

File tree

49 files changed

+5920
-3078
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+5920
-3078
lines changed

docs/app/pages/blog/.blog.yml

Lines changed: 0 additions & 30 deletions
This file was deleted.

docs/app/pages/blog/[slug].vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ useSeoMeta({
3636
ogTitle: `${title} · NuxtHub Blog`
3737
})
3838
39-
if (post.value.image) {
39+
if (post.value.image && import.meta.server) {
4040
defineOgImage({ url: joinURL(url, post.value.image) })
4141
}
4242

docs/app/pages/blog/index.vue

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,47 @@
11
<script setup lang="ts">
2-
// @ts-expect-error yaml is not typed
3-
import page from '.blog.yml'
2+
const page = {
3+
title: 'The NuxtHub Blog',
4+
navigation: {
5+
title: 'Blog'
6+
},
7+
description: 'Read the latest news about NuxtHub or articles about fullstack development with Nuxt.',
8+
icon: 'i-lucide-newspaper',
9+
hero: {
10+
title: 'Blog',
11+
description: 'Read the latest news about NuxtHub.',
12+
align: 'center',
13+
links: [
14+
{
15+
label: '@nuxt_hub',
16+
icon: 'i-simple-icons-x',
17+
color: 'neutral',
18+
variant: 'outline',
19+
size: 'sm',
20+
to: 'https://x.com/nuxt_hub',
21+
target: '_blank'
22+
},
23+
{
24+
label: 'NuxtHub',
25+
icon: 'i-simple-icons-linkedin',
26+
color: 'neutral',
27+
variant: 'outline',
28+
size: 'sm',
29+
to: 'https://www.linkedin.com/showcase/nuxthub/',
30+
target: '_blank'
31+
},
32+
{
33+
label: 'Blog RSS',
34+
icon: 'i-simple-icons-rss',
35+
to: '/blog/rss.xml',
36+
color: 'neutral',
37+
variant: 'outline',
38+
size: 'sm',
39+
target: '_blank'
40+
}
41+
]
42+
}
43+
44+
}
445
546
const { data: posts } = await useAsyncData('posts', async () => {
647
return queryCollection('blog')

docs/app/pages/changelog/.changelog.yml

Lines changed: 0 additions & 29 deletions
This file was deleted.

docs/app/pages/changelog/[slug].vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ useSeoMeta({
3636
ogTitle: `${title} · NuxtHub Blog`
3737
})
3838
39-
if (post.value.image) {
39+
if (post.value.image && import.meta.server) {
4040
defineOgImage({ url: joinURL(url, post.value.image) })
4141
}
4242

docs/app/pages/changelog/index.vue

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,43 @@
11
<script setup lang="ts">
2-
// @ts-expect-error yaml is not typed
3-
import page from '.changelog.yml'
2+
const page = {
3+
title: 'Changelog',
4+
description: 'Follow the latest updates and improvements of NuxtHub.',
5+
icon: 'i-lucide-megaphone',
6+
hero: {
7+
title: 'Changelog',
8+
description: 'Follow the latest updates and improvements of NuxtHub.',
9+
align: 'center',
10+
links: [
11+
{
12+
label: '@nuxt_hub',
13+
icon: 'i-simple-icons-x',
14+
color: 'neutral',
15+
variant: 'outline',
16+
size: 'sm',
17+
to: 'https://x.com/nuxt_hub',
18+
target: '_blank'
19+
},
20+
{
21+
label: 'NuxtHub',
22+
icon: 'i-simple-icons-linkedin',
23+
color: 'neutral',
24+
variant: 'outline',
25+
size: 'sm',
26+
to: 'https://www.linkedin.com/showcase/nuxthub/',
27+
target: '_blank'
28+
},
29+
{
30+
label: 'Changelog RSS',
31+
icon: 'i-simple-icons-rss',
32+
to: '/changelog/rss.xml',
33+
color: 'neutral',
34+
variant: 'outline',
35+
size: 'sm',
36+
target: '_blank'
37+
}
38+
]
39+
}
40+
}
441
542
definePageMeta({
643
primary: 'green'
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
---
2+
title: Self-Hosting First & Cloud-Agnostic Future
3+
description: "We are evolving NuxtHub to become a truly multi-cloud platform. This transition requires us to move away from features tightly coupled to a single cloud provider and adopt a more flexible, cloud-agnostic approach."
4+
date: 2025-11-25
5+
image: '/images/changelog/self-hosting-first.png'
6+
authors:
7+
- name: Rihan Arfan
8+
avatar:
9+
src: https://avatars.githubusercontent.com/u/20425781?v=4
10+
to: https://bsky.app/profile/rihan.dev
11+
username: rihan.dev
12+
- name: Sebastien Chopin
13+
avatar:
14+
src: https://avatars.githubusercontent.com/u/904724?v=4
15+
to: https://x.com/atinux
16+
username: atinux
17+
---
18+
19+
::tip
20+
This feature is available in [`@nuxthub/core >= v0.9.1`](https://github.com/nuxt-hub/core/releases/tag/v0.9.1).
21+
::
22+
23+
Following the [acquisition of NuxtLabs](https://nuxtlabs.com), we are evolving NuxtHub to become a truly multi-cloud platform. This transition requires us to move away from features tightly coupled to a single cloud provider and adopt a more flexible, cloud-agnostic approach.
24+
25+
## What's Changing
26+
27+
### NuxtHub Admin Sunset
28+
29+
**NuxtHub Admin will be sunset on December 31st, 2025.** This platform was designed specifically for Cloudflare deployments, which conflicts with our multi-cloud vision. We are now recommending all projects to adopt self-hosting practices.
30+
31+
::note{to="/docs/getting-started/deploy#self-hosted-recommended"}
32+
Read more about self-hosting.
33+
::
34+
35+
### Enhanced Self-Hosting Support
36+
37+
To ensure a smooth transition, we've significantly improved the self-hosting experience with direct Cloudflare API integration. You can now use more features without relying on NuxtHub Admin:
38+
39+
#### **Simplified Remote Storage Setup**
40+
- New `hub.projectUrl` configuration option for cleaner setup
41+
- Environment-based project URL selection (production/preview)
42+
- Direct project-to-project authentication via `NUXT_HUB_PROJECT_SECRET_KEY`
43+
- No more CLI linking required for remote storage access
44+
45+
::note{to="/docs/getting-started/remote-storage"}
46+
Read more about the remote storage setup.
47+
::
48+
49+
#### **Direct Cloudflare API Support**
50+
New environment variables enable direct API access for self-hosted projects:
51+
- `NUXT_HUB_CLOUDFLARE_ACCOUNT_ID` - Your Cloudflare account ID
52+
- `NUXT_HUB_CLOUDFLARE_API_TOKEN` - API token for service access
53+
- `NUXT_HUB_CLOUDFLARE_BUCKET_ID` - For R2 blob operations
54+
- `NUXT_HUB_CLOUDFLARE_CACHE_NAMESPACE_ID` - For KV cache operations
55+
56+
These credentials allow you to:
57+
- Run AI and AutoRAG models during local development
58+
- Perform cache bulk deletion operations with the Nuxt DevTools
59+
- Generate presigned URLs for blob uploads at runtime
60+
61+
### Cloud-Specific Features Deprecated
62+
63+
As part of our multi-cloud strategy, we are deprecating features that are specific to Cloudflare:
64+
65+
- **AI & AutoRAG** - Use [AI SDK](https://ai-sdk.dev/) with the [Workers AI Provider](https://ai-sdk.dev/providers/community-providers/cloudflare-workers-ai) instead, or access `process.env.AI` directly
66+
- **Browser (Puppeteer)** - Cloudflare-specific browser automation
67+
- **Vectorize** - Cloudflare's vector database
68+
- **Additional Bindings** - Direct Cloudflare Workers bindings
69+
70+
These features are now marked as deprecated in the documentation and will be removed in a future major version to maintain framework neutrality.
71+
72+
## Migration Guide
73+
74+
### For Current NuxtHub Admin Users
75+
76+
1. **Switch to self-hosting** by following the updated [remote storage documentation](/docs/getting-started/remote-storage)
77+
2. **Set up direct authentication** using `NUXT_HUB_PROJECT_SECRET_KEY`
78+
3. **Configure Cloudflare credentials** if using AI, AutoRAG, or advanced blob/cache features
79+
80+
### For Self-Hosted Projects
81+
82+
Update your environment configuration to use the new Cloudflare API credentials:
83+
84+
```bash [.env]
85+
# Required for remote storage
86+
NUXT_HUB_PROJECT_SECRET_KEY=<your-secret-key>
87+
88+
# Optional: for direct Cloudflare API features (AI, AutoRAG, etc.)
89+
NUXT_HUB_CLOUDFLARE_ACCOUNT_ID=<your-account-id>
90+
NUXT_HUB_CLOUDFLARE_API_TOKEN=<your-api-token>
91+
NUXT_HUB_CLOUDFLARE_BUCKET_ID=<your-bucket-id>
92+
NUXT_HUB_CLOUDFLARE_CACHE_NAMESPACE_ID=<your-namespace-id>
93+
```
94+
::note
95+
In the coming weeks, we will update the NuxtHub Admin with an easier migration path to help you either stay on Cloudflare or move to Vercel.
96+
::

0 commit comments

Comments
 (0)