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>
This commit is contained in:
Francismar Nascimento da Silva
2026-10-03 23:46:08 -03:00
parent 8a08364161
commit 48d038d803
2 changed files with 31 additions and 5 deletions

View File

@@ -24,9 +24,11 @@ LEARNHOUSE_ORG_SLUG=
GITEA_RAW_BASE=
```
`GITEA_RAW_BASE` é a raiz raw do repo no Gitea (ex:
`https://git.xenserver.com.br/ai-bot/cursos/raw/branch/main/courses`), usada
pra montar a URL de cada aula Markdown.
`GITEA_RAW_BASE` é a base usada pra montar a URL de cada aula Markdown. Use
`https://cursos.overia.com.br/aulas`: o nginx do LearnHouse repassa `/aulas/<caminho>.md`
pra `https://git.xenserver.com.br/ai-bot/cursos/raw/branch/main/courses/<caminho>.md`.
**Não** use a URL raw do Gitea direto: ela não envia `Access-Control-Allow-Origin` e o
navegador bloqueia a leitura (a aula mostra "Failed to fetch").
## Uso

View File

@@ -1,3 +1,11 @@
# Aulas em Markdown: o Gitea não envia Access-Control-Allow-Origin, então o navegador bloqueia a leitura direta
# a partir de cursos.overia.com.br. Este proxy serve o mesmo arquivo no próprio domínio (/aulas/...).
# Só caminhos .md, sem "..", sempre sob courses/ do repositório ai-bot/cursos (o $request_uri mantém o escape original).
map $request_uri $gitea_aula {
default "";
"~^/aulas/(?<aula_path>(?!.*\.\.)[^?#]+\.md)(?:\?.*)?$" /ai-bot/cursos/raw/branch/main/courses/$aula_path;
}
# Botão "Sair" só para quem tem a sessão do LearnHouse (cookie LH_access; $cookie_ não lê nome em maiúsculas).
map $http_cookie $ov_logout_btn {
default "";
@@ -71,6 +79,22 @@ server {
return 302 https://$http_host/oauth2/start?rd=$request_uri;
}
location ^~ /aulas/ {
if ($request_method !~ ^(GET|HEAD)$) { return 405; }
if ($gitea_aula = "") { return 404; }
resolver 127.0.0.11 valid=60s ipv6=off;
proxy_pass https://git.xenserver.com.br$gitea_aula;
proxy_ssl_server_name on;
proxy_set_header Host git.xenserver.com.br;
proxy_set_header Accept-Encoding "";
proxy_set_header Cookie "";
proxy_hide_header Set-Cookie;
proxy_connect_timeout 5s;
proxy_read_timeout 15s;
expires 5m;
add_header X-Content-Type-Options nosniff;
}
# Tema overia (CSS + fontes), montado de ./theme no container do nginx.
location ^~ /overia-theme/ {
alias /usr/share/nginx/overia-theme/;
@@ -129,7 +153,7 @@ server {
proxy_pass http://learnhouse-app:80;
proxy_set_header Accept-Encoding "";
sub_filter_once on;
sub_filter '</head>' '<link rel="stylesheet" href="/overia-theme/overia.css?v=9"></head>';
sub_filter '</head>' '<link rel="stylesheet" href="/overia-theme/overia.css?v=11"><script src="/overia-theme/theme-toggle.js?v=1"></script></head>';
sub_filter '</body>' '$ov_logout_btn</body>';
# Use $http_host (not $host) so the port is preserved — Next.js Server
# Actions reject POSTs where origin and x-forwarded-host disagree.
@@ -156,7 +180,7 @@ server {
proxy_pass http://learnhouse-app:80;
proxy_set_header Accept-Encoding "";
sub_filter_once on;
sub_filter '</head>' '<link rel="stylesheet" href="/overia-theme/overia.css?v=9"></head>';
sub_filter '</head>' '<link rel="stylesheet" href="/overia-theme/overia.css?v=11"><script src="/overia-theme/theme-toggle.js?v=1"></script></head>';
sub_filter '</body>' '$ov_logout_btn</body>';
# Use $http_host (not $host) so the port is preserved — Next.js Server
# Actions reject POSTs where origin and x-forwarded-host disagree.