https://rayssenleonardo-source.github.io/Organograma/
├── frontend/ # Interface (HTML, CSS, JS)
│ ├── index.html # Organograma principal
│ ├── organograma-2.html # Organograma de cargos
│ ├── css/
│ │ └── style.css
│ ├── js/
│ │ ├── script.js
│ │ └── organograma-2.js
│ └── admin/ # Painel administrativo
│ ├── login.html
│ ├── login.js
│ ├── login.css
│ ├── admin.html
│ ├── admin.js
│ ├── admin.css
│ ├── admin-org2.html
│ └── admin-org2.js
├── data/
│ └── dados.json # Dados do organograma
├── backend/
│ ├── app.py # API Flask
│ └── requirements.txt
├── uploads/ # Fotos enviadas
├── deploy/
│ ├── Dockerfile
│ ├── docker-compose.yml
│ └── render.yaml
├── docs/
│ ├── pessoas.md
│ └── images.md
└── .github/workflows/
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python app.py
API padrão: http://127.0.0.1:5000
/api.Salvar no Servidor grava direto em data/dados.json.uploads/ e grava a URL no JSON.uploads/ (quando a foto veio do backend).Se as variáveis do Supabase estiverem configuradas, dados e fotos passam a ser salvos no Supabase automaticamente.
GET /api/healthGET /api/dadosPUT /api/dadosPOST /api/upload-photo (multipart file)DELETE /api/photo (JSON { "url": "..." })docker compose -f deploy/docker-compose.yml up -d --build
Use --build sempre que alterar arquivos da interface, como *.html, *.js e *.css.
No docker-compose.yml, apenas data/dados.json e uploads/ são montados como volume; o restante do código fica dentro da imagem.
docker compose -f deploy/docker-compose.yml logs -f
docker compose -f deploy/docker-compose.yml down
Aplicação: http://localhost:5001
Este repositório já inclui deploy/render.yaml para subir como Web Service Python.
New + > Blueprint.organograma usando o deploy/render.yaml.Pythonbackendpip install --upgrade pip && pip install -r requirements.txtgunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 2 --timeout 120 --max-requests 500 --max-requests-jitter 50 app:app/api/healthFLASK_DEBUG=falseDATA_FILE=/tmp/data/dados.jsonUPLOADS_DIR=/tmp/uploadsSUPABASE_URL=https://SEU-PROJETO.supabase.coSUPABASE_SERVICE_ROLE_KEY=...SUPABASE_DATA_TABLE=organograma_dataSUPABASE_DATA_ROW_ID=mainSUPABASE_STORAGE_BUCKET=organograma-uploadsSUPABASE_STORAGE_PREFIX=organogramaNo plano Free do Render, o filesystem é temporário. Para persistência real use Supabase.
No SQL Editor do Supabase, rode:
create table if not exists public.organograma_data (
id text primary key,
payload jsonb not null,
updated_at timestamptz not null default now()
);
organograma-uploadsPublicSUPABASE_URLSUPABASE_SERVICE_ROLE_KEY (usar a Service Role, não a anon)SUPABASE_DATA_TABLE=organograma_dataSUPABASE_DATA_ROW_ID=mainSUPABASE_STORAGE_BUCKET=organograma-uploadsSUPABASE_STORAGE_PREFIX=organograma (opcional)Este repositório tem o workflow .github/workflows/sync-dados-render.yml.
Ele busca GET /api/dados no serviço publicado e, se houver mudança, atualiza data/dados.json e faz commit na main.
Settings > Secrets and variables > Actions > Variables.RENDER_API_DADOS_URL com a URL completa do endpoint, por exemplo:
https://SEU-SERVICO.onrender.com/api/dadosActions > workflow Sync dados.json from Render.Run workflow.api_url no formulário (se vazio, usa RENDER_API_DADOS_URL).