This commit is contained in:
@@ -20,7 +20,7 @@ func baseLayout(
|
|||||||
return [
|
return [
|
||||||
.documentType("html"),
|
.documentType("html"),
|
||||||
html(lang: "en-US") {
|
html(lang: "en-US") {
|
||||||
generateHeader(pageTitle, extraHeader)
|
generateHead(pageTitle, extraHeader)
|
||||||
body(class: "text-white text-lg pb-5 font-avenir \(section.rawValue)") {
|
body(class: "text-white text-lg pb-5 font-avenir \(section.rawValue)") {
|
||||||
siteHeader(section)
|
siteHeader(section)
|
||||||
|
|
||||||
@@ -80,19 +80,16 @@ private func footer(_ rssLink: String) -> Node {
|
|||||||
"("
|
"("
|
||||||
%a(
|
%a(
|
||||||
class: "[&:hover]:border-b border-green-400",
|
class: "[&:hover]:border-b border-green-400",
|
||||||
href: "https://github.com/m-housh/mhoush.com",
|
href: "https://git.housh.dev/homelab/docs",
|
||||||
rel: "nofollow",
|
rel: "nofollow",
|
||||||
target: "_blank"
|
target: "_blank"
|
||||||
) { "source" }
|
) { "source" }
|
||||||
%")."
|
%")."
|
||||||
}
|
}
|
||||||
script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js")
|
|
||||||
script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js")
|
|
||||||
script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func generateHeader(_ pageTitle: String, _ extraHeader: NodeConvertible) -> Node {
|
private func generateHead(_ pageTitle: String, _ extraHeader: NodeConvertible) -> Node {
|
||||||
head {
|
head {
|
||||||
meta(charset: "utf-8")
|
meta(charset: "utf-8")
|
||||||
meta(content: "#0e1112", name: "theme-color", customAttributes: ["media": "(prefers-color-scheme: dark)"])
|
meta(content: "#0e1112", name: "theme-color", customAttributes: ["media": "(prefers-color-scheme: dark)"])
|
||||||
@@ -128,8 +125,6 @@ private func generateHeader(_ pageTitle: String, _ extraHeader: NodeConvertible)
|
|||||||
link(href: "/static/output.css", rel: "stylesheet")
|
link(href: "/static/output.css", rel: "stylesheet")
|
||||||
link(href: "/articles/feed.xml", rel: "alternate", title: SiteMetadata.name, type: "application/rss+xml")
|
link(href: "/articles/feed.xml", rel: "alternate", title: SiteMetadata.name, type: "application/rss+xml")
|
||||||
extraHeader
|
extraHeader
|
||||||
// script(src: "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js")
|
|
||||||
//
|
|
||||||
Node.raw("""
|
Node.raw("""
|
||||||
<script src="/pagefind/pagefind-ui.js"></script>
|
<script src="/pagefind/pagefind-ui.js"></script>
|
||||||
<link href="/pagefind/pagefind-ui.css" rel="stylesheet">
|
<link href="/pagefind/pagefind-ui.css" rel="stylesheet">
|
||||||
|
|||||||
@@ -46,12 +46,15 @@ extension HomeLink: NodeConvertible {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func internalLink() -> Node {
|
private func internalLink() -> Node {
|
||||||
a(class: "bg-orange-400 border-2 border-green-600 p-4 rounded-lg [&:hover]:bg-orange-500", href: href) {
|
a(
|
||||||
|
class: "bg-orange-400 border-2 border-green-600 p-4 rounded-lg [&:hover]:bg-orange-500",
|
||||||
|
href: href
|
||||||
|
) {
|
||||||
div(class: "flex text-3xl") {
|
div(class: "flex text-3xl") {
|
||||||
i(class: "mt-1", customAttributes: ["data-lucide": icon])
|
i(class: "mt-1", customAttributes: ["data-lucide": icon])
|
||||||
p(class: "ps-2") { title }
|
span(class: "ps-2") { title }
|
||||||
}
|
}
|
||||||
p(class: "text-sm") { description }
|
span(class: "text-sm") { description }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,9 +67,9 @@ extension HomeLink: NodeConvertible {
|
|||||||
) {
|
) {
|
||||||
div(class: "flex text-3xl") {
|
div(class: "flex text-3xl") {
|
||||||
i(class: "mt-1", customAttributes: ["data-lucide": icon])
|
i(class: "mt-1", customAttributes: ["data-lucide": icon])
|
||||||
p(class: "ps-2") { title }
|
span(class: "ps-2") { title }
|
||||||
}
|
}
|
||||||
p(class: "text-sm") { description }
|
span(class: "text-sm") { description }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,14 +37,7 @@ func renderHome(body: String) -> Node {
|
|||||||
"Articles",
|
"Articles",
|
||||||
icon: "newspaper",
|
icon: "newspaper",
|
||||||
href: "/articles/",
|
href: "/articles/",
|
||||||
description: "Click here to view articles."
|
description: "Click here to view all articles."
|
||||||
)
|
|
||||||
|
|
||||||
HomeLink.external(
|
|
||||||
"Service Monitor",
|
|
||||||
icon: "heart-pulse",
|
|
||||||
href: "https://uptime.housh.dev/status/housh-dev",
|
|
||||||
description: "Click here to view the service status."
|
|
||||||
)
|
)
|
||||||
|
|
||||||
HomeLink.external(
|
HomeLink.external(
|
||||||
@@ -55,17 +48,10 @@ func renderHome(body: String) -> Node {
|
|||||||
)
|
)
|
||||||
|
|
||||||
HomeLink.external(
|
HomeLink.external(
|
||||||
"Excalidraw",
|
"Service Monitor",
|
||||||
icon: "pen-tool",
|
icon: "heart-pulse",
|
||||||
href: "https://draw.housh.dev",
|
href: "https://uptime.housh.dev/status/housh-dev",
|
||||||
description: "A drawing utility."
|
description: "Server and services uptime status page."
|
||||||
)
|
|
||||||
|
|
||||||
HomeLink.external(
|
|
||||||
"Gitea",
|
|
||||||
icon: "git-branch",
|
|
||||||
href: "https://git.housh.dev/explore/repos",
|
|
||||||
description: "Explore source code."
|
|
||||||
)
|
)
|
||||||
|
|
||||||
HomeLink.external(
|
HomeLink.external(
|
||||||
@@ -75,12 +61,33 @@ func renderHome(body: String) -> Node {
|
|||||||
description: "Network management."
|
description: "Network management."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
HomeLink.external(
|
||||||
|
"Excalidraw",
|
||||||
|
icon: "pen-tool",
|
||||||
|
href: "https://draw.housh.dev",
|
||||||
|
description: "A drawing utility that runs locally in your browser."
|
||||||
|
)
|
||||||
|
|
||||||
|
HomeLink.external(
|
||||||
|
"Gitea",
|
||||||
|
icon: "git-branch",
|
||||||
|
href: "https://git.housh.dev/explore/repos",
|
||||||
|
description: "Explore source code."
|
||||||
|
)
|
||||||
|
|
||||||
HomeLink.external(
|
HomeLink.external(
|
||||||
"Legacy Purchase Orders",
|
"Legacy Purchase Orders",
|
||||||
icon: "file-archive",
|
icon: "file-archive",
|
||||||
href: "https://legach-po.housh.dev",
|
href: "https://legach-po.housh.dev",
|
||||||
description: "Legacy purchase order application (pre-2025)."
|
description: "Legacy purchase order application (pre-2025)."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
HomeLink.external(
|
||||||
|
"HVAC Toolbox",
|
||||||
|
icon: "hammer",
|
||||||
|
href: "https://hvac-toolbox.com",
|
||||||
|
description: "A collection of HVAC calculators."
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
script(src: "https://unpkg.com/lucide@latest")
|
script(src: "https://unpkg.com/lucide@latest")
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
---
|
---
|
||||||
date: 2025-4-02
|
date: 2025-4-02
|
||||||
updated: 2025-4-03
|
updated: 2025-4-08
|
||||||
author: "Michael Housh"
|
author: "Michael Housh"
|
||||||
tags: network, infrastructure
|
tags: network, infrastructure
|
||||||
|
primaryTag: infrastructure
|
||||||
---
|
---
|
||||||
|
|
||||||
# Networking
|
# Networking
|
||||||
@@ -10,9 +11,31 @@ tags: network, infrastructure
|
|||||||
All of the networking setup is done through [unifi](https://unifi.ui.com). The
|
All of the networking setup is done through [unifi](https://unifi.ui.com). The
|
||||||
network is segmented into several different networks to isolate communication.
|
network is segmented into several different networks to isolate communication.
|
||||||
|
|
||||||
|
> Note: If you are unable to connect to the unifi management console linked
|
||||||
|
> above or if the internet is down, you can connect directly with the management
|
||||||
|
> console at `http://192.168.1.1`.
|
||||||
|
|
||||||
|
## Backup
|
||||||
|
|
||||||
|
The network management console get's backed up automatically each week (Sundays
|
||||||
|
@2:30am), however you can manually backup the server by going to
|
||||||
|
`Settings -> Control Plane -> Backups`. This is where you can also restore from
|
||||||
|
a backup if needed.
|
||||||
|
|
||||||
## Networks
|
## Networks
|
||||||
|
|
||||||
An overview of the networks that are setup.
|
A brief overview of the networks that are setup, their uses, and why they are
|
||||||
|
needed.
|
||||||
|
|
||||||
|
| Network | VLAN ID | Subnet | Usable IP's |
|
||||||
|
| --------- | ------- | ---------------- | ----------- |
|
||||||
|
| Default | 1 | 192.168.1.0/24 | 249 |
|
||||||
|
| Main | 10 | 192.168.10.0/24 | 205 |
|
||||||
|
| Phones | 20 | 192.168.20.0/28 | 13 |
|
||||||
|
| IoT | 30 | 192.168.30.0/24 | 249 |
|
||||||
|
| housh.dev | 50 | 192.168.50.0/28 | 12 |
|
||||||
|
| Guest | 60 | 192.168.60.0/26 | 61 |
|
||||||
|
| Mangement | 254 | 192.168.254.0/24 | 249 |
|
||||||
|
|
||||||
### Default Network
|
### Default Network
|
||||||
|
|
||||||
@@ -21,8 +44,8 @@ unifi networking gear. It is also generally the network a new device will go if
|
|||||||
it is plugged into an ethernet cable / switch. For this reason this network is
|
it is plugged into an ethernet cable / switch. For this reason this network is
|
||||||
isolated from communicating with other networks.
|
isolated from communicating with other networks.
|
||||||
|
|
||||||
New devices that end up on this network should be configured to the appropriate
|
New devices that end up on this network should be configured / moved to the
|
||||||
network by a network administrator.
|
appropriate network by a network administrator.
|
||||||
|
|
||||||
### Management Network
|
### Management Network
|
||||||
|
|
||||||
@@ -33,26 +56,32 @@ someone gained access to the network.
|
|||||||
### Main Network
|
### Main Network
|
||||||
|
|
||||||
This is where the majority of "trusted" devices should be placed on the network,
|
This is where the majority of "trusted" devices should be placed on the network,
|
||||||
such as computers, phones, etc. This is also the network when people join the
|
such as computers, mobile phones, etc. This is also the network used when people
|
||||||
non-guest WiFi.
|
join the non-guest WiFi.
|
||||||
|
|
||||||
This network has the ability to communicate with most all other networks.
|
This network has the ability to communicate with most all other networks,
|
||||||
|
therefore only trusted devices should be allowed on this network.
|
||||||
|
|
||||||
### housh.dev Network
|
### housh.dev Network
|
||||||
|
|
||||||
This is the network where all the servers are placed. This network is primarily
|
This is the network where the majority of servers are placed. This network is
|
||||||
setup to allow "responses", but not initiate communication with other networks.
|
primarily setup to allow "responses", but not allowed to initiate communication
|
||||||
This is to help reduce the risk if one of the servers gets compromised, an
|
with other networks. This is to help reduce the risk if one of the servers gets
|
||||||
attacker should not easily be able to transition to another network.
|
compromised, an attacker should not easily be able to transition to another
|
||||||
|
network.
|
||||||
|
|
||||||
### Phones Network
|
### Phones Network
|
||||||
|
|
||||||
This is the network where all the VoIP phones are on. It is considered
|
This is the network where all the VoIP phones are on. It is considered
|
||||||
"untrusted" and should not be able to communicate with any other network.
|
"untrusted" and should not be able to communicate with any other network.
|
||||||
|
|
||||||
|
This is merely considered "untrusted" because there's no reason for anything on
|
||||||
|
this network to try and reach anything else. It should only handle phone
|
||||||
|
traffic.
|
||||||
|
|
||||||
### IoT Network
|
### IoT Network
|
||||||
|
|
||||||
This is the network where all IoT (internet of things) devices are. This is
|
This is the network where IoT (internet of things) devices are. This is
|
||||||
considered an "untrusted" network and communications with other networks are
|
considered an "untrusted" network and communications with other networks are
|
||||||
minimized to what is actually needed to work. This network is not able to
|
minimized to what is actually needed to work. This network is not able to
|
||||||
communicate with the internet, because these devices are made by so many
|
communicate with the internet, because these devices are made by so many
|
||||||
@@ -64,6 +93,24 @@ such as home-pods and apple-tv because there are network challenges with these
|
|||||||
devices operating properly when placed on the IoT network, such as airdrop and
|
devices operating properly when placed on the IoT network, such as airdrop and
|
||||||
screen casting (which may be resolved in the future).
|
screen casting (which may be resolved in the future).
|
||||||
|
|
||||||
|
### Guest Network
|
||||||
|
|
||||||
|
This is the network where guests are placed, it is considered "untrusted" and
|
||||||
|
should only be able to access the internet. Devices on this network are also not
|
||||||
|
able to communicate with other devices attached to the guest network.
|
||||||
|
|
||||||
|
## Wifi Networks
|
||||||
|
|
||||||
|
The following wifi networks are setup and broadcast via the access points. All
|
||||||
|
networks require a password to use. Ask Michael for passwords if you need them.
|
||||||
|
|
||||||
|
| Wifi SSID | Network |
|
||||||
|
| ------------------------ | ----------------------- |
|
||||||
|
| Center of Monroe | Main |
|
||||||
|
| Jarvis | IoT |
|
||||||
|
| Center of Monroe - Guest | Guest |
|
||||||
|
| Housh Home Energy | Main (VPN traffic only) |
|
||||||
|
|
||||||
## Firewall
|
## Firewall
|
||||||
|
|
||||||
The unifi management console is what handles firewall rules for the networks. It
|
The unifi management console is what handles firewall rules for the networks. It
|
||||||
@@ -74,6 +121,11 @@ is accessed via `Settings -> Security -> Firewall` on the management console.
|
|||||||
This is where settings are made to either allow or deny traffic on the networks
|
This is where settings are made to either allow or deny traffic on the networks
|
||||||
from communicating with other networks or the internet.
|
from communicating with other networks or the internet.
|
||||||
|
|
||||||
|
> Note: Be aware that making changes here may break things / render networks or
|
||||||
|
> services to be unusable. It is recommended to make a backup prior to making
|
||||||
|
> changes. One of the biggest things to _not_ do is block traffic from
|
||||||
|
> `Main -> Gateway`, most everything else done is recoverable.
|
||||||
|
|
||||||
## DNS
|
## DNS
|
||||||
|
|
||||||
DNS is what translates IP addresses to domain names (i.e.
|
DNS is what translates IP addresses to domain names (i.e.
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
---
|
---
|
||||||
date: 2025-04-04
|
date: 2025-04-04
|
||||||
|
updated: 2025-04-08
|
||||||
tags: servers, infrastructure, homelab
|
tags: servers, infrastructure, homelab
|
||||||
|
primaryTag: infrastructure
|
||||||
---
|
---
|
||||||
|
|
||||||
# Servers
|
# Servers
|
||||||
@@ -15,7 +17,9 @@ services based on that. Meaning services that I run primarily for personal items
|
|||||||
are running on servers that I own, while services that are supporting business
|
are running on servers that I own, while services that are supporting business
|
||||||
functionality run on the companies server.
|
functionality run on the companies server.
|
||||||
|
|
||||||
All of the servers run the services in `Docker Containers`.
|
All of the servers run the services in `Docker Containers`, which allows for
|
||||||
|
them to be isolated from the host system (server) and makes them more easily
|
||||||
|
portable between servers if needed.
|
||||||
|
|
||||||
There is also a `Raspberry-Pi` that runs `Home Assitant`, which is another one
|
There is also a `Raspberry-Pi` that runs `Home Assitant`, which is another one
|
||||||
of my personal devices.
|
of my personal devices.
|
||||||
@@ -27,10 +31,14 @@ of my personal devices.
|
|||||||
| rogue-mini | roguemini.housh.dev | 192.168.50.4 |
|
| rogue-mini | roguemini.housh.dev | 192.168.50.4 |
|
||||||
| home-assistant | homeassitant.housh.dev | 192.168.30.5 |
|
| home-assistant | homeassitant.housh.dev | 192.168.30.5 |
|
||||||
| NAS | nas.housh.dev | 192.168.10.105 |
|
| NAS | nas.housh.dev | 192.168.10.105 |
|
||||||
|
| Backup NAS | nas.hhe | 192.168.1.10 |
|
||||||
|
|
||||||
You can read more about the network setup
|
You can read more about the network setup
|
||||||
[here](https://docs.housh.dev/articles/2025/network/).
|
[here](https://docs.housh.dev/articles/2025/network/).
|
||||||
|
|
||||||
|
> Note: The backup NAS is used to backup our primary NAS, for now it is not easy
|
||||||
|
> to use, and will be used for camera / security footage in the future.
|
||||||
|
|
||||||
## Containers
|
## Containers
|
||||||
|
|
||||||
Services run inside of docker containers that are spread between several
|
Services run inside of docker containers that are spread between several
|
||||||
@@ -44,7 +52,8 @@ is hosted on an [internal git server](https://git.housh.dev/homelab). The
|
|||||||
configuration will consist of a docker compose file (generally named
|
configuration will consist of a docker compose file (generally named
|
||||||
`compose.yaml`). There is often an `example.env` file for the service, these are
|
`compose.yaml`). There is often an `example.env` file for the service, these are
|
||||||
examples for documentation and variable naming purposes. The environment
|
examples for documentation and variable naming purposes. The environment
|
||||||
variables themselves are setup in the container orchestrator for the service.
|
variables themselves are setup in the container orchestrator for the service to
|
||||||
|
prevent sensitive data being "leaked".
|
||||||
|
|
||||||
### Container orchestrator
|
### Container orchestrator
|
||||||
|
|
||||||
@@ -99,7 +108,7 @@ access may be implemented in the future. If access is required outside of our
|
|||||||
network then using our VPN is required. The VPN setup is done automatically via
|
network then using our VPN is required. The VPN setup is done automatically via
|
||||||
unifi (our network router).
|
unifi (our network router).
|
||||||
|
|
||||||
`DNS` is what translates domain names to `IP` addresses, currently the public
|
`DNS` is what translates domain names to `IP addresses`, currently the public
|
||||||
DNS records are handled by cloudflare. Cloudflare is used to validate that we
|
DNS records are handled by cloudflare. Cloudflare is used to validate that we
|
||||||
own the `housh.dev` domain name in order for Let's Encrypt to issue free `TLS`
|
own the `housh.dev` domain name in order for Let's Encrypt to issue free `TLS`
|
||||||
certificates. TLS is used to encrypt traffic over the web (`https://`).
|
certificates. TLS is used to encrypt traffic over the web (`https://`).
|
||||||
@@ -107,4 +116,7 @@ certificates. TLS is used to encrypt traffic over the web (`https://`).
|
|||||||
Internal DNS records are setup in our unifi router `Settings -> Routing -> DNS`.
|
Internal DNS records are setup in our unifi router `Settings -> Routing -> DNS`.
|
||||||
The internal DNS is fairly simple and just needs to map to servers appropriately
|
The internal DNS is fairly simple and just needs to map to servers appropriately
|
||||||
(primarily just to the primary caddy instance, which then handles all the
|
(primarily just to the primary caddy instance, which then handles all the
|
||||||
routing to the individual service that is requested).
|
routing to the individual service that is requested). All devices that connect
|
||||||
|
to the network will be able to use the internal DNS to resolve host names
|
||||||
|
properly (meaning it all should just work automatically without any knowledge
|
||||||
|
from the user).
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
date: 2025-04-07
|
date: 2025-04-07
|
||||||
tags: phones, infrastructure, unifi
|
tags: phones, infrastructure, unifi
|
||||||
|
primaryTag: infrastructure
|
||||||
---
|
---
|
||||||
|
|
||||||
# Phone System
|
# Phone System
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
date: 2025-04-07
|
date: 2025-04-07
|
||||||
tags: how-to, backups, nas
|
tags: how-to, backups, nas
|
||||||
|
primaryTag: how-to
|
||||||
---
|
---
|
||||||
|
|
||||||
# Time Machine Backups
|
# Time Machine Backups
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
date: 2025-04-08
|
date: 2025-04-08
|
||||||
tags: how-to, nas
|
tags: how-to, nas
|
||||||
|
primaryTag: how-to
|
||||||
---
|
---
|
||||||
|
|
||||||
# Link Sharing
|
# Link Sharing
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ article a:hover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
article code {
|
article code {
|
||||||
@apply bg-violet-600;
|
@apply text-white bg-violet-600 px-2;
|
||||||
}
|
}
|
||||||
|
|
||||||
article ol {
|
article ol {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user