📄 SKILL.md

← Vault

name: rochasales-vps-project-map

description: Project map, conventions and critical fixes for rochasalesseguros.com.br VPS (31.97.243.106)


Rocha Sales VPS — Project Map & Conventions

Project Structure on VPS (31.97.243.106)

The VPS at / has two separate rochasales projects:

nginx config: /etc/nginx/sites-enabled/rochasales.conf

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)

    PathContentServed ViaStatus
    ------------
    /opt/rochasales/CURRENT SITE — full React src + Admin panel + Supabasenginx → /opt/rochasales/distActive, built Apr 2026
    /var/www/rochasales/OLD static site (backup, no node_modules)Was old nginx configDeprecated
    ContainerPurposeStatus
    ---------
    deploy-vps-db-1PostgreSQL 15 — hosts broker_links, cms_content, custom_roles, leads, profiles, tool_role_access, user_roles tablesActive
    deploy-vps-auth-1GoTrue auth server (port 9999 internal)Active
    deploy-vps-kong-1API gateway (port 8000) — routes /auth/v1/, /rest/v1/Active
    deploy-vps-rest-1PostgREST (port 3000 internal)Active
    deploy-vps-storage-1Storage serverActive
    deploy-vps-functions-1Edge FunctionsActive
    deploy-vps-studio-1Supabase Studio (unhealthy)Unhealthy
    ContainerImageStatus
    ---------
    root-postgressupabase/postgresExited (pgvector, não usado)
    root-sidekiq-1sameersbn/redis:latestRunning
    root-rails-1sameersbn/redis:latestRunning
    n8n-postgrespostgres:16Running
    n8nn8nio/n8nRunning
    ollamaollama/ollama:latestRunning
    imgproxyapiary/estafette-imgproxyRunning
    chatwoot-kanban-dbpostgres:16Running
    chatwoot-kanban-redisredis:7Running
    chatwoot-kanban-appchatwoot/chatwoot:latestRunning
    chatwoot-kanban-sidekiqchatwoot/chatwoot:latestRunning
    chatwoot-kanban-caddycaddy:2Running

    Volumes Docker órfãos removidos (Jun 2026):

  • - ollama-nef5_ollama (~15GB) — era do Evolution API, órfão
  • - ollama_data (~1.8GB) — órfão
  • - evolution_evolution_postgres (48MB) — Evolution API, removido
  • Volumes em uso (NÃO REMOVER):

  • - ollama-d0xb_ollama — volume ativo do container ollama (diferente de ollama-nef5_ollama)