Sede Electrónica — Puesta a producción
Para qué sirve esta guía
Pasos concretos para activar la Sede Electrónica de una entidad nueva (o pasar la actual de desarrollo a producción): DNS, Cl@ve PIN real, tema y branding, catálogo de trámites, vinculaciones de información pública, reparto de áreas y publicación final.
Prerrequisitos
| Requisito | Por qué | Cómo se obtiene |
|---|---|---|
Subdominio propio (sede.<ayto>.es) |
La sede tiene valor administrativo y debe vivir en su propio subdominio, separado de la web corporativa. | Alta DNS en el proveedor del ayuntamiento. CNAME apuntando al frontal. |
| Certificado TLS para el subdominio | Obligatorio — la sede maneja identificación electrónica. | Let's Encrypt, Sectigo o el certificado del ayuntamiento. |
| Cl@ve PIN alta como Service Provider (SP) | Para que el ciudadano se identifique con Cl@ve. | Alta en el portal de proveedores de Cl@ve del MINHAP (administracionelectronica.gob.es). Tarda ~1 mes. |
| Certificado FNMT de la entidad (recomendado) | Para firmar las notificaciones electrónicas y para conectar con DEHú si se opta por integrarse. | Solicitud en la FNMT, presencial para representantes legales. |
| Logos y branding | Imagen institucional. | Logo en PNG/SVG transparente, logo monocromo blanco para hero. |
Variables de entorno
# .env
# ---------- Resolución de la entidad por subdominio ----------
# En producción la sede resuelve por Host: HTTP entrante. En dev se
# puede simular con ?dominio=... o ?entidad_id=...
SEDE_DOMINIO_FALLBACK=sede.dev.local
# ---------- Cl@ve PIN ----------
# IdP nacional o mock. En dev el mock está siempre disponible.
CLAVE_MODE=production # production | mock
CLAVE_IDP_URL=https://se-pasarela.clave.gob.es/...
CLAVE_SP_ENTITY_ID=https://sede.plasencia.es/clave/sp
CLAVE_SP_CERT_PATH=/secrets/clave_sp.crt
CLAVE_SP_KEY_PATH=/secrets/clave_sp.key
CLAVE_JWT_SECRET=... # secreto que firma el JWT de sesión ciudadana
CLAVE_SESION_HORAS=2 # expiración de la sesión Cl@ve
# ---------- DEHú (opcional) ----------
DEHU_MODE=mock # mock | production — hoy mock por defecto
DEHU_WSDL_URL=https://dehu.redsara.es/.../...?wsdl
DEHU_CERT_PATH=/secrets/fnmt.pfx
DEHU_CERT_PASSWORD=...
DEHU_DIR3_EMISOR=L01100993
# ---------- URLs del frontend (CORS) ----------
FRONTEND_URL=https://sede.plasencia.es
Paso 1 — DNS y certificado TLS
- Alta CNAME
sede.<ayto>.es→<frontal-de-tu-plataforma>. - Emitir certificado TLS para el subdominio (Let's Encrypt o el propio del ayuntamiento).
- En el frontal (nginx/caddy/load-balancer), enrutar el host
sede.<ayto>.esal frontend de la sede (Vite build). - Verificar:
curl -I https://sede.<ayto>.esdebe responder con TLS válido y servir elindex.htmldel frontend.
Paso 2 — Configurar la entidad en BD
# Desde shell del backend
from app import create_app
from app.extensions import db
from app.models import Entidad
from app.modules.sede_electronica.models import SedeConfiguracion
app = create_app()
with app.app_context():
ent = Entidad.query.filter_by(cif="P1015100I").first()
cfg = SedeConfiguracion(
entidad_id=ent.id,
dominio="sede.plasencia.es",
titulo="Sede Electrónica del Ayuntamiento de Plasencia",
subtitulo="Tu ayuntamiento, 24/7",
publicada=False, # de momento NO — pruebas internas
)
db.session.add(cfg)
db.session.commit()
Con publicada=False, la sede solo se ve en modo ?preview=true.
Útil para que el ayuntamiento valide internamente antes de abrir al
público.
Paso 3 — Tema y branding
Desde el backoffice (/sede-admin/tema con permiso sede:tema:gestionar):
- Color primario (cabeceras, botones principales).
- Color secundario (gradientes del hero).
- Color de acento (chips destacados, avisos).
- Tipografía (Inter, Manrope, Roboto, Lato, Source Sans, Open Sans).
- Logo principal (PNG/SVG transparente, ~80px alto).
- Logo monocromo blanco para el hero (recomendado).
- Favicon.
El logo se sube a static/images/ del backend (vía endpoint
POST /api/sede-admin/assets/logo). El path queda referenciado en
SedeTema.logo_url.
Paso 4 — Cl@ve PIN
En desarrollo
CLAVE_MODE=mock. Hay un IdP simulado en /api/clave/mock/idp que
permite identificarse con cualquier NIF + 4 dígitos. La sesión es
real (JWT firmado, persistido en SesionCiudadano), solo el IdP es
fake.
En producción
- Solicitar alta como SP en Cl@ve (1 mes de trámite). Entregable: metadata SAML + certificado SP.
- Configurar variables
CLAVE_*en el.env. - Generar el certificado SP (autofirmado o de la FNMT).
- Probar con un NIF de pruebas en el entorno de pre-producción de Cl@ve.
- Pasar a
CLAVE_MODE=production.
Token sin jti
El frontend de la sede usa el token que devuelve useCiudadano(),
no el apiClient del backoffice. Si una pantalla llama a un
endpoint de Mi área con el token del empleado en vez del de
Cl@ve, el backend responde CLAVE-TOKEN-MALFORMADO: Token sin jti.
Verificar siempre que los PUT/POST de Mi área usan fetch con
Authorization: Bearer ${token}.
Paso 5 — Catálogo de trámites
Hay dos formas de poblar el catálogo:
Opción A — Importar el catálogo público del ayuntamiento
Si el ayuntamiento ya tiene su catálogo en un sistema externo (STA de aytoExpress/Espublico es lo más habitual), exportarlo a JSON y usar el seed:
# 1. Exportar el catálogo desde el sistema actual
# (típicamente leyendo la variable JS dataset_CATSERV de la página
# catalogo del STA — ver docs/plasencia_tramites_export/README)
# 2. Colocar el JSON en docs/<entidad>_tramites_export/
# 3. Adaptar y correr el seed
python seed_catalogo_plasencia_completo.py <entidad_id>
El seed:
- Mapea las familias del STA → categorías de
SedeTramite(padron,tributos,urbanismo, etc.). - Marca
digitalizable=Truepara trámites cuyo nombre empieza por "Solicitud", "Comunicación", "Declaración", "Alta", "Baja", etc. - Marca
digitalizable=Falsecon motivo concreto para los que no proceden ("Requiere TPV", "Instrumento urbanístico"…). - Marca
interno=Truelos trámites de gestión interna (RRHH, contratación pública) — no se exponen al ciudadano.
Opción B — Crear trámites desde cero
Desde el backoffice (/sede-admin/tramites con permiso
sede:tramites:gestionar):
- Nuevo trámite → código, nombre, categoría.
- Rellenar la ficha pública (descripción larga, requisitos, documentación, plazo, coste, normativa, órgano resolutor, silencio).
- Marcar como activo y opcionalmente destacado.
- Si el trámite se digitalizará en breve, marcar
digitalizable=True.
Paso 6 — Vincular procedimientos a Información Pública
Para que las publicaciones (actas, bandos, ordenanzas, decretos) salgan automáticamente al aprobarlas:
Desde /sede-admin/info-publica:
- Crear una vinculación por cada par procedimiento↔categoría:
- Procedimiento "Pleno" → categoría
PLENO. - Procedimiento "Junta de Gobierno" → categoría
JUNTA_GOBIERNO. - Procedimiento "Bando" → categoría
BANDO. - …
- Si el procedimiento "Acta" se usa para Pleno y Junta de
Gobierno, crear dos vinculaciones con
tipo_acta_iddistinto en cada una. - Configurar
retirada_dias(cuántos días se mantiene la publicación visible al ciudadano antes de retirarse del listado público). - Si solo se publican algunas UDs (no todas las aprobadas), marcar
solo_marcadas=True— solo se publicarán las que tengan el flagpublicar_en_sede=Truedesde la pestaña de la UD.
Categorías servidas por URL externa
Si el Portal de Transparencia o el Perfil del Contratante están en sistemas externos (PLACSP, Wordpress…), no se vincula procedimiento; basta con poner la URL externa en el campo correspondiente de la configuración de la categoría desde el backoffice.
Paso 7 — Áreas de queja y reparto
Desde /sede-admin/areas-quejas:
- Activar las áreas que el ayuntamiento ofrece como opciones al ciudadano (Limpieza viaria, Policía local, Vía pública, Cultura, Educación, etc.).
- Desde
/sede-admin/reparto-areas, mapear cada área al departamento que debe atender las quejas de esa categoría. - Si un área no está mapeada, el sistema usa el departamento por defecto (normalmente Secretaría).
Paso 8 — Páginas legales
17 páginas obligatorias por ley (RD 1112/2018, Ley 39/2015 arts. 9-10,
ENI/ENS, RGPD). Vienen pre-llenas con plantillas genéricas y
placeholders {{ENTIDAD_NOMBRE}}, {{ENTIDAD_CIF}} que se
sustituyen automáticamente.
Desde /sede-admin/paginas:
- Editar las que el ayuntamiento quiera personalizar (titularidad, aviso legal, política de privacidad, accesibilidad, FAQs, ayuda, mapa web, normativa, calendario y plazos, relación de servicios, cartas de servicios, certificados electrónicos, sistemas de identificación, sistemas de firma, interrupciones del servicio, enlaces de interés, perfil del contratante si se sirve como página).
- Las que no se editen muestran el contenido por defecto con los placeholders ya resueltos.
Paso 9 — Menú principal y layout
Dos modos coexisten (legacy y nuevo):
- Editor de menú (
/sede-admin/menu): drag-and-drop de secciones e items que apuntan al catálogo. Es el recomendado. - Editor de layout (
/sede-admin/layout): modo clásico por zonas - bloques. Sigue funcionando pero el menú nuevo lo reemplaza.
El usuario admin reorganiza las secciones de la portada y, dentro de cada una, elige qué funcionalidades del catálogo aparecen como cards.
Paso 10 — Pruebas internas
Con SedeConfiguracion.publicada=False, validar entrando por:
Lista de verificación:
- Portada se ve con el tema correcto, logo y subtítulo.
- Buscador devuelve resultados al teclear "volante", "ibi", "queja".
- Catálogo de trámites carga, los chips de categoría tienen conteos, la paginación funciona.
- Una ficha de trámite muestra todos los bloques (requisitos, plazo, coste, normativa).
- Un trámite con formulario electrónico (instancia general) se rellena, se envía con Cl@ve PIN y devuelve recibo con CSV.
- El CSV del recibo se verifica en
/verificar/<csv>y devuelve el PDF. - La identificación con Cl@ve PIN funciona y lleva a Mi área.
- Mi área muestra los datos del padrón, recibos pendientes, notificaciones.
- El cambio de canal de notificación (POSTAL/ELECTRONICO/AMBOS) se guarda y persiste tras refrescar.
- Información Pública muestra todas las categorías con conteo de publicaciones vigentes.
- Una página legal (titularidad, accesibilidad) se ve con los placeholders resueltos.
Paso 11 — Publicar
# Cuando todo esté validado:
cfg = SedeConfiguracion.query.filter_by(entidad_id=ent.id).first()
cfg.publicada = True
db.session.commit()
A partir de aquí la sede ya es accesible sin ?preview=true.
Operación y mantenimiento
Diariamente
- Bandeja de notificaciones DEHú: los funcionarios revisan los acuses de recibo recibidos y atienden los rechazos por silencio (notificaciones no abiertas en 10 días).
- Bandeja de quejas: el departamento receptor responde a las quejas en plazo (20 días hábiles).
- Validación de cambios de datos: el departamento de Padrón resuelve las solicitudes de cambio de datos personales. Si no se resuelven en 7 días, se avisa al jefe; en 30 días, rechazo automático.
Mensualmente
- Revisión del catálogo: detectar trámites obsoletos, dar de
alta los nuevos, marcar como
digitalizablelos que vayan a tener formulario electrónico. - Comprobar publicaciones: que las publicaciones automáticas (actas, bandos) están saliendo bien.
- Audit del reparto de áreas: que ningún área queda sin responsable activo.
Por sprint
- Construir un nuevo formulario electrónico según el roadmap del
catálogo (ver
docs/sede_catalogo_tramites_analisis.md): - Definir
FormularioTramiteenformularios.py. - Asignar
formulario_clavealSedeTramitecorrespondiente desde el backoffice. - El frontend renderiza el formulario automáticamente.
Pendientes para producción real
Esta lista vive en project_registro_pendientes_produccion del memory
y aplica también a la sede:
- Activar Cl@ve PIN PRODUCTION (alta como SP en MINHAP).
- Integración FACe real para facturación electrónica.
- Cliente DEHú PRODUCTION (SOAP) — hoy MOCK.
- Pasarela TPV (Redsys/Cecabank) para pago online de recibos.
- Certificado FNMT del ayuntamiento para firmar notificaciones salientes.
- JRE 11+ en el frontal si se usa AutoFirma (para certificados con DNIe).