<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Davi Lucas</title>
    <description>The latest articles on DEV Community by Davi Lucas (@debugdavi).</description>
    <link>https://dev.to/debugdavi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4063234%2F5877b388-f619-42bc-9fa4-350534bd3fbd.jpg</url>
      <title>DEV Community: Davi Lucas</title>
      <link>https://dev.to/debugdavi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/debugdavi"/>
    <language>en</language>
    <item>
      <title>Configurando um Servidor HAPI FHIR com BR-Core</title>
      <dc:creator>Davi Lucas</dc:creator>
      <pubDate>Sat, 17 Oct 2026 01:47:14 +0000</pubDate>
      <link>https://dev.to/debugdavi/configurando-um-servidor-hapi-fhir-com-br-core-2o7g</link>
      <guid>https://dev.to/debugdavi/configurando-um-servidor-hapi-fhir-com-br-core-2o7g</guid>
      <description>&lt;h2&gt;
  
  
  Adequação do Servidor FHIR ao BR-Core
&lt;/h2&gt;

&lt;p&gt;Primeiro, é necessário entender como irá funcionar a arquitetura da nossa aplicação como um todo, levando em consideração principalmente o &lt;strong&gt;Back-end, Front-end, Servidor FHIR e a RNDS&lt;/strong&gt;. Nesse modelo não vou entrar em detalhes da infraestrutura porque não é o foco deste artigo. Quero focar na estrutura principal da aplicação e, principalmente, na parte que envolve o servidor FHIR e sua adequação ao BR-Core.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; este artigo surgiu a partir dos problemas que enfrentei durante a implementação de um ambiente FHIR para um sistema do &lt;strong&gt;PET-Saúde de Sobral&lt;/strong&gt;. Por isso, alguns exemplos, nomes de containers, bancos e credenciais utilizados ao longo do artigo são baseados nesse ambiente.&lt;/p&gt;

&lt;p&gt;As credenciais apresentadas aqui são &lt;strong&gt;exclusivamente de desenvolvimento/teste&lt;/strong&gt;, criadas para facilitar que os alunos envolvidos no projeto consigam lembrar, reproduzir e modificar o ambiente local sem precisar ficar procurando quais valores utilizar. Elas não correspondem a credenciais de acesso a ambientes de produção ou a serviços reais.&lt;/p&gt;

&lt;p&gt;A ideia deste artigo é justamente documentar o caminho que percorri durante a implementação, incluindo alguns dos problemas e decisões que apareceram no processo. Então, se você encontrar alguma solução melhor para alguma das etapas, fique à vontade para compartilhar. 😄&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Overview das implementações FHIR
&lt;/h2&gt;

&lt;p&gt;No documento que disponibilizei anteriormente para entendimento do que se trata o &lt;code&gt;HAPI FHIR&lt;/code&gt;, também dei ênfase no problema que passamos ao tentar trabalhar com pacientes brasileiros. O servidor conseguia trabalhar normalmente com recursos FHIR, mas não conhecia os perfis específicos do BR-Core, pois eles ainda não haviam sido instalados no ambiente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Observação:&lt;/strong&gt; eu ainda não postei o outro artigo porque fiquei muito feliz depois de conseguir resolver esse problema e decidi postar esse primeiro hehe. 😅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nos repositórios que encontrei, dois projetos acabaram chamando bastante atenção:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;hapifhir/hapi-fhir&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;hapifhir/hapi-fhir-jpaserver-starter&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O primeiro é o projeto principal do HAPI FHIR, onde ficam os módulos responsáveis pela implementação das funcionalidades do FHIR. Ele é desenvolvido principalmente em Java e serve como base para todo o ecossistema do HAPI. Se quiséssemos montar um servidor FHIR completamente do zero utilizando essa implementação, precisaríamos conhecer bastante de Java/Spring Boot e também entender toda a parte de persistência, endpoints, configuração e infraestrutura envolvida. É uma alternativa interessante para quem precisa de uma solução extremamente customizada, mas não era exatamente o nosso caso.&lt;/p&gt;

&lt;p&gt;O segundo já nos entrega uma aplicação de servidor baseada no HAPI FHIR JPA, permitindo subir o serviço de forma muito mais rápida sem precisar desenvolver toda essa estrutura do zero. Ele também possui suporte para execução em containers, o que facilita bastante quando estamos trabalhando com Docker.&lt;/p&gt;

&lt;p&gt;É importante lembrar que o HAPI não é a única implementação disponível. Existem várias outras implementações open-source do FHIR em diferentes linguagens e frameworks, e elas podem ser consultadas na &lt;a href="https://confluence.hl7.org/spaces/FHIR/pages/35718838/Open+Source+Implementations" rel="noopener noreferrer"&gt;lista de implementações open-source do HL7&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No nosso caso, escolhemos a implementação em Java principalmente pela comunidade e pela quantidade de material disponível. Quando começamos a mexer com uma tecnologia dessas, inevitavelmente aparecem problemas de configuração, arquitetura e infraestrutura, então ter bastante documentação e gente que já passou pelos mesmos problemas ajuda muito. O próprio projeto já traz bastante material relacionado a Docker, PostgreSQL, CORS, proxy reverso, load balancers e outras coisas que provavelmente vamos precisar conforme o projeto crescer.&lt;/p&gt;

&lt;p&gt;Mas existe uma peculiaridade importante: o HAPI FHIR está adequado ao padrão FHIR, mas ele não vem com os perfis específicos do Brasil instalados por padrão. É aí que entra o &lt;strong&gt;BR-Core&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desenho da arquitetura
&lt;/h2&gt;

&lt;p&gt;A arquitetura inicial que estamos pensando ficou mais ou menos assim:&lt;/p&gt;

&lt;h3&gt;
  
  
  Diagrama Mermaid
&lt;/h3&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD

    %% Estilos dos nós

    classDef frontend fill:#3b82f6,stroke:#2563eb,stroke-width:2px,color:#fff

    classDef laravel fill:#ef4444,stroke:#dc2626,stroke-width:2px,color:#fff

    classDef db fill:#f59e0b,stroke:#d97706,stroke-width:2px,color:#fff

    classDef fhir fill:#10b981,stroke:#059669,stroke-width:2px,color:#fff

    classDef rnds fill:#8b5cf6,stroke:#7c3aed,stroke-width:2px,color:#fff


    subgraph Cliente ["Camada de Apresentação (Frontend)"]

        UI["Interface do Utilizador\n(React, Vue, ou Blade)"]:::frontend

    end


    subgraph Sistema_Principal ["Backend Principal"]

        API["Laravel App (API)\n- Autenticação\n- Orquestração\n- Assinatura Digital"]:::laravel

        LocalDB[("Banco Local\n(PostgreSQL/MySQL)\n- Utilizadores\n- Permissões\n- IDs de Mapeamento")]:::db

        API &amp;lt;--&amp;gt;|SQL| LocalDB

    end


    subgraph CasaOS ["Ambiente FHIR Local (Docker no CasaOS)"]

        HAPI["Servidor HAPI FHIR\n(BR-Core Ativo)"]:::fhir

        FHIRDB[("Banco FHIR\n(PostgreSQL 15)")]:::db

        HAPI &amp;lt;--&amp;gt;|JDBC/Hibernate| FHIRDB

    end


    subgraph Externo ["Ministério da Saúde"]

        RNDS["RNDS\n(Rede Nacional de Dados em Saúde)"]:::rnds

    end


    %% Fluxo de comunicação

    UI &amp;lt;--&amp;gt;|HTTP / REST JSON| API

    API &amp;lt;--&amp;gt;|FHIR REST JSON| HAPI

    API &amp;lt;--&amp;gt;|Integração segura| RNDS&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Papel de cada componente na arquitetura
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Interface do Utilizador (Frontend)
&lt;/h4&gt;

&lt;p&gt;O frontend não precisa conversar diretamente com o servidor FHIR. A ideia é que ele envie os formulários normais e consuma os endpoints REST expostos pelo Laravel. Dessa forma, a camada visual não precisa saber o que é FHIR ou como um &lt;code&gt;Patient&lt;/code&gt; deve ser estruturado segundo o BR-Core. Essas responsabilidades ficam concentradas no backend.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Laravel App — o orquestrador
&lt;/h4&gt;

&lt;p&gt;O Laravel é o cérebro da operação. Ele recebe a requisição do frontend e divide as águas entre o que pertence à aplicação e o que pertence ao servidor FHIR.&lt;/p&gt;

&lt;p&gt;Dados como passwords, tokens de sessão, permissões de acesso e a interface administrativa do projeto PET-Saúde ficam no banco da própria aplicação. Já os dados clínicos seguem para o HAPI FHIR.&lt;/p&gt;

&lt;p&gt;O Laravel atua como uma espécie de tradutor. Ele pega os dados recebidos do formulário, aplica as regras necessárias e constrói o JSON do recurso FHIR de acordo com os perfis do BR-Core, enviando posteriormente esse recurso para o HAPI.&lt;/p&gt;

&lt;p&gt;No banco de dados do Laravel, uma tabela de &lt;code&gt;pacientes&lt;/code&gt;, por exemplo, poderia guardar apenas informações necessárias para o controle da aplicação, como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id_local
nome
cpf
fhir_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;fhir_id&lt;/code&gt; seria a referência para o recurso correspondente dentro do servidor FHIR. Quando fosse necessário consultar o histórico clínico, o Laravel utilizaria esse identificador para buscar os dados no HAPI.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. HAPI FHIR Server &amp;amp; Base de Dados
&lt;/h4&gt;

&lt;p&gt;Esse é o nosso servidor FHIR. Como estamos adicionando o BR-Core, ele passa a ter acesso aos perfis brasileiros que vamos utilizar para estruturar e validar nossos recursos.&lt;/p&gt;

&lt;p&gt;O banco de dados utilizado pelo HAPI é o PostgreSQL. A aplicação não deve manipular esse banco diretamente para criar ou alterar recursos FHIR. Quem deve controlar essa persistência é o próprio HAPI, através da API FHIR.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. RNDS
&lt;/h4&gt;

&lt;p&gt;Quando um atendimento estiver finalizado e precisar ser enviado para a rede nacional, o Laravel entra em ação novamente. A ideia é buscar no HAPI os recursos necessários, montar o conteúdo esperado para a integração e realizar a comunicação com a RNDS seguindo os requisitos definidos pelo Ministério da Saúde, incluindo os mecanismos de autenticação, transporte seguro e assinatura digital necessários.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker Compose e Envs
&lt;/h2&gt;

&lt;p&gt;Com a arquitetura definida, podemos começar pela parte prática.&lt;/p&gt;

&lt;p&gt;Primeiro, baixei a imagem do HAPI FHIR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker pull hapiproject/hapi:v8.12.0-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Preferi utilizar uma versão específica em vez de &lt;code&gt;latest&lt;/code&gt;, principalmente para evitar que uma atualização futura da imagem altere o comportamento do ambiente sem que tenhamos planejado isso.&lt;/p&gt;

&lt;p&gt;Depois criei os arquivos &lt;code&gt;docker-compose.yml&lt;/code&gt; e &lt;code&gt;application.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  application.yaml
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;application.yaml&lt;/code&gt; ficou responsável principalmente pela conexão com o PostgreSQL, configuração do FHIR R4, CORS e algumas configurações do HAPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;spring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;datasource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Conecta o HAPI ao container do PostgreSQL criado no docker-compose&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;jdbc:postgresql://fhir-db:5432/hapi'&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin_pet_saude&lt;/span&gt;
    &lt;span class="na"&gt;driverClassName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;org.postgresql.Driver&lt;/span&gt;

  &lt;span class="na"&gt;jpa&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# O dialeto obriga o Hibernate a traduzir as queries para o padrão PostgreSQL&lt;/span&gt;
      &lt;span class="na"&gt;hibernate.dialect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgresDialect&lt;/span&gt;

      &lt;span class="c1"&gt;# Desativa a busca full-text avançada inicialmente&lt;/span&gt;
      &lt;span class="na"&gt;hibernate.search.enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="na"&gt;hapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;fhir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Habilita a versão R4 do FHIR, utilizada pelo BR-Core&lt;/span&gt;
    &lt;span class="na"&gt;fhir_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;R4&lt;/span&gt;

    &lt;span class="c1"&gt;# Habilita o upload dinâmico de Implementation Guides&lt;/span&gt;
    &lt;span class="na"&gt;ig_runtime_upload_enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

    &lt;span class="na"&gt;cors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;allow_Credentials&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;allowed_origin&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;

      &lt;span class="c1"&gt;# Em produção, substitua "*" pelos domínios reais&lt;/span&gt;
      &lt;span class="na"&gt;allowed_headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Origin&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Accept&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Content-Type&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Authorization&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;If-Match&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;If-None-Match&lt;/span&gt;

      &lt;span class="na"&gt;exposed_headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Location&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Content-Location&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ETag&lt;/span&gt;

    &lt;span class="na"&gt;tester&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;home&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PET-Saúde Local FHIR&lt;/span&gt;
        &lt;span class="na"&gt;server_address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8080/fhir'&lt;/span&gt;
        &lt;span class="na"&gt;refuse_to_fetch_third_party_urls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="na"&gt;fhir_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;R4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas funcionalidades mais avançadas ficaram de fora neste primeiro momento porque não eram necessárias para o MVP. A ideia é não adicionar complexidade antes de realmente precisar dela.&lt;/p&gt;

&lt;h3&gt;
  
  
  docker-compose.yml
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;docker-compose.yml&lt;/code&gt; ficou responsável por subir tanto o servidor FHIR quanto o PostgreSQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;fhir-server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pet_fhir_api&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hapiproject/hapi:v8.12.0-2"&lt;/span&gt;

    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;

    &lt;span class="na"&gt;configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hapi_config&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/app/config/application.yaml&lt;/span&gt;

    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;fhir-db&lt;/span&gt;

    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pet_saude_net&lt;/span&gt;

    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

  &lt;span class="na"&gt;fhir-db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pet_fhir_db&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15-alpine&lt;/span&gt;

    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin_pet_saude&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hapi&lt;/span&gt;

    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;

    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;fhir_pg_data:/var/lib/postgresql/data&lt;/span&gt;

    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pet_saude_net&lt;/span&gt;

&lt;span class="na"&gt;configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;hapi_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./application.yaml&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;fhir_pg_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pet_saude_net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de subir o ambiente, alguns endpoints interessantes para testar são:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8080
http://localhost:8080/fhir/swagger-ui
http://localhost:8080/fhir/metadata
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;/fhir/metadata&lt;/code&gt;, em especial, retorna o &lt;code&gt;CapabilityStatement&lt;/code&gt; do servidor e ajuda bastante a entender o que aquela instância do FHIR suporta.&lt;/p&gt;

&lt;h2&gt;
  
  
  HAPI FHIR CLI
&lt;/h2&gt;

&lt;p&gt;Até aqui temos um servidor FHIR funcionando, mas ainda falta uma parte importante: precisamos colocar as definições do BR-Core dentro dele.&lt;/p&gt;

&lt;p&gt;Foi nessa etapa que encontrei o &lt;strong&gt;HAPI FHIR CLI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A documentação oficial pode ser encontrada aqui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://hapifhir.io/hapi-fhir/docs/tools/hapi_fhir_cli.html" rel="noopener noreferrer"&gt;https://hapifhir.io/hapi-fhir/docs/tools/hapi_fhir_cli.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/hapifhir/hapi-fhir/releases" rel="noopener noreferrer"&gt;https://github.com/hapifhir/hapi-fhir/releases&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O CLI é uma ferramenta de linha de comando do HAPI que permite realizar algumas operações relacionadas ao ecossistema FHIR. No nosso caso, ele seria útil principalmente para trabalhar com pacotes e Implementation Guides.&lt;/p&gt;

&lt;p&gt;Minha ideia inicial era utilizar o próprio CLI para pegar as definições do BR-Core e gerar o &lt;code&gt;.tgz&lt;/code&gt; que posteriormente seria instalado no servidor.&lt;/p&gt;

&lt;p&gt;Foi aí que comecei a procurar onde exatamente estava o pacote que precisava.&lt;/p&gt;

&lt;h2&gt;
  
  
  O BR-Core
&lt;/h2&gt;

&lt;p&gt;Para entender e baixar o material do BR-Core, utilizei a documentação disponibilizada pelo projeto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://fhir.saude.go.gov.br/r4/core/downloads.html" rel="noopener noreferrer"&gt;https://fhir.saude.go.gov.br/r4/core/downloads.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://hl7.org.br/fhir/core/downloads.html" rel="noopener noreferrer"&gt;https://hl7.org.br/fhir/core/downloads.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma coisa legal que descobri nesse processo foi o &lt;strong&gt;Forge&lt;/strong&gt;, uma ferramenta que permite editar e criar perfis FHIR.&lt;/p&gt;

&lt;p&gt;Download:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://simplifier.net/forge" rel="noopener noreferrer"&gt;https://simplifier.net/forge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Forge é interessante principalmente quando começarmos a criar ou adaptar perfis próprios, já que trabalhar manualmente com todos aqueles JSONs de &lt;code&gt;StructureDefinition&lt;/code&gt; pode ficar meio doloroso depois de um tempo.&lt;/p&gt;

&lt;p&gt;Mas, para o que eu precisava agora, o mais importante era conseguir o pacote oficial do BR-Core.&lt;/p&gt;

&lt;p&gt;E aqui vem, novamente, uma das partes mais chatas desse projeto: &lt;strong&gt;encontrar o bendito&lt;/strong&gt; &lt;code&gt;**package.tgz**&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Eu já tinha falado que essa parte foi meio sofrida, mas vale reforçar porque provavelmente alguém vai passar pela mesma coisa. Na documentação oficial do BR-Core existe bastante coisa para baixar, mas não fica muito claro que, para utilizar o pacote no HAPI, você precisa baixar o &lt;strong&gt;guia de implementação completo em&lt;/strong&gt; &lt;code&gt;**.zip**&lt;/code&gt; e procurar o pacote lá dentro. Não existe aquele momento mágico de “clique aqui para baixar o &lt;code&gt;package.tgz&lt;/code&gt;”. Você baixa o ZIP, abre um monte de arquivo e começa a procurar por &lt;code&gt;package&lt;/code&gt;, na esperança de encontrar o que precisa.&lt;/p&gt;

&lt;p&gt;Enquanto eu não encontrava o arquivo, comecei até a estudar o &lt;strong&gt;HAPI FHIR CLI&lt;/strong&gt;, porque achei que provavelmente teria que gerar o &lt;code&gt;.tgz&lt;/code&gt; por conta própria. Felizmente, não precisei inventar moda.&lt;/p&gt;

&lt;p&gt;Depois de abrir o ZIP e pesquisar por &lt;code&gt;package&lt;/code&gt;, encontrei os pacotes das implementações já prontos, no formato &lt;code&gt;.tgz&lt;/code&gt;. No meu caso, como o servidor está configurado para trabalhar com &lt;strong&gt;FHIR R4&lt;/strong&gt;, o arquivo que nos interessa é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package.r4.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E uma comparação que achei curiosa é que, no outro guia disponibilizado junto à documentação, o &lt;strong&gt;Guia de Implementação da SES GO - CORE&lt;/strong&gt;, da Secretaria de Estado da Saúde de Goiás (SES-GO), essa parte é bem mais tranquila. Na página de downloads existe um tópico específico chamado &lt;strong&gt;“NPM Package”&lt;/strong&gt;, justamente para explicar e disponibilizar o &lt;code&gt;package.tgz&lt;/code&gt;. Você entra, encontra o tópico, baixa o pacote e segue a vida.&lt;/p&gt;

&lt;p&gt;Já no material do BR-Core que eu estava utilizando, precisei fazer essa pequena caça ao tesouro para descobrir que o pacote já estava dentro do guia completo. 😅&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;POR FAVOR LEIA: BAIXE O GUIA COMPLETO EM&lt;/strong&gt; &lt;code&gt;**.ZIP**&lt;/code&gt;&lt;strong&gt;, ABRA O ARQUIVO E PESQUISE&lt;/strong&gt; &lt;code&gt;**PACKAGE**&lt;/code&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É sério. 😭 Os pacotes &lt;code&gt;.tgz&lt;/code&gt; das implementações já estão lá, prontos para uso. Depois é só escolher o que corresponde à versão do FHIR utilizada pelo seu servidor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com os arquivos finalmente encontrados, podemos partir para a configuração do HAPI e para a instalação do pacote no nosso servidor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organização do projeto
&lt;/h2&gt;

&lt;p&gt;Depois que encontrei o pacote, organizei os arquivos em uma pasta própria para deixar tudo relacionado ao servidor FHIR no mesmo lugar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pet-compose/
├── docker-compose.yml
├── application.yaml
└── fhir-packages/
    └── package.r4.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia é que essa pasta &lt;code&gt;fhir-packages&lt;/code&gt; concentre os pacotes que forem necessários futuramente.&lt;/p&gt;

&lt;p&gt;Como o pacote está na máquina host, precisamos fazer com que o container também consiga enxergá-lo. Para isso, adicionei um bind mount ao serviço do FHIR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./fhir-packages:/fhir-packages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse volume faz uma ligação entre uma pasta da máquina que está executando o Docker e uma pasta dentro do container.&lt;/p&gt;

&lt;p&gt;Então temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Máquina host
./fhir-packages
       │
       │ bind mount
       ▼
Container
/fhir-packages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, o arquivo que está no nosso projeto também fica disponível para o ambiente do HAPI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalando o BR-Core
&lt;/h2&gt;

&lt;p&gt;Com o pacote em mãos, chegou a hora de instalá-lo.&lt;/p&gt;

&lt;p&gt;Aqui aconteceu uma das partes mais interessantes do processo, porque a documentação nem sempre deixa claro qual é exatamente o formato que determinada operação do HAPI espera.&lt;/p&gt;

&lt;p&gt;A operação utilizada pelo servidor é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /fhir/ImplementationGuide/$install
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na primeira tentativa, tentei enviar diretamente o &lt;code&gt;.tgz&lt;/code&gt; para o endpoint utilizando &lt;code&gt;application/gzip&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O HAPI respondeu que a operação precisava receber um &lt;code&gt;Content-Type&lt;/code&gt; FHIR. Ou seja, não bastava simplesmente mandar o arquivo compactado.&lt;/p&gt;

&lt;p&gt;Depois disso, transformei o &lt;code&gt;.tgz&lt;/code&gt; em Base64:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; 0 /home/debugz/pet-compose/fhir-packages/package.r4.tgz &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/brcore.b64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o conteúdo do pacote estava salvo em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/tmp/brcore.b64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, criei um &lt;code&gt;Parameters&lt;/code&gt; FHIR contendo esse conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/brcore.b64&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Remove a quebra de linha final gerada pelo base64
&lt;/span&gt;    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resourceType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parameter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npmContent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;valueBase64Binary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/brcore-install.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Arquivo criado: /tmp/brcore-install.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;PY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E finalmente fiz o POST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/fhir+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/fhir+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; @/tmp/brcore-install.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"http://localhost:8080/fhir/ImplementationGuide/&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;install"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O retorno foi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resourceType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Parameters"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse momento eu já tinha uma boa indicação de que a instalação tinha sido aceita, mas ainda faltava confirmar se os recursos realmente estavam disponíveis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nem tudo funcionou de primeira
&lt;/h2&gt;

&lt;p&gt;Como quase sempre acontece quando estamos configurando alguma coisa nova, o caminho não foi exatamente reto.&lt;/p&gt;

&lt;p&gt;A primeira tentativa de chamar o &lt;code&gt;$install&lt;/code&gt; utilizando diretamente o &lt;code&gt;.tgz&lt;/code&gt; falhou porque o endpoint esperava uma requisição FHIR.&lt;/p&gt;

&lt;p&gt;Depois, na primeira versão do &lt;code&gt;Parameters&lt;/code&gt;, utilizei um nome de parâmetro incorreto e o HAPI acabou retornando um &lt;code&gt;NullPointerException&lt;/code&gt;. Depois de entender melhor o formato esperado pela operação, alterei o parâmetro para &lt;code&gt;npmContent&lt;/code&gt; e a instalação passou a ser processada.&lt;/p&gt;

&lt;p&gt;Também apareceu um warning durante a instalação: o &lt;code&gt;StructureDefinition/br-core-careteam&lt;/code&gt; estava com &lt;code&gt;status = draft&lt;/code&gt;, e a configuração atual do HAPI não permitiu que esse recurso fosse instalado.&lt;/p&gt;

&lt;p&gt;Mesmo assim, o restante do pacote continuou sendo processado normalmente.&lt;/p&gt;

&lt;p&gt;No final, o HAPI informou que havia criado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;46 resources of type StructureDefinition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e ignorado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 resource of type StructureDefinition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então, apesar dos percalços, a instalação do pacote funcionou.&lt;/p&gt;

&lt;h2&gt;
  
  
  Confirmando o BR-Core no servidor
&lt;/h2&gt;

&lt;p&gt;Agora vinha a parte que eu considero mais importante: não basta o servidor responder que instalou alguma coisa. Precisamos confirmar que os recursos realmente estão disponíveis.&lt;/p&gt;

&lt;p&gt;Para isso, fiz uma busca pelo &lt;code&gt;StructureDefinition&lt;/code&gt; do paciente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/fhir+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"http://localhost:8080/fhir/StructureDefinition?url=https://br-core.saude.gov.br/fhir/StructureDefinition/br-core-patient"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="s1"&gt;'.entry[]?.resource | {resourceType,id,url,version,status}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado foi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resourceType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"StructureDefinition"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://br-core.saude.gov.br/fhir/StructureDefinition/br-core-patient"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.3.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou seja, o &lt;code&gt;br-core-patient&lt;/code&gt; realmente está disponível no servidor, com a URL canônica correta, versão &lt;code&gt;1.3.0&lt;/code&gt; e status &lt;code&gt;active&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Foi aqui que finalmente deu para dizer: &lt;strong&gt;beleza, o BR-Core está no nosso HAPI.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  E o ImplementationGuide?
&lt;/h2&gt;

&lt;p&gt;Durante a instalação, o HAPI também encontrou o &lt;code&gt;ImplementationGuide&lt;/code&gt; dentro do pacote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;ImplementationGuide-br.gov.saude.br-core.fhir.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;com a URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://br-core.saude.gov.br/fhir/ImplementationGuide/br.gov.saude.br-core.fhir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porém, quando fiz a busca:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-G&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/fhir+json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"url=https://br-core.saude.gov.br/fhir/ImplementationGuide/br.gov.saude.br-core.fhir"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"http://localhost:8080/fhir/ImplementationGuide"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o servidor retornou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resourceType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bundle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"searchset"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso foi uma situação interessante porque os &lt;code&gt;StructureDefinition&lt;/code&gt;s foram instalados e podem ser consultados normalmente, enquanto o &lt;code&gt;ImplementationGuide&lt;/code&gt; não aparece no endpoint de recursos.&lt;/p&gt;

&lt;p&gt;Ainda não vou entrar muito nessa investigação aqui porque ela merece um artigo próprio se eu for realmente aprofundar no comportamento interno do &lt;code&gt;PackageInstallerSvc&lt;/code&gt; e na diferença entre o gerenciamento de packages e a persistência dos recursos no repositório FHIR.&lt;/p&gt;

&lt;p&gt;Para o objetivo atual, o que importa é que os perfis necessários do BR-Core já estão disponíveis no servidor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estado atual
&lt;/h2&gt;

&lt;p&gt;Então, neste momento, temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HAPI FHIR
  versão: v8.12.0-2
  FHIR: R4
  container: pet_fhir_api

PostgreSQL
  versão: 15
  container: pet_fhir_db

BR-Core
  package: br.gov.saude.br-core.fhir.r4
  versão: 1.3.0

StructureDefinitions
  criados: 46
  ignorados: 1

br-core-patient
  status: active
  versão: 1.3.0
  disponível pela API: sim

ImplementationGuide
  encontrado no pacote: sim
  disponível em /ImplementationGuide: não
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;br-core-careteam&lt;/code&gt; foi o único &lt;code&gt;StructureDefinition&lt;/code&gt; ignorado porque estava como &lt;code&gt;draft&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Próximos passos
&lt;/h2&gt;

&lt;p&gt;Agora que temos a base funcionando, os próximos passos são começar a utilizar os perfis do BR-Core de verdade dentro da aplicação.&lt;/p&gt;

&lt;p&gt;Isso significa definir quais recursos realmente serão utilizados pelo projeto, criar os &lt;code&gt;Patient&lt;/code&gt;, &lt;code&gt;Practitioner&lt;/code&gt;, &lt;code&gt;Encounter&lt;/code&gt; e outros recursos necessários, validar esses recursos contra os perfis corretos e começar a estruturar a comunicação entre o Laravel e o HAPI FHIR.&lt;/p&gt;

&lt;p&gt;Depois disso entra uma parte ainda maior do projeto, que é trabalhar a integração com a RNDS.&lt;/p&gt;

&lt;p&gt;A ideia não é tentar resolver tudo de uma vez. Primeiro colocamos o servidor FHIR de pé, depois adicionamos os perfis necessários, validamos os recursos e só então começamos a construir as integrações em cima disso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;No começo, parecia que o problema era simplesmente:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Precisamos colocar o BR-Core no nosso HAPI FHIR."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na prática, acabou envolvendo Docker, PostgreSQL, HAPI FHIR, HAPI CLI, pacotes FHIR, &lt;code&gt;.tgz&lt;/code&gt;, Base64, scripts em Python e alguns erros no caminho.&lt;/p&gt;

&lt;p&gt;E foi justamente isso que tornou o processo interessante.&lt;/p&gt;

&lt;p&gt;No final, conseguimos instalar o pacote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;br.gov.saude.br-core.fhir.r4#1.3.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e confirmar que os &lt;code&gt;StructureDefinition&lt;/code&gt;s do BR-Core estão disponíveis no nosso servidor HAPI FHIR.&lt;/p&gt;

&lt;p&gt;Ainda existem alguns pontos que quero investigar e melhorar, mas pelo menos agora temos uma base funcional para continuar desenvolvendo a infraestrutura de saúde digital do projeto.&lt;/p&gt;

&lt;p&gt;E acho que essa é uma das partes mais legais de trabalhar com tecnologia: você começa pensando que vai "só instalar um pacote" e termina estudando como um servidor FHIR resolve packages por dentro. 😂&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;E se você trabalha com FHIR, BR-Core, RNDS ou qualquer coisa relacionada e tiver alguma sugestão, correção ou uma forma melhor de fazer alguma das coisas que mostrei aqui, pode falar comigo!&lt;/strong&gt; Ainda estou aprendendo bastante sobre esse ecossistema, então toda troca com quem já tem mais experiência é muito bem-vinda. A ideia aqui é justamente compartilhar o que fui descobrindo no caminho e também aprender com quem já passou por problemas parecidos. 😄&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://hapifhir.io/" rel="noopener noreferrer"&gt;HAPI FHIR&lt;/a&gt; — Documentação oficial do HAPI FHIR, servidor e framework utilizado neste projeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://hapifhir.io/hapi-fhir/docs/tools/hapi_fhir_cli.html" rel="noopener noreferrer"&gt;HAPI FHIR CLI&lt;/a&gt; — Documentação oficial da ferramenta de linha de comando do HAPI FHIR.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/hapifhir/hapi-fhir" rel="noopener noreferrer"&gt;HAPI FHIR no GitHub&lt;/a&gt; — Repositório oficial do HAPI FHIR e seu código-fonte.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/hapifhir/hapi-fhir-jpaserver-starter" rel="noopener noreferrer"&gt;HAPI FHIR JPA Server Starter&lt;/a&gt; — Projeto base para executar um servidor HAPI FHIR utilizando JPA.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/hapifhir/hapi-fhir/releases" rel="noopener noreferrer"&gt;Releases do HAPI FHIR&lt;/a&gt; — Página com as versões e releases oficiais do HAPI FHIR.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://confluence.hl7.org/spaces/FHIR/pages/35718838/Open+Source+Implementations" rel="noopener noreferrer"&gt;Implementações Open Source de FHIR&lt;/a&gt; — Lista de implementações open source de servidores e ferramentas FHIR.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://hl7.org.br/fhir/core/downloads.html" rel="noopener noreferrer"&gt;BR-Core&lt;/a&gt; — Documentação e materiais oficiais do Guia de Implementação do BR-Core.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://simplifier.net/forge" rel="noopener noreferrer"&gt;Forge&lt;/a&gt; — Ferramenta para criação e edição de perfis e artefatos FHIR.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/kyriosdata/rnds" rel="noopener noreferrer"&gt;Integração RNDS — Kyriosdata&lt;/a&gt; — Bibliotecas e ferramentas em Java e JavaScript/NPM para integração com a RNDS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jsonpath.com/" rel="noopener noreferrer"&gt;JSONPath Evaluator&lt;/a&gt; — Ferramenta para navegar e consultar estruturas JSON utilizando expressões JSONPath.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://simplifier.net/redenacionaldedadosemsaude/" rel="noopener noreferrer"&gt;Simplifier — Projeto RNDS&lt;/a&gt; — Plataforma para publicação, gerenciamento e compartilhamento de artefatos FHIR relacionados à RNDS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://simplifier.net/RedeNacionaldeDadosemSaude/~introduction" rel="noopener noreferrer"&gt;Simplifier — Introdução ao RNDS&lt;/a&gt; — Página de introdução aos artefatos e recursos do projeto RNDS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://rnds-guia.saude.gov.br/docs/introducao" rel="noopener noreferrer"&gt;RNDS — Guia de Integração&lt;/a&gt; — Documentação oficial para integração de sistemas com a RNDS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://rnds-guia.saude.gov.br/docs/passo-a-passo" rel="noopener noreferrer"&gt;RNDS — Passo a Passo&lt;/a&gt; — Guia oficial com as etapas para integração e envio de dados à RNDS.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>fhir</category>
      <category>docker</category>
      <category>brcore</category>
    </item>
  </channel>
</rss>
