Fumadocs + GitLab Pages

Deploy no GitLab Pages

Export estático do Next.js e pipeline de CI/CD para publicar a documentação no GitLab Pages.

Editar no GitLab
Como Fazer Deploy do Fumadocs no GitLab Pages com CI/CD

O GitLab Pages serve arquivos estáticos a partir de um diretório chamado public, gerado por um job de CI com nome pages. O trabalho, então, é fazer o Next.js gerar HTML estático e entregar esse HTML no lugar certo.

1. Export estático do Next.js

next.config.mjs
import { createMDX } from 'fumadocs-mdx/next';

const withMDX = createMDX();

/** @type {import('next').NextConfig} */
const nextConfig = {
  output: 'export',
  // Gera `/rota/index.html` para que o host estático sirva links diretos após um refresh.
  trailingSlash: true,
};

export default withMDX(nextConfig);
  • output: 'export' faz next build escrever o site pronto na pasta out/.
  • trailingSlash: true gera rota/index.html em vez de rota.html. Sem isso, atualizar a página em uma URL profunda dá 404 no GitLab Pages.

O que não sobrevive ao export

No modo estático não existe servidor: rotas dinâmicas, revalidate com tempo, middleware e otimização de imagem sob demanda ficam de fora. Por isso a busca deste projeto é estática (staticGET em app/api/search/route.ts) e o proxy.ts só funciona em desenvolvimento.

2. O pipeline

.gitlab-ci.yml
stages:
  - build
  - deploy

build:
  stage: build
  image: oven/bun
  script:
    - bun install
    - bun run build
  artifacts:
    paths:
      - out

pages:
  stage: deploy
  script:
    - echo "Deploying to GitLab Pages..."
    - mv out public
  artifacts:
    paths:
      - public
    expire_in: 30 days

Como isso funciona:

  1. O job build roda na imagem oven/bun, instala as dependências e gera out/.
  2. artifacts: paths: [out] guarda o resultado — sem isso, o próximo estágio começaria com o diretório vazio.
  3. O job precisa se chamar pages: é esse nome que o GitLab reconhece como publicação.
  4. mv out public renomeia o diretório para o único nome que o Pages serve.
  5. O artefato public é o que vai para o ar.

Nome do job e nome da pasta

Os dois são convenções fixas do GitLab: job pages, pasta public. Errar um dos dois faz o pipeline passar em verde sem publicar nada.

3. Publicando

Terminal
git add .
git commit -m "docs: nova página"
git push

Acompanhe em Build → Pipelines e, quando terminar, a URL aparece em Deploy → Pages.

Ajustes que costumam aparecer

Acontece quando o projeto é servido em um subcaminho, como https://<grupo>.gitlab.io/<projeto>/. Nesse caso o Next.js precisa saber o prefixo:

next.config.mjs
const nextConfig = {
  output: 'export',
  trailingSlash: true,
  basePath: '/fumadocs-gitlab-pages',
};

Se o projeto usa o domínio único do GitLab Pages (uma URL própria do tipo https://<projeto>-<hash>.gitlab.io/, hoje o padrão) ou um domínio personalizado, o site fica na raiz e basePath não é necessário.

Publicar só a partir da branch principal

Por padrão o pipeline roda em qualquer branch. Para publicar apenas o que entra na main:

.gitlab-ci.yml
pages:
  stage: deploy
  script:
    - mv out public
  artifacts:
    paths:
      - public
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

O build demora a cada push

Vale guardar o cache das dependências entre execuções:

.gitlab-ci.yml
build:
  stage: build
  image: oven/bun
  cache:
    key:
      files:
        - bun.lock
    paths:
      - node_modules
  script:
    - bun install
    - bun run build
  artifacts:
    paths:
      - out

Referências

On this page