Compare commits
4 Commits
7c2277786d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 4022f12289 | |||
| 812fec9f08 | |||
| 8cb27adcaa | |||
| 581c91162b |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -4,6 +4,12 @@
|
|||||||
.env.*
|
.env.*
|
||||||
|
|
||||||
### Container data (DO NOT VERSION)
|
### Container data (DO NOT VERSION)
|
||||||
|
/cloudflared
|
||||||
|
/dashy
|
||||||
|
/gitea
|
||||||
|
/homarr
|
||||||
|
/nginx
|
||||||
|
/codeserver
|
||||||
/portainer/config
|
/portainer/config
|
||||||
/portainer/config/*
|
/portainer/config/*
|
||||||
**/data/
|
**/data/
|
||||||
|
|||||||
26
calibre/.gitignore
vendored
Normal file
26
calibre/.gitignore
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Ignore the environment file containing sensitive data
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Ignore the config directory which may contain persistent data (e.g., Calibre database, metadata)
|
||||||
|
/app-config
|
||||||
|
/web-config
|
||||||
|
/calibre-lib
|
||||||
|
config/
|
||||||
|
|
||||||
|
# Ignore the Docker container image and build files
|
||||||
|
*.log
|
||||||
|
*.pid
|
||||||
|
docker-compose.override.yml
|
||||||
|
|
||||||
|
# Ignore any other temporary or autogenerated files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# Ignore Docker-related metadata
|
||||||
|
.docker/
|
||||||
|
|
||||||
|
# Ignore system files created by editors
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
0
calibre/README.md
Normal file
0
calibre/README.md
Normal file
48
calibre/docker-compose.yml
Normal file
48
calibre/docker-compose.yml
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: lscr.io/linuxserver/calibre:latest
|
||||||
|
container_name: calibre
|
||||||
|
#security_opt:
|
||||||
|
#- seccomp:unconfined #optional
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=America/Detroit
|
||||||
|
#- PASSWORD=${PASSWORD}
|
||||||
|
- CLI_ARGS='--disable-web-password'
|
||||||
|
volumes:
|
||||||
|
- ./app-config:/config
|
||||||
|
- ./calibre-lib:/calibre
|
||||||
|
ports:
|
||||||
|
- 9000:8080 # Calibre desktop gui (only for reverse proxy access)
|
||||||
|
- 9001:8181 # Calibre desktop gui HTTPS
|
||||||
|
- 9002:8081 # Calibre webserver gui (needs to be enabled in gui settings first)
|
||||||
|
shm_size: "1gb"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
web:
|
||||||
|
image: lscr.io/linuxserver/calibre-web:latest
|
||||||
|
container_name: calibre-web
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=America/Detroit
|
||||||
|
- WEB_USER=${USERNAME}
|
||||||
|
- WEB_PASSWORD=${PASSWORD}
|
||||||
|
#- DOCKER_MODS=linuxserver/mods:universal-calibre #optional
|
||||||
|
#- OAUTHLIB_RELAX_TOKEN_SCOPE=1 #optional
|
||||||
|
volumes:
|
||||||
|
- ./web-config:/config
|
||||||
|
- ./calibre-lib:/books
|
||||||
|
ports:
|
||||||
|
- 9004:8083
|
||||||
|
networks:
|
||||||
|
- 'homelab'
|
||||||
|
- 'default'
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
|
||||||
|
networks:
|
||||||
|
homelab:
|
||||||
|
external: true
|
||||||
|
|
||||||
20
cloudflared/.gitignore
vendored
20
cloudflared/.gitignore
vendored
@@ -1,20 +0,0 @@
|
|||||||
# Ignore sensitive files
|
|
||||||
cloudflared/*.json
|
|
||||||
# Ignore all JSON files-> ignores <tunnel_id>.json
|
|
||||||
cert.pem
|
|
||||||
config.yml
|
|
||||||
.env
|
|
||||||
|
|
||||||
# Ignore docker-compose override files (local configurations)
|
|
||||||
docker-compose.override.yml
|
|
||||||
|
|
||||||
# Ignore log files
|
|
||||||
*.log
|
|
||||||
|
|
||||||
# Ignore backup or swap files created by editors
|
|
||||||
*.bak
|
|
||||||
*.swp
|
|
||||||
|
|
||||||
# Ignore any temporary files or directories created during runtime
|
|
||||||
tmp/
|
|
||||||
*.pid
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
# Cloudflare Tunnel Info
|
|
||||||
|
|
||||||
## Instructions:
|
|
||||||
- Make sure config.yml is updated with changes from config.git.yml
|
|
||||||
|
|
||||||
## Contents:
|
|
||||||
**`cloudflared`**
|
|
||||||
│ ├── **`<tunnel_id>.json`**
|
|
||||||
│ ├── **`cert.pem`**
|
|
||||||
│ ├── **`config.git.yml`**
|
|
||||||
│ ├── **`config.yml`**
|
|
||||||
│ ├── **`docker-compose.yml`**
|
|
||||||
│ ├── **`.env`**
|
|
||||||
│ ├── **`.gitignore`**
|
|
||||||
│ └── **`README.md`**
|
|
||||||
|
|
||||||
### File Descriptions:
|
|
||||||
- **`<tunnel_id>.json`**: Cloudflare tunnel credentials file
|
|
||||||
- **`cert.pem`**: Cloudflare certificate file
|
|
||||||
- **`config.git.yml`**: Version-controlled template for `config.yml`
|
|
||||||
- **`config.yml`**: Configuration file for Cloudflare tunnel ingress methods
|
|
||||||
- **`docker-compose.yml`**: Docker Compose file for running the Cloudflare tunnel
|
|
||||||
- **`.env`**: Environment variables, including the tunnel ID
|
|
||||||
- **`.gitignore`**: Git ignore file
|
|
||||||
- **`README.md`**: Documentation
|
|
||||||
|
|
||||||
### Environment Variables:
|
|
||||||
- **`tunnel_id`**: Cloudflare tunnel ID (stored in `.env`).
|
|
||||||
|
|
||||||
### Ignored Files:
|
|
||||||
- **`<tunnel_id>.json`**: Sensitive file containing the Cloudflare tunnel credentials
|
|
||||||
- **`cert.pem`**: Cloudflare certificate file
|
|
||||||
- **`config.yml`**: Configuration file with sensitive data
|
|
||||||
- **`.env`**: Environment file containing sensitive data
|
|
||||||
|
|
||||||
### Current Ingress Methods:
|
|
||||||
- **szumko.net** --> dashy dashboard
|
|
||||||
- **cloud.szumko.net** --> nextcloud
|
|
||||||
- **git.szumko.net** --> Gitea
|
|
||||||
- **ha.szumko.net** --> Home Assistant
|
|
||||||
- **pihole.szumko.net** --> Pihole Admin
|
|
||||||
- **lib.szumko.net** --> Calibre
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
tunnel: <tunnel_id> # your tunnel ID
|
|
||||||
credentials-file: /etc/cloudflared/<tunnel_id>.json
|
|
||||||
|
|
||||||
ingress:
|
|
||||||
- hostname: szumko.net
|
|
||||||
service: http://nginx-app-1:80
|
|
||||||
- hostname: pihole.szumko.net
|
|
||||||
service: http://nginx-app-1:80
|
|
||||||
- hostname: git.szumko.net
|
|
||||||
service: http://nginx-app-1:80
|
|
||||||
- hostname: cloud.szumko.net
|
|
||||||
service: http://nginx-app-1:80
|
|
||||||
- hostname: ha.szumko.net
|
|
||||||
service: http://nginx-app-1:80
|
|
||||||
- hostname: lib.szumko.net
|
|
||||||
service: http://nginx-app-1:80
|
|
||||||
- service: http_status:404
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
services:
|
|
||||||
cloudflared:
|
|
||||||
image: cloudflare/cloudflared:latest
|
|
||||||
restart: unless-stopped
|
|
||||||
networks:
|
|
||||||
- 'default'
|
|
||||||
- 'tunnel'
|
|
||||||
volumes:
|
|
||||||
- ./config.yml:/etc/cloudflared/config.yml
|
|
||||||
- ./${TUNNEL_ID}.json:/etc/cloudflared/${TUNNEL_ID}.json # Use environment variable for tunnel ID
|
|
||||||
command: tunnel --no-autoupdate --config /etc/cloudflared/config.yml run
|
|
||||||
env_file:
|
|
||||||
- .env # Reference the .env file to inject environment variables
|
|
||||||
|
|
||||||
networks:
|
|
||||||
tunnel:
|
|
||||||
external: true
|
|
||||||
10
dashy/.gitignore
vendored
10
dashy/.gitignore
vendored
@@ -1,10 +0,0 @@
|
|||||||
# Ignore sensitive data
|
|
||||||
.env # Environment variables file (contains sensitive info)
|
|
||||||
|
|
||||||
# Ignore temporary or log files
|
|
||||||
*.log # Log files
|
|
||||||
*.bak # Backup files
|
|
||||||
*.swp # Swap files (e.g., from text editors)
|
|
||||||
|
|
||||||
# Ignore any local overrides or extra Docker Compose files
|
|
||||||
docker-compose.override.yml # Local override for docker-compose (optional)
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# Not In use, replaced by Home Assistant for now
|
|
||||||
|
|
||||||
# Dashy Info
|
|
||||||
|
|
||||||
## Instructions:
|
|
||||||
- Access WebUI on port 8181
|
|
||||||
- Use conf.yml to edit page
|
|
||||||
|
|
||||||
## Contents:
|
|
||||||
**`dashy/`**
|
|
||||||
├── **`config/`**
|
|
||||||
│ ├── **`conf.yml`**
|
|
||||||
│ └── **`item-icons/`**
|
|
||||||
├── **`docker-compose.yml`**
|
|
||||||
├── **`.env`**
|
|
||||||
├── **`.gitignore`**
|
|
||||||
└── **`README.md`**
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## File Descrptions:
|
|
||||||
- **`config/`**: Configuration data
|
|
||||||
* **`conf.yml`**: COnfiguration file
|
|
||||||
* **`item-icons/`**: Icons
|
|
||||||
- **`docker-compose.yml`**: Docker compose file
|
|
||||||
- **`.env`**: Environment Variables
|
|
||||||
- **`.gitignore`**: Git ignore file
|
|
||||||
- **`README.md`**: Documentation
|
|
||||||
|
|
||||||
## Environmet Variables:
|
|
||||||
- None
|
|
||||||
|
|
||||||
## Ignored Files:
|
|
||||||
- **`.env`**: Environment VariablesDashy Info
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
pageInfo:
|
|
||||||
title: Pi Server
|
|
||||||
description: ''
|
|
||||||
navLinks:
|
|
||||||
- title: GitHub
|
|
||||||
path: https://github.com/Lissy93/dashy
|
|
||||||
target: newtab
|
|
||||||
- title: Documentation
|
|
||||||
path: https://dashy.to/docs
|
|
||||||
target: newtab
|
|
||||||
appConfig:
|
|
||||||
theme: dracula
|
|
||||||
layout: auto
|
|
||||||
iconSize: large
|
|
||||||
sections:
|
|
||||||
- name: Services
|
|
||||||
displayData:
|
|
||||||
sortBy: default
|
|
||||||
cols: 4
|
|
||||||
collapsed: false
|
|
||||||
hideForGuests: false
|
|
||||||
rows: 1
|
|
||||||
items:
|
|
||||||
- title: Pi-Hole
|
|
||||||
description: Network Ad Block
|
|
||||||
url: https://pihole.szumko.net
|
|
||||||
target: newtab
|
|
||||||
id: 0_836_pihole
|
|
||||||
- title: Gitea
|
|
||||||
description: Git Repos
|
|
||||||
url: https://git.szumko.net
|
|
||||||
target: newtab
|
|
||||||
id: 1_836_gitea
|
|
||||||
- title: Portainer
|
|
||||||
description: Docker Management
|
|
||||||
url: https://192.168.0.152:9443
|
|
||||||
target: newtab
|
|
||||||
id: 2_836_portainer
|
|
||||||
- title: Cloud
|
|
||||||
url: https://cloud.szumko.net
|
|
||||||
target: newtab
|
|
||||||
id: 3_836_cloud
|
|
||||||
- name: CPU
|
|
||||||
displayData:
|
|
||||||
cols: 1
|
|
||||||
sortBy: default
|
|
||||||
rows: 4
|
|
||||||
collapsed: false
|
|
||||||
hideForGuests: false
|
|
||||||
widgets:
|
|
||||||
- type: gl-cpu-temp
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
untits: F
|
|
||||||
id: 0_232_glcputemp
|
|
||||||
- type: gl-current-cpu
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 1_232_glcurrentcpu
|
|
||||||
- type: gl-current-cores
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 2_232_glcurrentcores
|
|
||||||
- type: gl-cpu-history
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 3_232_glcpuhistory
|
|
||||||
- name: Memory
|
|
||||||
widgets:
|
|
||||||
- type: gl-current-mem
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 0_633_glcurrentmem
|
|
||||||
- type: gl-mem-history
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 1_633_glmemhistory
|
|
||||||
- name: Disk
|
|
||||||
widgets:
|
|
||||||
- type: gl-disk-space
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 0_395_gldiskspace
|
|
||||||
- type: gl-disk-io
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 1_395_gldiskio
|
|
||||||
- name: System Load
|
|
||||||
widgets:
|
|
||||||
- type: gl-system-load
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 0_1061_glsystemload
|
|
||||||
- type: gl-load-history
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 1_1061_glloadhistory
|
|
||||||
- name: Network
|
|
||||||
widgets:
|
|
||||||
- type: gl-network-interfaces
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 0_746_glnetworkinterfaces
|
|
||||||
- type: gl-network-traffic
|
|
||||||
options:
|
|
||||||
hostname: https://szumko.net/data
|
|
||||||
id: 1_746_glnetworktraffic
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
# Welcome to Dashy! To get started, run `docker compose up -d`
|
|
||||||
# You can configure your container here, by modifying this file
|
|
||||||
version: "3.8"
|
|
||||||
services:
|
|
||||||
dashy:
|
|
||||||
container_name: Dashy
|
|
||||||
|
|
||||||
# Pull latest image from DockerHub
|
|
||||||
image: lissy93/dashy
|
|
||||||
|
|
||||||
# To build from source, replace 'image: lissy93/dashy' with 'build: .'
|
|
||||||
# build: .
|
|
||||||
|
|
||||||
# You can also use an image with a different tag, or pull from a different registry, e.g:
|
|
||||||
# image: ghcr.io/lissy93/dashy or image: lissy93/dashy:3.0.0
|
|
||||||
|
|
||||||
# Pass in your config file below, by specifying the path on your host machine
|
|
||||||
volumes:
|
|
||||||
- /home/szumkoal/docker/dashy/config/conf.yml:/app/user-data/conf.yml
|
|
||||||
- /home/szumkoal/docker/dashy/config/item-icons:/app/user-data/item-icons/
|
|
||||||
|
|
||||||
# Set port that web service will be served on. Keep container port as 8080
|
|
||||||
ports:
|
|
||||||
- 8181:8080
|
|
||||||
networks:
|
|
||||||
- 'homelab'
|
|
||||||
# Set any environmental variables
|
|
||||||
environment:
|
|
||||||
- NODE_ENV=production
|
|
||||||
# Specify your user ID and group ID. You can find this by running `id -u` and `id -g`
|
|
||||||
- UID=1000
|
|
||||||
- GID=1000
|
|
||||||
|
|
||||||
# Specify restart policy
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
networks:
|
|
||||||
homelab:
|
|
||||||
external: true
|
|
||||||
27
gitea/.gitignore
vendored
27
gitea/.gitignore
vendored
@@ -1,27 +0,0 @@
|
|||||||
# Ignore environment file that contains sensitive information
|
|
||||||
.env
|
|
||||||
|
|
||||||
# Ignore any log files that may be generated by services
|
|
||||||
*.log
|
|
||||||
|
|
||||||
# Ignore temporary or backup files that might be created by editors
|
|
||||||
*.bak
|
|
||||||
*.swp
|
|
||||||
|
|
||||||
# Ignore docker-compose override files (local configurations, not meant to be versioned)
|
|
||||||
docker-compose.override.yml
|
|
||||||
|
|
||||||
# Ignore any database files that are mapped as volumes (persistent data)
|
|
||||||
config/
|
|
||||||
data/
|
|
||||||
mysql/
|
|
||||||
|
|
||||||
# Ignore any tmp or pid files that might be created during runtime
|
|
||||||
tmp/
|
|
||||||
*.pid
|
|
||||||
|
|
||||||
# Ignore any SQLite database files (if applicable)
|
|
||||||
*.sqlite
|
|
||||||
|
|
||||||
# Ignore any generated Nextcloud data files (if they're stored here instead of in volumes)
|
|
||||||
*.db
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
services:
|
|
||||||
server:
|
|
||||||
image: docker.gitea.com/gitea:latest-rootless
|
|
||||||
environment:
|
|
||||||
- GITEA__database__DB_TYPE=mysql
|
|
||||||
- GITEA__database__HOST=db:3306
|
|
||||||
- GITEA__database__NAME=gitea
|
|
||||||
- GITEA__database__USER=${GITEA__database__USER}
|
|
||||||
- GITEA__database__PASSWD=${GITEA__database__PASSWD}
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- ./data:/var/lib/gitea
|
|
||||||
- ./config:/etc/gitea
|
|
||||||
- /etc/timezone:/etc/timezone:ro
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
- "2222:2222"
|
|
||||||
networks:
|
|
||||||
- 'default'
|
|
||||||
- 'homelab'
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
|
|
||||||
db:
|
|
||||||
image: docker.io/library/mysql:8
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
|
||||||
- MYSQL_USER=${MYSQL_USER}
|
|
||||||
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
|
||||||
- MYSQL_DATABASE=${MYSQL_DATABASE}
|
|
||||||
volumes:
|
|
||||||
- ./mysql:/var/lib/MySQL
|
|
||||||
|
|
||||||
networks:
|
|
||||||
homelab:
|
|
||||||
external: true
|
|
||||||
@@ -14,44 +14,41 @@
|
|||||||
- sat
|
- sat
|
||||||
conditions: []
|
conditions: []
|
||||||
actions:
|
actions:
|
||||||
- action: rest_command.get_phone_weather
|
|
||||||
data: {}
|
|
||||||
response_variable: weather_data
|
|
||||||
- variables:
|
- variables:
|
||||||
max_temp: '{{weather_data.content.daily.temperature_2m_max[0]}}'
|
high: '{{ state_attr(''sensor.daily_forecast'', ''temperature_2m_max'')[0] }}'
|
||||||
min_temp: '{{weather_data.content.daily.temperature_2m_min[0]}}'
|
low: '{{ state_attr(''sensor.daily_forecast'', ''temperature_2m_min'')[0] }}'
|
||||||
temp_unit: '{{weather_data.content.daily_units.temperature_2m_max}}'
|
temp_unit: '{{ state_attr(''sensor.units'', ''temperature_2m'') }}'
|
||||||
condition: "{% set code = weather_data.content.daily.weather_code[0] | int %}
|
loc: '{{ state_attr(''sensor.alexs_iphone_2_geocoded_location'', ''Locality'')
|
||||||
{% set mapper = {\n 0: \"Clear sky\",\n 1: \"Mainly clear\",\n 2: \"Partly
|
}}, {{ state_attr(''sensor.alexs_iphone_2_geocoded_location'', ''Administrative
|
||||||
cloudy\",\n 3: \"Overcast\",\n 45: \"Fog\",\n 48: \"Depositing rime fog\",\n
|
Area'') }}'
|
||||||
\ 51: \"Drizzle - Light intensity\",\n 53: \"Drizzle - Moderate intensity\",\n
|
condition: "{% set code = state_attr('sensor.daily_forecast', 'weather_code')[0]
|
||||||
\ 55: \"Drizzle - Dense intensity\",\n 56: \"Freezing Drizzle - Light intensity\",\n
|
| int %} {% set mapper = {\n 0: \"Clear sky\",\n 1: \"Mainly clear\",\n
|
||||||
\ 57: \"Freezing Drizzle - Dense intensity\",\n 61: \"Rain - Slight intensity\",\n
|
\ 2: \"Partly cloudy\",\n 3: \"Overcast\",\n 45: \"Fog\",\n 48: \"Depositing
|
||||||
\ 63: \"Rain - Moderate intensity\",\n 65: \"Rain - Heavy intensity\",\n
|
rime fog\",\n 51: \"Drizzle - Light intensity\",\n 53: \"Drizzle - Moderate
|
||||||
\ 66: \"Freezing Rain - Light intensity\",\n 67: \"Freezing Rain - Heavy
|
intensity\",\n 55: \"Drizzle - Dense intensity\",\n 56: \"Freezing Drizzle
|
||||||
intensity\",\n 71: \"Snow fall - Slight intensity\",\n 73: \"Snow fall -
|
- Light intensity\",\n 57: \"Freezing Drizzle - Dense intensity\",\n 61:
|
||||||
Moderate intensity\",\n 75: \"Snow fall - Heavy intensity\",\n 77: \"Snow
|
\"Rain - Slight intensity\",\n 63: \"Rain - Moderate intensity\",\n 65:
|
||||||
grains\",\n 80: \"Rain showers - Slight intensity\",\n 81: \"Rain showers
|
\"Rain - Heavy intensity\",\n 66: \"Freezing Rain - Light intensity\",\n
|
||||||
- Moderate intensity\",\n 82: \"Rain showers - Violent intensity\",\n 85:
|
\ 67: \"Freezing Rain - Heavy intensity\",\n 71: \"Snow fall - Slight intensity\",\n
|
||||||
\"Snow showers - Slight intensity\",\n 86: \"Snow showers - Heavy intensity\",\n
|
\ 73: \"Snow fall - Moderate intensity\",\n 75: \"Snow fall - Heavy intensity\",\n
|
||||||
|
\ 77: \"Snow grains\",\n 80: \"Rain showers - Slight intensity\",\n 81:
|
||||||
|
\"Rain showers - Moderate intensity\",\n 82: \"Rain showers - Violent intensity\",\n
|
||||||
|
\ 85: \"Snow showers - Slight intensity\",\n 86: \"Snow showers - Heavy intensity\",\n
|
||||||
\ 95: \"Thunderstorm - Slight intensity\",\n 96: \"Thunderstorm with slight
|
\ 95: \"Thunderstorm - Slight intensity\",\n 96: \"Thunderstorm with slight
|
||||||
hail\",\n 99: \"Thunderstorm with heavy hail\"\n } %}\n {{ mapper.get(code,
|
hail\",\n 99: \"Thunderstorm with heavy hail\"\n } %}\n {{ mapper.get(code,
|
||||||
\"Not Availible\") }}\n"
|
\"Not Availible\") }}\n"
|
||||||
- action: script.general_notificatioon
|
- action: script.general_notificatioon
|
||||||
metadata: {}
|
|
||||||
data:
|
data:
|
||||||
title: Morning Weather
|
|
||||||
message: 'Good Morning!
|
message: 'Good Morning!
|
||||||
|
|
||||||
Here is the weather for today:
|
Here is the weather for today for {{loc}}:
|
||||||
|
|
||||||
High: {{max_temp}} {{temp_unit}}
|
High: {{high}} {{temp_unit}}
|
||||||
|
|
||||||
Low: {{min_temp}} {{temp_unit}}
|
Low: {{low}} {{temp_unit}}
|
||||||
|
|
||||||
Conditions: {{condition}}
|
Conditions: {{condition}}'
|
||||||
|
title: Morning Report
|
||||||
'
|
|
||||||
mode: single
|
mode: single
|
||||||
- id: '1766182515375'
|
- id: '1766182515375'
|
||||||
alias: Dash Test
|
alias: Dash Test
|
||||||
@@ -66,58 +63,3 @@
|
|||||||
- variables:
|
- variables:
|
||||||
max_temp: '{{weather.content.daily.temperature_2m_max[0]}}'
|
max_temp: '{{weather.content.daily.temperature_2m_max[0]}}'
|
||||||
mode: single
|
mode: single
|
||||||
- id: '1766406207253'
|
|
||||||
alias: Morning Test
|
|
||||||
description: ''
|
|
||||||
triggers:
|
|
||||||
- trigger: time
|
|
||||||
at: 07:00:00
|
|
||||||
weekday:
|
|
||||||
- sun
|
|
||||||
- mon
|
|
||||||
- tue
|
|
||||||
- wed
|
|
||||||
- thu
|
|
||||||
- fri
|
|
||||||
- sat
|
|
||||||
conditions: []
|
|
||||||
actions:
|
|
||||||
- action: rest_command.get_phone_weather
|
|
||||||
data: {}
|
|
||||||
response_variable: weather_data
|
|
||||||
- variables:
|
|
||||||
max_temp: '{{weather_data.content.daily.temperature_2m_max[0]}}'
|
|
||||||
min_temp: '{{weather_data.content.daily.temperature_2m_min[0]}}'
|
|
||||||
temp_unit: '{{weather_data.content.daily_units.temperature_2m_max}}'
|
|
||||||
condition: "{% set code = weather_data.content.daily.weather_code[0] | int %}
|
|
||||||
{% set mapper = {\n 0: \"Clear sky\",\n 1: \"Mainly clear\",\n 2: \"Partly
|
|
||||||
cloudy\",\n 3: \"Overcast\",\n 45: \"Fog\",\n 48: \"Depositing rime fog\",\n
|
|
||||||
\ 51: \"Drizzle - Light intensity\",\n 53: \"Drizzle - Moderate intensity\",\n
|
|
||||||
\ 55: \"Drizzle - Dense intensity\",\n 56: \"Freezing Drizzle - Light intensity\",\n
|
|
||||||
\ 57: \"Freezing Drizzle - Dense intensity\",\n 61: \"Rain - Slight intensity\",\n
|
|
||||||
\ 63: \"Rain - Moderate intensity\",\n 65: \"Rain - Heavy intensity\",\n
|
|
||||||
\ 66: \"Freezing Rain - Light intensity\",\n 67: \"Freezing Rain - Heavy
|
|
||||||
intensity\",\n 71: \"Snow fall - Slight intensity\",\n 73: \"Snow fall -
|
|
||||||
Moderate intensity\",\n 75: \"Snow fall - Heavy intensity\",\n 77: \"Snow
|
|
||||||
grains\",\n 80: \"Rain showers - Slight intensity\",\n 81: \"Rain showers
|
|
||||||
- Moderate intensity\",\n 82: \"Rain showers - Violent intensity\",\n 85:
|
|
||||||
\"Snow showers - Slight intensity\",\n 86: \"Snow showers - Heavy intensity\",\n
|
|
||||||
\ 95: \"Thunderstorm - Slight intensity\",\n 96: \"Thunderstorm with slight
|
|
||||||
hail\",\n 99: \"Thunderstorm with heavy hail\"\n } %}\n {{ mapper.get(code,
|
|
||||||
\"Not Availible\") }}\n"
|
|
||||||
- action: script.general_notificatioon
|
|
||||||
metadata: {}
|
|
||||||
data:
|
|
||||||
title: Morning Weather
|
|
||||||
message: 'Good Morning!
|
|
||||||
|
|
||||||
Here is the weather for today:
|
|
||||||
|
|
||||||
High: {{max_temp}} {{temp_unit}}
|
|
||||||
|
|
||||||
Low: {{min_temp}} {{temp_unit}}
|
|
||||||
|
|
||||||
Conditions: {{condition}}
|
|
||||||
|
|
||||||
'
|
|
||||||
mode: single
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ http:
|
|||||||
trusted_proxies:
|
trusted_proxies:
|
||||||
#- 172.19.0.2 # Add the IP address of the proxy server
|
#- 172.19.0.2 # Add the IP address of the proxy server
|
||||||
- 172.0.0.0/8 # You may also provide the subnet mask
|
- 172.0.0.0/8 # You may also provide the subnet mask
|
||||||
|
- 192.168.0.56
|
||||||
|
|
||||||
rest_command: # This api shows: Daily code, max/min temp, apperent max/min temp, sunrise/sunset/daylight, UV, percip sum/hours/probability
|
rest_command: # This api shows: Daily code, max/min temp, apperent max/min temp, sunrise/sunset/daylight, UV, percip sum/hours/probability
|
||||||
get_phone_weather: # All in US units for 3 days out
|
get_phone_weather: # All in US units for 3 days out
|
||||||
@@ -24,50 +25,26 @@ rest_command: # This api shows: Daily code, max/min temp, apperent max/min temp,
|
|||||||
https://api.open-meteo.com/v1/forecast?latitude={{lat}}&longitude={{lon}}&daily=weather_code,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,sunrise,daylight_duration,sunset,uv_index_max,precipitation_sum,precipitation_hours,precipitation_probability_max&timezone=America%2FNew_York&forecast_days=3&wind_speed_unit=mph&temperature_unit=fahrenheit&precipitation_unit=inch
|
https://api.open-meteo.com/v1/forecast?latitude={{lat}}&longitude={{lon}}&daily=weather_code,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,sunrise,daylight_duration,sunset,uv_index_max,precipitation_sum,precipitation_hours,precipitation_probability_max&timezone=America%2FNew_York&forecast_days=3&wind_speed_unit=mph&temperature_unit=fahrenheit&precipitation_unit=inch
|
||||||
method: GET
|
method: GET
|
||||||
|
|
||||||
rest:
|
rest: !include_dir_merge_list rest/
|
||||||
- resource_template: >
|
|
||||||
{% set lat = state_attr('device_tracker.alexs_phone','latitude') %}
|
|
||||||
{% set lon = state_attr('device_tracker.alexs_phone','longitude') %}
|
|
||||||
https://api.open-meteo.com/v1/forecast?latitude={{lat}}&longitude={{lon}}&daily=weather_code,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,sunrise,daylight_duration,sunset,uv_index_max,rain_sum,snowfall_sum,precipitation_sum,precipitation_hours,precipitation_probability_max&hourly=temperature_2m,apparent_temperature,precipitation_probability,weather_code,precipitation¤t=temperature_2m,apparent_temperature,precipitation,weather_code,is_day&timezone=America%2FNew_York&wind_speed_unit=mph&temperature_unit=fahrenheit&precipitation_unit=inch
|
|
||||||
scan_interval: 900
|
|
||||||
sensor:
|
|
||||||
- name: "Phone Location Minimum Temperature"
|
|
||||||
unique_id: "phone_min_temp"
|
|
||||||
value_template: '{{value_json.daily.temperature_2m_min[0]}}'
|
|
||||||
unit_of_measurement: '°F'
|
|
||||||
device_class: temperature
|
|
||||||
- name: "Phone Location Maximum Temperature"
|
|
||||||
unique_id: "phone_max_temp"
|
|
||||||
value_template: '{{value_json.daily.temperature_2m_max[0]}}'
|
|
||||||
unit_of_measurement: '°F'
|
|
||||||
device_class: temperature
|
|
||||||
|
|
||||||
monitor_docker:
|
monitor_docker:
|
||||||
- name: Docker
|
- name: Docker
|
||||||
containers:
|
containers:
|
||||||
- cloudflared-cloudflared-1
|
|
||||||
- gitea-db-1
|
|
||||||
- gitea-server-1
|
|
||||||
- glances
|
- glances
|
||||||
- habridge
|
- habridge
|
||||||
- homeassistant
|
- homeassistant
|
||||||
- nextcloud-app-1
|
- nextcloud-app-1
|
||||||
- nextcloud-db-1
|
- nextcloud-db-1
|
||||||
- nextcloud-redis-1
|
- nextcloud-redis-1
|
||||||
- nginx-app-1
|
|
||||||
- portainer
|
- portainer
|
||||||
- syncthing
|
- syncthing
|
||||||
rename:
|
rename:
|
||||||
cloudflared-cloudflared-1: 'Cloudflared'
|
|
||||||
gitea-db-1: 'Gitea Database'
|
|
||||||
gitea-server-1: 'Gitea Server'
|
|
||||||
glances: 'Glances'
|
glances: 'Glances'
|
||||||
habridge: 'Home Assistant Bridge'
|
habridge: 'Home Assistant Bridge'
|
||||||
homeassistant: 'Home Assistant'
|
homeassistant: 'Home Assistant'
|
||||||
nextcloud-app-1: 'Nextcloud Server'
|
nextcloud-app-1: 'Nextcloud Server'
|
||||||
nextcloud-db-1: 'Nextcloud Database'
|
nextcloud-db-1: 'Nextcloud Database'
|
||||||
nextcloud-redis-1: 'Nextcloud Redis'
|
nextcloud-redis-1: 'Nextcloud Redis'
|
||||||
nginx-app-1: 'Nginx Proxy Manager'
|
|
||||||
portainer: 'Portainer'
|
portainer: 'Portainer'
|
||||||
syncthing: 'Syncthing'
|
syncthing: 'Syncthing'
|
||||||
monitored_conditions:
|
monitored_conditions:
|
||||||
|
|||||||
@@ -42,3 +42,98 @@ general_notificatioon:
|
|||||||
alias: General Notification
|
alias: General Notification
|
||||||
description: ''
|
description: ''
|
||||||
icon: mdi:bell-badge
|
icon: mdi:bell-badge
|
||||||
|
get_cal_data:
|
||||||
|
sequence:
|
||||||
|
- action: calendar.get_events
|
||||||
|
metadata: {}
|
||||||
|
data:
|
||||||
|
duration:
|
||||||
|
hours: 96
|
||||||
|
minutes: 0
|
||||||
|
seconds: 0
|
||||||
|
response_variable: Events
|
||||||
|
target:
|
||||||
|
entity_id: calendar.szumkoal_gmail_com
|
||||||
|
alias: Get Cal Data
|
||||||
|
description: ''
|
||||||
|
parse_morning_weather:
|
||||||
|
sequence:
|
||||||
|
- variables:
|
||||||
|
high: '{{ state_attr(''sensor.daily_forecast'', ''temperature_2m_max'')[0] }}'
|
||||||
|
low: '{{ state_attr(''sensor.daily_forecast'', ''temperature_2m_min'')[0] }}'
|
||||||
|
temp_unit: '{{ state_attr(''sensor.units'', ''temperature_2m'') }}'
|
||||||
|
condition: "{% set code = state_attr('sensor.daily_forecast', 'weather_code')[0]
|
||||||
|
| int %} {% set mapper = {\n 0: \"Clear sky\",\n 1: \"Mainly clear\",\n
|
||||||
|
\ 2: \"Partly cloudy\",\n 3: \"Overcast\",\n 45: \"Fog\",\n 48: \"Depositing
|
||||||
|
rime fog\",\n 51: \"Drizzle - Light intensity\",\n 53: \"Drizzle - Moderate
|
||||||
|
intensity\",\n 55: \"Drizzle - Dense intensity\",\n 56: \"Freezing Drizzle
|
||||||
|
- Light intensity\",\n 57: \"Freezing Drizzle - Dense intensity\",\n 61:
|
||||||
|
\"Rain - Slight intensity\",\n 63: \"Rain - Moderate intensity\",\n 65:
|
||||||
|
\"Rain - Heavy intensity\",\n 66: \"Freezing Rain - Light intensity\",\n
|
||||||
|
\ 67: \"Freezing Rain - Heavy intensity\",\n 71: \"Snow fall - Slight intensity\",\n
|
||||||
|
\ 73: \"Snow fall - Moderate intensity\",\n 75: \"Snow fall - Heavy intensity\",\n
|
||||||
|
\ 77: \"Snow grains\",\n 80: \"Rain showers - Slight intensity\",\n 81:
|
||||||
|
\"Rain showers - Moderate intensity\",\n 82: \"Rain showers - Violent intensity\",\n
|
||||||
|
\ 85: \"Snow showers - Slight intensity\",\n 86: \"Snow showers - Heavy intensity\",\n
|
||||||
|
\ 95: \"Thunderstorm - Slight intensity\",\n 96: \"Thunderstorm with slight
|
||||||
|
hail\",\n 99: \"Thunderstorm with heavy hail\"\n } %}\n {{ mapper.get(code,
|
||||||
|
\"Not Availible\") }}\n"
|
||||||
|
current_temp: '{{ state_attr(''sensor.current_weather'', ''apparent_temperature'')
|
||||||
|
}}'
|
||||||
|
alias: Parse_Morning_Weather
|
||||||
|
description: ''
|
||||||
|
parse_current_weather:
|
||||||
|
sequence:
|
||||||
|
- variables:
|
||||||
|
time: '{{ state_attr(''sensor.current_weather'', ''time'') | as_timestamp()
|
||||||
|
| timestamp_custom(''%B %d, %Y, %I:%M %p'') }}'
|
||||||
|
temp: '{{ state_attr(''sensor.current_weather'', ''temperature_2m'') }}'
|
||||||
|
apparent_temp: '{{ state_attr(''sensor.current_weather'', ''apparent_temperature'')
|
||||||
|
}}'
|
||||||
|
precip: '{{ state_attr(''sensor.current_weather'', ''precipitation'') }}'
|
||||||
|
weather_code: "{% set code = state_attr('sensor.current_weather', 'weather_code')
|
||||||
|
| int %} {% set mapper = {\n 0: \"Clear sky\",\n 1: \"Mainly clear\",\n
|
||||||
|
\ 2: \"Partly cloudy\",\n 3: \"Overcast\",\n 45: \"Fog\",\n 48: \"Depositing
|
||||||
|
rime fog\",\n 51: \"Drizzle - Light intensity\",\n 53: \"Drizzle - Moderate
|
||||||
|
intensity\",\n 55: \"Drizzle - Dense intensity\",\n 56: \"Freezing Drizzle
|
||||||
|
- Light intensity\",\n 57: \"Freezing Drizzle - Dense intensity\",\n 61:
|
||||||
|
\"Rain - Slight intensity\",\n 63: \"Rain - Moderate intensity\",\n 65:
|
||||||
|
\"Rain - Heavy intensity\",\n 66: \"Freezing Rain - Light intensity\",\n
|
||||||
|
\ 67: \"Freezing Rain - Heavy intensity\",\n 71: \"Snow fall - Slight intensity\",\n
|
||||||
|
\ 73: \"Snow fall - Moderate intensity\",\n 75: \"Snow fall - Heavy intensity\",\n
|
||||||
|
\ 77: \"Snow grains\",\n 80: \"Rain showers - Slight intensity\",\n 81:
|
||||||
|
\"Rain showers - Moderate intensity\",\n 82: \"Rain showers - Violent intensity\",\n
|
||||||
|
\ 85: \"Snow showers - Slight intensity\",\n 86: \"Snow showers - Heavy intensity\",\n
|
||||||
|
\ 95: \"Thunderstorm - Slight intensity\",\n 96: \"Thunderstorm with slight
|
||||||
|
hail\",\n 99: \"Thunderstorm with heavy hail\"\n } %}\n {{ mapper.get(code,
|
||||||
|
\"Not Availible\") }}\n"
|
||||||
|
daytime: '{{ state_attr(''sensor.current_weather'', ''is_day'') }}'
|
||||||
|
alias: Parse Current Weather
|
||||||
|
description: ''
|
||||||
|
parse_hourly_weather:
|
||||||
|
sequence:
|
||||||
|
- variables:
|
||||||
|
iso_time: '{{ state_attr(''sensor.hourly_forecast'', ''time'') }}'
|
||||||
|
temp: '{{ state_attr(''sensor.hourly_forecast'', ''temperature_2m'') }}'
|
||||||
|
precip_prob: '{{ state_attr(''sensor.hourly_forecast'', ''precipitation_probability'')
|
||||||
|
}}'
|
||||||
|
weather_code: '{{ state_attr(''sensor.hourly_forecast'', ''weather_code'') }}'
|
||||||
|
precip: '{{ state_attr(''sensor.hourly_forecast'', ''precipitation'') }}'
|
||||||
|
count: 0
|
||||||
|
formatted_time: []
|
||||||
|
- variables:
|
||||||
|
test: '{% set count = count +1 %}'
|
||||||
|
formatted_time: "\n{% set result = [] %} \n{% for i in range(iso_time | length)
|
||||||
|
%}\n {% set formatted = iso_time[i] | as_timestamp() | timestamp_custom('%B
|
||||||
|
%d, %Y, %I:%M %p') %}\n {% set result = result + [iso_time[i] | as_timestamp()
|
||||||
|
| timestamp_custom('%B %d, %Y, %I:%M %p')] %}\n{% endfor %} \n{{ result }}\n
|
||||||
|
\ \n"
|
||||||
|
- action: notify.persistent_notification
|
||||||
|
metadata: {}
|
||||||
|
data:
|
||||||
|
title: test
|
||||||
|
message: '{{iso_time}}
|
||||||
|
|
||||||
|
{{ formatted_time }}'
|
||||||
|
alias: Parse Hourly Weather
|
||||||
|
description: ''
|
||||||
|
|||||||
1
homarr/.gitignore
vendored
1
homarr/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
.env
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Homarr Info
|
|
||||||
# Testing only right now
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
services:
|
|
||||||
homarr:
|
|
||||||
container_name: homarr
|
|
||||||
image: ghcr.io/homarr-labs/homarr:latest
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration
|
|
||||||
- ./appdata:/appdata
|
|
||||||
environment:
|
|
||||||
- SECRET_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY}
|
|
||||||
ports:
|
|
||||||
- '7575:7575'
|
|
||||||
networks:
|
|
||||||
- 'homelab'
|
|
||||||
|
|
||||||
networks:
|
|
||||||
homelab:
|
|
||||||
external: true
|
|
||||||
@@ -35,9 +35,9 @@ services:
|
|||||||
- MYSQL_USER=${MYSQL_USER}
|
- MYSQL_USER=${MYSQL_USER}
|
||||||
- MYSQL_HOST=db
|
- MYSQL_HOST=db
|
||||||
- REDIS_HOST=redis
|
- REDIS_HOST=redis
|
||||||
- OVERWRITECLIURL=${OVERWRITECLIURL}
|
# - OVERWRITECLIURL=${OVERWRITECLIURL}
|
||||||
- OVERWRITEPROTOCOL=${OVERWRITEPROTOCOL}
|
# - OVERWRITEPROTOCOL=${OVERWRITEPROTOCOL}
|
||||||
- OVERWRITEHOST=${OVERWRITEHOST}
|
# - OVERWRITEHOST=${OVERWRITEHOST}
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
- redis
|
- redis
|
||||||
|
|||||||
14
nginx/.gitignore
vendored
14
nginx/.gitignore
vendored
@@ -1,14 +0,0 @@
|
|||||||
# Ignore sensitive data
|
|
||||||
.env # Environment variables file (contains sensitive info)
|
|
||||||
|
|
||||||
# Ignore directories with persistent or sensitive data
|
|
||||||
data/ # Contains persistent data (e.g., databases, configuration files)
|
|
||||||
letsencrypt/ # Contains SSL certificates (do not track in Git)
|
|
||||||
|
|
||||||
# Ignore temporary or log files
|
|
||||||
*.log # Log files
|
|
||||||
*.bak # Backup files
|
|
||||||
*.swp # Swap files (e.g., from text editors)
|
|
||||||
|
|
||||||
# Ignore any local overrides or extra Docker Compose files
|
|
||||||
docker-compose.override.yml # Local override for docker-compose (optional)
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# Nginx Proxy Manager Info
|
|
||||||
|
|
||||||
## Instructions:
|
|
||||||
- Use for controlling paths/subdomains in cloudflare tunnel
|
|
||||||
- Access WebUI on port 81
|
|
||||||
|
|
||||||
## Contents:
|
|
||||||
**`nginx/`**
|
|
||||||
├── **`data/`**
|
|
||||||
├── **`docker-compose.yml`**
|
|
||||||
├── **`.env`**
|
|
||||||
├── **`.gitignore`**
|
|
||||||
├── **`letsencrypt/`**
|
|
||||||
└── **`README.md`**
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## File Descrptions:
|
|
||||||
- **`data/`**: Nginx Data
|
|
||||||
- **`docker-compose.yml`**: Compose file
|
|
||||||
- **`.env`**: Environment Variables
|
|
||||||
- **`.gitignore`**: Git Ignore file
|
|
||||||
- **`letsencrypt/`**: Letsencrypt Data
|
|
||||||
- **`README.md`**: Documentation
|
|
||||||
|
|
||||||
## Environmet Variables:
|
|
||||||
- None
|
|
||||||
|
|
||||||
## Ignored Files:
|
|
||||||
- **`data/`**: Persistant Data
|
|
||||||
- **`.env`**: Environment Variables
|
|
||||||
- **`letsencrypt/`**: Potentially sensitive data
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
services:
|
|
||||||
app:
|
|
||||||
image: 'docker.io/jc21/nginx-proxy-manager:latest'
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
# - '80:80'
|
|
||||||
- '81:81'
|
|
||||||
# - '443:443'
|
|
||||||
networks:
|
|
||||||
- 'homelab'
|
|
||||||
- 'tunnel'
|
|
||||||
volumes:
|
|
||||||
- ./data:/data
|
|
||||||
- ./letsencrypt:/etc/letsencrypt
|
|
||||||
|
|
||||||
networks:
|
|
||||||
homelab:
|
|
||||||
external: true
|
|
||||||
tunnel:
|
|
||||||
external: true
|
|
||||||
Reference in New Issue
Block a user