<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Angel's Tech Tutorials]]></title><description><![CDATA[Angel's Tech Tutorials]]></description><link>https://angelsanchez.me/</link><image><url>https://angelsanchez.me/favicon.png</url><title>Angel&apos;s Tech Tutorials</title><link>https://angelsanchez.me/</link></image><generator>Ghost 5.80</generator><lastBuildDate>Tue, 21 Apr 2026 10:47:25 GMT</lastBuildDate><atom:link href="https://angelsanchez.me/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Setting up Mailrise with Docker]]></title><description><![CDATA[<p>I recently discovered <a href="https://github.com/YoRyan/mailrise?ref=angelsanchez.me">Mailrise</a>, which is an SMTP gateway for <a href="https://github.com/caronc/apprise?ref=angelsanchez.me">Apprise</a> notifications. You can use Mailrise to have devices that only use SMTP for notifications or alerts, and Mailrise will convert it to one of the many supported notifications found <a href="https://github.com/caronc/apprise?ref=angelsanchez.me#supported-notifications">here</a>.</p><p>In this post, I will be configuring it with</p>]]></description><link>https://angelsanchez.me/setting-up-mailrise-with-docker/</link><guid isPermaLink="false">641cc0356f8e5a0001077d6d</guid><category><![CDATA[Mailrise]]></category><category><![CDATA[Docker]]></category><category><![CDATA[MTA]]></category><category><![CDATA[Linux]]></category><category><![CDATA[SMTP]]></category><category><![CDATA[Signal]]></category><category><![CDATA[Notifications]]></category><dc:creator><![CDATA[Angel Sanchez]]></dc:creator><pubDate>Fri, 24 Mar 2023 04:29:18 GMT</pubDate><content:encoded><![CDATA[<p>I recently discovered <a href="https://github.com/YoRyan/mailrise?ref=angelsanchez.me">Mailrise</a>, which is an SMTP gateway for <a href="https://github.com/caronc/apprise?ref=angelsanchez.me">Apprise</a> notifications. You can use Mailrise to have devices that only use SMTP for notifications or alerts, and Mailrise will convert it to one of the many supported notifications found <a href="https://github.com/caronc/apprise?ref=angelsanchez.me#supported-notifications">here</a>.</p><p>In this post, I will be configuring it with Signal. To deploy Mailrise with Signal, I will be using an LXC container on a Proxmox server running Debian (I am using a template I created that has docker preinstalled. Instructions to install it can be found <a href="https://docs.docker.com/engine/install/debian/?ref=angelsanchez.me#installation-methods">here</a>).</p><p>A brief overview of what we need to do is found below.</p><ul><li>Deploy the Signal REST-API docker image found <a href="https://github.com/bbernhard/signal-cli-rest-api?ref=angelsanchez.me">here</a>. You can find the setup instructions on the apprise documentation page found <a href="https://github.com/caronc/apprise/wiki/Notify_signal?ref=angelsanchez.me">here</a>.</li><li>Link your Signal account to the Signal REST- API docker image.</li><li>Generate a <code>mailrise.conf</code> file.</li><li>Deploy Mailrise with docker-compose</li></ul><h1 id="signal">Signal</h1><p>First, make a directory that will hold the docker-compose files. I will be using the <code>/opt/docker</code> directory. You will need elevated privileges to create the directory if you are not running as root.</p><figure class="kg-card kg-code-card"><pre><code class="language-Bash">sudo mkdir -p /opt/docker/signal-rest-api/</code></pre><figcaption><code>sudo</code> runs the command as root and the <code>-p</code> flag makes sure that any missing parent directories in the specified path are created.</figcaption></figure><ul><li>If you are not running as root, you will need to change the ownership of the <code>/opt/docker/</code> folder. You can do this by using <code>sudo chown -R &lt;user&gt;:&lt;user&gt; /opt/docker/</code>. Change the <code>&lt;user&gt;</code> to your username.</li></ul><blockquote>You can run this with docker as shown in the Getting Started page of the project&apos;s README <a href="https://github.com/bbernhard/signal-cli-rest-api?ref=angelsanchez.me#getting-started">here</a>. I prefer to use docker-compose as I can see the configuration that I used to deploy the container.</blockquote><p>Next, create the <code>docker-compose.yml</code> file for the Signal REST-API docker image.</p><pre><code class="language-Bash">nano /opt/docker/signal-rest-api/docker-compose.yml</code></pre><figure class="kg-card kg-code-card"><pre><code class="language-YAML">version: &apos;3&apos;

services:
  signal-api:
    image: bbernhard/signal-cli-rest-api
    container_name: signal-api
    restart: always
    environment:
      MODE: native
    ports:
      - 8080:8080
    volumes:
      - ./signal-cli:/home/.local/share/signal-cli
</code></pre><figcaption>Contents of /opt/docker/signal-rest-api/docker-compose.yml</figcaption></figure><p>Bring up the container by running the <code>docker-compose -f /opt/docker/signal-rest-api/docker-compose.yml up -d</code> (Or <code>docker-compose up -d</code> if you&apos;re in the directory where the <code>docker-compose.yml</code> file is located).</p><p>Register your Signal number by going to <code>http://10.0.69.1:8080/v1/qrcodelink?device_name=signal-api</code>. Replace <code>10.0.69.1</code> with the IP address of your machine. You can link your number by going to the Signal app &gt; Settings &gt; Linked Devices.</p><h1 id="mailrise">Mailrise</h1><p>To deploy Mailrise, make a directory in the <code>/opt/docker</code> directory.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">mkdir /opt/docker/mailrise</code></pre><figcaption>You shouldn&apos;t need to use <code>sudo</code> as the folder&apos;s owner shoudl be your current user (or you&apos;re running as root).</figcaption></figure><p>Then create the <code>docker-compose.yml</code> file in the <code>/opt/docker/mailrise</code> directory using <code>nano</code>.</p><figure class="kg-card kg-code-card"><pre><code class="language-YAML">version: &apos;3&apos;

services:
  mailrise:
    container_name: mailrise
    image: yoryan/mailrise
    restart: unless-stopped
    ports:
      - 8025:8025
    volumes:
      - ./mailrise.conf:/etc/mailrise.conf</code></pre><figcaption>Contents of <code>/opt/docker/mailrise/docker-compose.yml</code>.</figcaption></figure><p>Before deploying the container, you will need to create the <code>mailrise.conf</code> file. The <code>docker-compose.yml</code> file sets the location of the <code>mailrise.conf</code> file in the same directory as indicated by the <code>./</code> in the last line of the configuration file.</p><blockquote>Note: If you don&apos;t create the file, a directory will be created when the container is deployed. You&apos;ll need to remove the folder and create the file.</blockquote><pre><code class="language-bash">nano /opt/docker/mailrise/mailrise.conf</code></pre><figure class="kg-card kg-code-card"><pre><code class="language-YAML">configs:
# The following line will be the email username for the email destination address.
# Because it is set as signal, the email address to be used is signal@mailrise.xyz
  signal:
    urls:
    # The following will send a Signal &quot;Note to Self&quot;.
      - signal://10.0.69.1:8080/18001234567
    # The following will send a signal message to the second number in the URL.
      - signal://10.0.69.1:8080/18001234567/18007654321
    # You can leave both lines to receive a &quot;Note to Self&quot; and send the message to the specified number as well.
# In the line below, the email username is set to jamesjonahjameson, so the email recipient will be jamesjonahjameson@mailrise.xyz
  jamesjonahjameson:
    urls:
      - signal://10.0.69.1:8080/18001234567/15557654321</code></pre><figcaption>Contents of <code>/opt/docker/mailrise/mailrise.conf</code>.</figcaption></figure><blockquote>Note: Modify the <code>signal://</code> lines to reflect your IP address and Signal recipient and destination phone number. You can also choose if you want to send a message to yourself or to another Signal number.</blockquote><p>In the <code>mailrise.conf</code> file shown above, there is a section for <code>signal</code> and another section called <code>jamesjonahjameson</code>. These can be used to have different email recipients so that when you send an email to <code>signal@mailrise.xyz</code>, you get a signal Note to Self. When you send an email to <code>jamesjonahjameson@mailrise.xyz</code>, someone else gets notified.</p><p>There are several <code>urls</code> you can add to the config file, such as Microsoft Teams, PagerDuty, Home Assistant, Mastodon, PushBullet, Pushover, and so many more. You can find a list of all the supported notification services <a href="https://github.com/caronc/apprise/wiki?ref=angelsanchez.me#notification-services">here</a>.</p><p>After you configure the <code>mailrise.conf</code> file, bring up the container with <code>docker-compose -f /opt/docker/mailrise/docker-compose.yml up -d</code> (Or <code>docker-compose up -d</code> if you&apos;re in the directory where the <code>docker-compose.yml</code> file is located).</p><h1 id="verifying-installation">Verifying installation</h1><p>You can verify the docker containers are running by executing <code>docker ps</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2023/03/image.png" class="kg-image" alt loading="lazy" width="1738" height="101" srcset="https://angelsanchez.me/content/images/size/w600/2023/03/image.png 600w, https://angelsanchez.me/content/images/size/w1000/2023/03/image.png 1000w, https://angelsanchez.me/content/images/size/w1600/2023/03/image.png 1600w, https://angelsanchez.me/content/images/2023/03/image.png 1738w" sizes="(min-width: 720px) 720px"><figcaption>Output of <code>docker ps</code> on my instance.</figcaption></figure><blockquote>Note: If you have any errors running a container, you can check the logs by running <code>docker logs &lt;container_name&gt; -f</code>. You can also run <code>docker-compose logs -f</code> if you are in the directory where the <code>docker-compose.yml</code> file is at.</blockquote><p>An example of the directory structure can be found below (You can run <code>tree /opt/docker/</code> to check your file structure).</p><pre><code>[user@fedora ~]# tree /opt/docker/
.
&#x251C;&#x2500;&#x2500; mailrise
&#x2502;   &#x251C;&#x2500;&#x2500; docker-compose.yml
&#x2502;   &#x2514;&#x2500;&#x2500; mailrise.conf
&#x2514;&#x2500;&#x2500; signal-api
    &#x251C;&#x2500;&#x2500; docker-compose.yml
    &#x2514;&#x2500;&#x2500; signal-cli</code></pre><h1 id="using-mailrise">Using Mailrise</h1><p>There are several ways you can use Mailrise to send notifications.</p><h3 id="linux">Linux</h3><p>In Linux, you can use <code>ssmtp</code> to create an email from the command line.</p><p>After installing <code>ssmtp</code>, modify the <code>/etc/ssmtp/ssmtp.conf</code> file to have the following</p><figure class="kg-card kg-code-card"><pre><code>mailhub=10.0.69.1:8025
UseTLS=NO
UseSTARTTLS=NO
FromLineOverride=YES
FromLineSender=YES</code></pre><figcaption>Contents of <code>/etc/ssmtp/ssmtp.conf</code>.</figcaption></figure><p>Now that the configuration for <code>ssmtp</code> is done, you can send a message by executing the following:</p><p><code>echo &quot;Current Directory is $(pwd)&quot; | ssmtp signal@mailrise.xyz</code></p><p>A more useful example command can be found below.</p><pre><code>{
    echo To: signal@mailrise.xyz
    echo From: from_email@example.com
    echo Subject: Current user is $USER
    echo &quot;Body Message goes here&quot;
    echo &quot;You can add more info here such as the IP address&quot;
    echo &quot;Public IP is :&quot; $(curl ifconfig.co)
    echo &quot;Private IP is $(ip addr show eth0 | grep &apos;inet\b&apos; | awk &apos;{print $2}&apos; | cut -d &apos;/&apos; -f1)&quot;
} | ssmtp signal@mailrise.xyz</code></pre><h3 id="windows-powershell">Windows (PowerShell)</h3><p>In Windows, you can use the <code>Send-MailMessage</code> PowerShell cmdlet (more info found <a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage?view=powershell-7.3&amp;ref=angelsanchez.me">here</a>). You can add variables to receive some information about the system as well.</p><pre><code class="language-PowerShell">Send-MailMessage -From &quot;admin@$env:COMPUTERNAME.local&quot; -To &quot;signal@mailrise.xyz&quot; -Subject &quot;subject&quot; -Body  &quot;Machine running $env:PROCESSOR_ARCHITECTURE&quot; -SmtpServer 10.0.69.1 -Port 8025</code></pre>]]></content:encoded></item><item><title><![CDATA[Creating an Active Directory Home Lab with Proxmox]]></title><description><![CDATA[<p>If you want to create an Active Directory environment in a non-production environment, doing so in Proxmox is a great way since you can use many of the features of Proxmox such as backups, snapshots, cloning, etc. This post will go through the setup process of creating an Active Directory</p>]]></description><link>https://angelsanchez.me/creating-an-active-directory-home-lab-with-proxmox/</link><guid isPermaLink="false">639a30f786149500014434c7</guid><category><![CDATA[Proxmox]]></category><category><![CDATA[Active Directory]]></category><category><![CDATA[Windows Server]]></category><dc:creator><![CDATA[Angel Sanchez]]></dc:creator><pubDate>Sat, 17 Dec 2022 00:48:05 GMT</pubDate><content:encoded><![CDATA[<p>If you want to create an Active Directory environment in a non-production environment, doing so in Proxmox is a great way since you can use many of the features of Proxmox such as backups, snapshots, cloning, etc. This post will go through the setup process of creating an Active Directory environment.</p><p>To get started, we will need a Windows Server 2022 Server VM, as well as a few Windows 11 VMs. The Windows 11 VMs must be running a version that supports joining a domain, which includes Windows 11 Professional, Enterprise, and Education.</p><p>I have templates made for Windows Server 2022 and Windows 11 Enterprise in my Proxmox server. These are both running the evaluation editions from Microsoft.</p><h1 id="proxmox-network-setup">Proxmox Network Setup</h1><p>To begin, you will need to create a bridge under Proxmox so that the VMs can communicate with each other. The bridge created will only be used for the Windows Active Directory environment. You can see this in the diagram below.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/ad-proxmox.png" class="kg-image" alt loading="lazy" width="811" height="554" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/ad-proxmox.png 600w, https://angelsanchez.me/content/images/2022/12/ad-proxmox.png 811w" sizes="(min-width: 720px) 720px"></figure><p>To create the Linux bridge, go to your Proxmox web interface, click on your node name, then go to <code>System</code> &gt; <code>Network</code>. </p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/01.png" class="kg-image" alt loading="lazy" width="387" height="284"></figure><p>You will need to create a new Linux Bridge. To do so, click on <code>Create</code> &gt; <code>Linux Bridge</code>. Add a comment to signify that this will be the bridge used for the Active Directory Home Lab. The bridge I will be using is named <code>vmbr3</code>. After the Active Directory lab is configured, we can bridge a port to the <code>vmbr3</code> bridge. This will let us use a network adapter connected to the Proxmox server to connect physical Windows devices to the Active Directory domain.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/02.gif" class="kg-image" alt loading="lazy" width="1111" height="538" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/02.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/02.gif 1000w, https://angelsanchez.me/content/images/2022/12/02.gif 1111w" sizes="(min-width: 720px) 720px"><figcaption>Creating the Linux bridge under Proxmox (<code>vmbr3</code>).</figcaption></figure><p>The next step is to create a clone of Windows Server 2022. Right click on the template, and select <code>Clone</code>. Change the mode to <code>Full Clone</code>, give it a VM ID (I choose 801), and choose a name for it. I will name mine <code>HL01-WindowsServer2022</code>. Then click <code>Clone</code>. </p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/03.png" class="kg-image" alt loading="lazy" width="603" height="249" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/03.png 600w, https://angelsanchez.me/content/images/2022/12/03.png 603w"></figure><p>Do the same for the Windows 11 template. I named my Windows 11 VM <code>HL01-Windows11-Client01</code> and gave it a VM ID of <code>802</code>. Make sure you change the mode to <code>Full</code> and click <code>Clone</code>.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/04.png" class="kg-image" alt loading="lazy" width="601" height="250" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/04.png 600w, https://angelsanchez.me/content/images/2022/12/04.png 601w"></figure><p>The time it takes to fully create the VM under Proxmox can vary depending on your hardware.</p><p>The next step is modify the network devices of each VM. The Windows Server 2022 (VM ID <code>801</code>) will act as the default gateway, so it needs to have two network adapters. I will add a network device and choose the <code>Linux Bridge</code> we created earlier ( <code>vmbr3</code>). Make sure the model of the network device is <code>VirtIO (Paravirtualized)</code>. The other network device is attached to a Linux bridge that has internet access (<code>vmbr1</code> in the following image).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/05.gif" class="kg-image" alt loading="lazy" width="979" height="566" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/05.gif 600w, https://angelsanchez.me/content/images/2022/12/05.gif 979w" sizes="(min-width: 720px) 720px"><figcaption>Adding a network adapter to Windows Server 2022 using the <code>vmbr3</code> bridge created earlier.</figcaption></figure><p>On the Windows 11 VM, we now have to change the bridge of the current network device to be <code>vmbr3</code> as that is the one we created earlier. The Windows 11 VM will then communicate with the Windows Server via the network device connected with the bridge <code>vmbr3</code>.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/07.gif" class="kg-image" alt loading="lazy" width="979" height="566" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/07.gif 600w, https://angelsanchez.me/content/images/2022/12/07.gif 979w" sizes="(min-width: 720px) 720px"></figure><h1 id="windows-server-2022-setup">Windows Server 2022 Setup</h1><p>Now we&apos;re ready to start up our Windows Server 2022 VM. The initial setup is similar to previous Windows installations. Set the local Administrator password and login. Select <code>Yes</code> when you are asked if you want to allow your PC to be discoverable by other PCs.</p><p>The first thing to do is to rename the Windows Server. Go to <code>Settings</code> &gt; <code>System</code> &gt; <code>About</code>. Then choose <code>Rename this PC</code>. I named mine <code>DC01</code> and choose <code>Restart Later</code>. </p><p>The next step to do before rebooting is to rename the ethernet adapters. Go to <code>Control Panel</code> &gt; <code>Network and Internet</code> &gt; <code>Network and Sharing Center</code>. Then choose <code>Change adapter settings</code>.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/08-ws.png" class="kg-image" alt loading="lazy" width="783" height="595" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/08-ws.png 600w, https://angelsanchez.me/content/images/2022/12/08-ws.png 783w" sizes="(min-width: 720px) 720px"></figure><p>One of the network adapters should have internet connectivity. You can identify which one by double clicking on them and seeing if they have internet connectivity.</p><p>Rename them so that you know which one has an active internet connection. I renamed mine <code>Internet</code>. I then renamed the other ethernet adapter as <code>Internal</code>. I restarted the VM at this point.</p><p>We then have to set an IPv4 range for the AD network. You can so this by once again going to <code>Control Panel</code> &gt; <code>Network and Internet</code> &gt; <code>Network and Sharing Center</code>. Then choose <code>Change adapter settings</code>.</p><p>Double click the <code>Internal</code> network device, click on <code>Properties</code>, select <code>Internet Protocol Version 4</code>, and click <code>Properties</code>. &#xA0;</p><p>In the <code>Properties</code> tab, you have to select a private IP range that will not interfere with your current network. </p><p>The IP range I chose for my home lab is <code>172.16.0.1/16</code>. You can find more info about the private IP ranges in RFC1918 <a href="https://www.rfc-editor.org/rfc/rfc1918?ref=angelsanchez.me">here</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/09.png" class="kg-image" alt loading="lazy" width="399" height="454"><figcaption>The IP of the domain controller is set to <code>172.16.0.1</code>, with a <code>/16</code> subnet.</figcaption></figure><p>The IP of the domain controller is set to <code>172.16.0.1</code>, with a <code>/16</code> subnet. I did not specify a gateway as the domain controller will act as the default gateway. I specified the localhost address (<code>127.0.0.1</code>) as the DNS server as the domain controller will serve as a DNS server. Select <code>OK</code> and the close the <code>Properties</code> window.</p><h2 id="setup-active-directory-domain-services">Setup Active Directory Domain Services</h2><p>The next step is to setup Active Directory Domain Services. To do so, open <code>Server Manager</code> and lick on <code>Add roles and features</code>. Select <code>Next</code> to accept the default settings until you&apos;re prompted with the <code>Server Roles</code> section. Choose <code>Active Directory Domain Services</code>, confirm by clicking the <code>Add Features</code> button, then lick on <code>Next</code> to accept the default settings until you can select the <code>Install</code> button. Once it has installed successfully, select <code>Close</code>.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/10-ADDS.gif" class="kg-image" alt loading="lazy" width="1021" height="764" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/10-ADDS.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/10-ADDS.gif 1000w, https://angelsanchez.me/content/images/2022/12/10-ADDS.gif 1021w" sizes="(min-width: 720px) 720px"></figure><p>The next step is to promote the server to a domain controller. You will need to have the domain name you want to use in the next step. There are several best practices when choosing a domain name, such as having a FQDN from a top-level registrar. You can find some of Microsoft&apos;s best practices <a href="https://learn.microsoft.com/en-us/troubleshoot/windows-server/identity/naming-conventions-for-computer-domain-site-ou?ref=angelsanchez.me">here</a>. Because I am deploying this in a home lab environment, I will choose the domain name of <code>mydomain.com</code>.</p><p>To promote the server to a domain controller, click on the notification icon on the top section of the <code>Server Manager</code> program. Then select <code>Promote this server to a domain controller</code>. Select <code>Add a new forest</code> as this in a newly created AD environment. Enter the domain name in the <code>Root domain name:</code> area.</p><p>You will then need to set a password for the <code>Directory Services Restore Mode</code>. Enter a secure password and click <code>Next</code>. Accept the default settings for the following prompts by selecting <code>Next</code>. You will receive some warnings but these are okay for our home lab environment use case. This process can take a while so be patient. The Windows Server 2022 VM will restart automatically when the process is completed. </p><p>Once the Windows Server has rebooted, you will see the login screen show the domain entered in the previous step. </p><h2 id="create-a-domain-administrator-account">Create a domain administrator account</h2><p>The next step we want to do is to create a domain administrative account. This is a good practice and it can enable proper monitoring of logs to see who accesses the server and what changes they may make.</p><p>First, we have to login with the built in Administrator account. To create a domain administrative account, &#xA0;we need to open <code>Active Directory Users and Computers</code>. This can be found in the Start menu under <code>Windows Administrative Tools</code>.</p><p>Expand the <code>mydomain.com</code> section (or whichever domain name you chose previously). Right click on <code>mydomain.com</code> and select <code>New</code> &gt; <code>Organizational Unit</code> (OU). </p><p>I created two OUs called <code>_IT Staff</code> and <code>_Staff</code>. &#xA0;I unchecked <code>Protect container from accidental deletion</code> as this makes it easier to manage in my home lab environment.</p><p>To create an IT Adminstrator, I right clicked the <code>_IT Staff</code> OU, then selected <code>New</code> &gt; <code>User</code>. In the pop up windows, enter the credentials for the domain administrator account you want to create. In most organizations, usernames are created by using the first initial of their first name, followed by their last name. Because I am creating an administrative account, I want to denote this is the <code>User logon name</code> section. I will be denoting administrative accounts by adding the prefix <code>admin-</code> to the <code>User logon name</code>. </p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/11-DA.png" class="kg-image" alt loading="lazy" width="437" height="382"></figure><p>Then set a password for the account. I disabled the option <code>User must change password at next logon</code> &#xA0;and the <code>Password never expires</code> because I am deploying this in my home lab environment. In an organization, this option should be checked so that the end user can set their own password. In an organization, <code>Password never expires</code> may need to be unchecked depending on their password policy requirements.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/12.png" class="kg-image" alt loading="lazy" width="440" height="377"></figure><p>Now we need to add the newly created account to the <code>Domain Admin</code> group. This can be done right clicking the newly created user and selecting <code>Properties</code>.</p><p>Select the <code>Member of</code> tab. You will notice that the user is a member of the <code>Domain Users</code> group. Click on <code>Add</code>. You will get a pop up titled <code>Select Groups</code>. Under the <code>Enter the object names to select</code> section, click on the <code>Advanced</code> button. Then click <code>Find now</code> button on the pop up window. Select <code>Domain Admins</code> and click <code>OK</code>. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/13-manual.gif" class="kg-image" alt loading="lazy" width="535" height="645"><figcaption>Searching for the <code>Domain Admins</code> object name to add the user to that group.</figcaption></figure><p>NOTE: If you know the name of the object name, you can type it in when the <code>Select Groups</code> pop up windows shows up as shown below.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/14-faster.gif" class="kg-image" alt loading="lazy" width="535" height="645"><figcaption>Typing in the object name directly to add it.</figcaption></figure><p> We can then logout of the Administrator account and login with our newly created domain account.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/14.5.gif" class="kg-image" alt loading="lazy" width="1593" height="892" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/14.5.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/14.5.gif 1000w, https://angelsanchez.me/content/images/2022/12/14.5.gif 1593w" sizes="(min-width: 720px) 720px"><figcaption>Logging in with the newly created domain account.</figcaption></figure><h2 id="installing-ras-nat">Installing RAS/ NAT</h2><p>The next step is to install RAS/NAT. If we take a look at the network diagram, this will allow the AD clients to receive Internet access via the domain controller. </p><p>To get NAT installed, we have to once again open <code>Server Manager</code>. Select <code>Add roles and features</code>. Select <code>Next</code> to accept the default settings until you reach the <code>Server Roles</code> section. Select the <code>Remote Access</code> checkbox as this will install NAT. Select <code>Next</code>. Then when you get to the <code>Role Services</code> section, enable the <code>Routing</code> checkbox, and click on the <code>Add Features</code> button. This should auto select the <code>DirectAccess and VPN (RAS)</code> checkbox. Select <code>Next</code> &gt; <code>Next</code> &gt; <code>Next</code>. Then click on the <code>Install</code> button and wait for the features to get installed.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2023/01/RAS-Steps-2.gif" class="kg-image" alt loading="lazy" width="916" height="685" srcset="https://angelsanchez.me/content/images/size/w600/2023/01/RAS-Steps-2.gif 600w, https://angelsanchez.me/content/images/2023/01/RAS-Steps-2.gif 916w" sizes="(min-width: 720px) 720px"><figcaption>Adding RAS/ NAT.</figcaption></figure><p>Next, go back to the <code>Server Manager</code> program. Then click on <code>Tools</code> &gt; <code>Routing and Remote Access</code>. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2023/01/image-1.png" class="kg-image" alt loading="lazy" width="920" height="690" srcset="https://angelsanchez.me/content/images/size/w600/2023/01/image-1.png 600w, https://angelsanchez.me/content/images/2023/01/image-1.png 920w" sizes="(min-width: 720px) 720px"><figcaption><code>Tools</code> &gt; <code>Routing and Remote Access</code></figcaption></figure><p>In the <code>Routing and Remote Access</code> window, right click on the domain controller&apos;s name (<code>DC01</code>) and select <code>Configure and Enable Routing and Remote Access</code>. Select <code>Next</code> and then choose <code>Network Address Translation (NAT)</code>. Select <code>Next</code>. </p><p>NOTE: If you don&apos;t see any network adapters in this step, close the wizard and close the <code>Routing and Remote Access</code> windows. Reopen it and they should appear.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/15-ras_nat.png" class="kg-image" alt loading="lazy" width="497" height="421"></figure><p>Because we labeled the devices earlier, we can see which adapter is being used for internet access. Select the one labeled <code>Internet</code> and click <code>Next</code>. Then select <code>Finish</code>. If you don&apos;t see any changes, you might need to refresh by right clicking the domain controller&apos;s name and selecting <code>Refresh</code>. </p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/16.png" class="kg-image" alt loading="lazy" width="245" height="357"></figure><h2 id="setting-up-the-dhcp-server">Setting up the DHCP Server</h2><p>The next step is to setup the DHCP server on the Windows Server. This can be done by going to the <code>Server Manager</code> program. Click on <code>Add roles and features</code>. Select <code>Next</code> until you reach the <code>Server Roles</code> section. Select <code>DHCP Server</code> from the list and click on <code>Add Features</code> in the pop put window. Select <code>Next</code> to accept the defaults settings and then select <code>Install</code>.</p><p>To complete the DHCP configuration, you have to click on the Notifications flag icon in <code>Server Manager</code> and select <code>Complete DHCP Configuration</code>. Specify the credentials to be used to authorize this DHCP server in AD DS. I chose the domain account I created earlier <code>admin-asanchez</code>.</p><p>We then have to configure a DHCP scope. To do so, go to <code>Server Manager</code> once again. Then select <code>Tools</code> &gt; <code>DHCP</code>. Expand the available options and then right click on <code>IPv4</code> to create an IPv4 scope.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/17-dhcp.png" class="kg-image" alt loading="lazy" width="324" height="215"></figure><p>Set a name for the scope and give it a description if you wish to do so. Select <code>Next</code>. Now to select the scope for the IPv4 addresses, we have to refer back to our initial network diagram. We chose to implement a <code>172.16.0.1/16</code> network. This gives us the available IP range of <code>172.16.0.2</code> to <code>172.16.255.254</code> with over 65,000 available IP addresses. </p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/18.png" class="kg-image" alt loading="lazy" width="514" height="423"></figure><p>Then you can exclude some IP addresses from being handed out by the DHCP server. I choose to exclude the IP ranges of <code>172.16.0.2</code> to <code>172.16.9.255</code>. The first available IP address the DHCP server should hand out would be <code>172.16.10.0</code>. I reserved these addresses so I can know that devices with those IP addresses were manually assigned. This lets me organize devices and manage their network access. I use this feature in my own network to easily identify devices such as printers, managed switches, etc.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/19.png" class="kg-image" alt loading="lazy" width="519" height="428"><figcaption>NOTE: Make sure you select <code>Add</code>.</figcaption></figure><p>When you are prompted to choose the lease duration, this depends on how long a typical host will be connected to the network. The default of <code>8 days</code> is okay for our home lab use case. </p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/20.png" class="kg-image" alt loading="lazy" width="516" height="429"></figure><p>When prompted if you want to configure DHCP options for this scope now, choose <code>Yes, I want to configure these options now</code>, then select <code>Next</code>. You will then be prompted to select the IP address for the default gateway. The IP address we gave our default gateway was <code>172.16.0.1</code>. Enter that and click on <code>Add</code>. Then select <code>Next</code>.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/21.png" class="kg-image" alt loading="lazy" width="518" height="425"></figure><p>The pre-configured options in the <code>Domain Name and DNS Servers</code> are okay for our use case so select <code>Next</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/22.png" class="kg-image" alt loading="lazy" width="519" height="430"><figcaption><code>Domain Name and DNS Servers</code> section.</figcaption></figure><p>I am not configuring WINS so I will select <code>Next</code> on the <code>WINS Server</code> section. Then when prompted if you want to activate the scope now, make sure <code>Yes, I want to activate this scope now</code> is selected and hit <code>Next</code> then <code>Finish</code>.</p><p>You might need to refresh to see the changes.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2023/01/image-2.png" class="kg-image" alt loading="lazy" width="296" height="390"></figure><h2 id="using-a-script-to-create-multiple-users">Using a script to create multiple users</h2><p>Next you can create users you want to have in your domain. You can do this manually as shown in the previous step where we created a domain admin account. You can use a script as well to quickly create multiple user accounts. </p><p>I will be modifying a script by Josh Madakor. The link for the script can be found below.</p><p><a href="https://github.com/joshmadakor1/AD_PS/archive/master.zip?ref=angelsanchez.me"><code>https://github.com/joshmadakor1/AD_PS/archive/master.zip</code></a></p><p>Download the <code>.zip</code> file on the Windows Server 2022 VM. I copied the extracted file to the Desktop. Then open up <code>PowerShell ISE</code> and run it as an administrator. </p><p>The first pre-requisite to run the script is to run the following command.</p><p><code>Set-ExecutionPolicy Unrestricted</code>.</p><p>This is to allow the script to run on the server. You can restrict the policy after running the script if you would like.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/23-script.gif" class="kg-image" alt loading="lazy" width="1023" height="766" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/23-script.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/23-script.gif 1000w, https://angelsanchez.me/content/images/2022/12/23-script.gif 1023w" sizes="(min-width: 720px) 720px"><figcaption>Tip: Hit <code>Tab</code> after typing the first few characters to use tab completion.</figcaption></figure><p>Enter <code>dir</code> to show the contents of the directory. The script is set to use the <code>names.txt</code> file but I created my own called <code>staff.txt</code> so I will &#xA0;modify the script to use this file instead.</p><p>Open up the PowerShell scripts in <code>PowerShell ISE</code>. Then change the file the script will use to generate the user accounts (from <code>names.txt</code> to <code>staff.txt</code>), the defaut password used (the script has it set at <code>Password</code>). Then change the OU the user accounts will be placed at. I changed it so that the new accounts will go to add users to the <code>_Staff</code> OU I created earlier.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/24.gif" class="kg-image" alt loading="lazy" width="1023" height="766" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/24.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/24.gif 1000w, https://angelsanchez.me/content/images/2022/12/24.gif 1023w" sizes="(min-width: 720px) 720px"></figure><p>After modyfing the script. save it then run the script. I have <code>Active Directory Users and Computers</code> window on the right. Refreshing it after running the script will show the newly created user accounts.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/25.gif" class="kg-image" alt loading="lazy" width="1276" height="801" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/25.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/25.gif 1000w, https://angelsanchez.me/content/images/2022/12/25.gif 1276w" sizes="(min-width: 720px) 720px"></figure><p>We can now begin configuring the Windows 11 VM.</p><h1 id="windows-11-setup">Windows 11 Setup</h1><p>Since we have already configured the Windows 11 VM, we are now ready to start it up under Proxmox. Go through the initial setup wizard. When you are prompted to sign in, select <code>Sign-in options</code>. Then enter the username and password for the local administrator of the PC.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/26-w11-setup.gif" class="kg-image" alt loading="lazy" width="1276" height="799" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/26-w11-setup.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/26-w11-setup.gif 1000w, https://angelsanchez.me/content/images/2022/12/26-w11-setup.gif 1276w" sizes="(min-width: 720px) 720px"></figure><p>I like to disable the telemetry options when prompted.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/27.gif" class="kg-image" alt loading="lazy" width="1276" height="799" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/27.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/27.gif 1000w, https://angelsanchez.me/content/images/2022/12/27.gif 1276w" sizes="(min-width: 720px) 720px"></figure><p>After Windows 11 finishes the setup process, you will be logged in to the account that you created earlier. When we open up a command prompt and run <code>ipconfig</code>, we see that the Windows 11 VM has a valid IP address. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/28.png" class="kg-image" alt loading="lazy" width="546" height="283"><figcaption>Running <code>ipconfig</code> in the Windows 11 VM.</figcaption></figure><p>The next step is to join the Windows 11 VM to the domain. To do so, open the <code>Settings</code> program. Then go to <code>Accounts</code> &gt; <code>Access work or school</code>. Then click on the blue <code>Connect</code> button. In the pop out window, select the option <code>Join this device to a local Active Directory domain</code>. Enter the domain name we used to configure our Active Directory forest (I used <code>mydomain.com</code>). You will then be prompted with a login prompt. </p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/29.gif" class="kg-image" alt loading="lazy" width="1276" height="799" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/29.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/29.gif 1000w, https://angelsanchez.me/content/images/2022/12/29.gif 1276w" sizes="(min-width: 720px) 720px"></figure><p>I entered the credentials for a user I created earlier, <code>jjameson</code>. I did not specify the account type as I want to see what default permissions are for the domain.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/30.gif" class="kg-image" alt loading="lazy" width="1276" height="799" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/30.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/30.gif 1000w, https://angelsanchez.me/content/images/2022/12/30.gif 1276w" sizes="(min-width: 720px) 720px"></figure><p>Windows 11 will restart after entering the credentials. After rebooting, you can now login to the domain by selecting <code>Other User</code> in the lower left corner.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/31.gif" class="kg-image" alt loading="lazy" width="1276" height="799" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/31.gif 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/31.gif 1000w, https://angelsanchez.me/content/images/2022/12/31.gif 1276w" sizes="(min-width: 720px) 720px"></figure><h1 id="final-thoughts">Final thoughts</h1><p>So now we have a working active directory home lab environment. There is still a lot of work to as we have to manage what permissions each OU has, as well as manage the group policies per OU, we can add storage to the domain controller and share access with only the users that require it. One issue I noticed is that when I added the <code>jjameson</code> account to the domain via the Windows 11 VM and skipped the step to set their permissions, I noticed that the user account would have the default permissions for the domain. After using the <code>jjameson</code> account for a few minutes, I noticed that there were a few access control policies I would like to implement. But this is a great way to get started and learn more about how to manage an Active Directory environment in a non-production environment. Because I am hosting the Windows Server in a VM in proxmox, I can also backup the VM, create snapshots, and easily restore to a previous point if I want to revert any changes that I make.</p>]]></content:encoded></item><item><title><![CDATA[Creating a virtual Windows Server 2022 template with Proxmox]]></title><description><![CDATA[<p>One of my favorite features of Proxmox is the ability to create templates so I can quickly deploy a virtual machine, especially when I am implementing new features that I am not familiar with. I recently got some new hardware that will let me implement an Active Directory setup in</p>]]></description><link>https://angelsanchez.me/creating-a-virtual-windows-server-2022-template-with-proxmox/</link><guid isPermaLink="false">63912e438614950001443383</guid><dc:creator><![CDATA[Angel Sanchez]]></dc:creator><pubDate>Mon, 12 Dec 2022 19:55:53 GMT</pubDate><content:encoded><![CDATA[<p>One of my favorite features of Proxmox is the ability to create templates so I can quickly deploy a virtual machine, especially when I am implementing new features that I am not familiar with. I recently got some new hardware that will let me implement an Active Directory setup in my home lab. I plan to use this environment to become more familiar with the way it works.</p><p>I have a Proxmox cluster setup and I&apos;m adding Windows Server 2022 and Windows 11 Enterprise virtual machines to it to become more familiar with Active Directory. Having virtual machines can let me mess around with different configurations and if I break something, I can revert back by using the snapshots feature. I also want to get familitar with the process of creating an Active Directory without referencing to my documentation as often as I currently do. </p><p>To begin, you will need the evaluation image for Windows Server 2022 which can be found <a href="https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022?ref=angelsanchez.me">here</a>.</p><p>You will also need the <a href="https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers?ref=angelsanchez.me">VirtIO Drivers</a>. You can find them here. I will be using the newest version available at this time which is the <code>virtio-win-0.1.225-2.iso</code> found <a href="https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.225-2/virtio-win-0.1.225.iso?ref=angelsanchez.me">here</a>.</p><p>Instead of downloading the image to your PC, you can copy the download link and download it directly from your Proxmox server. You can find the ISO images page by heading to the <code>ISO Images</code> tab of the <code>local</code> storage.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/image.png" class="kg-image" alt loading="lazy" width="671" height="356" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/image.png 600w, https://angelsanchez.me/content/images/2022/12/image.png 671w"><figcaption>ISO images section in Proxmox.</figcaption></figure><p>You can see the options I chose for my Windows Server 2022 VM below. Because I want to convert this to a template later on, I chose the minimum amount of storage required which is <a href="https://learn.microsoft.com/en-us/windows-server/get-started/hardware-requirements?ref=angelsanchez.me#storage-controller-and-disk-space-requirements">32 GB.</a> </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/CreateWindowsServer2022VM.gif" class="kg-image" alt loading="lazy" width="719" height="508" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/CreateWindowsServer2022VM.gif 600w, https://angelsanchez.me/content/images/2022/12/CreateWindowsServer2022VM.gif 719w"><figcaption>Creating the VM with Proxmox (NOTE: I choose Windows 11 ISO in the template, I had to go back and choose the Windows Server 2022 image afterwards).</figcaption></figure><p>After creating the Virtual Machine, we have to add the VirtIO ISO so that we can load the drivers during the Windows installation process. You do this by going to the <code>Hardware</code> section, adding a <code>CD/DVD Drive</code>, and choosing the ISO image.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/AddVirtIoDisk.gif" class="kg-image" alt loading="lazy" width="947" height="410" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/AddVirtIoDisk.gif 600w, https://angelsanchez.me/content/images/2022/12/AddVirtIoDisk.gif 947w" sizes="(min-width: 720px) 720px"></figure><p>You&apos;ll then want to verify that the VM will boot off of the Windows ISO attached to it. You can change the boot order by going to the <code>Options</code> tab.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/WindowsServer2022BootOrder-1.gif" class="kg-image" alt loading="lazy" width="957" height="454" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/WindowsServer2022BootOrder-1.gif 600w, https://angelsanchez.me/content/images/2022/12/WindowsServer2022BootOrder-1.gif 957w" sizes="(min-width: 720px) 720px"></figure><p>Now you are ready to start the VM. The installation process is similar to recent previous Windows installations. When choosing which OS to install, I choose the Standard Edition with Desktop Experience. The Desktop Experience will give you a GUI so you don&apos;t have to manage it via a CLI.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/image-1.png" class="kg-image" alt loading="lazy" width="898" height="674" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/image-1.png 600w, https://angelsanchez.me/content/images/2022/12/image-1.png 898w" sizes="(min-width: 720px) 720px"></figure><p>When you get to the step where you have to select a storage, you won&apos;t see any options until we load the appropriate driver. Choose <code>Load Diver</code> (Or type <code>L</code>) and then browse to the VirtIO drive &gt; <code>vioscsi</code> &gt; <code>2k22</code> &gt; <code>amd64</code> folder. Once you load that driver, you should see the drive as an option to install Windows Server 2022.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://angelsanchez.me/content/media/2022/12/AddDriverToInstall.webm" poster="https://img.spacergif.org/v1/644x483/0a/spacer.png" width="644" height="483" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://angelsanchez.me/content/images/2022/12/media-thumbnail-ember342.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container kg-video-hide"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>After the installation process is completed, you will be prompted to create a password. This password will need to be recreated after the template is created so don&apos;t worry about the complexity of it, as long as Windows accepts it as an acceptable password.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/image-2.png" class="kg-image" alt loading="lazy" width="1021" height="767" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/image-2.png 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/image-2.png 1000w, https://angelsanchez.me/content/images/2022/12/image-2.png 1021w" sizes="(min-width: 720px) 720px"></figure><p>Once you&apos;re at the login screen, send the <code>Control</code> + <code>Alt</code> + <code>Delete</code> key combo via the Proxmox interface.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/image-4.png" class="kg-image" alt loading="lazy" width="1022" height="765" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/image-4.png 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/image-4.png 1000w, https://angelsanchez.me/content/images/2022/12/image-4.png 1022w" sizes="(min-width: 720px) 720px"></figure><p>After logging in, install the VirtIO drivers by selecting the VirtIO image from Windows Explorer and run the <code>virtio-win-guest-tools.exe</code> file. If you run the <code>.msi</code> installer, you wont get all the drivers installed. Reboot the VM after the drivers are installed.</p><p>You can also choose to install updates to the VM at this time. This will save you resources as newly created machines will be up to date.</p><p>To properly convert the VM to a template, we have to run the <code>sysprep</code> utility to safely clone it so that when a machine is created from the template, it has its own unique identifiers.</p><p>To run the <code>sysprep</code> utility, I will run it as a command from the <code>Run</code> dialog screen. Enter the following command:</p><p><code>C:\Windows\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown</code></p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/image-5.png" class="kg-image" alt loading="lazy" width="1020" height="769" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/image-5.png 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/image-5.png 1000w, https://angelsanchez.me/content/images/2022/12/image-5.png 1020w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/12/image-6.png" class="kg-image" alt loading="lazy" width="1020" height="768" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/image-6.png 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/image-6.png 1000w, https://angelsanchez.me/content/images/2022/12/image-6.png 1020w" sizes="(min-width: 720px) 720px"><figcaption>NOTE: You can also run the command via Command Prompt too (and I can capture the full command in a screenshot).</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/image-7.png" class="kg-image" alt loading="lazy" width="1021" height="771" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/image-7.png 600w, https://angelsanchez.me/content/images/size/w1000/2022/12/image-7.png 1000w, https://angelsanchez.me/content/images/2022/12/image-7.png 1021w" sizes="(min-width: 720px) 720px"></figure><p>Once the VM powers off, all that is left to do is to convert it to a template under Proxmox. I like to remove the mounted ISO images from the VM before doing so. That includes the VirtIO image and the Windows Server ISO.</p><figure class="kg-card kg-video-card kg-card-hascaption"><div class="kg-video-container"><video src="https://angelsanchez.me/content/media/2022/12/RemoveImageFromVM.webm" poster="https://img.spacergif.org/v1/846x435/0a/spacer.png" width="846" height="435" playsinline preload="metadata" style="background: transparent url(&apos;https://angelsanchez.me/content/images/2022/12/media-thumbnail-ember121.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div><figcaption>Removing the VirtIO image from the VM. Do the same with the Windows Installation image.</figcaption></figure><p>Then convert it to a template and you&apos;re done!</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/12/Template.gif" class="kg-image" alt loading="lazy" width="804" height="532" srcset="https://angelsanchez.me/content/images/size/w600/2022/12/Template.gif 600w, https://angelsanchez.me/content/images/2022/12/Template.gif 804w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Accessing your self-hosted applications with an SSL certificate and .local domain name]]></title><description><![CDATA[<p>There are several benefits to running your own recursive DNS server. I recently deployed my own internal DNS server primarily to access my self-hosted applications via a URL instead of an IP address with a specified port.</p><p>Using a recursive DNS server will also provide some privacy features since instead</p>]]></description><link>https://angelsanchez.me/creating-a-custom-dns-server-with-adguardhome-alpine-linux-and-proxmox/</link><guid isPermaLink="false">63702e3986149500014431b6</guid><dc:creator><![CDATA[Angel Sanchez]]></dc:creator><pubDate>Tue, 15 Nov 2022 04:20:54 GMT</pubDate><content:encoded><![CDATA[<p>There are several benefits to running your own recursive DNS server. I recently deployed my own internal DNS server primarily to access my self-hosted applications via a URL instead of an IP address with a specified port.</p><p>Using a recursive DNS server will also provide some privacy features since instead of querying a public DNS server, the DNS server will request the IP address from the authoritative name server and cache the requests. Initial requests will take a bit longer but load times will decrease as the DNS server will cache request made. This prevents your ISP from building a profile based on your DNS requests (as you won&apos;t be using their DNS servers).</p><p>Additional benefits include lower response times for DNS queries and filtered DNS queries.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://angelsanchez.me/content/images/2022/11/image-6.png" class="kg-image" alt loading="lazy" width="836" height="661" srcset="https://angelsanchez.me/content/images/size/w600/2022/11/image-6.png 600w, https://angelsanchez.me/content/images/2022/11/image-6.png 836w" sizes="(min-width: 720px) 720px"><figcaption>Illustration of how my internal DNS server works.</figcaption></figure><p>I deployed my DNS server using my Proxmox server with an Alpine Linux LXC container, AdGuard, Unbound, and Nginx Reverse Proxy.</p><p>To begin, I deployed an LXC container based on Alpine Linux on my Proxmox server. I choose Alpine Linux because it is a lightweight distribution of Linux. Once the LXC container is deployed, I <a href="https://wiki.alpinelinux.org/wiki/Setting_up_a_new_user?ref=angelsanchez.me">added a non root user,</a> <a href="https://wiki.alpinelinux.org/wiki/Setting_up_a_SSH_server?ref=angelsanchez.me">installed OpenSSH</a> to manage the container remotely, and disabled password based authentication (I am using key-based authentication).</p><p>The next step is to install the DNS server. I choose to install a DNS forwarder that are able to block ads from specified domain names. Two popular options are Pi-Hole and AdGuard Home. I used AdGuard Home for my DNS server. You can see the setup instructions to install AdGuard Home on Alpine Linux in a post I made found <a href="https://angelsanchez.me/setting-up-adguard-home-with-alpine-linux/">here</a>.</p><p>After the initial setup of AdGuard Home was completed, I installed <a href="https://wiki.alpinelinux.org/wiki/Setting_up_unbound_DNS_server?ref=angelsanchez.me">Unbound</a> and then configured AdGuard Home with it. </p><p>Next, I added DNS rewrites to my AdGuard Home instance. You can choose any domain you would like to use here. For a local only domain name, I chose the <code>.local</code> extension. Because the <code>.local</code> extension is not a fully qualified domain name, any attempts to access it from outside my local network would not be resolved. The <code>.local</code> domain name is reserved by the IETF so that it can&apos;t be used as a top level domain<sup><a href="https://en.wikipedia.org/wiki/.local?ref=angelsanchez.me">[1]</a></sup>. More information about the <code>.local</code> domain name can be found at the IETF RFC 6762 documentation found <a href="https://datatracker.ietf.org/doc/html/rfc6762?ref=angelsanchez.me">here</a>.</p><p>Then, I added custom DNS entried on my Nginx Proxy Manger instance. I specified the IP address and port the web applications were hosted on, and choose a custom subdomain. The following screenshot shows a few of the proxied hosts added.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/11/image-13.png" class="kg-image" alt loading="lazy" width="810" height="585" srcset="https://angelsanchez.me/content/images/size/w600/2022/11/image-13.png 600w, https://angelsanchez.me/content/images/2022/11/image-13.png 810w" sizes="(min-width: 720px) 720px"></figure><p>The next step is to generate a self-signed certificate so that the traffic is encrypted. Because I am using a <code>.local</code> domain name, getting an SSL certificate from LetsEncrypt is not possible as the internal applications are not publicly accessible.</p><p>To generate a self-signed certificate, I used <code>openssl</code> on a fresh LXC container.</p><p>First, I ran the following commands to generate the key and the certificate. I ran the following commands as root.</p><pre><code>openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./nginx.key -out ./nginx.crt</code></pre><p>The &quot;Common Name&quot; is the only required information as it is a self-signed certificate. I created a wildcard certificate with the domain name <code>*.sanchez.local</code>.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/11/image-9.png" class="kg-image" alt loading="lazy" width="1022" height="470" srcset="https://angelsanchez.me/content/images/size/w600/2022/11/image-9.png 600w, https://angelsanchez.me/content/images/size/w1000/2022/11/image-9.png 1000w, https://angelsanchez.me/content/images/2022/11/image-9.png 1022w" sizes="(min-width: 720px) 720px"></figure><p>Then I needed to access these files to upload them to Nginx Proxy Manger. I setup a quick web server by running the following command.</p><pre><code>python3 -m http.server 80</code></pre><p>The web server can be reached via its IP address. I downloaded the two files and uploaded them to Nginx Proxy Manager. You need to then add the self-signed SSL certificate and certificate key.</p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/11/image-8.png" class="kg-image" alt loading="lazy" width="726" height="205" srcset="https://angelsanchez.me/content/images/size/w600/2022/11/image-8.png 600w, https://angelsanchez.me/content/images/2022/11/image-8.png 726w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/11/image-10.png" class="kg-image" alt loading="lazy" width="495" height="517"></figure><p>You will still receive an error that you have a self-signed certificate when you attempt to access self-hosted web applications via its URL. This can be removed by adding the certificate to the list of trusted certificates on the device accessing the web application. </p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/11/image-11.png" class="kg-image" alt loading="lazy" width="854" height="556" srcset="https://angelsanchez.me/content/images/size/w600/2022/11/image-11.png 600w, https://angelsanchez.me/content/images/2022/11/image-11.png 854w" sizes="(min-width: 720px) 720px"></figure><p>Once the certificate is added to the list of trusted certificates, you will no longer recive the error and you can access your self-hosted applications securely! </p><figure class="kg-card kg-image-card"><img src="https://angelsanchez.me/content/images/2022/11/image-14.png" class="kg-image" alt loading="lazy" width="785" height="687" srcset="https://angelsanchez.me/content/images/size/w600/2022/11/image-14.png 600w, https://angelsanchez.me/content/images/2022/11/image-14.png 785w" sizes="(min-width: 720px) 720px"></figure><p>Reference</p><p>[1]&#x201C;.local,&#x201D; <em>Wikipedia</em>, Jan. 30, 2021. https://en.wikipedia.org/wiki/.local</p>]]></content:encoded></item><item><title><![CDATA[Setting up AdGuard Home with Alpine Linux]]></title><description><![CDATA[<p>Deploying AdGuard Home with Alpine Linux can be done with OpenRC, as <a href="https://wiki.alpinelinux.org/wiki/OpenRC?ref=angelsanchez.me">Alpine Linux</a> uses <a href="https://wiki.gentoo.org/wiki/OpenRC?ref=angelsanchez.me" rel="nofollow">OpenRC</a> for its init system instead of systemd. The manual steps are shown below. I created a script and uploaded it to my GitHub <a href="https://github.com/angelsanchez312/adguard-alpine?ref=angelsanchez.me">repository</a> as well.</p><h2 id="manual-installation">Manual Installation</h2><ol><li>Head on over to the <a href="https://github.com/AdguardTeam/AdGuardHome/releases?ref=angelsanchez.me">r</a></li></ol>]]></description><link>https://angelsanchez.me/setting-up-adguard-home-with-alpine-linux/</link><guid isPermaLink="false">6370222d8614950001443167</guid><dc:creator><![CDATA[Angel Sanchez]]></dc:creator><pubDate>Sat, 12 Nov 2022 23:36:48 GMT</pubDate><content:encoded><![CDATA[<p>Deploying AdGuard Home with Alpine Linux can be done with OpenRC, as <a href="https://wiki.alpinelinux.org/wiki/OpenRC?ref=angelsanchez.me">Alpine Linux</a> uses <a href="https://wiki.gentoo.org/wiki/OpenRC?ref=angelsanchez.me" rel="nofollow">OpenRC</a> for its init system instead of systemd. The manual steps are shown below. I created a script and uploaded it to my GitHub <a href="https://github.com/angelsanchez312/adguard-alpine?ref=angelsanchez.me">repository</a> as well.</p><h2 id="manual-installation">Manual Installation</h2><ol><li>Head on over to the <a href="https://github.com/AdguardTeam/AdGuardHome/releases?ref=angelsanchez.me">r</a>my<a href="https://github.com/AdguardTeam/AdGuardHome/releases?ref=angelsanchez.me">eleases</a> page for the AdGuard Home over on GitHub.</li><li>Download the release for your architecture. You can find out which architecture you are on by running the command <code>uname -m</code>. I download it using <code>wget</code> to my home directory.</li><li>Extract the folder to the <code>/opt/</code> directory. You can do this by running the following command.</li></ol><pre><code class="language-Shell">doas tar -xvf AdGuardHome*.tar.gz -C /opt/</code></pre><p>4. &#xA0;Create a file &#xA0;<code>/etc/init.d/AdGuardHome</code>. Change the file permissions to 755 afterwards by running the following command.</p><p> <code>doas chmod 755 /etc/init.d/AdGuardHome</code></p><figure class="kg-card kg-code-card"><pre><code class="language-shell">#!/sbin/openrc-run

description=&quot;AdGuard Home&quot;

pidfile=&quot;/run/$RC_SVCNAME.pid&quot;
command=&quot;/opt/AdGuardHome/AdGuardHome&quot;
command_args=&quot;-s run&quot;
command_background=true

extra_commands=&quot;checkconfig&quot;

depend() {
  need net
  provide dns
  after firewall
}

checkconfig() {
  &quot;$command&quot; --check-config || return 1
}

stop() {
  if [ &quot;${RC_CMD}&quot; = &quot;restart&quot; ] ; then
    checkconfig || return 1
  fi

  ebegin &quot;Stopping $RC_SVCNAME&quot;
  start-stop-daemon --stop --exec &quot;$command&quot; \
    --pidfile &quot;$pidfile&quot; --quiet
  eend $?
}</code></pre><figcaption>Script created by https://vladislav.xyz/posts/adguard-on-alpine-linux/</figcaption></figure><p>Tip: The files in the <code>/etc/init.d/</code> directory have the same file permissions. A quick way to get the octal file permissions is by running the <code>stat</code> command. You can get the file permissions for the files by running the following command.</p><pre><code>stat -c &apos;%a&apos; /etc/init.d/*</code></pre><p>5. Enable the service by running <code>doas rc-update add AdGuardHome</code></p><p>6. Start the service by running <code>doas rc-service AdGuardHome start</code></p><p>AdGuardHome should be running now and you can configure it by accessing it via its IP address on port 3000.</p><h2 id="install-with-a-script">Install with a script</h2><p>I created a script and added it to my GitHub repository. The repository and instructions can be found <a href="https://github.com/angelsanchez312/adguard-alpine?ref=angelsanchez.me">here</a>.</p>]]></content:encoded></item><item><title><![CDATA[Backing up folders with MegaCMD and bash]]></title><description><![CDATA[<p>Automating the backup of crucial information can be done with MegaCMD.</p><p>For this demonstration, I installed MegaCMD on the server that I want to backup data from. Afterwards, I setup a Cron Job to automatically backup data to my Mega account. </p><p>First, I installed MegaCMD and logged in using the</p>]]></description><link>https://angelsanchez.me/backing-up-folders-with-megacmd-and-bash/</link><guid isPermaLink="false">63642c6586149500014430c8</guid><dc:creator><![CDATA[Angel Sanchez]]></dc:creator><pubDate>Thu, 03 Nov 2022 21:26:32 GMT</pubDate><content:encoded><![CDATA[<p>Automating the backup of crucial information can be done with MegaCMD.</p><p>For this demonstration, I installed MegaCMD on the server that I want to backup data from. Afterwards, I setup a Cron Job to automatically backup data to my Mega account. </p><p>First, I installed MegaCMD and logged in using the non-interactive command <code>mega-login</code>. I logged in so I do not need to include my credentials in the script.</p><pre><code>mega-login email@domain.com password</code></pre><p>NOTE: If you have 2 factor authentication on your account, append the <code>--auth-code=</code> to the end of <code>mega-login</code> command.</p><p>Then I choose what directory I wanted to backup to my Mega Account and added it to a script that will run at the specified time I set using a Cron Job.</p><p>The script is below. I added a <code>curl</code> command to notify me when the script was executed. &#xA0;<code>curl</code> will attempt to GET response from my n8n instance, which will then execute a workflow that will notify my Discord and Mattermost server. &#xA0;</p><ol><li>Create the script with nano, I made a directory called <code>scripts</code> to store all my scripts.</li></ol><p><code>mkdir ~/scripts &amp;&amp; cd ~/scripts</code></p><p><code>nano mega-backup.sh</code></p><figure class="kg-card kg-code-card"><pre><code>#!/bin/bash
# Select items to backup
mega-put -c /home/angel/backup2mega/ /linux_backup/
# Optional - Use curl to notify me when the script is executed
curl https://n8n.mydomain.com/webhook-uuid</code></pre><figcaption>Contents of <code>mega-backup.sh</code></figcaption></figure><p>2. Make the script executable: </p><p><code>chmod +x ~/scripts/mega-backup-script.sh</code></p><p>3. Add it to Cron and choose how often it is executed.</p><p><code>crontab -e</code></p><pre><code>0 0 * * * sh /home/angel/scripts/mega-backup.sh</code></pre><p>To know when it was executed, you can view the cron logs located at <code>var/log/cron</code></p><figure class="kg-card kg-code-card"><pre><code>sudo cat /var/log/cron | grep -e &apos;mega-backup&apos; | less</code></pre><figcaption>In this command, I am using <code>grep</code> to filter out the lines that contain mega-backup and viewing the output with <code>less</code></figcaption></figure>]]></content:encoded></item></channel></rss>