Login Fix — FINALIZADO ✅ (Jun 16, 2026 — 18:10 UTC)
✅ STATUS: 100% FUNCIONANDO
Testes finais (todos OK)
`
SITE: 200 ✅
REST /cms_content: [] ✅ (vazio mas OK)
REST /profiles: [{"email":"tecrochasales@gmail.com","full_name":"TecRocha Sales"}] ✅
REST /leads: [] ✅ (vazio mas OK)
AUTH LOGIN: OK - token received ✅
`
Login
- - Email:
tecrochasales@gmail.com - - Senha:
Rochasales2024 - - User UUID:
fd1fb25e-2cde-47be-9119-1f649833c7a4 - - Role:
admin - - Arquivo:
/docker/deploy-vps/pg_hba.conf - - Bind mount no compose:
/docker/deploy-vps/pg_hba.conf:/etc/postgresql/pg_hba.conf:ro - - Agora sobrevive a qualquer restart/recreate do container DB
- -
profiles✅ - -
custom_roles✅ - -
user_roles✅ - -
cms_content✅ - -
leads✅ - -
broker_links✅ - -
tool_role_access✅ - -
admin,anon,authenticated,service_role - -
GOTRUE_DB_DATABASE_URL=postgres://...@db:5432/postgres?options=-csearch_path%3Dauth%2Cpublic - - Auth:
172.23.0.4→proxy_pass http://172.23.0.4:9999 - - Rest:
172.23.0.7→proxy_pass http://172.23.0.7:3000 - - IP:
31.97.243.106 - - SSH:
root/Marcia19671951@
O que foi corrigido permanentemente
1. pg_hba.conf trust (PERMANENTE)
2. Tabelas públicas recriadas
3. Roles PostgreSQL recriados
4. GoTrue search_path
5. nginx proxy IPs
⚠️ SE ALGO PARAR NO FUTURO
Se auth voltar a dar 500 ou "invalid_grant":
1. Ver se container DB está rodando: docker ps | grep db
2. Ver se auth conecta: curl -s http://localhost:9999/health
3. Restartar auth: docker restart deploy-vps-auth-1
Se nginx der 502:
Verificar IPs dos containers e atualizar /etc/nginx/sites-enabled/rochasales.conf:
`bash
Obter IPs atuais
docker inspect deploy-vps-auth-1 --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
docker inspect deploy-vps-rest-1 --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
`
Se tables sumirem de novo:
Rodar o SQL de recovery (mais abaixo)
Para recriar admin (se perder)
`bash
docker exec deploy-vps-auth-1 gotrue admin createuser tecrochasales@gmail.com Rochasales2024 --admin --confirm
`
SQL de recovery completo (se tables forem apagadas)
`sql
-- Roles
CREATE ROLE admin NOLOGIN;
CREATE ROLE anon NOLOGIN;
CREATE ROLE authenticated NOLOGIN;
CREATE ROLE service_role NOLOGIN;
GRANT ALL ON SCHEMA public TO admin;
GRANT USAGE ON SCHEMA public TO anon;
GRANT USAGE ON SCHEMA public TO authenticated;
GRANT ALL ON SCHEMA public TO service_role;
-- Tables
CREATE TABLE public.profiles (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID UNIQUE NOT NULL, email TEXT, full_name TEXT, is_active BOOLEAN DEFAULT true, created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now());
CREATE TABLE public.custom_roles (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT UNIQUE NOT NULL, has_admin_access BOOLEAN DEFAULT false, can_manage_users BOOLEAN DEFAULT false, can_manage_cms BOOLEAN DEFAULT false, created_at TIMESTAMPTZ DEFAULT now());
CREATE TABLE public.user_roles (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL, role TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT now());
CREATE TABLE public.cms_content (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), title TEXT, slug TEXT UNIQUE, content JSONB DEFAULT '{}', page TEXT, is_published BOOLEAN DEFAULT false, created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now());
CREATE TABLE public.leads (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT, email TEXT, phone TEXT, source TEXT, status TEXT DEFAULT 'novo', notes TEXT, created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now());
CREATE TABLE public.broker_links (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL, token TEXT UNIQUE NOT NULL, folder_id TEXT, client_id TEXT, created_at TIMESTAMPTZ DEFAULT now());
CREATE TABLE public.tool_role_access (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), role_name TEXT NOT NULL, tool_name TEXT NOT NULL, can_access BOOLEAN DEFAULT true, UNIQUE(role_name, tool_name));
-- RLS
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.custom_roles ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.user_roles ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.cms_content ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.leads ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.broker_links ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.tool_role_access ENABLE ROW LEVEL SECURITY;
-- Policies
CREATE POLICY profiles_all ON public.profiles FOR ALL TO anon, authenticated, admin, service_role USING (true) WITH CHECK (true);
CREATE POLICY custom_roles_all ON public.custom_roles FOR ALL TO anon, authenticated, admin, service_role USING (true) WITH CHECK (true);
CREATE POLICY user_roles_all ON public.user_roles FOR ALL TO anon, authenticated, admin, service_role USING (true) WITH CHECK (true);
CREATE POLICY cms_content_all ON public.cms_content FOR ALL TO anon, authenticated, admin, service_role USING (true) WITH CHECK (true);
CREATE POLICY leads_all ON public.leads FOR ALL TO anon, authenticated, admin, service_role USING (true) WITH CHECK (true);
CREATE POLICY broker_links_all ON public.broker_links FOR ALL TO anon, authenticated, admin, service_role USING (true) WITH CHECK (true);
CREATE POLICY tool_role_access_all ON public.tool_role_access FOR ALL TO anon, authenticated, admin, service_role USING (true) WITH CHECK (true);
-- Grants
GRANT SELECT ON public.profiles TO anon, authenticated, admin;
GRANT ALL ON public.profiles TO admin, service_role;
GRANT SELECT ON public.custom_roles TO anon, authenticated, admin;
GRANT ALL ON public.custom_roles TO admin, service_role;
GRANT SELECT ON public.user_roles TO anon, authenticated, admin;
GRANT ALL ON public.user_roles TO admin, service_role;
GRANT SELECT ON public.cms_content TO anon, authenticated, admin;
GRANT ALL ON public.cms_content TO admin, service_role;
GRANT SELECT ON public.leads TO anon, authenticated, admin;
GRANT ALL ON public.leads TO admin, service_role;
GRANT SELECT ON public.broker_links TO anon, authenticated, admin;
GRANT ALL ON public.broker_links TO admin, service_role;
GRANT SELECT ON public.tool_role_access TO anon, authenticated, admin;
GRANT ALL ON public.tool_role_access TO admin, service_role;
-- Profile admin
INSERT INTO public.profiles (user_id, email, full_name, is_active) VALUES ('fd1fb25e-2cde-47be-9119-1f649833c7a4', 'tecrochasales@gmail.com', 'TecRocha Sales', true) ON CONFLICT (user_id) DO NOTHING;
INSERT INTO public.custom_roles (name, has_admin_access, can_manage_users, can_manage_cms) VALUES ('admin', true, true, true) ON CONFLICT (name) DO NOTHING;
INSERT INTO public.user_roles (user_id, role) VALUES ('fd1fb25e-2cde-47be-9119-1f649833c7a4', 'admin') ON CONFLICT DO NOTHING;
`
Arquivos críticos
| Arquivo | O que faz |
| --- | --- |
/docker/deploy-vps/pg_hba.conf | Trust auth - permanente via bind mount |
/docker/deploy-vps/docker-compose.yml | Define bind mount + volume do banco |
/etc/nginx/sites-enabled/rochasales.conf | Proxy auth e rest (IPs podem mudar) |
/docker/deploy-vps/.env | Credenciais (POSTGRES_PASSWORD=*) |