diff --git a/containers/loki/config.yml b/containers/loki/config.yml new file mode 100644 index 000000000..8dde74156 --- /dev/null +++ b/containers/loki/config.yml @@ -0,0 +1,33 @@ +auth_enabled: false + +server: + http_listen_port: 3100 + grpc_listen_port: 9096 + +common: + instance_addr: 127.0.0.1 + path_prefix: /data/loki + storage: + filesystem: + chunks_directory: /data/loki/chunks + replication_factor: 1 + ring: + kvstore: + store: inmemory + +ruler: + storage: + type: local + local: + directory: /tmp/loki-rules + +schema_config: + configs: + - from: 2020-10-24 + store: tsdb + object_store: filesystem + schema: v13 + index: + prefix: index_ + period: 24h + diff --git a/containers/mimir/config.yml b/containers/mimir/config.yml new file mode 100644 index 000000000..2aa80b1be --- /dev/null +++ b/containers/mimir/config.yml @@ -0,0 +1,26 @@ +target: all + +server: + http_listen_port: 9009 + grpc_listen_port: 9095 + +ingester: + ring: + instance_addr: 127.0.0.1 + kvstore: + store: inmemory + replication_factor: 1 + +blocks_storage: + backend: filesystem + filesystem: + dir: /data/mimir/blocks + tsdb: + dir: /data/mimir/tsdb + +compactor: + data_dir: /data/mimir/compactor + +store_gateway: + sharding_ring: + replication_factor: 1 diff --git a/containers/nginx/auth/metrics.htpasswd b/containers/nginx/auth/metrics.htpasswd new file mode 100644 index 000000000..7b25837a0 --- /dev/null +++ b/containers/nginx/auth/metrics.htpasswd @@ -0,0 +1 @@ +remote_writer:$apr1$baokJMMP$NH1P3Xbin2H9GqtJ8IZL2/ diff --git a/containers/nginx/default.conf b/containers/nginx/default.conf index 38f386f41..71bbb4e80 100644 --- a/containers/nginx/default.conf +++ b/containers/nginx/default.conf @@ -3,6 +3,107 @@ upstream backend { server ${PROXY_PASS}; } +server { + listen 80; + server_name grafana.metrics.sctomega.com; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + server_name grafana.metrics.sctomega.com; + + ssl_certificate /etc/letsencrypt/live/grafana.metrics.sctomega.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/grafana.metrics.sctomega.com/privkey.pem; + + ssl_protocols TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5; + + add_header Strict-Transport-Security "max-age=31536000" always; + + location ^~ /.well-known/acme-challenge/ { + alias /var/www/certbot/.well-known/acme-challenge/; + } + + location / { + proxy_pass http://grafana:3000/; + proxy_http_version 1.1; + proxy_set_header Connection 'upgrade'; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } +} + +server { + listen 80; + server_name mimir.metrics.sctomega.com; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + server_name mimir.metrics.sctomega.com; + + ssl_certificate /etc/letsencrypt/live/mimir.metrics.sctomega.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/mimir.metrics.sctomega.com/privkey.pem; + + ssl_protocols TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5; + + add_header Strict-Transport-Security "max-age=31536000" always; + auth_basic "Restricted"; + auth_basic_user_file /etc/nginx/auth/metrics.htpasswd; + + location ^~ /.well-known/acme-challenge/ { + alias /var/www/certbot/.well-known/acme-challenge/; + } + + location / { + proxy_pass http://mimir:9009; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto https; + } +} + +server { + listen 80; + server_name loki.metrics.sctomega.com; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl; + server_name loki.metrics.sctomega.com; + + ssl_certificate /etc/letsencrypt/live/loki.metrics.sctomega.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/loki.metrics.sctomega.com/privkey.pem; + + ssl_protocols TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5; + + add_header Strict-Transport-Security "max-age=31536000" always; + auth_basic "Restricted"; + auth_basic_user_file /etc/nginx/auth/metrics.htpasswd; + + location ^~ /.well-known/acme-challenge/ { + alias /var/www/certbot/.well-known/acme-challenge/; + } + + location / { + proxy_pass http://loki:3100; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto https; + } +} + server { listen 80; server_name ${DOMAIN}; diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index b049f4671..7cc4f5f9c 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -30,10 +30,11 @@ services: - 443:443 environment: DOMAIN: ${DOMAIN} - PROXY_PASS: 'projectnext:3000' + PROXY_PASS: "projectnext:3000" volumes: - ./containers/nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./containers/nginx/default.conf:/etc/nginx/templates/default.conf.template:ro + - ./containers/nginx/auth:/etc/nginx/auth:ro - store:/usr/store:ro - ./certs/conf:/etc/letsencrypt:ro - ./certs/www/:/var/www/certbot:ro @@ -46,13 +47,37 @@ services: entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 14d & wait $${!}; done;'" restart: always + grafana: + image: grafana/grafana:latest + volumes: + - grafana_data:/var/lib/grafana + - ./containers/grafana/provisioning:/etc/grafana/provisioning:ro + restart: unless-stopped + + loki: + image: grafana/loki:latest + user: root + volumes: + - ./containers/loki/config.yml:/etc/loki/config.yml:ro + - loki_data:/data/loki + command: -config.file=/etc/loki/config.yml + restart: unless-stopped + + mimir: + image: grafana/mimir:latest + volumes: + - ./containers/mimir/config.yml:/etc/mimir/config.yml:ro + - mimir_data:/data/mimir + command: -config.file=/etc/mimir/config.yml + restart: unless-stopped + postfix: build: ${PROJECT_ROOT:-.}/containers/postfix/ ports: - - '587:587' - - '25:25' + - "587:587" + - "25:25" environment: - POSTGRES_HOST: 'db' + POSTGRES_HOST: "db" POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USERNAME} POSTGRES_PASSWORD: ${DB_PASSWORD} @@ -76,3 +101,9 @@ volumes: driver: local dobbelOmegaManifest: driver: local + grafana_data: + driver: local + loki_data: + driver: local + mimir_data: + driver: local