this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

:tada: initial commit

Pedro Correa 9b8f759a

+691
+49
caddy/Caddyfile
··· 1 + (cloudflare) { 2 + tls { 3 + dns cloudflare 4 + } 5 + } 6 + 7 + stump.tulkdan.dev { 8 + import cloudflare 9 + 10 + reverse_proxy stump:10801 11 + } 12 + 13 + grafana.tulkdan.dev { 14 + import cloudflare 15 + 16 + reverse_proxy monitoring-grafana:3000 17 + } 18 + 19 + glance.tulkdan.dev { 20 + import cloudflare 21 + 22 + reverse_proxy glance:8080 23 + } 24 + 25 + git.tulkdan.dev { 26 + import cloudflare 27 + 28 + reverse_proxy soft-serve:23232 29 + } 30 + 31 + wakapi.tulkdan.dev { 32 + import cloudflare 33 + 34 + reverse_proxy wakapi:3000 35 + } 36 + 37 + paisa.tulkdan.dev { 38 + import cloudflare 39 + 40 + reverse_proxy paisa:7500 41 + } 42 + 43 + *.tulkdan.dev { 44 + import cloudflare 45 + 46 + handle { 47 + abort 48 + } 49 + }
+11
caddy/Dockerfile
··· 1 + ARG VERSION=2 2 + 3 + FROM caddy:${VERSION}-builder AS builder 4 + 5 + # We need this plugin to obtain SSL certificates from Cloudflare 6 + RUN xcaddy build \ 7 + --with github.com/caddy-dns/cloudflare 8 + 9 + FROM caddy:${VERSION} 10 + 11 + COPY --from=builder /usr/bin/caddy /usr/bin/caddy
+26
caddy/docker-compose.yml
··· 1 + services: 2 + caddy: 3 + build: . 4 + restart: unless-stopped 5 + container_name: caddy 6 + hostname: caddy 7 + ports: 8 + - "80:80" 9 + - "443:443" 10 + - "443:443/udp" 11 + networks: 12 + - proxy-network 13 + volumes: 14 + - ./Caddyfile:/etc/caddy/Caddyfile 15 + - ./data:/data 16 + - ./config:/config 17 + - /var/run/docker.sock:/var/run/docker.sock 18 + labels: 19 + glance.name: Caddy 20 + glance.icon: si:caddy 21 + 22 + networks: 23 + proxy-network: 24 + name: proxy-network 25 + attachable: true 26 + driver: bridge
+15
glance/docker-compose.yml
··· 1 + services: 2 + glance: 3 + container_name: glance 4 + image: glanceapp/glance 5 + volumes: 6 + - ./glances:/app/config 7 + - /var/run/docker.sock:/var/run/docker.sock 8 + restart: unless-stopped 9 + networks: 10 + - glance-network 11 + 12 + networks: 13 + glance-network: 14 + name: proxy-network 15 + external: true
+9
glance/glances/glance.yml
··· 1 + pages: 2 + !include: startpage.yml 3 + !include: news.yml 4 + !include: local.yml 5 + 6 + theme: 7 + background-color: 50 1 6 8 + primary-color: 24 97 58 9 + negative-color: 209 88 54
+136
glance/glances/local.yml
··· 1 + - name: Local 2 + width: slim 3 + columns: 4 + - size: full 5 + widgets: 6 + - type: docker-containers 7 + 8 + - type: split-column 9 + widgets: 10 + - type: dns-stats 11 + service: adguard 12 + url: http://192.168.0.13:150 13 + username: tulkdan 14 + password: 15 + 16 + - type: custom-api 17 + title: Tailscale Devices 18 + title-url: https://login.tailscale.com/admin/machines 19 + url: https://api.tailscale.com/api/v2/tailnet/-/devices 20 + headers: 21 + Authorization: Bearer 22 + cache: 10m 23 + template: | 24 + {{/* User Variables */}} 25 + {{/* Set to true if you'd like an indicator for online devices */}} 26 + {{ $enableOnlineIndicator := true }} 27 + 28 + <style> 29 + .device-info-container { 30 + position: relative; 31 + overflow: hidden; 32 + height: 1.5em; 33 + } 34 + 35 + .device-info { 36 + display: flex; 37 + transition: transform 0.2s ease, opacity 0.2s ease; 38 + } 39 + 40 + .device-ip { 41 + position: absolute; 42 + top: 0; 43 + left: 0; 44 + transform: translateY(-100%); 45 + opacity: 0; 46 + transition: transform 0.2s ease, opacity 0.2s ease; 47 + } 48 + 49 + .device-info-container:hover .device-info { 50 + transform: translateY(100%); 51 + opacity: 0; 52 + } 53 + 54 + .device-info-container:hover .device-ip { 55 + transform: translateY(0); 56 + opacity: 1; 57 + } 58 + 59 + .update-indicator { 60 + width: 8px; 61 + height: 8px; 62 + border-radius: 50%; 63 + background-color: var(--color-primary); 64 + display: inline-block; 65 + margin-left: 4px; 66 + vertical-align: middle; 67 + } 68 + 69 + .offline-indicator { 70 + width: 8px; 71 + height: 8px; 72 + border-radius: 50%; 73 + background-color: var(--color-negative); 74 + display: inline-block; 75 + margin-left: 4px; 76 + vertical-align: middle; 77 + } 78 + 79 + .online-indicator { 80 + width: 8px; 81 + height: 8px; 82 + border-radius: 50%; 83 + background-color: var(--color-positive); 84 + display: inline-block; 85 + margin-left: 4px; 86 + vertical-align: middle; 87 + } 88 + 89 + .device-name-container { 90 + display: flex; 91 + align-items: center; 92 + gap: 8px; 93 + } 94 + 95 + .indicators-container { 96 + display: flex; 97 + align-items: center; 98 + gap: 4px; 99 + } 100 + </style> 101 + <ul class="list list-gap-10 collapsible-container" data-collapse-after="4"> 102 + {{ range .JSON.Array "devices" }} 103 + <li> 104 + <div class="flex items-center gap-10"> 105 + <div class="device-name-container grow"> 106 + <span class="size-h4 block text-truncate color-primary"> 107 + {{ findMatch "^([^.]+)" (.String "name") }} 108 + </span> 109 + <div class="indicators-container"> 110 + {{ if (.Bool "updateAvailable") }} 111 + <span class="update-indicator" data-popover-type="text" data-popover-text="Update Available"></span> 112 + {{ end }} 113 + 114 + {{ $lastSeen := .String "lastSeen" | parseTime "rfc3339" }} 115 + {{ if not ($lastSeen.After (offsetNow "-10s")) }} 116 + {{ $lastSeenTimezoned := $lastSeen.In now.Location }} 117 + <span class="offline-indicator" data-popover-type="text" 118 + data-popover-text="Offline - Last seen {{ $lastSeenTimezoned.Format " Jan 2 3:04pm" }}"></span> 119 + {{ else if $enableOnlineIndicator }} 120 + <span class="online-indicator" data-popover-type="text" data-popover-text="Online"></span> 121 + {{ end }} 122 + </div> 123 + </div> 124 + </div> 125 + <div class="device-info-container"> 126 + <ul class="list-horizontal-text device-info"> 127 + <li>{{ .String "os" }}</li> 128 + <li>{{ .String "user" }}</li> 129 + </ul> 130 + <div class="device-ip"> 131 + {{ .String "addresses.0"}} 132 + </div> 133 + </div> 134 + </li> 135 + {{ end }} 136 + </ul>
+76
glance/glances/news.yml
··· 1 + - name: News 2 + width: slim 3 + columns: 4 + - size: small 5 + widgets: 6 + - type: weather 7 + location: Campinas, Brazil 8 + 9 + - type: rss 10 + limit: 20 11 + collapse-after: 10 12 + cache: 3h 13 + feeds: 14 + - url: https://stackoverflow.blog/feed/ 15 + title: Stack Overflow 16 + - url: https://buttondown.email/cassidoo/rss 17 + title: Cassidoo 18 + - url: https://github.com/readme.rss 19 + title: The ReadME Project 20 + - url: https://kerkour.com/feed.xml 21 + title: Sylvian Kerkour 22 + - url: https://blog.pico.sh/rss 23 + title: Pico Team 24 + - url: https://www.citationneeded.news/rss/ 25 + title: Citation Needed 26 + - url: https://zapier.com/engine/rss/42968/thoughtbot-giant 27 + title: ThoughtBot 28 + - url: https://www.ntietz.com/atom.xml 29 + title: Technically a blog 30 + - url: https://jvns.ca/atom.xml 31 + title: Julia Evans 32 + - url: https://newsletter.techworld-with-milan.com/feed 33 + title: Tech World with Milan 34 + - url: https://newsletter.systemdesignclassroom.com/feed 35 + title: System Design Classroom 36 + - url: https://strategizeyourcareer.com/feed 37 + title: Strategize Your Career 38 + - url: https://golangweekly.com/rss/ 39 + title: Golang weekly 40 + 41 + - size: full 42 + widgets: 43 + - type: group 44 + widgets: 45 + - type: hacker-news 46 + 47 + - type: lobsters 48 + sort-by: hot 49 + tags: 50 + - go 51 + - security 52 + - linux 53 + - vim 54 + - testing 55 + - rust 56 + - debugging 57 + - performance 58 + - release 59 + - databases 60 + - nix 61 + - javascript 62 + - nodejs 63 + - gleam 64 + - editors 65 + 66 + - type: group 67 + widgets: 68 + - type: reddit 69 + subreddit: selfhosted 70 + - type: reddit 71 + subreddit: unixporn 72 + - type: reddit 73 + subreddit: programming 74 + - type: reddit 75 + subreddit: linuxmemes 76 + show-thumbnails: true
+52
glance/glances/startpage.yml
··· 1 + - name: Startpage 2 + width: slim 3 + center-vertically: true 4 + columns: 5 + - size: full 6 + widgets: 7 + - type: search 8 + search-engine: duckduckgo 9 + bangs: 10 + - title: Youtube 11 + shortcut: "!yt" 12 + url: https://www.youtube.com/results?search_query={QUERY} 13 + - title: Nix Packages 14 + shortcut: "!np" 15 + url: https://search.nixos.org/packages?type=packages&channel=unstable&query={QUERY} 16 + 17 + - type: monitor 18 + cache: 1m 19 + title: Services 20 + sites: 21 + - title: Stump 22 + url: https://stump.tulkdan.dev 23 + icon: si:bookstack 24 + - title: Wakatime 25 + url: https://wakapi.tulkdan.dev 26 + icon: si:wakatime 27 + - title: Grafana 28 + url: https://grafana.tulkdan.dev 29 + icon: si:grafana 30 + - title: Paisa 31 + url: https://paisa.tulkdan.dev 32 + 33 + - type: bookmarks 34 + groups: 35 + - title: General 36 + links: 37 + - title: Gmail 38 + url: https://mail.google.com/mail/u/0/ 39 + - title: Proton mail 40 + url: https://mail.proton.me 41 + - title: Github 42 + url: https://github.com/ 43 + - title: Social 44 + links: 45 + - title: Reddit 46 + url: https://www.reddit.com/ 47 + - title: Bluesky 48 + url: https://bsky.app 49 + - title: Instagram 50 + url: https://www.instagram.com/ 51 + - title: Mastodon 52 + url: https://phany.social
+180
monitoring/docker-compose.yml
··· 1 + services: 2 + grafana: 3 + container_name: monitoring-grafana 4 + image: grafana/grafana:latest 5 + hostname: rpi-grafana 6 + restart: unless-stopped 7 + networks: 8 + - monitor-network 9 + - internal 10 + env_file: 11 + - ./grafana/.env 12 + volumes: 13 + - grafana-data:/var/lib/grafana 14 + depends_on: 15 + - prometheus 16 + healthcheck: 17 + test: ["CMD", "wget", "-O", "/dev/null", "http://localhost:3000/api/health"] 18 + interval: 30s 19 + timeout: 10s 20 + retries: 3 21 + start_period: 30s 22 + labels: 23 + com.example.description: Grafana Dashboard 24 + com.example.service: monitoring 25 + glance.name: Grafana 26 + glance.icon: si:grafana 27 + glance.url: https://grafana.tulkdan.dev 28 + glance.id: grafana 29 + logging: 30 + driver: "json-file" 31 + options: 32 + max-size: "10m" 33 + max-file: "3" 34 + 35 + cadvisor: 36 + container_name: monitoring-cadvisor 37 + image: gcr.io/cadvisor/cadvisor:latest 38 + hostname: rpi-cadvisor 39 + restart: unless-stopped 40 + cap_add: 41 + - SYS_ADMIN 42 + networks: 43 + - internal 44 + expose: 45 + - 8080 46 + command: 47 + - '-housekeeping_interval=15s' 48 + - '-docker_only=true' 49 + - '-store_container_labels=false' 50 + devices: 51 + - /dev/kmsg 52 + volumes: 53 + - /:/rootfs:ro 54 + - /var/run:/var/run:rw 55 + - /sys:/sys:ro 56 + - /var/lib/docker/:/var/lib/docker:ro 57 + - /dev/disk/:/dev/disk:ro 58 + - /etc/machine-id:/etc/machine-id:ro 59 + healthcheck: 60 + test: ["CMD", "wget", "-O", "/dev/null", "http://localhost:8080/healthz"] 61 + interval: 30s 62 + timeout: 10s 63 + retries: 3 64 + labels: 65 + com.example.description: cAdvisor Container Monitoring 66 + com.example.service: monitoring 67 + glance.name: CAdvisor 68 + glance.parent: grafana 69 + logging: 70 + driver: "json-file" 71 + options: 72 + max-size: "10m" 73 + max-file: "3" 74 + mem_limit: 256m 75 + mem_reservation: 128m 76 + 77 + node-exporter: 78 + container_name: monitoring-node-exporter 79 + image: prom/node-exporter:latest 80 + hostname: rpi-exporter 81 + restart: unless-stopped 82 + networks: 83 + - internal 84 + expose: 85 + - 9100 86 + command: 87 + - --path.procfs=/host/proc 88 + - --path.sysfs=/host/sys 89 + - --path.rootfs=/host 90 + - --collector.filesystem.ignored-mount-points 91 + - ^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/) 92 + volumes: 93 + - /proc:/host/proc:ro 94 + - /sys:/host/sys:ro 95 + - /:/rootfs:ro 96 + - /:/host:ro,rslave 97 + healthcheck: 98 + test: ["CMD", "wget", "-O", "/dev/null", "http://localhost:9100/metrics"] 99 + interval: 30s 100 + timeout: 10s 101 + retries: 3 102 + labels: 103 + com.example.description: Node Exporter 104 + com.example.service: monitoring 105 + glance.name: Node exporter 106 + glance.parent: grafana 107 + logging: 108 + driver: "json-file" 109 + options: 110 + max-size: "10m" 111 + max-file: "3" 112 + mem_limit: 128m 113 + mem_reservation: 64m 114 + 115 + prometheus: 116 + container_name: monitoring-prometheus 117 + image: prom/prometheus:latest 118 + hostname: rpi-prometheus 119 + restart: unless-stopped 120 + user: "nobody" 121 + command: 122 + - '--config.file=/etc/prometheus/prometheus.yml' 123 + - '--storage.tsdb.path=/prometheus' 124 + - '--storage.tsdb.retention.time=1y' 125 + - '--storage.tsdb.retention.size=10GB' 126 + - '--web.console.libraries=/usr/share/prometheus/console_libraries' 127 + - '--web.console.templates=/usr/share/prometheus/consoles' 128 + networks: 129 + - internal 130 + expose: 131 + - 9090 132 + volumes: 133 + - prometheus-data:/prometheus 134 + - ./prometheus.yml:/etc/prometheus/prometheus.yml 135 + depends_on: 136 + - cadvisor 137 + - node-exporter 138 + healthcheck: 139 + test: ["CMD", "wget", "-O", "/dev/null", "http://localhost:9090/-/healthy"] 140 + interval: 30s 141 + timeout: 10s 142 + retries: 3 143 + start_period: 30s 144 + labels: 145 + com.example.description: Prometheus Time Series Database 146 + com.example.service: monitoring 147 + glance.name: Prometheus 148 + glance.parent: grafana 149 + logging: 150 + driver: "json-file" 151 + options: 152 + max-size: "10m" 153 + max-file: "3" 154 + mem_limit: 1g 155 + mem_reservation: 512m 156 + 157 + volumes: 158 + grafana-data: 159 + labels: 160 + - "com.example.description=Grafana Persistent Data" 161 + - "com.example.service=monitoring" 162 + prometheus-data: 163 + labels: 164 + - "com.example.description=Prometheus Persistent Data" 165 + - "com.example.service=monitoring" 166 + 167 + networks: 168 + internal: 169 + driver: bridge 170 + ipam: 171 + driver: default 172 + config: 173 + - subnet: 172.20.0.0/16 174 + gateway: 172.20.0.1 175 + labels: 176 + - "com.example.description=Monitoring Network" 177 + - "com.example.service=monitoring" 178 + monitor-network: 179 + name: proxy-network 180 + external: true
+30
monitoring/prometheus.yml
··· 1 + # my global config 2 + global: 3 + scrape_interval: 60s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 4 + evaluation_interval: 60s # Evaluate rules every 15 seconds. The default is every 1 minute. 5 + # scrape_timeout is set to the global default (10s). 6 + 7 + # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. 8 + #rule_files: 9 + # - "first_rules.yml" 10 + # - "second_rules.yml" 11 + 12 + # A scrape configuration containing exactly one endpoint to scrape: 13 + # Here it's Prometheus itself. 14 + scrape_configs: 15 + # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. 16 + - job_name: 'prometheus' 17 + # Override the global default and scrape targets from this job every 5 seconds. 18 + scrape_interval: 5s 19 + static_configs: 20 + - targets: ['localhost:9090'] 21 + 22 + - job_name: 'cadvisor' 23 + scrape_interval: 5s 24 + static_configs: 25 + - targets: ['cadvisor:8080'] 26 + 27 + - job_name: 'node-exporter' 28 + scrape_interval: 5s 29 + static_configs: 30 + - targets: ['node-exporter:9100']
+17
paisa/docker-compose.yml
··· 1 + services: 2 + paisa: 3 + image: ananthakumaran/paisa:v0.7.3-hledger 4 + container_name: paisa 5 + restart: unless-stopped 6 + volumes: 7 + - ./data/:/root/Documents/paisa/ 8 + labels: 9 + glance.name: Paisa 10 + glance.url: https://paisa.tulkdan.dev 11 + networks: 12 + - paisa-network 13 + 14 + networks: 15 + paisa-network: 16 + name: proxy-network 17 + external: true
+28
soft-serve/docker-compose.yml
··· 1 + services: 2 + soft-serve: 3 + image: charmcli/soft-serve:latest 4 + container_name: soft-serve 5 + volumes: 6 + - ./data:/soft-serve 7 + ports: 8 + - 23231:23231 9 + - 9418:9418 10 + environment: 11 + SOFT_SERVE_INITIAL_ADMIN_KEYS: /run/secrets/admin_key 12 + restart: unless-stopped 13 + networks: 14 + - soft-serve-network 15 + labels: 16 + glance.name: Soft Serve 17 + glance.icon: si:git 18 + secrets: 19 + - admin_key 20 + 21 + networks: 22 + soft-serve-network: 23 + name: proxy-network 24 + external: true 25 + 26 + secrets: 27 + admin_key: 28 + file: ./admin_key.txt
+26
stump/docker-compose.yml
··· 1 + services: 2 + stump: 3 + image: aaronleopold/stump:latest 4 + container_name: stump 5 + # Replace my paths (prior to the colons) with your own 6 + volumes: 7 + - /home/pedro-correa/.stump:/config 8 + - /media/books:/data 9 + environment: 10 + - PUID=1000 11 + - PGID=1000 12 + # This `environment` field is optional, remove if you don't need it. 13 + # I am using it as an example here, but it's actually a default value. 14 + - STUMP_CONFIG_DIR=/config 15 + restart: unless-stopped 16 + networks: 17 + - stump-network 18 + labels: 19 + glance.name: Stump 20 + glance.icon: si:bookstack 21 + glance.url: https://stump.tulkdan.dev 22 + 23 + networks: 24 + stump-network: 25 + name: proxy-network 26 + external: true
+36
wakapi/docker-compose.yml
··· 1 + services: 2 + wakapi: 3 + image: ghcr.io/muety/wakapi:latest 4 + init: true 5 + container_name: wakapi 6 + restart: unless-stopped 7 + environment: 8 + WAKAPI_PASSWORD_SALT_FILE: "/run/secrets/password_salt" # alternatively, set WAKAPI_PASSWORD_SALT directly without the use of secrets 9 + secrets: 10 + - source: password_salt 11 + target: password_salt 12 + uid: '1000' 13 + gid: '1000' 14 + mode: '0400' 15 + volumes: 16 + - wakapi-data:/data 17 + labels: 18 + glance.name: Wakatime 19 + glance.icon: si:wakatime 20 + glance.url: https://wakapi.tulkdan.dev 21 + networks: 22 + - wakapi-network 23 + 24 + # secrets can be defined either from a local file or from an environment variable defined on the client host (the one that runs `docker compose` command) 25 + # see https://docs.docker.com/compose/how-tos/use-secrets/ for details 26 + secrets: 27 + password_salt: 28 + file: password_salt.txt 29 + 30 + volumes: 31 + wakapi-data: 32 + 33 + networks: 34 + wakapi-network: 35 + name: proxy-network 36 + external: true