Wiki source code of Objetivo

Last modified by tech on 2026/07/10 00:28

Show last authors
1 # Objetivo do Sistema e Visão Geral da Arquitetura
2
3 ---
4
5 ## 1. Objetivos Principais do Projeto { data-toc-label="1. Objetivos" }
6
7 1. **Centralização de Código e CI/CD:** Instância privada do **[GitLab CE](GitLab_Omnibus.md)** (VM dedicada, Omnibus) para alojar repositórios e executar pipelines automáticos através de runners Kubernetes.
8
9 2. **Orquestração de Contentores (HA):** **[Cluster K3s](K3s_Cluster.md)** com 3 nós master (via `kube-vip`) e 2 nós worker.
10
11 3. **Deployment GitOps:** Infraestrutura e aplicações declaradas em Git e sincronizadas automaticamente no Kubernetes com **[ArgoCD](ArgoCD.md)**.
12
13 4. **Single Sign-On (SSO):** **[Authentik](Authentik_SSO.md)** centraliza a autenticação (OIDC/OAuth2), distinguindo acessos internos de acessos via **[Cloudflare](Cloudflare_Tunnel.md)**.
14
15 5. **Observabilidade:** Métricas e logs centralizados com **[Prometheus](Observabilidade.md)**, **[Grafana](Observabilidade.md)** e **[Loki](Observabilidade.md)**. O **[Promtail](Observabilidade.md)** recolhe os logs da VM GitLab.
16
17 6. **Persistência de Dados:** **[TrueNAS SCALE](TrueNAS_NFS.md)** (`192.168.1.28`) fornece armazenamento NFS através de dois datasets:
18
19 - **`/mnt/storage/gitlab`** — Montado na VM GitLab (`/var/opt/gitlab`) para repositórios, registry, artefactos e backups.
20
21 - **`/mnt/storage/k8s-pvc`** — Exposto como **NFS StorageClass**, criado para todas as aplicações Kubernetes.
22
23 7. **Acesso Remoto Seguro:** **[Cloudflare Tunnel](Cloudflare_Tunnel.md)** expõe **GitLab** e **Authentik** sem abertura de portas no router. O túnel termina no **Traefik Público** (`192.168.1.41`), separado do **Traefik Privado** (`192.168.1.40`) para serviços privados(internos).
24
25 ---
26
27 ## 2. Visão Geral da Arquitetura
28
29 #### A. Fluxo de Tráfego
30
31 !!! info "Como o tráfego da internet e da rede local chega aos Ingress Controllers (Traefik) e é distribuído pelas aplicações."
32
33 ```mermaid
34
35 flowchart TD
36
37 subgraph Internet["Internet"]
38
39 ExtUser["Utilizador Remoto"]
40
41 CloudflareCDN["Cloudflare CDN\n(rede anycast)"]
42
43 end
44
45 subgraph LocalNet["Rede da Junta (192.168.1.0/24)"]
46
47 LocalUser["Utilizador Local"]
48
49 end
50
51 subgraph K3s_Ingress["K3s: Ingress & Tunnel"]
52
53 Cloudflared["cloudflared (pod)\nTúnel outbound"]
54
55 TraefikPub["Traefik Público\n(192.168.1.41)"]
56
57 TraefikPriv["Traefik Privado\n(192.168.1.40)"]
58
59 end
60
61 subgraph Servicos["Aplicações"]
62
63 GitLab["GitLab CE (VM)\ngitlab.fcidadeguimaraes.pt"]
64
65 Auth["Authentik (K8s)\nauth.fcidadeguimaraes.pt"]
66
67 ArgoCD["ArgoCD (K8s)\nargocd.fcidadeguimaraes.pt"]
68
69 Grafana["Grafana (K8s)\ngrafana.fcidadeguimaraes.pt"]
70
71 end
72
73 %% Acesso Externo
74
75 ExtUser --> CloudflareCDN
76
77 CloudflareCDN <-->|"Túnel encriptado"| Cloudflared
78
79 Cloudflared -->|"Encaminha"| TraefikPub
80
81 TraefikPub --> GitLab
82
83 TraefikPub --> Auth
84
85 %% Acesso Interno
86
87 LocalUser -->|".41"| TraefikPub
88
89 LocalUser -->|".40"| TraefikPriv
90
91 TraefikPriv --> ArgoCD
92
93 TraefikPriv --> Grafana
94
95 ```
96
97 #### B. Orquestração
98
99 !!! info "Cluster K3s, deploy de aplicações acontece dentro dos workers"
100
101 ```mermaid
102
103 flowchart TD
104
105 subgraph Proxmox_Hypervisor["Proxmox VE (192.168.1.7)"]
106
107 subgraph K3s_HA_Cluster["Cluster K3s HA"]
108
109 VIP["kube-vip\n(192.168.1.20)"]
110
111 subgraph K8s_Masters["Masters HA"]
112
113 m1["k3s-m1 (.21)"]
114
115 m2["k3s-m2 (.22)"]
116
117 m3["k3s-m3 (.23)"]
118
119 end
120
121 subgraph K8s_Workers["Workers"]
122
123 w1["k3s-w1 (.31)"]
124
125 w2["k3s-w2 (.32)"]
126
127 end
128
129 end
130
131 GitLab_VM["VM dedicada:\nGitLab CE (.10)"]
132
133 end
134
135 VIP --> m1 & m2 & m3
136
137 m1 & m2 & m3 -->|Orquestração| w1 & w2
138
139 ```
140
141 !!! important "Nota"
142
143 Todos os serviços, menos o gitlab + promtail, estão dentro do cluster K3s
144
145 #### C. Dados, Integrações e Observabilidade { data-toc-label="C. Dados" }
146
147 !!! info "Ligação com o TrueNAS e envio de logs"
148
149 ```mermaid
150
151 flowchart LR
152
153 subgraph K3s["Serviços Kubernetes"]
154
155 ArgoCD["ArgoCD<br/>(GitOps)"]
156
157 Authentik["Authentik<br/>(SSO)"]
158
159 Runner["GitLab Runner"]
160
161 Monitoring["Prometheus<br/>Grafana<br/>Loki"]
162
163 end
164
165 GitLab["GitLab CE (VM)<br/>Promtail instalado"]
166
167 subgraph Storage["TrueNAS (192.168.1.28)"]
168
169 DatasetGitLab["Dataset<br/>/mnt/storage/gitlab"]
170
171 DatasetPVC["Dataset<br/>/mnt/storage/k8s-pvc"]
172
173 end
174
175 %% Autenticação
176
177 ArgoCD -->|OIDC / OAuth2| Authentik
178
179 GitLab -->|OIDC / OAuth2| Authentik
180
181 %% GitOps e CI/CD
182
183 ArgoCD -->|Monitoriza Repositórios| GitLab
184
185 Runner -->|Executa Jobs CI/CD| GitLab
186
187 %% Observabilidade
188
189 GitLab -->|Promtail → Loki| Monitoring
190
191 %% Armazenamento
192
193 GitLab -->|NFS| DatasetGitLab
194
195 ```
196
197 #### D. Emissão Automática de Certificados (TLS) { data-toc-label="D. Certificados" }
198
199 !!! info "Fluxo do `cert-manager` a utilizar o desafio DNS-01 para obter certificados TLS válidos (Let's Encrypt) para serviços internos."
200
201 ```mermaid
202
203 flowchart LR
204
205 CertManager["cert-manager\n(Cluster K3s)"]
206
207 CFAPI["Cloudflare API"]
208
209 CertManager -->|"Desafio DNS-01"| CFAPI
210
211 CFAPI -.->|"Valida & Emite"| CertManager
212
213 ```
214
215 ---
216
217 ### 2.2 Separação Público / Privado { data-toc-label="2.2 Público / Privado" }
218
219 | Serviço | Domínio | IP Traefik | Acessível de |
220
221 | :---------------- | :---------------------------- | :-------------: | :-------------------- |
222
223 | **GitLab CE** | `gitlab.fcidadeguimaraes.pt` | `.41` (Público) | Internet + Rede Local |
224
225 | **Authentik SSO** | `auth.fcidadeguimaraes.pt` | `.41` (Público) | Internet + Rede Local |
226
227 | **ArgoCD** | `argocd.fcidadeguimaraes.pt` | `.40` (Privado) | Rede Local |
228
229 | **Grafana** | `grafana.fcidadeguimaraes.pt` | `.40` (Privado) | Rede Local |
230
231 ---
232
233