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        = [] |   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" { | resource "authentik_provider_oauth2" "service_providers" { | ||||||
|   for_each              = local.services_auth |   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", |     "forgejo_runner": "forgejo", | ||||||
|     "healthcheck": "healthchecks", |     "healthcheck": "healthchecks", | ||||||
|     "lego": "lets-encrypt", |     "lego": "lets-encrypt", | ||||||
|  |     "lgtm_stack": "grafana", | ||||||
|     "mailcowdockerized": "mailcow", |     "mailcowdockerized": "mailcow", | ||||||
|     "minecraft_3": "minecraft", |     "minecraft_3": "minecraft", | ||||||
|     "reitanlage_oranienburg": "grav", |     "reitanlage_oranienburg": "grav", | ||||||
|  |  | ||||||
|  | @ -403,6 +403,31 @@ services = { | ||||||
|     s3 = false |     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" = { |   "minecraft_3" = { | ||||||
|     host = "" |     host = "" | ||||||
|     dns = [ |     dns = [ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue