Compare commits
11 Commits
2025.06.13
...
2025.10.07
Author | SHA1 | Date | |
---|---|---|---|
|
013a41bb02 | ||
|
3daee8bc4d | ||
|
342c025697 | ||
|
a603f5160a | ||
|
846f09f817 | ||
|
d930d6774d | ||
|
513af6bfa7 | ||
|
c74faccd78 | ||
|
95ce34b12b | ||
|
ff4c256544 | ||
|
e6633ce255 |
@@ -8,7 +8,7 @@ Do you want to know how and where RandomPlace is hosted? Or do you just want to
|
||||
|
||||
:::info
|
||||
|
||||
This post is from the past. From far away times when this website had another domain, another name and another hosting place. For current setup, please see [HomeLab](/docs/homelab).
|
||||
This post is from the past. From far away times when this website had another domain, another name and another hosting place.
|
||||
|
||||
Still, this guide can be useful.
|
||||
|
||||
|
185
blog/2025-10-07-proxmox-ve-on-hetzner-dedicated-server/index.md
Normal file
@@ -0,0 +1,185 @@
|
||||
---
|
||||
slug: proxmox-ve-on-hetzner-dedicated-server
|
||||
title: "Proxmox VE and PBS on Hetzner dedicated server"
|
||||
tags: [self-hosting, homelab, Proxmox, Proxmox VE, PBS, Hetzner, Tailscale, Caddy]
|
||||
image: /img/homelab.png
|
||||
---
|
||||
|
||||
Circumstances forced me to move all my self-hosted services to a location that does not depend on my living place. Someday, I hope I'll have all that hosted at home again, but now I want to describe my path of setting up a Proxmox VE on a Hetzner dedicated server together with Proxmox Backup Server and Tailscale with backups on Backblaze. This could look like a trivial task at first, but I faced some issues and obstacles I want to document here, for me to remember and for others to be informed.
|
||||
|
||||
I want to warn that this is not a full step-by-step guide. It is rather notes on the process and steps I followed.
|
||||
|
||||
<!-- truncate -->
|
||||
|
||||
## Installation
|
||||
|
||||
There is documentation on the installation process at [Hetzner](https://community.hetzner.com/tutorials/install-and-configure-proxmox_ve). There are options, and I chose the first one - installing Proxmox VE on Debian.
|
||||
So, according to the docs, I booted a [Rescue System](https://docs.hetzner.com/robot/dedicated-server/troubleshooting/hetzner-rescue-system/) and installed Debian with the [installimage](https://docs.hetzner.com/robot/dedicated-server/operating-systems/installimage/).
|
||||
Then I followed the [guide from Proxmox Wiki](https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_13_Trixie) to install Proxmox VE. There is a step where you first install a new kernel and reboot to activate it. I was forced to reboot the server twice to make it appear online again. Have no idea why.
|
||||
|
||||
## Network
|
||||
|
||||
Now to the hard part.
|
||||
The initial plan was to have all LXCs in a single local network to allow internal communication. Also, the host and some containers should have public IPs for external access.
|
||||
|
||||
I reviewed a lot of network configuration options around the internet and chose a bridged setup with masquerading (NAT).
|
||||
|
||||
For the network I edited `/etc/network/interfaces` like this:
|
||||
|
||||
```
|
||||
auto lo
|
||||
|
||||
iface lo inet loopback
|
||||
|
||||
iface lo inet6 loopback
|
||||
|
||||
iface enp5s0 inet manual
|
||||
|
||||
iface enp5s0 inet6 manual
|
||||
|
||||
auto vmbr0
|
||||
iface vmbr0 inet static
|
||||
address <Public IPv4>/26
|
||||
gateway <Public IPv4 gateway>
|
||||
pointopoint <Public IPv4 gateway>
|
||||
bridge-ports enp5s0
|
||||
bridge-stp off
|
||||
bridge-fd 0
|
||||
up route add -net <Public IPv4 gateway - 1> netmask 255.255.255.192 gw <Public IPv4 gateway> dev vmbr0
|
||||
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
post-up echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
|
||||
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d <Public IPv4> --dport 21074 -j DNAT --to 192.168.50.3
|
||||
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp -d <Public IPv4> --dport 21074 -j DNAT --to 192.168.50.3
|
||||
|
||||
iface vmbr0 inet6 static
|
||||
address <Public IPv6>/64
|
||||
gateway <Public IPv6 gateway>
|
||||
|
||||
auto vmbr1
|
||||
iface vmbr1 inet static
|
||||
address 192.168.50.1/24
|
||||
netmask 255.255.255.0
|
||||
bridge-ports none
|
||||
bridge-stp off
|
||||
bridge-fd 0
|
||||
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
|
||||
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1
|
||||
post-up iptables -t nat -A POSTROUTING -s '192.168.50.0/24' -o vmbr0 -j MASQUERADE
|
||||
post-down iptables -t nat -D POSTROUTING -s '192.168.50.0/24' -o vmbr0 -j MASQUERADE
|
||||
```
|
||||
|
||||
Let's see what's going on in here.
|
||||
|
||||
For the containers that don't require a public IP, I choose `vbmr1` bridge, set some IP from the local IP range (192.168.50.x), and use the local IP as a gateway:
|
||||
|
||||

|
||||
|
||||
For LXCs that require a separate public IP, I choose the `vmbr0` bridge, set the IP, gateway, and MAC address provided by Hetzner.
|
||||
|
||||

|
||||
|
||||
The route with the `<Public IPv4 gateway - 1>` is a route from the official [Hetzner docs](https://community.hetzner.com/tutorials/install-and-configure-proxmox_ve). That doc was updated while I was writing this post, and the line was removed from the example network configuration there. Some network configuration guides across the internet still have it, so I'm leaving it as is for now. If your public IP gateway is, for example, 67.11.34.23, the route will be
|
||||
|
||||
```
|
||||
up route add -net 67.11.34.22 netmask 255.255.255.192 gw 67.11.34.23 dev vmbr0
|
||||
```
|
||||
|
||||
The next lines enable IP forwarding across networks:
|
||||
|
||||
```
|
||||
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
post-up echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
|
||||
```
|
||||
|
||||
And here is an example of forwarding a port `21074` from the public IP to the local IP of a single LXC:
|
||||
|
||||
```
|
||||
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d <Public IPv4> --dport 21074 -j DNAT --to 192.168.50.3
|
||||
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp -d <Public IPv4> --dport 21074 -j DNAT --to 192.168.50.3
|
||||
```
|
||||
|
||||
For the local network `vmbr1` the next lines are needed to make Proxmox Firewall work properly:
|
||||
|
||||
```
|
||||
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
|
||||
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1
|
||||
```
|
||||
|
||||
### Network security
|
||||
|
||||
Ports `8006`, `22`, and `8007` are opened on the Proxmox host in the Proxmox firewall, but explicitly closed in the Hetzner firewall. That way, I can use Proxmox VE and PBS web UI only from the Tailscale network, but, in case of an emergency or misconfiguration, I can open critical ports in Hetzner firewall to get access using server's public IP.
|
||||
|
||||
## Public Reverse Proxy
|
||||
|
||||
I know it is not the best practice to install anything directly on a Proxmox host, but this looks like a perfect decision, as it already has a public IP address, and I can't unassign it because this is the only way to access the server in case of failure.
|
||||
So I decided to install Caddy directly to a Proxmox Host and open ports `80` and `443` to it. Caddy handles requests and then proxies them to the local IPs of LXCs:
|
||||
|
||||
```
|
||||
git.nicelycomposed.codes {
|
||||
reverse_proxy 192.168.50.3:3000
|
||||
}
|
||||
```
|
||||
|
||||
## Tailscale and Internal Reverse Proxy
|
||||
|
||||
They call it "bastion host". A single point of connecting to your internal resources that you don't want to expose publicly. I have an LXC for this with Tailscale and another instance of Caddy installed. Let's see how it works on an example.
|
||||
|
||||
I want to securely connect to the Proxmox VE web UI using a valid SSL certificate at `https://pve.int.example.com`.
|
||||
|
||||
First, to make Tailscale work inside an LXC, additional configuration should be made on the Proxmox host. LXC configuration file can be found at `/etc/pve/lxc/<CT_ID>.conf`. Those two lines should be added to the file:
|
||||
|
||||
```
|
||||
lxc.cgroup2.devices.allow: c 10:200 rwm
|
||||
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
|
||||
```
|
||||
|
||||
Then just restart the LXC.
|
||||
|
||||
Then, I installed Tailscale and Caddy on my "bastion host". Then I created a DNS record to point `pve.int.example.com` to an IP address of my bastion host in the Tailscale network:
|
||||
|
||||
```
|
||||
A pve.int.example.com 10.11.12.13
|
||||
```
|
||||
|
||||
Then, in the Caddy config, I proxied `pve.int.example.com` to the local IP of my Proxmox host and port `8006`, using HTTPS and skipping TLS verification because of Proxmox's default self-signed certificate:
|
||||
|
||||
```
|
||||
pve.int.example.com {
|
||||
reverse_proxy 192.168.50.1:8006 {
|
||||
transport http {
|
||||
tls
|
||||
tls_insecure_skip_verify
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Now I'm able to point my browser to `https://pve.int.example.com` while connected to my Tailscale network.
|
||||
|
||||
:::warning
|
||||
As all ports are closed on the "bastion host" and it is not exposed publicly, the default ACME HTTP challenge will not work for Caddy to issue SSL certificates for internal resources. [DNS challenge](https://caddyserver.com/docs/json/admin/identity/issuers/acme/challenges/) should be used instead.
|
||||
:::
|
||||
|
||||
I can add other internal resources hosted on other LXCs in the same way:
|
||||
|
||||
```
|
||||
dockge.int.example.com {
|
||||
reverse_proxy 192.168.50.4:5000
|
||||
}
|
||||
|
||||
element-admin.int.example.com {
|
||||
reverse_proxy 192.168.50.8:8080
|
||||
}
|
||||
```
|
||||
|
||||
## Proxmox Backup Server
|
||||
|
||||
It was the simplest part. I know this is not the most recommended method, but my Proxmox Backup Server is [installed on the Proxmox VE host](https://pbs.proxmox.com/docs/installation.html#install-proxmox-backup-server-on-proxmox-ve).
|
||||
After installing it and configuring it to use [Backblaze S3 storage](https://pbs.proxmox.com/docs/storage.html#datastores-with-s3-backend), I just added it as a storage to Proxmox VE using the local IP of the host.
|
||||
|
||||

|
||||
|
||||
## Conclusion
|
||||
Have no idea why everyone wants to write a conclusion for each post nowadays. It looks like a forced conclusion to a school physics problem in most cases: "Solving this problem of moving trains, we found out that trains can move".
|
||||
|
||||
Have a nice tinkering.
|
BIN
blog/2025-10-07-proxmox-ve-on-hetzner-dedicated-server/pbs.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
blog/2025-10-07-proxmox-ve-on-hetzner-dedicated-server/vmbr0.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
blog/2025-10-07-proxmox-ve-on-hetzner-dedicated-server/vmbr1.png
Normal file
After Width: | Height: | Size: 90 KiB |
@@ -1,29 +0,0 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
title: Homelab
|
||||
---
|
||||
|
||||
## What is it?
|
||||
|
||||
This is my project of publicly available documentation of my home servers and self-hosted services.
|
||||
|
||||
## Network
|
||||
|
||||
The gate to my HomeLab is a **UniFi Cloud Gateway Ultra**. It is connected to a **1 Gbps** fiber optic from my ISP and manages **3 static WAN IP** addresses.
|
||||
|
||||
The local network is separated into **four VLANs**.
|
||||
|
||||
The gateway is also a DNS server for all local network and VPN clients.
|
||||
|
||||
WiFi network is delivered by **two UniFi U6+** access points powered with the **Switch Lite 8 PoE**.
|
||||
|
||||
[More on network](network.md)
|
||||
|
||||
## Servers
|
||||
My family home cloud is provided by the **Synology DS423+**. It is for photos and documents hosting and sharing.
|
||||
|
||||
I also have a **DIY NAS with TrueNAS Community Edition** on it that hosts most of the services for personal and family use, that are not from Synology.
|
||||
|
||||
The third one is the **Asus PN42** min PC with an Intel N100 CPU with the **Proxomox VE** on it. It hosts public services, like this website, my Gitea instance, and others.
|
||||
|
||||
I also have a mighty **Home Assistant Blue** with... well **Home Assistant** on it. It does not depend on other servers and has a separate Cloudflare tunnel to it from the outside to be available even when all other servers fail.
|
@@ -1,111 +0,0 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
title: Network
|
||||
---
|
||||
The gate to my HomeLab is a **UniFi Cloud Gateway Ultra**. It is connected to a **1 Gbps** fiber optic from my ISP and manages **3 static WAN IP** addresses.
|
||||
|
||||
## Hardware
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
look: handDrawn
|
||||
theme: forest
|
||||
---
|
||||
flowchart TB
|
||||
gateway(UniFi Cloud Gateway Ultra)
|
||||
poe(UniFi Switch Light 8 PoE)
|
||||
wifi1((UniFi U6+))
|
||||
wifi2((UniFi U6+))
|
||||
ISP <--> gateway
|
||||
gateway <--> lan1[LAN]
|
||||
gateway <--> poe
|
||||
poe <--> lan2[LAN]
|
||||
poe <-->|PoE| wifi1
|
||||
poe <-->|PoE| wifi2
|
||||
```
|
||||
|
||||
## WAN
|
||||
|
||||
### Port forwarding
|
||||
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
look: handDrawn
|
||||
theme: neutral
|
||||
---
|
||||
flowchart LR
|
||||
W8[WAN IP *8]
|
||||
W9[WAN IP *9]
|
||||
W0[WAN IP *0]
|
||||
montgomery("`Synology NAS
|
||||
_DSM Web UI, Hyper Backup Vault, Drive Server_`")
|
||||
plex(Plex external access)
|
||||
ingress50("`ingress-50
|
||||
_Zoraxy_`")
|
||||
ingress1("`ingress-1
|
||||
_Zoraxy_`")
|
||||
WAN1 --> W8
|
||||
WAN1 --> W9
|
||||
WAN1 --> W0
|
||||
W8 --> montgomery
|
||||
W8 --> plex
|
||||
W8 --> qbt(qBittorrent)
|
||||
W9 --> gitssh(Gitea SSH)
|
||||
W9 --> ingress50 --> pub(Public services)
|
||||
W0 --> ingress1 --> per(Personal services)
|
||||
```
|
||||
|
||||
### Firewall rules
|
||||
In addition to default rules.
|
||||
|
||||
| Name | Action | Source Zone | Destination Zone |
|
||||
|-------------------------- | ------ | ------------- | ---------------- |
|
||||
| Allow UniFi remote access | Allow | External | Gateway |
|
||||
|
||||
## Local network
|
||||
### VLANs
|
||||
| Name | Subnet | Description | Isolate network |
|
||||
|------------ | ----------------- | ------------------------------------------------------------- | --------------- |
|
||||
| **Default** | _192.168.1.0/24_ | Default local network for laptops, family phones and tablets | No |
|
||||
| **Pub** | _192.168.50.0/24_ | An isolated VLAN for public services | No |
|
||||
| **Guest** | _192.168.5.0/24_ | An isolated VLAN for guest WiFi access | No |
|
||||
| **IoT** | _192.168.6.0/24_ | An isolated VLAN for connected home appliance | No |
|
||||
|
||||
- Device Isolation is disabled for all networks
|
||||
|
||||
### Firewall zones
|
||||
| Name | Built in | Networks / Interfaces |
|
||||
|---------------- | -------- | ------------------------------------------- |
|
||||
| Internal | âś… | [`Default`](#vlans) |
|
||||
| External | âś… | [`Primary (WAN1)`](#wan) `Secondary (WAN2)` |
|
||||
| Gateway | âś… | - |
|
||||
| VPN | âś… | [`Hearthstone`](#vpn) [`VPS`](#vpn) |
|
||||
| Hotspot | âś… | [`Guest`](#vlans) |
|
||||
| DMZ | âś… | - |
|
||||
| VLAN 50 | ❌ | [`Pub`](#vlans) |
|
||||
| VLAN 6 | ❌ | [`IoT`](#vlans) |
|
||||
|
||||
### Zones access rules
|
||||
Additional Firewall rules allowing or blocking zone-to-zone or subnet-to-subnet communications.
|
||||
|
||||
| Source Zone | Destination Zone | Source | Destination | Action | Description |
|
||||
|-------------- | ---------------- | --------------------- | --------------------------- | ------------------ | ---------------------------------------------------------------------------------- |
|
||||
| Internal | VLAN 50 | All | All | Allow with return | Allow all traffic from [`Default`](#vlans) network to [`Pub`](#vlans) |
|
||||
| Internal | VLAN 6 | All | All | Allow with return | Allow all traffic from [`Default`](#vlans) network to [`IoT`](#vlans) |
|
||||
| VPN | Internal | [VPS subnet](#vpn) | All | Allow only return | Allow return traffic from [`VPS`](#vpn) subnet to [`Default`](#vlans) |
|
||||
| VPN | Internal | [VPS subnet](#vpn) | All | Block | Block [`VPS`](#vpn) VPN clients from accessing the [`Default`](#vlans) network |
|
||||
| VPN | Hotspot | [VPS subnet](#vpn) | All | Block | Block [`VPS`](#vpn) VPN clients from accessing the [`Guest`](#vlans) network |
|
||||
| VPN | DMZ | [VPS subnet](#vpn) | All | Block | Block [`VPS`](#vpn) VPN clients from accessing the [`DMZ`](#firewall-zones) zone |
|
||||
| VPN | VLAN 50 | All | [Hearthstone](#vpn) | Allow all | Allow [`Hearthstone`](#vpn) VPN clients access to [`Pub`](#vlans) network |
|
||||
| VPN | VLAN 6 (IoT) | All | [Hearthstone](#vpn) | Allow all | Block [`Hearthstone`](#vpn) VPN clients access to [`IoT`](#vlans) network |
|
||||
| VLAN 50 | VLAN 50 | All | All | Allow all | Allow [`Pub`](#vlans) network clients accessing each other |
|
||||
|
||||
## VPN
|
||||
There are two Wireguard servers configured:
|
||||
1. **Hearthstone**. Subnet _192.168.3.0/24_. For external access to all local networks.
|
||||
1. **VPS**. Subnet _192.168.4.0/24_. For accessing VPS servers as local network devices.
|
||||
|
||||
## DNS Server
|
||||
I use my gateway as a local DNS server with additional records for internal services, allowing them to be accessed using domain names like `beszel.int.example.com`, but only from the LAN or VPN. Almost all internal domains are pointing to the `ingress1` (Zoraxy reverse proxy), that also manages SSL termination.
|
1
docs/index.md
Normal file
@@ -0,0 +1 @@
|
||||
Hello World!
|
@@ -98,12 +98,6 @@ const config = {
|
||||
srcDark: 'img/logo_dark.svg',
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: 'docSidebar',
|
||||
sidebarId: 'docsSidebar',
|
||||
position: 'left',
|
||||
label: 'Homelab',
|
||||
},
|
||||
{ to: '/blog', label: 'Blog', position: 'left' },
|
||||
],
|
||||
},
|
||||
@@ -111,12 +105,8 @@ const config = {
|
||||
style: 'dark',
|
||||
links: [
|
||||
{
|
||||
title: 'This site sections',
|
||||
title: 'This site sections:',
|
||||
items: [
|
||||
{
|
||||
label: 'Homelab',
|
||||
to: '/docs/homelab',
|
||||
},
|
||||
{
|
||||
label: 'Blog',
|
||||
to: '/blog',
|
||||
@@ -132,38 +122,16 @@ const config = {
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'My',
|
||||
title: 'Feel free to contact me with questions and/or criticisms:',
|
||||
items: [
|
||||
{
|
||||
label: 'Code',
|
||||
href: 'https://git.nicelycomposed.codes/yehor',
|
||||
label: 'Matrix',
|
||||
to: 'https://matrix.to/#/@yehor:vi.place',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Me on',
|
||||
items: [
|
||||
{
|
||||
label: 'Mastodon',
|
||||
href: 'https://techhub.social/@estevez',
|
||||
to: 'https://techhub.social/@estevez',
|
||||
},
|
||||
{
|
||||
label: 'Pixelfed',
|
||||
href: 'https://pixelfed.social/estevez',
|
||||
},
|
||||
{
|
||||
label: 'GitHub',
|
||||
href: 'https://github.com/estevez-dev',
|
||||
},
|
||||
{
|
||||
label: 'Untappd',
|
||||
href: 'https://untappd.com/user/estevezz',
|
||||
},
|
||||
{
|
||||
label: 'LinkedIn',
|
||||
href: 'https://www.linkedin.com/in/yehor-vialov-2a362158/',
|
||||
},
|
||||
|
||||
],
|
||||
},
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "yevi-org",
|
||||
"version": "0.1.1",
|
||||
"version": "0.2.2",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"docusaurus": "docusaurus",
|
||||
|
@@ -6,7 +6,7 @@ const FeatureList = [
|
||||
{
|
||||
title: 'Blog',
|
||||
link: 'blog',
|
||||
Svg: require('@site/static/img/blog.svg').default,
|
||||
Svg: require('@site/static/icons/blog.svg').default,
|
||||
description: (
|
||||
<>
|
||||
Some notes, interesting things and projects.
|
||||
@@ -14,12 +14,72 @@ const FeatureList = [
|
||||
),
|
||||
},
|
||||
{
|
||||
title: 'Homelab Documented',
|
||||
link: 'docs/homelab',
|
||||
Svg: require('@site/static/img/homelab.svg').default,
|
||||
title: 'Git',
|
||||
link: 'https://git.nicelycomposed.codes/yehor',
|
||||
Svg: require('@site/static/icons/gitea.svg').default,
|
||||
description: (
|
||||
<>
|
||||
Here I'm trying my best in documenting my home servers and self-hosted services.
|
||||
My code
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: 'Mastodon',
|
||||
link: 'https://techhub.social/@estevez',
|
||||
Svg: require('@site/static/icons/mastodon.svg').default,
|
||||
description: (
|
||||
<>
|
||||
My micro blog at techhub.social
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: 'Matrix',
|
||||
link: 'https://matrix.to/#/@yehor:vi.place',
|
||||
Svg: require('@site/static/icons/matrix.svg').default,
|
||||
description: (
|
||||
<>
|
||||
If you want to chat (with end-to-end encryption)
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: 'Pixelfed',
|
||||
link: 'https://pixelfed.social/estevez',
|
||||
Svg: require('@site/static/icons/pixelfed.svg').default,
|
||||
description: (
|
||||
<>
|
||||
For some photography
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: 'GitHub',
|
||||
link: 'https://github.com/estevez-dev',
|
||||
Svg: require('@site/static/icons/github.svg').default,
|
||||
description: (
|
||||
<>
|
||||
Some forks and contributions
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: 'Untappd',
|
||||
link: 'https://untappd.com/user/estevezz',
|
||||
Svg: require('@site/static/icons/untappd.svg').default,
|
||||
description: (
|
||||
<>
|
||||
Budmo!
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: 'Linkedin',
|
||||
link: 'https://www.linkedin.com/in/yehor-vialov-2a362158/',
|
||||
Svg: require('@site/static/icons/linkedin.svg').default,
|
||||
description: (
|
||||
<>
|
||||
They say I need this to find any work
|
||||
</>
|
||||
),
|
||||
},
|
||||
@@ -28,10 +88,10 @@ const FeatureList = [
|
||||
function Feature({ Svg, title, link, description }) {
|
||||
return (
|
||||
|
||||
<div className={clsx('col col--6')}>
|
||||
<div className={clsx('col col--3', styles.featureBlock)}>
|
||||
<div className="text--center">
|
||||
<a href={link} className={styles.featureLink}>
|
||||
<Svg className={styles.featureSvg} role="img" />
|
||||
<a href={link} target='_blank' className={styles.featureLink}>
|
||||
<Svg fill="currentColor" className={styles.featureSvg} role="img" />
|
||||
</a>
|
||||
</div>
|
||||
<a href={link} className={styles.featureLink}>
|
||||
|
@@ -5,9 +5,17 @@
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.featureBlock {
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
|
||||
.featureSvg {
|
||||
height: 200px;
|
||||
width: 200px;
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.featureSvg path {
|
||||
fill: var(--ifm-link-color) !important;
|
||||
}
|
||||
|
||||
.featureLink {
|
||||
|
@@ -31,3 +31,15 @@
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||
--ifm-link-color: var(--ifm-color-primary-darker);
|
||||
}
|
||||
|
||||
@media (max-width: 996px) {
|
||||
.col {
|
||||
--ifm-col-width: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 500px) {
|
||||
.col {
|
||||
--ifm-col-width: 100%;
|
||||
}
|
||||
}
|
@@ -15,8 +15,8 @@ function HomepageHeader() {
|
||||
<Heading as="h1" className="hero__title">
|
||||
Yehor Vialov
|
||||
</Heading>
|
||||
<p className="hero__subtitle">Public Profiles</p>
|
||||
<div className={styles.buttons}>
|
||||
<p className="hero__subtitle">Public profiles and publications</p>
|
||||
{/* <div className={styles.buttons}>
|
||||
<Link
|
||||
className="button button--secondary button--lg"
|
||||
to="https://git.nicelycomposed.codes/yehor">
|
||||
@@ -27,11 +27,6 @@ function HomepageHeader() {
|
||||
to="https://techhub.social/@estevez">
|
||||
Mastodon
|
||||
</Link>
|
||||
<Link
|
||||
className="button button--secondary button--lg"
|
||||
to="https://pixelfed.social/estevez">
|
||||
Pixelfed
|
||||
</Link>
|
||||
<Link
|
||||
className="button button--secondary button--lg"
|
||||
to="https://github.com/estevez-dev">
|
||||
@@ -47,7 +42,7 @@ function HomepageHeader() {
|
||||
to="https://www.linkedin.com/in/yehor-vialov-2a362158/">
|
||||
LinkedIn
|
||||
</Link>
|
||||
</div>
|
||||
</div> */}
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
|
21
static/icons/blog.svg
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg height="800px" width="800px" version="1.1" id="_x32_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
viewBox="0 0 512 512" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#000000;}
|
||||
</style>
|
||||
<g>
|
||||
<polygon class="st0" points="93.539,218.584 275.004,218.584 354.699,138.894 355.448,138.145 355.448,125.045 93.539,125.045 "/>
|
||||
<polygon class="st0" points="402.213,433.724 46.77,433.724 46.77,78.276 402.213,78.276 402.213,91.467 448.983,56.572
|
||||
448.983,31.506 0,31.506 0,480.494 448.983,480.494 448.983,289.204 402.213,335.974 "/>
|
||||
<path class="st0" d="M229.358,274.708H93.539v28.062h120.476C218.602,292.858,223.932,283.312,229.358,274.708z"/>
|
||||
<path class="st0" d="M93.539,349.539v28.062h110.935c-3.275-8.796-4.302-18.334-3.649-28.062H93.539z"/>
|
||||
<path class="st0" d="M290.939,268.789c-15.501,15.501-55.612,80.76-40.11,96.27c15.51,15.51,80.76-24.609,96.27-40.11l63.755-63.77
|
||||
l-56.155-56.15L290.939,268.789z"/>
|
||||
<path class="st0" d="M500.374,115.509c-15.511-15.502-40.649-15.502-56.15,0l-76.682,76.685l56.156,56.15l76.676-76.685
|
||||
C515.875,156.158,515.875,131.019,500.374,115.509z M400.166,202.361l-9.636-9.628l53.684-53.684l9.619,9.618L400.166,202.361z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
1
static/icons/docusaurus.svg
Normal file
After Width: | Height: | Size: 5.5 KiB |
1
static/icons/gitea.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M502.6 103.7c-3.3-3.3-7.8-3.3-7.8-3.3s-95.5 5.4-144.9 6.5c-10.8.2-21.6.5-32.3.6V203c-4.5-2.1-9-4.3-13.5-6.4 0-29.6-.1-88.9-.1-88.9-23.6.3-72.7-1.8-72.7-1.8s-115.2-5.8-127.7-6.9c-8-.5-18.3-1.7-31.8 1.2-7.1 1.5-27.3 6-43.8 21.9C-8.7 154.8.7 206.7 1.9 214.5c1.4 9.5 5.6 36 25.8 59 37.3 45.7 117.6 44.6 117.6 44.6s9.9 23.5 24.9 45.2c20.4 27 41.3 48 61.7 50.5 51.3 0 153.9-.1 153.9-.1s9.8.1 23-8.4c11.4-6.9 21.6-19.1 21.6-19.1s10.5-11.2 25.2-36.9c4.5-7.9 8.2-15.6 11.5-22.8 0 0 45-95.4 45-188.2-1-28-7.9-33-9.5-34.6M97.7 269.9c-21.1-6.9-30.1-15.2-30.1-15.2S52 243.8 44.2 222.3c-13.4-36-1.1-58-1.1-58s6.8-18.3 31.4-24.4c11.2-3 25.2-2.5 25.2-2.5s5.8 48.4 12.8 76.7c5.9 23.8 20.2 63.3 20.2 63.3s-21.3-2.6-35-7.5m289.4-4.5c-5.2 12.6-44.8 92.1-44.8 92.1s-5 11.8-16 12.5c-4.7.3-8.4-1-8.4-1s-.2-.1-4.3-1.7l-92-44.8s-8.9-4.6-10.4-12.7c-1.8-6.6 2.2-14.7 2.2-14.7l44.2-91.1s3.9-7.9 9.9-10.6c.5-.2 1.9-.8 3.7-1.2 6.6-1.7 14.7 2.3 14.7 2.3l18.4 8.9c-3.7 7.6-7.5 15.2-11.2 22.9-5.5-.1-10.5 2.9-13.1 7.7-2.8 5.1-2.2 11.5 1.5 16.1-6.6 13.8-13.3 27.5-19.9 41.1-6.7.1-12.5 4.7-14.1 11.2-1.5 6.5 1.6 13.3 7.4 16.3 6.3 3.3 14.3 1.5 18.5-4.4 4.2-5.8 3.5-13.8-1.5-18.8l19.5-40c1.2.1 3 .2 5-.4 3.3-.7 5.8-2.9 5.8-2.9 3.4 1.5 7 3.1 10.8 5 3.9 2 7.6 4 10.9 5.9.7.4 1.5.9 2.3 1.5 1.3 1.1 2.8 2.5 3.8 4.5 1.5 4.5-1.5 12.1-1.5 12.1-1.9 6.2-15 33.1-15 33.1-6.6-.2-12.5 4.1-14.4 10.2-2.1 6.6.9 14.1 7.2 17.3 6.4 3.3 14.2 1.4 18.3-4.3 4.1-5.5 3.7-13.3-.9-18.4l4.6-9.2c4.1-8.5 11-24.8 11-24.8.7-1.4 4.6-8.4 2.2-17.3-2-9.3-10.3-13.6-10.3-13.6-9.9-6.4-23.8-12.4-23.8-12.4s0-3.3-.9-5.8-2.3-4.2-3.2-5.1c3.6-7.6 7.4-15.1 11-22.6l61.8 29.9s10.3 4.6 12.5 13.2c1.5 6-.4 11.4-1.5 14" style="fill:#fff"/></svg>
|
After Width: | Height: | Size: 1.7 KiB |
1
static/icons/github.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M256 6.3C114.6 6.3 0 120.9 0 262.3c0 113.3 73.3 209 175 242.9 12.8 2.2 17.6-5.4 17.6-12.2 0-6.1-.3-26.2-.3-47.7-64.3 11.8-81-15.7-86.1-30.1-2.9-7.4-15.4-30.1-26.2-36.2-9-4.8-21.8-16.6-.3-17 20.2-.3 34.6 18.6 39.4 26.2 23 38.7 59.8 27.8 74.6 21.1 2.2-16.6 9-27.8 16.3-34.2-57-6.4-116.5-28.5-116.5-126.4 0-27.8 9.9-50.9 26.2-68.8-2.6-6.4-11.5-32.6 2.6-67.8 0 0 21.4-6.7 70.4 26.2 20.5-5.8 42.2-8.6 64-8.6s43.5 2.9 64 8.6c49-33.3 70.4-26.2 70.4-26.2 14.1 35.2 5.1 61.4 2.6 67.8 16.3 17.9 26.2 40.6 26.2 68.8 0 98.2-59.8 120-116.8 126.4 9.3 8 17.3 23.4 17.3 47.4 0 34.2-.3 61.8-.3 70.4 0 6.7 4.8 14.7 17.6 12.2C438.7 471.3 512 375.3 512 262.3c0-141.4-114.6-256-256-256" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"/></svg>
|
After Width: | Height: | Size: 819 B |
1
static/icons/linkedin.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M455.1 0H56.9C25.5 0 0 25.5 0 56.9v398.2C0 486.5 25.5 512 56.9 512h398.2c31.4 0 56.9-25.5 56.9-56.9V56.9C512 25.5 486.5 0 455.1 0M154.8 440.9H78.5V194.4h76.4v246.5zm-38.5-278.8c-24.9 0-45.2-20.4-45.2-45.5s20.2-45.5 45.2-45.5 45.1 20.4 45.1 45.5-20.2 45.5-45.1 45.5m324.6 278.8h-76V311.5c0-35.5-13.5-55.3-41.6-55.3-30.5 0-46.5 20.6-46.5 55.3v129.4h-73.2V194.4h73.2v33.2s22-40.7 74.3-40.7 89.7 31.9 89.7 98v156z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#fff"/></svg>
|
After Width: | Height: | Size: 564 B |
1
static/icons/mastodon.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M494.3 113.4C486.9 58.3 439 15 382.1 6.6 372.5 5.2 336.2 0 252 0h-.6c-84.2 0-102.2 5.2-111.8 6.6-55.3 8.2-105.7 47.1-118 102.8-5.9 27.4-6.5 57.8-5.4 85.7 1.6 40 1.9 79.9 5.5 119.7 2.5 26.4 6.9 52.7 13.1 78.5 11.6 47.7 58.7 87.4 104.9 103.6 49.4 16.9 102.6 19.7 153.5 8.1 5.6-1.3 11.1-2.8 16.6-4.5 12.4-3.9 26.9-8.3 37.5-16.1.1-.1.3-.2.4-.4s.1-.3.1-.5v-38.6c0-.2 0-.3-.1-.5s-.2-.3-.3-.4-.3-.2-.5-.2h-.5c-32.6 7.8-66.1 11.7-99.6 11.6-57.7 0-73.2-27.4-77.7-38.8-3.6-9.9-5.8-20.1-6.7-30.6 0-.2 0-.4.1-.5.1-.2.2-.3.3-.4s.3-.2.5-.2h.5c32.1 7.7 65 11.6 98 11.6 7.9 0 15.8 0 23.8-.2 33.2-.9 68.2-2.6 100.8-9 .8-.2 1.6-.3 2.3-.5 51.5-9.9 100.5-40.9 105.5-119.5.2-3.1.7-32.4.7-35.6-.1-11 3.4-77.5-.6-118.3m-81.6 198.5h-54.2V179.2c0-27.9-11.6-42.2-35.3-42.2-26 0-39.1 16.8-39.1 50.1v72.6h-53.8v-72.6c0-33.3-13.1-50.1-39.1-50.1-23.5 0-35.3 14.2-35.3 42.2v132.6h-54.1V175.2c0-27.9 7.1-50.1 21.4-66.6 14.7-16.4 34-24.8 58-24.8 27.7 0 48.7 10.7 62.6 32l13.5 22.6 13.5-22.6c14-21.3 34.9-32 62.6-32 23.9 0 43.2 8.4 58 24.8q21.3 24.6 21.3 66.6z" style="fill:#fff"/></svg>
|
After Width: | Height: | Size: 1.1 KiB |
1
static/icons/matrix.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"/></svg>
|
After Width: | Height: | Size: 890 B |
7
static/icons/pixelfed.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="-10 -5 1034 1034" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" fill="#000000">
|
||||
|
||||
<g id="SVGRepo_bgCarrier" stroke-width="0"/>
|
||||
|
After Width: | Height: | Size: 845 B |
1
static/icons/untappd.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0"?><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title/><path d="M11 13.299l-5.824 8.133c-.298.416-.8.635-1.308.572-.578-.072-1.374-.289-2.195-.879S.392 19.849.139 19.323a1.402 1.402 0 0 1 .122-1.425l5.824-8.133a3.066 3.066 0 0 1 1.062-.927l1.146-.604c.23-.121.436-.283.608-.478.556-.631 2.049-2.284 4.696-4.957l.046-.212a.134.134 0 0 1 .096-.1l.146-.037a.135.135 0 0 0 .101-.141l-.015-.18a.13.13 0 0 1 .125-.142c.176-.005.518.046 1.001.393s.64.656.692.824a.13.13 0 0 1-.095.164l-.175.044a.133.133 0 0 0-.101.141l.012.15a.131.131 0 0 1-.063.123l-.186.112c-1.679 3.369-2.764 5.316-3.183 6.046a2.157 2.157 0 0 0-.257.73l-.205 1.281A3.074 3.074 0 0 1 11 13.3zm12.739 4.598l-5.824-8.133a3.066 3.066 0 0 0-1.062-.927l-1.146-.605a2.138 2.138 0 0 1-.608-.478 50.504 50.504 0 0 0-.587-.654.089.089 0 0 0-.142.018 97.261 97.261 0 0 1-1.745 3.223 1.42 1.42 0 0 0-.171.485 3.518 3.518 0 0 0 0 1.103l.01.064c.075.471.259.918.536 1.305l5.824 8.133c.296.413.79.635 1.294.574a4.759 4.759 0 0 0 2.209-.881 4.762 4.762 0 0 0 1.533-1.802 1.4 1.4 0 0 0-.122-1.425zM8.306 3.366l.175.044a.134.134 0 0 1 .101.141l-.012.15a.13.13 0 0 0 .063.123l.186.112c.311.623.599 1.194.869 1.721.026.051.091.06.129.019.437-.469.964-1.025 1.585-1.668a.137.137 0 0 0 .003-.19c-.315-.322-.645-.659-1.002-1.02l-.046-.212a.13.13 0 0 0-.096-.099l-.146-.037a.135.135 0 0 1-.101-.141l.015-.18a.13.13 0 0 0-.123-.142c-.175-.005-.518.045-1.002.393-.483.347-.64.656-.692.824a.13.13 0 0 0 .095.164z"/></svg>
|
After Width: | Height: | Size: 1.5 KiB |