Add basic lgtm-stack (WIP)
This commit is contained in:
		
							parent
							
								
									0b6e4f1550
								
							
						
					
					
						commit
						0359a4ffa7
					
				
					 7 changed files with 289 additions and 0 deletions
				
			
		|  | @ -54,6 +54,23 @@ resource "authentik_group" "minio_users" { | |||
|   users        = [] | ||||
| } | ||||
| 
 | ||||
| resource "authentik_group" "grafana_grafana_admins" { | ||||
|   name    = "Grafana GrafanaAdmins" | ||||
|   users   = [authentik_user.default.id] | ||||
| } | ||||
| 
 | ||||
| resource "authentik_group" "grafana_admins" { | ||||
|   name    = "Grafana Admins" | ||||
| } | ||||
| 
 | ||||
| resource "authentik_group" "grafana_editors" { | ||||
|   name    = "Grafana Editors" | ||||
| } | ||||
| 
 | ||||
| resource "authentik_group" "grafana_viewers" { | ||||
|   name    = "Grafana Viewers" | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| resource "authentik_provider_oauth2" "service_providers" { | ||||
|   for_each              = local.services_auth | ||||
|  |  | |||
							
								
								
									
										17
									
								
								playbooks/roles/lgtm_stack/tasks/grafana.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								playbooks/roles/lgtm_stack/tasks/grafana.yml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| - name: Set grafana datasources path | ||||
|   ansible.builtin.set_fact: | ||||
|     datasources_path: "{{ (service_path, 'datasources') | path_join }}" | ||||
| 
 | ||||
| - name: Create datasources directory | ||||
|   ansible.builtin.file: | ||||
|     path: "{{ datasources_path }}" | ||||
|     state: directory | ||||
|     mode: "0755" | ||||
| 
 | ||||
| - name: Template default datasources | ||||
|   ansible.builtin.template: | ||||
|     src: yml.j2 | ||||
|     dest: "{{ (datasources_path, 'default.yaml') | path_join }}" | ||||
|     mode: "0644" | ||||
|   vars: | ||||
|     yml: "{{ lgtm_stack_grafana_datasources }}" | ||||
							
								
								
									
										32
									
								
								playbooks/roles/lgtm_stack/tasks/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								playbooks/roles/lgtm_stack/tasks/main.yml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| --- | ||||
| - name: Set common facts | ||||
|   ansible.builtin.import_tasks: tasks/set-default-facts.yml | ||||
| 
 | ||||
| - name: Deploy {{ role_name }} | ||||
|   vars: | ||||
|     svc: "{{ lgtm_stack_svc }}" | ||||
|     env: "{{ lgtm_stack_env }}" | ||||
|     compose: "{{ lgtm_stack_compose }}" | ||||
|   block: | ||||
|     - name: Import prepare tasks for common service | ||||
|       ansible.builtin.import_tasks: tasks/prepare-common-service.yml | ||||
| 
 | ||||
|     - name: Run grafana specific tasks | ||||
|       ansible.builtin.import_tasks: grafana.yml | ||||
| 
 | ||||
|     - name: Template alloy config file | ||||
|       ansible.builtin.template: | ||||
|         src: config.alloy.j2 | ||||
|         dest: "{{ (service_path, 'config.alloy') | path_join }}" | ||||
|         mode: "0644" | ||||
| 
 | ||||
|     - name: Template mimir config file | ||||
|       ansible.builtin.template: | ||||
|         src: yml.j2 | ||||
|         dest: "{{ (service_path, 'mimir.yaml') | path_join }}" | ||||
|         mode: "0644" | ||||
|       vars: | ||||
|         yml: "{{ lgtm_stack_mimir_yml }}" | ||||
| 
 | ||||
|     - name: Import start tasks for common service | ||||
|       ansible.builtin.import_tasks: tasks/start-common-service.yml | ||||
							
								
								
									
										24
									
								
								playbooks/roles/lgtm_stack/templates/config.alloy.j2
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								playbooks/roles/lgtm_stack/templates/config.alloy.j2
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| logging { | ||||
|   level  = "info" | ||||
|   format = "logfmt" | ||||
| } | ||||
| 
 | ||||
| prometheus.exporter.self "alloy" {} | ||||
| prometheus.scrape "alloy" { | ||||
| 	targets    = prometheus.exporter.self.alloy.targets | ||||
| 	forward_to = [prometheus.remote_write.mimir.receiver] | ||||
| } | ||||
| 
 | ||||
| // prometheus.exporter.node_exporter "node_exporter" {} | ||||
| prometheus.scrape "node_exporter" { | ||||
|   targets = [ | ||||
|     {"__address__" = "node_exporter:9100", "job" = "node_exporter"}, | ||||
|   ] | ||||
|   forward_to = [prometheus.remote_write.mimir.receiver] | ||||
| } | ||||
| 
 | ||||
| prometheus.remote_write "mimir" { | ||||
| 	endpoint { | ||||
| 		url = "https://{{ lgtm_stack_mimir_domain }}/api/v1/push" | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										173
									
								
								playbooks/roles/lgtm_stack/vars/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								playbooks/roles/lgtm_stack/vars/main.yml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,173 @@ | |||
| --- | ||||
| lgtm_stack_domain: "{{ all_services | service_get_domain(role_name) }}" | ||||
| lgtm_stack_mimir_domain: mimir.serguzim.me | ||||
| lgtm_stack_alloy_domain: alloy.serguzim.me | ||||
| 
 | ||||
| lgtm_stack_svc: | ||||
|   domain: "{{ lgtm_stack_domain }}" | ||||
|   port: 3000 | ||||
|   extra_svcs: | ||||
|     - domain: "{{ lgtm_stack_alloy_domain }}" | ||||
|       docker_host: lgtm_stack_alloy | ||||
|       port: 12345 | ||||
|       caddy_extra: import vpn_only | ||||
|     - domain: "{{ lgtm_stack_mimir_domain }}" | ||||
|       docker_host: lgtm_stack_mimir | ||||
|       port: 9009 | ||||
|       caddy_extra: import vpn_only | ||||
| 
 | ||||
| lgtm_stack_env: | ||||
| 
 | ||||
|   GF_DEFAULT_INSTANCE_NAME: "{{ lgtm_stack_domain }}" | ||||
|   GF_SERVER_PROTOCOL: "http" | ||||
|   GF_SERVER_DOMAIN: "{{ lgtm_stack_domain }}" | ||||
|   GF_SERVER_ROOT_URL: "https://{{ lgtm_stack_domain }}/" | ||||
| 
 | ||||
|   GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: true | ||||
|   GF_SECURITY_ADMIN_USER: "{{ admin_email }}" | ||||
|   GF_SECURITY_SECRET_KEY: "{{ vault_lgtm_stack.grafana.secret_key }}" | ||||
|   GF_SECURITY_COOKIE_SECURE: true | ||||
|   GF_SECURITY_COOKIE_SAMESITE: "strict" | ||||
| 
 | ||||
|   GF_PLUGINS_PLUGIN_ADMIN_ENABLED: true | ||||
| 
 | ||||
|   GF_DATABASE_TYPE: "postgres" | ||||
|   GF_DATABASE_HOST: "{{ postgres.host }}" | ||||
|   GF_DATABASE_NAME: "{{ opentofu.postgresql_data.lgtm_stack.database }}" | ||||
|   GF_DATABASE_USER: "{{ opentofu.postgresql_data.lgtm_stack.user }}" | ||||
|   GF_DATABASE_PASSWORD: "{{ opentofu.postgresql_data.lgtm_stack.pass }}" | ||||
|   GF_DATABASE_SSL_MODE: "verify-full" | ||||
| 
 | ||||
|   GF_USERS_ALLOW_SIGN_UP: false | ||||
|   GF_AUTH_DISABLE_LOGIN_FORM: true | ||||
|   GF_SIGNOUT_REDIRECT_URL: "https://{{ lgtm_stack_domain }}/" | ||||
|   GF_OAUTH_AUTO_LOGIN: true | ||||
|   GF_AUTH_ANONYMOUS_ENABLED: true | ||||
|   GF_AUTH_ANONYMOUS_ORG_NAME: "Main Org." | ||||
|   GF_AUTH_ANONYMOUS_ORG_ROLE: "Viewer" | ||||
|   GF_AUTH_GENERIC_OAUTH_ENABLED: true | ||||
|   GF_AUTH_GENERIC_OAUTH_NAME: "auth.serguzim.me" | ||||
|   GF_AUTH_GENERIC_OAUTH_ALLOW_SIGN_UP: true | ||||
|   GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_PATH: "contains(groups, 'Grafana GrafanaAdmins') && 'GrafanaAdmin' || contains(groups, 'Grafana Admins') && 'Admin' || contains(groups, 'Grafana Editors') && 'Editor' || 'Viewer'" | ||||
|   GF_AUTH_GENERIC_OAUTH_ALLOW_ASSIGN_GRAFANA_ADMIN: true | ||||
|   GF_AUTH_GENERIC_OAUTH_CLIENT_ID: "{{ opentofu.authentik_data.lgtm_stack.client_id }}" | ||||
|   GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET: "{{ opentofu.authentik_data.lgtm_stack.client_secret }}" | ||||
|   GF_AUTH_GENERIC_OAUTH_SCOPES: "openid profile email" | ||||
|   GF_AUTH_GENERIC_OAUTH_AUTH_URL: "https://auth.serguzim.me/application/o/authorize/" | ||||
|   GF_AUTH_GENERIC_OAUTH_TOKEN_URL: "https://auth.serguzim.me/application/o/token/" | ||||
|   GF_AUTH_GENERIC_OAUTH_API_URL: "https://auth.serguzim.me/application/o/userinfo/" | ||||
|   GF_AUTH_SIGNOUT_REDIRECT_URL: "{{ (opentofu.authentik_data.lgtm_stack.base_url, 'end-session') | path_join }}/" | ||||
|   GF_AUTH_OAUTH_AUTO_LOGIN: true | ||||
| 
 | ||||
|   GF_SMTP_ENABLED: true | ||||
|   GF_SMTP_HOST: "{{ mailer.host }}:{{ mailer.port }}" | ||||
|   GF_SMTP_USER: "{{ opentofu.mailcow_data.lgtm_stack.address }}" | ||||
|   GF_SMTP_PASSWORD: "{{ opentofu.mailcow_data.lgtm_stack.password }}" | ||||
|   GF_SMTP_FROM_ADDRESS: "{{ opentofu.mailcow_data.lgtm_stack.address }}" | ||||
|   GF_SMTP_FROM_NAME: "Monitoring" | ||||
| 
 | ||||
| lgtm_stack_grafana_datasources: | ||||
|   apiVersion: 1 | ||||
| 
 | ||||
|   deleteDatasources: | ||||
|     - name: Mimir | ||||
| 
 | ||||
|   datasources: | ||||
|     - name: Mimir | ||||
|       type: prometheus | ||||
|       access: proxy | ||||
|       orgId: 1 | ||||
|       url: "https://{{ lgtm_stack_mimir_domain }}/prometheus" | ||||
|       version: 1 | ||||
|       editable: true | ||||
|       jsonData: | ||||
|         timeInterval: 60s | ||||
|         prometheusType: Mimir | ||||
| 
 | ||||
| lgtm_stack_mimir_yml: | ||||
|   multitenancy_enabled: false | ||||
|   target: all | ||||
| 
 | ||||
|   common: | ||||
|     storage: | ||||
|       backend: s3 | ||||
|       s3: | ||||
|         endpoint: "{{ opentofu.scaleway_data.mimir_blocks.api_endpoint |  regex_replace('^https://', '') }}" | ||||
|         region: "{{ opentofu.scaleway_data.mimir_blocks.region }}" | ||||
|         access_key_id: "{{ opentofu.scaleway_data.mimir_blocks.access_key }}" | ||||
|         secret_access_key: "{{ opentofu.scaleway_data.mimir_blocks.secret_key }}" | ||||
|   blocks_storage: | ||||
|     s3: | ||||
|       bucket_name: "{{ opentofu.scaleway_data.mimir_blocks.name }}" | ||||
|   alertmanager_storage: | ||||
|     s3: | ||||
|       bucket_name: "{{ opentofu.scaleway_data.mimir_alertmanager.name }}" | ||||
|   ruler_storage: | ||||
|     s3: | ||||
|       bucket_name: "{{ opentofu.scaleway_data.mimir_ruler.name }}" | ||||
| 
 | ||||
|   server: | ||||
|     http_listen_port: 9009 | ||||
| 
 | ||||
|     # Configure the server to allow messages up to 100MB. | ||||
|     grpc_server_max_recv_msg_size: 104857600 | ||||
|     grpc_server_max_send_msg_size: 104857600 | ||||
|     grpc_server_max_concurrent_streams: 1000 | ||||
| 
 | ||||
|   ingester: | ||||
|     ring: | ||||
|       replication_factor: 1 | ||||
| 
 | ||||
| lgtm_stack_compose: | ||||
|   watchtower: update | ||||
|   image: grafana/grafana-oss | ||||
|   volumes: | ||||
|     - ./datasources:/etc/grafana/provisioning/datasources | ||||
|     - grafana-data:/var/lib/grafana | ||||
|   file: | ||||
|     services: | ||||
|       alloy: | ||||
|         image: grafana/alloy:latest | ||||
|         restart: always | ||||
|         volumes: | ||||
|           - ./config.alloy:/etc/alloy/config.alloy:ro | ||||
|         command: | ||||
|           - run | ||||
|           - /etc/alloy/config.alloy | ||||
|           - --storage.path=/var/lib/alloy/data | ||||
|           - --server.http.listen-addr=0.0.0.0:12345 | ||||
|           - --stability.level=experimental | ||||
|         networks: | ||||
|           apps: | ||||
|             aliases: | ||||
|             - lgtm_stack_alloy | ||||
|           default: | ||||
|       node_exporter: | ||||
|         image: prom/node-exporter | ||||
|         hostname: "{{ inventory_hostname }}" | ||||
|         restart: always | ||||
|         volumes: | ||||
|           - /proc:/host/proc:ro | ||||
|           - /sys:/host/sys:ro | ||||
|         command: | ||||
|           - '--path.procfs=/host/proc' | ||||
|           - '--path.sysfs=/host/sys' | ||||
|           - '--collector.filesystem.ignored-mount-points' | ||||
|           - '^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)' | ||||
|         networks: | ||||
|           default: | ||||
| 
 | ||||
|       mimir: | ||||
|         image: grafana/mimir:latest | ||||
|         restart: always | ||||
|         command: | ||||
|           - -config.file=/etc/mimir-config/mimir.yaml | ||||
|         volumes: | ||||
|           - ./mimir.yaml:/etc/mimir-config/mimir.yaml:ro | ||||
|         networks: | ||||
|           default: | ||||
|           apps: | ||||
|             aliases: | ||||
|             - lgtm_stack_mimir | ||||
|     volumes: | ||||
|       grafana-data: | ||||
|  | @ -13,6 +13,7 @@ icon_overrides = { | |||
|     "forgejo_runner": "forgejo", | ||||
|     "healthcheck": "healthchecks", | ||||
|     "lego": "lets-encrypt", | ||||
|     "lgtm_stack": "grafana", | ||||
|     "mailcowdockerized": "mailcow", | ||||
|     "minecraft_3": "minecraft", | ||||
|     "reitanlage_oranienburg": "grav", | ||||
|  |  | |||
|  | @ -403,6 +403,31 @@ services = { | |||
|     s3 = false | ||||
|   }, | ||||
| 
 | ||||
|   "lgtm_stack" = { | ||||
|     host = "node001" | ||||
|     dns = [ | ||||
|       { | ||||
|         domain = "monitoring.serguzim.me" | ||||
|       }, | ||||
|       { | ||||
|         domain = "alloy.serguzim.me" | ||||
|         name = "alloy" | ||||
|         vpn = true | ||||
|       }, | ||||
|       { | ||||
|         domain = "mimir.serguzim.me" | ||||
|         name = "mimir" | ||||
|         vpn = true | ||||
|       } | ||||
|     ] | ||||
|     auth = true | ||||
|     auth_redirects = ["https://monitoring.serguzim.me/login/generic_oauth"] | ||||
|     database = true | ||||
|     s3 = true | ||||
|     s3_buckets = ["mimir_blocks", "mimir_alertmanager", "mimir_ruler"] | ||||
|     mail = "monitoring" | ||||
|   } | ||||
| 
 | ||||
|   "minecraft_3" = { | ||||
|     host = "" | ||||
|     dns = [ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue