Update site
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
Elara 2023-05-03 17:01:53 -07:00
parent dae8ba1e71
commit 0b5b8f947d
15 changed files with 26 additions and 85 deletions

View File

@ -8,7 +8,7 @@ pipeline:
upload: upload:
image: plugins/s3 image: plugins/s3
settings: settings:
endpoint: https://api.minio.arsenm.dev endpoint: https://api.minio.elara.ws
path_style: true path_style: true
bucket: site bucket: site
access_key: AkdgUdmzEJBoiYa2 access_key: AkdgUdmzEJBoiYa2

View File

@ -1,5 +1,5 @@
# Site # Site
[![status-badge](https://ci.arsenm.dev/api/badges/Arsen6331/site/status.svg)](https://ci.arsenm.dev/Arsen6331/site) [![status-badge](https://ci.arsenm.dev/api/badges/Elara6331/site/status.svg)](https://ci.arsenm.dev/Elara6331/site)
This is the git repository for my personal site at https://www.arsenm.dev/. This is the git repository for my personal site at https://www.arsenm.dev/.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

BIN
assets/img/nebula.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

View File

@ -2,7 +2,7 @@
# Refer to the theme docs for more details about each of these parameters. # Refer to the theme docs for more details about each of these parameters.
# https://jpanther.github.io/congo/docs/getting-started/ # https://jpanther.github.io/congo/docs/getting-started/
baseURL = "https://arsenm.dev/" baseURL = "https://elara.ws/"
defaultContentLanguage = "en" defaultContentLanguage = "en"
enableRobotsTXT = true enableRobotsTXT = true

View File

@ -5,21 +5,21 @@ isoCode = "en"
weight = 1 weight = 1
rtl = false rtl = false
title = "Arsen's Site" title = "Elara's Site"
#logo = "img/logo.jpg" #logo = "img/logo.jpg"
#description = "My awesome website" #description = "My awesome website"
copyright = "Copyright © Arsen Musayelyan" copyright = "Copyright © Elara Musayelyan"
dateFormat = "January 2, 2006" dateFormat = "January 2, 2006"
[author] [author]
name = "Arsen Musayelyan" name = "Elara Musayelyan"
image = "img/arsen-musayelyan.jpg" image = "img/nebula.jpg"
headline = "Software Engineer" headline = "Software Engineer"
bio = "A little bit about you" bio = "A little bit about you"
links = [ links = [
{ email = "mailto:arsen@arsenm.dev" }, { email = "mailto:arsen@arsenm.dev" },
{ gitea = "https://gitea.arsenm.dev/Arsen6331" }, { gitea = "https://gitea.elara.ws/Elara6331" },
{ github = "https://github.com/Arsen6331" }, { github = "https://github.com/Elara" },
{ linkedin = "https://www.linkedin.com/in/arsen-musayelyan-9a850a1ab/" }, #{ linkedin = "https://www.linkedin.com/in/arsen-musayelyan-9a850a1ab/" },
] ]

View File

@ -25,14 +25,9 @@
pageRef = "projects" pageRef = "projects"
weight = 30 weight = 30
[[main]]
name = "Blog"
pageRef = "blog"
weight = 30
[[main]] [[main]]
name = "Source Code" name = "Source Code"
url = "https://gitea.arsenm.dev/Arsen6331/site" url = "https://gitea.elara.ws/Elara6331/site"
# -- Footer Menu -- # -- Footer Menu --
# The footer menu is displayed at the bottom of the page, just before # The footer menu is displayed at the bottom of the page, just before

View File

@ -5,30 +5,17 @@ showDate = false
slug = "about" slug = "about"
+++ +++
I am Arsen Musayelyan, also sometimes known as Arsen6331 or Heisenbug online. I am <span id="age">Loading...</span> years old, and I am a Software Engineer. Hello! I'm Elara Musayelyan, also sometimes known as Elara6331 or Heisenbug online.
I am very passionate about software development, automation, microcontrollers, and open-source projects in general. I also love learning new things in those fields and trying them out to see if I can make anything I find interesting. I'm very passionate about software development, automation, microcontrollers, and open-source projects in general. I love learning new things and experimenting to find new and interesting applications for the things I've learned.
In my free time, I work on anything from DIY microcontroller gadgets to smartwatch companion apps to contributions to open-source projects. In my free time, I work on anything from DIY microcontroller gadgets to contributions to open-source projects.
I've contributed to several projects, such as the [TinyGo compiler](https://github.com/tinygo-org/tinygo), [TinyGo's Drivers](https://github.com/tinygo-org/drivers), and [InfiniTime](https://github.com/infiniTimeOrg/InfiniTime). I've contributed to several projects, such as [TinyGo](https://github.com/tinygo-org), [InfiniTime](https://github.com/InfiniTimeOrg/InfiniTime), and [GoReleaser](https://github.com/goreleaser/goreleaser).
I also have many of my own open-source projects, some of which are listed on the [projects page](/projects) of this site, and the rest can be found on my [Gitea](https://gitea.arsenm.dev/Arsen6331) or mirrored to my [GitHub](https://github.com/Arsen6331). I also have many of my own open-source projects, some of which are listed on the [projects page](/projects) of this site, and the rest can be found on my [Gitea](https://gitea.elara.ws/Elara6331) or mirrored to my [GitHub](https://github.com/Elara6331).
Online Profiles: Online Profiles:
- [Gitea](https://gitea.arsenm.dev/Arsen6331) - [Gitea](https://gitea.elara.ws/Elara6331)
- [GitHub](https://github.com/Arsen6331) - [GitHub](https://github.com/Elara6331)
- [LinkedIn](https://www.linkedin.com/in/arsen-musayelyan-9a850a1ab/)
<script>
birthday = new Date("April 24, 2005");
now = new Date();
age = now.getFullYear() - birthday.getFullYear();
if (now.getMonth() < birthday.getMonth()) {
age--;
} else if (now.getMonth() == birthday.getMonth() && now.getDate() < birthday.getDate()) {
age--;
}
document.getElementById("age").innerHTML = age;
</script>

View File

@ -1,4 +0,0 @@
+++
title = "Blog"
showDate = false
+++

View File

@ -1,37 +0,0 @@
+++
title = "My personal self-hosting journey"
date = "2023-02-12"
slug = "self-hosting"
+++
In this blog post, I'll delve into my personal experience of discovering and embracing self-hosting, and explore the advantages of this approach and why it might be worth considering for you.
For many years, I relied on free services such as Google Drive, Google Docs, Dropbox, Github, etc. and was very happy with them. I often wondered how companies could offer these services for free. It wasn't until later that I discovered the answer. Companies like Google, Microsoft, and Apple collect the data of their users and sell it to advertisers, who use it to target manipulative ads more accurately at people who are more likely to be influenced by them.
Moreover, users must trust both the service providers and the data purchasers to secure their information, prevent unauthorized access, and refrain from reselling it to entities that may pose a risk to the users' privacy. Historically, there have been numerous instances where both the service providers and data purchasers have proven to be unreliable and untrustworthy in their pursuit of higher profits.
This is where self-hosting comes into play. Instead of relying on corporations to store your data, you take control of it yourself, giving you complete control over your information and the ability to secure it to your standards. Additionally, it empowers you to access features that these corporations often restrict behind paywalls.
After learning about data collection, I was motivated to find a way to stop it. Initially, I tried using other service providers that claimed to prioritize privacy, but I soon realized that they couldn't guarantee their claims and often turned out to be just as problematic as other providers. That's when I began exploring the option of self-hosting and delving into the necessary knowledge, such as Linux servers, the internet, and various internet protocols. With time, I felt confident in my understanding and decided to take the leap into self-hosting.
At 14 years old, I saved up some birthday money, and acquired 5 Raspberry Pi 4s. I set them up in my room, and started trying things. At first, it was rough. I failed at all my attempts, but I was determined to continue, and eventually, I got my first service reachable from the internet. With that experience, I continued setting up more services. However, I eventually faced a problem - the Raspberry Pi models I purchased only had 1 GB of RAM, and I used 16 GB microSD cards for storage, which was insufficient for hosting some of the services I wanted. Additionally, this prevented me from using orchestration tools such as Kubernetes, as even the stripped down variants required more RAM to function properly.
After a while, I decided to expand my cluster, so I bought 5 more Raspberry Pi 4s, this time with 2 GB of RAM, as well as a 24-port network switch and an extremely long ethernet cable, using money I got from New Year gifts. With the help of my dad, I ran the Ethernet cable from our router to my room. On the router, I installed OpenWrt, a custom firmware for routers, and used its VLAN features to isolate my servers from the rest of the network and protect them from potential attacks related to WiFi and IoT devices. My dad also helped me construct a glass display case, which I used to house all my servers.
The extra power from the new Raspberry Pis allowed me to host even more services, but eventually, I ran into issues where certain services were designed to run on x86 CPUs such as those made by Intel and AMD, while Raspberry Pis use ARM CPUs like the ones often used in mobile devices. Around this time, I built myself a new desktop computer, which meant I no longer needed to use my 2012 Mac Mini with a broken drive. I replaced the old HDD with an SSD, upgraded the RAM to 16 GB, and added it to my cluster.
The addition of an x86 system with lots of RAM and lots of fast storage allowed me to host services that previously would've been difficult or impossible to host. The Mac Mini ran services such as [Nextcloud](https://github.com/nextcloud/server), [OnlyOffice](https://github.com/ONLYOFFICE/server), and [Gitea](https://github.com/go-gitea/gitea) to replace Google Drive, Google Docs, and Github respectively. These services required lots of RAM and storage, so they could not be run on my Raspberry Pis. It also ran services such as [Invidious](https://invidious.io/), which is written in the Crystal programming language, which couldn't be compiled for ARM at the time.
However, as my cluster continued to grow, I found it increasingly difficult to manage and keep track of all the devices and the various services they were hosting. The typical solution to this problem is to use an orchestration tool like Kubernetes, however, that wasn't an option for me since some of my nodes only have 1 GB of RAM, and even the most lightweight Kubernetes clients consume a substantial amount of it.
Eventually, while looking for a completely different tool, my friend found and showed me a tool called [Nomad](https://nomadproject.io). I looked at its documentation and discovered that it was much more lightweight than Kubernetes because it omitted features that were unnecessary for many clusters. I successfully set up a Nomad server on my Mac Mini and effortlessly added my other servers as clients. With minimal setup, everything was up and running. While exploring Nomad, I discovered two additional powerful tools, Consul and Traefik. Consul keeps track of the services running and their metadata, while Traefik acts as a reverse proxy, dynamically communicating with Consul to discover services. I incorporated these tools into my Nomad cluster, enhancing its functionality.
I quickly began converting the services I was running to Nomad services, fascinated by the extremely high level of automation. I was able to simply write a configuration file describing the service I wanted to run, and Nomad would automatically figure out which server would be optimal for that service, download it on that server, configure it, run it, and then manage it while it's running. Then, Nomad sent the metadata to Consul, from where Traefik was able to pick it up and automatically reconfigure itself to proxy requests to that service and acquire a TLS certificate.
I was impressed by Nomad's resilience, as I discovered when I intentionally shut down one of the servers running various services. Within seconds, Nomad stepped in and rescheduled the services on a different server, downloading and configuring them, and updating the Consul data. This prompted Traefik to reconfigure itself, and in no time, everything was back up and running seamlessly with no intervention from me.
Over time, I added more nodes, and every time, Nomad was able to add them to the cluster seamlessly and began scheduling tasks on them. I now run lots of services, including [SearXNG](https://docs.searxng.org/), [Matrix Dendrite](https://matrix.org/docs/projects/server/dendrite), [Homer](https://github.com/bastienwirtz/homer/), [Woodpecker CI](https://woodpecker-ci.org/), [MinIO](https://min.io/), [CyberChef](https://github.com/gchq/CyberChef), [Gitea](https://gitea.io), and much more. In fact, this site is hosted on that cluster. It's stored in a git repo on my Gitea server. When I update it, Woodpecker rebuilds it, and then uploads it to MinIO, from where Nomad downloads and deploys it.
I release all the files I use for my services publicly at https://gitea.arsenm.dev/Arsen6331/nomad (mirrored to https://github.com/Arsen6331/nomad)
Beyond the benefits of increased privacy, this experience has been a valuable learning opportunity for me. I have gained knowledge that I otherwise would not have had the chance to acquire. I highly recommend that anyone with an interest in self-hosting should give it a try. You don't have to go for a complex setup like mine to experience the benefits of self-hosting. Many people self-host their services on an old laptop that they no longer use.

View File

@ -7,7 +7,7 @@ weight = 20
# ITD - InfiniTime Daemon # ITD - InfiniTime Daemon
[ITD](https://gitea.arsenm.dev/Arsen6331/itd), short for InfiniTime Daemon, is one of my biggest and most-used projects. It's a companion daemon for the PineTime smartwatch on Linux, functioning similarly to the Watch app on iOS, but on Linux and for the PineTime instead of the Apple Watch. [ITD](https://gitea.elara.ws/Elara6331/itd), short for InfiniTime Daemon, is one of my biggest and most-used projects. It's a companion daemon for the PineTime smartwatch on Linux, functioning similarly to the Watch app on iOS, but on Linux and for the PineTime instead of the Apple Watch.
The daemon runs in the background and manages Bluetooth communication with the watch. Upon startup, it exposes a UNIX socket to accept API requests from the frontends, including `itctl` (a CLI frontend) and `itgui` (a GUI frontend). The daemon runs in the background and manages Bluetooth communication with the watch. Upon startup, it exposes a UNIX socket to accept API requests from the frontends, including `itctl` (a CLI frontend) and `itgui` (a GUI frontend).

View File

@ -8,7 +8,7 @@ weight = 30
## About ## About
[LURE](https://lure.arsenm.dev/) is a major project that I am currently working on. It allows Linux users to install software not otherwise available in their distro's repositories. It functions in a similar manner to Arch Linux's AUR, but works for any supported distro. [LURE](https://lure.elara.ws/) is a major project that I'm currently working on. It allows Linux users to install software not otherwise available in their distro's repositories. It functions in a similar manner to Arch Linux's AUR, but works for any supported distro.
## How it works ## How it works
@ -20,4 +20,4 @@ Arch Linux has a feature called the AUR, which allows any user to submit a packa
## Problems with this approach ## Problems with this approach
As has been rightfully pointed out by several people, trying to handle the various differences between the software available on each distro, especially library versions, is very difficult. This is not a problem LURE intends to solve. It simply provides a way for developers to automate the procedure of installing their software, so that their users don't have to figure it out themselves. This means that developers will have to handle some of those differences, such as dependency naming. However, LURE will help wherever it can, providing helper commands to create packages that adhere to the guidelines of the distro the package is being built for. Trying to handle the various differences between the software available on each distro, especially library versions, is very difficult. This is not a problem LURE intends to solve. It simply provides a way for developers to automate the procedure of installing their software, so that their users don't have to figure it out themselves. This means that developers will have to handle some of those differences, such as dependency naming. However, LURE will help wherever it can, providing helper commands to create packages that adhere to the guidelines of the distro the package is being built for.

View File

@ -8,7 +8,7 @@ weight = 10
## About ## About
[PCRE](https://gitea.arsenm.dev/Arsen6331/pcre) is a CGo-free port of the PCRE2 regular expression engine to Go. Being CGo-free means that rather than just being bindings to the PCRE2 library, this is a pure Go implementation of PCRE2. [PCRE](https://gitea.elara.ws/Elara6331/pcre) is a CGo-free port of the PCRE2 regular expression engine to Go. Being CGo-free means that rather than just being bindings to the PCRE2 library, this is a pure Go implementation of PCRE2.
## How it works ## How it works

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -28,7 +28,7 @@ job "site" {
} }
artifact { artifact {
source = "https://api.minio.arsenm.dev/site/site.tar.gz" source = "https://api.minio.elara.ws/site/site.tar.gz"
destination = "local/site" destination = "local/site"
} }
@ -39,11 +39,11 @@ job "site" {
tags = [ tags = [
"traefik.enable=true", "traefik.enable=true",
"traefik.http.middlewares.site-redir.redirectRegex.regex=^https://arsenm\\.dev", "traefik.http.middlewares.site-redir.redirectRegex.regex=^https://elara\\.ws",
"traefik.http.middlewares.site-redir.redirectRegex.replacement=https://www.arsenm.dev", "traefik.http.middlewares.site-redir.redirectRegex.replacement=https://www.elara.ws",
"traefik.http.middlewares.site-redir.redirectRegex.permanent=true", "traefik.http.middlewares.site-redir.redirectRegex.permanent=true",
"traefik.http.routers.site.rule=Host(`arsenm.dev`) || Host(`www.arsenm.dev`)", "traefik.http.routers.site.rule=Host(`elara.ws`) || Host(`www.elara.ws`)",
"traefik.http.routers.site.middlewares=site-redir", "traefik.http.routers.site.middlewares=site-redir",
"traefik.http.routers.site.tls.certResolver=letsencrypt", "traefik.http.routers.site.tls.certResolver=letsencrypt",
] ]