[logs]
change
commit 3e3b47ebf6d2e5d167dc34a998f8fab71c9590ff
author Alpha Chen <alpha@kejadlen.dev>
date
parent 4e1b7be8
diff --git a/lotus-land-story/grafana.yml b/lotus-land-story/grafana.yml
index 4a275a7..cfdb3ec 100644
--- a/lotus-land-story/grafana.yml
+++ b/lotus-land-story/grafana.yml
@@ -87,7 +87,7 @@
           - /mnt/lotus-land-story/grafana/provisioning:/etc/grafana/provisioning
           - grafana:/var/lib/grafana
         env:
-          GF_INSTALL_PLUGINS: https://storage.googleapis.com/integration-artifacts/grafana-lokiexplore-app/grafana-lokiexplore-app-latest.zip;grafana-lokiexplore-app
+          # GF_INSTALL_PLUGINS: https://storage.googleapis.com/integration-artifacts/grafana-lokiexplore-app/grafana-lokiexplore-app-latest.zip;grafana-lokiexplore-app
         restart_policy: unless-stopped
         networks:
           - name: lotus_land_story
diff --git a/lotus-land-story/logs.yml b/lotus-land-story/logs.yml
index 087ecd7..0b93bca 100644
--- a/lotus-land-story/logs.yml
+++ b/lotus-land-story/logs.yml
@@ -1,9 +1,41 @@
+- name: Set up Vector
+  tags: vector
+  hosts: lotus-land-story
+  vars:
+    version: 0.45.0-debian
+  tasks:
+
+    - name: Create Vector config dir
+      ansible.builtin.file:
+        path: /mnt/lotus-land-story/vector
+        state: directory
+        mode: "0700"
+
+    - name: Configure Vector
+      ansible.builtin.copy:
+        src: templates/vector.yml
+        dest: /mnt/lotus-land-story/vector/vector.yml
+
+    - name: Run Vector
+      community.docker.docker_container:
+        name: vector
+        image: timberio/vector:{{ version }}
+        restart: true
+        command: -c /etc/vector/*.yml
+        volumes:
+          - /mnt/lotus-land-story/vector:/etc/vector:ro
+          # - /var/log:/var/log
+          - /var/run/docker.sock:/var/run/docker.sock
+        restart_policy: unless-stopped
+        networks:
+          - name: lotus_land_story
+
 - name: VictoriaLogs
   hosts: lotus-land-story
   vars_files:
     - vars.yml
   vars:
-    victoria_logs_version: 1.20.0
+    version: 1.20.0
   tasks:
 
     - name: Make directories
@@ -23,14 +55,50 @@
       community.docker.docker_container:
         restart: true
         name: victoria-logs
-        image: docker.io/victoriametrics/victoria-logs:v{{ victoria_logs_version }}-victorialogs
+        image: docker.io/victoriametrics/victoria-logs:v{{ version }}-victorialogs
+        command: -storageDataPath=/data -syslog.listenAddr.tcp=:514
         restart_policy: unless-stopped
+        ports:
+          - "514:514"   # syslog
+          - "9428:9428" # journald
         volumes:
           - /mnt/lotus-land-story/victoria-logs:/data
         networks:
           - name: lotus_land_story
-        # etc_hosts:
-        #   host.docker.internal: host-gateway
+
+    - name: Ship syslogs
+      ansible.builtin.copy:
+        content: |
+          *.* action(type="omfwd"
+                     protocol="tcp"
+                     target="127.0.0.1"
+                     port="514"
+                     Template="RSYSLOG_SyslogProtocol23Format"
+                     TCP_Framing="octet-counted"
+                     KeepAlive="on")
+        dest: /etc/rsyslog.d/50-promtail.conf
+        mode: "0644"
+      notify: Restart rsyslog
+
+    - name: Ship journald logs
+      block:
+
+        - name: Install systemd-journal-remote
+          ansible.builtin.apt:
+            name: systemd-journal-remote
+            state: present
+
+        - name: Set remote URL for uploading
+          ansible.builtin.lineinfile:
+            path: /etc/systemd/journal-upload.conf
+            regexp: '^URL='
+            insertafter: '^# URL='
+            line: URL=http://localhost:9428/insert/journald
+
+        - name: Run systemd-journal-remote
+          ansible.builtin.service:
+            name: systemd-journal-upload
+            state: started
 
   handlers:
     - name: Import restarts
diff --git a/lotus-land-story/loki.yml b/lotus-land-story/loki.yml
index 0a49342..1a1baaa 100644
--- a/lotus-land-story/loki.yml
+++ b/lotus-land-story/loki.yml
@@ -12,12 +12,10 @@
         dest: /mnt/lotus-land-story/grafana/provisioning/datasources/loki.yml
         content: |
           apiVersion: 1
-
-          datasources:
+          deleteDatasources:
             - name: Loki
-              type: loki
-              access: proxy
-              url: http://loki:3100
+              orgId: 1
+          prune: true
         mode: "0644"
 
     - name: Create Loki config dirs
@@ -94,6 +92,7 @@
 
     - name: Run Loki
       community.docker.docker_container:
+        state: absent
         name: loki
         image: grafana/loki:{{ version }}
         restart: true
@@ -109,116 +108,6 @@
         etc_hosts:
           host.docker.internal: host-gateway
 
-- name: Set up Vector
-  tags: vector
-  hosts: lotus-land-story
-  vars:
-    version: 0.45.0-debian
-  tasks:
-
-    - name: Create Vector config dir
-      ansible.builtin.file:
-        path: /mnt/lotus-land-story/vector
-        state: directory
-        mode: "0700"
-
-    - name: Configure Vector
-      ansible.builtin.copy:
-        dest: /mnt/lotus-land-story/vector/vector.yml
-        content: |
-          sources:
-            rsyslog:
-              type: syslog
-              address: 0.0.0.0:514
-              mode: tcp
-            docker:
-              type: docker_logs
-
-          transforms:
-            docker_parsed:
-              type: remap
-              inputs:
-                - docker
-              source: |
-                ._time = del(.timestamp)
-
-                if .container_name == "caddy" {
-                  . = merge!(., parse_json!(.message))
-                  ._time = del(.ts)
-                  ._msg = del(.msg)
-                } else if .container_name == "gotosocial" {
-                  . = merge!(., parse_key_value!(.message))
-                  ._time = parse_timestamp!(del(.timestamp), format: "%d/%m/%Y %H:%M:%S%.3f")
-                  ._msg = del(.msg)
-                } else if .container_name == "loki" {
-                  . = merge!(., parse_key_value!(.message))
-                  ._time = del(.ts)
-                  ._msg = del(.msg)
-                } else if .container_name == "miniflux" {
-                  . = merge!(., parse_json!(.message))
-                  ._msg = del(.msg)
-                } else {
-                  ._msg = .message
-                }
-                del(.message)
-
-                ._stream_id = .container_name
-
-          sinks:
-            # console:
-            #   inputs:
-            #     - remap_caddy
-            #   target: stdout
-            #   type: console
-            #   encoding:
-            #     codec: json
-
-            loki_rsyslog:
-              type: loki
-              inputs:
-                - rsyslog
-              endpoint: http://loki:3100
-              encoding:
-                codec: json
-              labels:
-                agent: vector
-                host: "{{ '{{' }} host }}"
-                level: "{{ '{{' }} severity }}"
-                syslog_facility: "{{ '{{' }} facility }}"
-                syslog_identifier: "{{ '{{' }} appname }}"
-
-            victoria_logs:
-              inputs:
-                - docker_parsed
-              type: http
-              uri: http://victoria-logs:9428/insert/jsonline
-              compression: gzip
-              encoding:
-                codec: json
-              framing:
-                method: newline_delimited
-              healthcheck:
-                enabled: false
-
-    - name: Run Vector
-      community.docker.docker_container:
-        name: vector
-        image: timberio/vector:{{ version }}
-        restart: true
-        command: -c /etc/vector/*.yml
-        ports:
-          - "514:514"
-        volumes:
-          - /mnt/lotus-land-story/vector:/etc/vector:ro
-          # - /var/log:/var/log
-          - /var/run/docker.sock:/var/run/docker.sock
-        restart_policy: unless-stopped
-        networks:
-          - name: lotus_land_story
-        # etc_hosts:
-        #   host.docker.internal: host-gateway
-
-
 - name: Set up Promtail
   tags: promtail
   hosts: lotus-land-story
@@ -268,6 +157,7 @@
 
     - name: Run Promtail
       community.docker.docker_container:
+        state: absent
         name: promtail
         image: grafana/promtail:{{ version }}
         restart: true
diff --git a/lotus-land-story/security.yml b/lotus-land-story/security.yml
index e69e151..39db116 100644
--- a/lotus-land-story/security.yml
+++ b/lotus-land-story/security.yml
@@ -1,4 +1,6 @@
-- hosts: lotus-land-story
+- name: Set up firewall
+  tags: ufw
+  hosts: lotus-land-story
   tasks:
 
     - name: Enable ufw
@@ -40,4 +42,27 @@
     - name: Import restarts
       ansible.builtin.import_tasks: restarts.yml
 
+- name: Set up Fail2Ban
+  tags: fail2ban
+  hosts: lotus-land-story
+  tasks:
+
+    - name: Install Fail2Ban
+      ansible.builtin.apt:
+        name: fail2ban
+        state: present
+
+    - name: Configure Fail2Ban
+      ansible.builtin.copy:
+        dest: /etc/jail.local
+        content: |
+          [sshd]
+          enabled = true
+        mode: "0600"
+
+    - name: Start Fail2Ban
+      ansible.builtin.service:
+        name: fail2ban
+        state: started
+
 # vim: ft=yaml.ansible
diff --git a/lotus-land-story/templates/prometheus.yml b/lotus-land-story/templates/prometheus.yml
index b32024a..676ab88 100644
--- a/lotus-land-story/templates/prometheus.yml
+++ b/lotus-land-story/templates/prometheus.yml
@@ -37,10 +37,6 @@ scrape_configs:
     static_configs:
       - targets: ['postgres-exporter:9187']
 
-  - job_name: promtail
-    static_configs:
-      - targets: ['promtail:9080']
-
   - job_name: miniflux
     static_configs:
       - targets: ['miniflux:8080']
@@ -83,3 +79,7 @@ scrape_configs:
     bearer_token: {{ gitea.metrics_token }}
     static_configs:
       - targets: ['gitea:3000']
+
+  - job_name: victoria-logs
+    static_configs:
+      - targets: ['victoria-logs:9428']
diff --git a/lotus-land-story/templates/vector.yml b/lotus-land-story/templates/vector.yml
new file mode 100644
index 0000000..af23dab
--- /dev/null
+++ b/lotus-land-story/templates/vector.yml
@@ -0,0 +1,77 @@
+sources:
+  docker:
+    type: docker_logs
+
+transforms:
+  docker_parsed:
+    type: remap
+    inputs:
+      - docker
+    source: |
+      ._time = del(.timestamp)
+
+      if .container_name == "caddy" {
+        . = merge!(., parse_json!(.message))
+        ._time = del(.ts)
+        ._msg = del(.msg)
+      } else if .container_name == "gitea" {
+        # gitea's common log doesn't match the vector common log because of the referer and user agent
+        router, router_err = parse_regex(
+            .message,
+            r'^(?P<remote_host>.*?) - (?P<identity>.*?) \[(?P<datetime>.*?)\] "(?P<request>.*?)" (?P<status>.*?) (?P<size>.*?) "(?P<referer>.*?)" "(?P<user_agent>.*?)"$',
+        )
+        if router_err == null {
+            . = merge(., router)
+
+            request = parse_regex!(.request, r'^(?P<method>.*?) (?P<request_uri>.*?) (?P<proto>.*?)$')
+            . = merge(., request)
+
+            ._time = parse_timestamp!(del(.datetime), format: "%d/%b/%Y:%H:%M:%S %z")
+            ._msg = del(.request)
+        } else {
+          ._msg = .message
+        }
+      } else if .container_name == "gotosocial" {
+        . = merge!(., parse_key_value!(.message))
+        ._time = parse_timestamp!(del(.timestamp), format: "%d/%m/%Y %H:%M:%S%.3f")
+        ._msg = del(.msg)
+      } else if .container_name == "grafana" {
+        . = merge!(., parse_key_value!(.message))
+        ._time = del(.t)
+        ._msg = del(.msg)
+      } else if .container_name == "loki" {
+        . = merge!(., parse_key_value!(.message))
+        ._time = del(.ts)
+        ._msg = del(.msg)
+      } else if .container_name == "miniflux" {
+        . = merge!(., parse_json!(.message))
+        ._msg = del(.msg)
+      } else {
+        ._msg = .message
+      }
+      del(.message)
+
+      ._stream_id = .container_name
+      ._stream = { "container_name": .container_name }
+
+sinks:
+  # console:
+  #   inputs:
+  #     - remap_caddy
+  #   target: stdout
+  #   type: console
+  #   encoding:
+  #     codec: json
+
+  victoria_logs:
+    inputs:
+      - docker_parsed
+    type: http
+    uri: http://victoria-logs:9428/insert/jsonline
+    compression: gzip
+    encoding:
+      codec: json
+    framing:
+      method: newline_delimited
+    healthcheck:
+      enabled: false