21 Commits

Author SHA1 Message Date
Francismar Nascimento da Silva
e268d8026a docs: arquitetura, SSO, tema, operacao e o que sabemos do LearnHouse
Documenta como o cursos.overia.com.br e construido (LearnHouse 1.3.6 community
no NAS4, login pelo Keycloak via oauth2-proxy e ponte, tema overia injetado pelo
nginx, aulas por proxy /aulas), as armadilhas ja encontradas, o runbook de
publicacao, rollback, backup e atualizacao, e as decisoes e pendencias.

learnhouse-upstream.md resume o repositorio e a documentacao oficiais e marca onde
a doc diverge do codigo da imagem (cookies LH_*, politica de login por organizacao).

deploy/publicar-tema.sh publica deploy/theme e o nginx.prod.conf com nginx -t e
volta automatica; recebe host, porta, usuario e senha por variaveis de ambiente.

O repositorio e publico: nenhum IP, porta, usuario, conta ou segredo nos arquivos.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 00:03:45 -03:00
Francismar Nascimento da Silva
63687deffb feat(deploy): botao de tema (automatico/claro/escuro) e escuro das aulas
theme-toggle.js: botao no canto inferior esquerdo alterna automatico -> claro ->
escuro, guarda a escolha em localStorage e aplica data-theme em <html> antes da
pintura. O CSS escuro agora vale tanto pelo sistema (sem escolha manual) quanto
pela escolha "escuro"; as 26 regras sao as mesmas, so muda o prefixo.

Escuro para o conteudo das aulas (.markdown-body do github-markdown-css fixava
fundo branco): texto, links, codigo, citacoes e tabelas.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 23:46:08 -03:00
Francismar Nascimento da Silva
48d038d803 fix(deploy): aulas em Markdown pelo proxy do nginx, sem CORS
O Gitea nao envia Access-Control-Allow-Origin, entao o navegador bloqueava a
leitura do Markdown a partir de cursos.overia.com.br e toda aula mostrava
"Failed to fetch". Novo /aulas/<caminho>.md no nginx busca o arquivo no Gitea e o
serve no proprio dominio. So aceita GET/HEAD de .md sob courses/ do repositorio
ai-bot/cursos, rejeita "..", resolve o DNS em tempo de execucao (o nginx nao deixa
de subir se o Gitea estiver fora) e nao repassa cookies.

No banco, as 8 aulas passaram a apontar para /aulas (backup das linhas em
~/backups/learnhouse-20261003 no NAS4). README: GITEA_RAW_BASE agora deve ser
https://cursos.overia.com.br/aulas, senao uma nova publicacao desfaz a correcao.

O conf tambem referencia theme-toggle.js, que entra no commit seguinte.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 23:46:08 -03:00
Francismar Nascimento da Silva
8a08364161 fix(deploy): "cursos" do mesmo tamanho de "overia" no logo do cabecalho
As duas palavras usam a mesma fonte (Red Hat Display 600), tamanho (1.1rem) e
espacamento; "cursos" segue em verde e "overia" na cor do texto.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 23:35:14 -03:00
Francismar Nascimento da Silva
68a128b1ac feat(deploy): tema escuro do overia e rotulo "cursos" na marca
Variante escura (prefers-color-scheme: dark) com a paleta de overia.com.br
escuro: tokens shadcn em HSL e remapeamento das cores fixas do Tailwind
(bg-white, text-gray-*, border-gray-*, text-black/NN). Auditoria automatica
em 8 telas (home, cursos, library, podcasts, comunidades, playgrounds, curso e
aula): nenhum fundo claro e nenhum texto abaixo de contraste 3.

Marca do cabecalho em duas linhas: "cursos" (mono, verde) sobre "overia".
Logo da organizacao trocado pelo simbolo transparente, que serve aos dois temas.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 23:05:49 -03:00
Francismar Nascimento da Silva
5df9e41bf6 feat(deploy): tema overia no LearnHouse (cursos.overia.com.br)
CSS e fontes copiados de overia.com.br (tema claro): paleta verde/tinta,
Red Hat Display/Text e JetBrains Mono servidas localmente, cabecalho branco com
linha fina e marca "overia", botoes verdes, cartoes com contorno. O LearnHouse
nao tem modo escuro, entao so o claro e aplicado.

O nginx serve ./theme em /overia-theme/ (volume novo no compose) e injeta o link
da folha antes de </head>. A versao no ?v= deve subir a cada mudanca: o
Cloudflare guarda respostas, inclusive 404, por horas. Nao recriar a pasta
./theme no servidor (copiar o conteudo para dentro) ou o volume monta vazio.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 22:58:53 -03:00
Francismar Nascimento da Silva
5e79bf4aee chore(deploy): nginx e compose do oauth2-proxy e da ponte SSO no NAS4
nginx.prod.conf: /login e /signup passam pelo Keycloak (cadastro direto via
/registrations), /sso/login e /logout vao para a ponte, pre-busca ?_rsc do
Next.js responde 204 (senao /oauth2/start sobrescreve o cookie PKCE e o login
falha), botao Sair e interceptacao do Sign Out injetados so para quem tem
LH_access.

docker-compose.override.yml: oauth2-proxy (client cursos, realm overia) e
sso-bridge. Aplicar com: docker compose -p xen-learnhouse up -d --no-deps.
Os segredos ficam em oauth2-proxy.env, fora do repositorio.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 22:48:43 -03:00
Francismar Nascimento da Silva
0e0e33d6ce feat: ponte SSO entre Keycloak e a sessao do LearnHouse
Sidecar que roda com o codigo do proprio LearnHouse. Em /sso/login confirma a
identidade perguntando ao oauth2-proxy (nunca confia em cabecalho do cliente),
acha ou cria o usuario pelo e-mail verificado e emite LH_access, LH_refresh e
LH_session, que o frontend exige para considerar o usuario logado. /sso/logout
limpa os cookies e encerra a sessao no Keycloak.

Redirecionamento pos-login restrito a caminhos internos (padrao: home).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 22:48:34 -03:00
3be955fe5a docs: corrige comando sem -m, dono do repo Gitea, descricao e README
- spec: uso correto e' 'python -m scripts.publish', nao o caminho direto do
  arquivo (imports absolutos quebram sem -m); ajusta texto do --dry-run pra
  descrever o que ele realmente imprime (arvore + URLs, nao payload
  completo); deixa explicito que a URL em Referencias e' link Markdown.
- plan: dono real do repo Gitea e' ai-bot/cursos, nao ia-bot/cursos.
- pyproject.toml: descricao real do projeto.
- README.md novo: o que e' o repo, estrutura, variaveis de .env, comando de uso.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-30 21:22:25 -03:00
3ff7f5992a fix: inclui corpo da resposta na mensagem de erro HTTP do LearnHouseClient
raise_for_status() sozinho so mostra status code, sem o corpo do erro 4xx/5xx
da API - dificulta debug. Centralizado num helper _raise_for_status pra nao
repetir try/except em cada metodo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-30 21:22:20 -03:00
d51636265f fix: publish_course nao recria capitulos/atividades de curso existente
Bug critico: ao publicar um curso ja existente com --publish, o codigo
atualizava metadados mas continuava chamando create_chapter/create_markdown_activity
do zero, duplicando a estrutura (ja aconteceu em producao, dados orfaos
corrigidos manualmente via API).

Agora, se o curso ja existe: so atualiza metadados; se publish=True, busca
a estrutura real via get_course_chapters (novo metodo, GET /courses/{uuid}/meta)
e publica so as atividades ainda nao publicadas, sem recriar nada.

Decisao: ignora atividades ja publicadas (nao rechama publish_activity nelas)
em vez de rechamar por simplicidade - evita chamadas HTTP redundantes sem
custo de complexidade adicional.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-30 21:20:19 -03:00
e9c04b5d0c chore: gitignorar __pycache__ e .venv
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 17:24:53 -03:00
232347fd84 content: capitulo 2 (Sintaxe Basica) do curso Python do Zero
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-29 16:00:10 -03:00
6819e7513f content: capitulo 1 (Introducao) do curso Python do Zero 2026-09-29 15:57:54 -03:00
8581cdb96e feat: CLI publish.py liga course_loader e LearnHouseClient
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 15:55:01 -03:00
e3baab88d1 feat: LearnHouseClient encapsula chamadas da API
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-29 15:52:23 -03:00
d9af91c961 feat: course_loader le arvore de pastas em Course/Chapter/Lesson 2026-09-29 15:49:35 -03:00
156dacf2d9 fix: remover dependência de src/cursos_overia para build
Remove seção [project.scripts] que causava erro de build ao procurar
src/cursos_overia/__init__.py (não commitado). Adiciona [tool.uv] package=false
para evitar tentar buildá-lo como pacote instalável.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-29 15:47:10 -03:00
e074735e4d chore: scaffold projeto uv + carregador de .env
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-29 15:44:11 -03:00
61ffe6c279 docs: spec e plano da série de cursos overia (pipeline LearnHouse)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 15:41:46 -03:00
0db74017dc Initial commit 2026-09-29 14:22:29 -03:00