- -
server_name rochasalesseguros.com.br www.rochasalesseguros.com.br
- -
root /opt/rochasales/dist ← this is what serves the live site Key files in /opt/rochasales/
`
src/
pages/Admin.tsx # Admin panel (route: /admin)
pages/AdminLogin.tsx # Login page
pages/BrokerArea.tsx # Broker area (route: /area-corretor)
pages/Index.tsx # Main landing page
components/admin/
ToolsManager.tsx # Ferramentas section — manages broker_links + tool_role_access
UsersManager.tsx # User management
RolesManager.tsx # Cargos — manages custom_roles + user_roles
TextsEditor.tsx # Textos — manages cms_content
ColorsEditor.tsx # Cores
MediaEditor.tsx # Imagens & Vídeos
LayoutEditor.tsx # Layout & Seções
SiteOverview.tsx # Visão Geral dashboard
lib/adminAuth.ts # Auth logic (Supabase)
integrations/supabase/client.ts # Supabase client
vite.config.ts # Build config
package.json
dist/ # Production build (what nginx serves)
node_modules/ # Must run npm install after changing package.json
`
Admin Panel — Ferramentas Section (ToolsManager.tsx)
Source: /opt/rochasales/src/components/admin/ToolsManager.tsx
Backend table: public.broker_links (in deploy-vps-db-1)
`sql
id UUID PK
title TEXT -- e.g. "Área do Corretor"
url TEXT -- e.g. "/area-corretor"
description TEXT NULL
icon TEXT NULL -- e.g. "tool" or FontAwesome class
display_order INTEGER
is_active BOOLEAN -- controls Ativa/Inativa badge in UI
`
Access control: public.tool_role_access links broker_link_id → custom_role_id
Current tools in DB (June 2026): Only 1 row — "Área do Corretor" (id: 2b4df465-da14-4806-aac3-4163ededf346)
Ferramentas UI behavior:
- - Shows all
broker_links rows ordered by display_order
- - Inactive tools (is_active=false) show "Inativa" badge and opacity:0.6
- - "Nova Ferramenta" button opens create form (title, URL, description, icon, is_active toggle)
- - Edit/Delete icons per tool card
- - Visibility is controlled by
tool_role_access (role-based tool access) Other apps on VPS (COMPLETELY SEPARATE — do NOT touch)
- -
/var/www/comercialrs/ — ComercialRS CRM
- -
/var/www/documentos/ — DocCorretor
- -
/var/www/documentos2/ — DocCorretor v2
- -
/var/www/chatwoot-kanban/ — Chatwoot Kanban
- -
/var/www/n8n/ — n8n automation (leftover 48KB; real n8n runs as Docker container)
- -
/var/www/obsidian-vault/ — Obsidian vault central de conhecimento (Jun 2026)
- -
/var/www/evolution-manager/ — REMOVED Jun 2026 (Evolution API was unused; containers + volume deleted, port 8080 freed) Deployment Workflow
1. Edit source in /opt/rochasales/src/
2. If changed package.json: cd /opt/rochasales && npm install --legacy-peer-deps
3. Build: cd /opt/rochasales && npm run build (outputs to dist/)
4. Reload nginx: nginx -s reload
5. Verify: check site loads, check admin login works
Admin Login
- - URL:
https://rochasalesseguros.com.br/admin
- - Credentials:
davi.freire@rochasalesseguros.com.br / 131415pi Supabase Stack (deploy-vps) — DO NOT TOUCH
Location: /docker/deploy-vps/ — THIS IS THE SUPABASE SELF-HOSTED STACK FOR THE CMS
| Container | Purpose | Status |
| --- | --- | --- |
| deploy-vps-db-1 | PostgreSQL 15 — hosts broker_links, cms_content, custom_roles, leads, profiles, tool_role_access, user_roles tables | Active |
| deploy-vps-auth-1 | GoTrue auth server (port 9999 internal) | Active |
| deploy-vps-kong-1 | API gateway (port 8000) — routes /auth/v1/, /rest/v1/ | Active |
| deploy-vps-rest-1 | PostgREST (port 3000 internal) | Active |
| deploy-vps-storage-1 | Storage server | Active |
| deploy-vps-functions-1 | Edge Functions | Active |
| deploy-vps-studio-1 | Supabase Studio (unhealthy) | Unhealthy |
DB access: docker exec deploy-vps-db-1 psql postgresql://postgres:Rochasales2024@localhost:5432/postgres
PostgREST reload: docker restart deploy-vps-rest-1
Anon's JWT: eyJ_REDACTED
JWT Secret: kETxz0JNJhJyg5UYxbd8zG6g2v9kXTYZGjY+3v7LUKI
Lovable-tagger Removal
Critical Bug: Password Update in UsersManager
Problem: In UsersManager.tsx, editing an existing user never showed the password field, and handleSave only updated the profiles table — never calling auth.admin.updateUser().
Fix applied:
- - Added password
Input field to edit form (was !editing && guard removed)
- - Added
supabase.auth.admin.updateUser(editing, { password: form.password }) call in the else branch of handleSave when editing
- - Only updates password if field is non-empty and >= 6 chars
Admin login: davi.freire@rochasalesseguros.com.br / 131415pi
Lovable-tagger Removal
What it was: lovable-tagger — a Vite plugin that injected analytics/tracking code during development builds. It was in:
- -
package.json devDependencies
- -
vite.config.ts as componentTagger() in plugins array (only active in mode === "development") Impact: Zero in production. The production build never included lovable-tagger code. Removed anyway to eliminate Lovable platform dependency.
How to verify clean build:
`bash
grep -ao 'lovable\|componentTagger' /opt/rochasales/dist/assets/*.js
Should return nothing
`
Supabase Edge Functions
Functions at /opt/rochasales/supabase/functions/ — routes via Kong at 8000/functions/v1/.
Critical: The Edge Runtime expects main/index.ts inside the functions directory:
`
/opt/rochasales/supabase/functions/
main/index.ts ← required for deploy-vps-functions-1 to start
manage-users/ ← extra function
`
If main/ is missing, the deploy-vps-functions-1 container enters a restart loop with no useful logs. See supabase-edge-runtime-vps-debug skill.
Como Descobrir Quem É Admin (consulta direta no banco)
O admin CMS não vem do Supabase Auth — tem um sistema de cargos próprio em 3 tabelas:
`sql
-- 1. Ver todos os usuários com cargo no CMS
SELECT ur.role, au.email
FROM public.user_roles ur
JOIN auth.users au ON ur.user_id = au.id
ORDER BY ur.created_at;
-- Resultado típico:
-- role | email
-- -------+--------------------------------------
-- admin | admin@rochasalesseguros.com.br
-- admin | davi.freire@rochasalesseguros.com.br
-- 2. Ver todos os cargos disponíveis (Administrador, Corretor, etc.)
SELECT * FROM public.custom_roles;
-- has_admin_access = true → acesso total ao CMS
-- has_admin_access = false → acesso limitado
-- 3. Verificar se existe tool_role_access (acesso granular às ferramentas)
SELECT * FROM public.tool_role_access; -- geralmente vazio
`
Resultado real (Jun 2026):
- -
admin@rochasalesseguros.com.br — Administrador (has_admin_access=true)
- -
davi.freire@rochasalesseguros.com.br — Administrador (has_admin_access=true)
- - Ambos têm nível igual — não existe "super admin" acima deles
Se precisar criar um novo admin:
`sql
-- Primeiro descubra o user_id do email
SELECT id FROM auth.users WHERE email = 'novo@email.com';
-- Depois insira na user_roles
INSERT INTO public.user_roles (id, user_id, role, created_at)
VALUES (gen_random_uuid(), '', 'admin', NOW());
`
VPS Access
- - IP:
31.97.243.106
- - Root password:
Marcia19671951@
- - SSH:
sshpass -p 'Marcia19671951@' ssh -o StrictHostKeyChecking=no root@31.97.243.106 Obsidian Vault (Jun 2026)
Location: /var/www/obsidian-vault/
URL: https://obsidian.rochasalesseguros.com.br (nginx autoindex serves raw .md files)
Installed via: snap install obsidian --classic (v1.12.7)
Vault structure:
`
/var/www/obsidian-vault/
00-MOCS/ — Maps of Content (índices mestres)
01-MEMORY/ — Memórias Hermes → Obsidian
02-AGENTS/ — Configurações de agentes
03-SUPABASE/ — Documentação schema e APIs
04-PROJECTS/ — Projetos ativos
05-WORKFLOWS/ — Fluxos operacionais
06-LOGS/ — Histórico e logs
07-DECISIONS/ — Decisões arquiteturais
08-KNOWLEDGE/ — Base de conhecimento
09-DOCUMENTATION/ — Documentação geral
10-BACKUPS/ — Backups
11-ARCHIVE/ — Arquivo
index.md — Página inicial do vault
`
Acesso Obsidian (desktop/mobile): Vault path = /var/www/obsidian-vault/
- - Para acesso local no PC: usar Obsidian Sync ou Git sync
- - Para site estático no browser: considerar Quartz (open-source, gratuito)
- - Obsidian Publish (~$10/mês) é a opção oficial paga
Nginx config: /etc/nginx/sites-available/obsidian.rochasalesseguros.com.br
- - SSL via Let's Encrypt (certbot, auto-renew)
- -
autoindex on para listar diretórios
- -
default_type text/markdown para servir .md como texto HEADLESS RUN (servidor sem GUI):
`bash
xvfb-run -a /snap/obsidian/62/obsidian --no-sandbox --disable-gpu
`
Dependências necessárias: apt install xvfb libgtk-3-0 libnotify-dev libnss3 libxss1
Docker Containers Ativos (Jun 2026)
| Container | Image | Status |
| --- | --- | --- |
| root-postgres | supabase/postgres | Exited (pgvector, não usado) |
| root-sidekiq-1 | sameersbn/redis:latest | Running |
| root-rails-1 | sameersbn/redis:latest | Running |
| n8n-postgres | postgres:16 | Running |
| n8n | n8nio/n8n | Running |
| ollama | ollama/ollama:latest | Running |
| imgproxy | apiary/estafette-imgproxy | Running |
| chatwoot-kanban-db | postgres:16 | Running |
| chatwoot-kanban-redis | redis:7 | Running |
| chatwoot-kanban-app | chatwoot/chatwoot:latest | Running |
| chatwoot-kanban-sidekiq | chatwoot/chatwoot:latest | Running |
| chatwoot-kanban-caddy | caddy:2 | Running |