<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>docker &#8211; weewee blog</title>
	<atom:link href="https://blog.weew.ee/tag/docker/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.weew.ee</link>
	<description></description>
	<lastBuildDate>Fri, 07 Feb 2025 21:54:54 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>
	<item>
		<title>Ethereum Solo-Staking on Proxmox</title>
		<link>https://blog.weew.ee/2025/02/07/ethereum-solo-staking-on-proxmox/</link>
					<comments>https://blog.weew.ee/2025/02/07/ethereum-solo-staking-on-proxmox/#respond</comments>
		
		<dc:creator><![CDATA[j]]></dc:creator>
		<pubDate>Fri, 07 Feb 2025 21:52:05 +0000</pubDate>
				<category><![CDATA[Tech Tutorials]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[Ethereum]]></category>
		<category><![CDATA[Proxmox]]></category>
		<guid isPermaLink="false">https://blog.weew.ee/?p=28</guid>

					<description><![CDATA[Setting up an Ethereum node requires careful consideration of system resources and containerization strategies, and requires a little more configuration than normal when trying to set up on a Proxmox server. In this guide, we&#8217;ll walk through the process of running eth-docker within a LXC on Proxmox. This is not for the faint of heart. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Setting up an Ethereum node requires careful consideration of system resources and containerization strategies, and requires a little more configuration than normal when trying to set up on a Proxmox server. In this guide, we&#8217;ll walk through the process of running eth-docker within a LXC on Proxmox.</p>



<p><strong>This is not for the faint of heart</strong>. We assume you have Docker experience, especially since we are making somewhat major modifications to <code>eth-docker</code>.</p>



<h2 class="wp-block-heading">High-level Overview of Architecture</h2>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="848" height="218" src="https://blog.weew.ee/wp-content/uploads/2025/02/Screenshot-2025-02-07-at-1.40.47 PM-1.png" alt="" class="wp-image-40" srcset="https://blog.weew.ee/wp-content/uploads/2025/02/Screenshot-2025-02-07-at-1.40.47 PM-1.png 848w, https://blog.weew.ee/wp-content/uploads/2025/02/Screenshot-2025-02-07-at-1.40.47 PM-1-300x77.png 300w, https://blog.weew.ee/wp-content/uploads/2025/02/Screenshot-2025-02-07-at-1.40.47 PM-1-768x197.png 768w" sizes="(max-width: 848px) 100vw, 848px" /><figcaption class="wp-element-caption">this method has been blessed by <a href="https://www.reddit.com/user/yorickdowne">/u/yorickdowne</a>, Staking Educator of <a href="https://www.reddit.com/r/ethstaker/">/r/ethstakers</a></figcaption></figure>



<p>Before diving into the setup, let&#8217;s go over the game plan. Note the &#8220;nesting&#8221;</p>



<ol class="wp-block-list">
<li>Proxmox as the hypervisor running on bare-metal 
<ul class="wp-block-list">
<li>LXC running within Proxmox
<ul class="wp-block-list">
<li>Docker containers managed by eth-docker running inside the LXC</li>
</ul>
</li>
</ul>
</li>
</ol>



<p>leading to&#8230;</p>



<h2 class="wp-block-heading">Hardware Prerequisites</h2>



<ul class="wp-block-list">
<li>Quad Core CPU</li>



<li>4TB&nbsp;<a href="https://gist.github.com/yorickdowne/f3a3e79a573bf35767cd002cc977b038">&#8220;mainstream&#8221; SSD</a>&nbsp;&#8211; TLC and DRAM, formatted in ext4</li>



<li>32 GiB of RAM &#8211; 16 GiB works but can be challenging depending on client mix</li>
</ul>



<p>As noted on the eth-docker documentation, you might be able to get away with smaller SSD and less RAM. However, you&#8217;re about to stake 32 Eth which at today&#8217;s market value is almost $90K USD. You&#8217;re not hurting for  the $300 to get an enterprise grade 4TB SSD (at least that&#8217;s what I told myself to justify the purchase). </p>



<h2 class="wp-block-heading">Configuring the LXC Container</h2>



<p>When setting up an LXC from Proxmox, my go-to is the Proxmox VE Helper-Scripts (I may be slightly biased as I am part of the  Proxmox Helper Scripts&nbsp;org). From your host shell, grab the Docker LXC</p>



<pre class="wp-block-code"><code>bash -c "$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/ct/docker.sh)"</code></pre>



<p><strong>When setting up, make sure to give the LXC 4 cores and 32GB RAM!</strong> </p>



<p>Let&#8217;s make sure the SSD is mounted to the LXC. Navigate to <code>/etc/pve/lxc</code> on the host machine and <code>vi &lt;lxc&gt;.conf</code></p>



<pre class="wp-block-code"><code>...
hostname: eth-docker
memory: 32768
mp0: /mnt/ethchain,mp=/mnt/ethchain
...</code></pre>



<p>Now we&#8217;ve set up the LXC, let&#8217;s go to the LXC shell and start setting things up from there</p>



<h2 class="wp-block-heading">Setting up eth-docker</h2>



<p>From here, you can follow the <a href="https://ethdocker.com/Usage/QuickStart" data-type="link" data-id="https://ethdocker.com/Usage/QuickStart">eth-docker quickstart</a>: </p>



<pre class="wp-block-code"><code>cd ~ &amp;&amp; git clone https://github.com/eth-educators/eth-docker.git &amp;&amp; cd eth-docker

# Install pre-requisites such as Docker

./ethd install

# Configure Eth Docker - have an Ethereum address handy where you want Execution Layer rewards to go

./ethd config</code></pre>



<p>For config, you can start with the testnet, and select Ethereum node. I chose to use Prysm consensus client and Geth execution client. For testing, MEV boost does not matter, but when reconfiguring for mainnet, you should opt for it. </p>



<p>After configuring, don&#8217;t run<code>./ethd up</code> just yet. This next step is the secret sauce for utilizing our SSD.</p>



<h2 class="wp-block-heading">Volume Override to SSD</h2>



<p>We want to create an override .yaml file that maps the volume from our host machine to the SSD.</p>



<p><code>my-volumes.override.yml:</code></p>



<pre class="wp-block-code"><code>services:
  ######################################################
  # Geth (execution)
######################################################

  execution:
    volumes:
      # Geth chain data (instead of named volumes geth-el-data / geth-eth1-data):
      - "${GETH_ETH1DATA_PATH}:/var/lib/goethereum"
      - "${GETH_DATA_PATH}:/var/lib/geth"

      # The JWT secret is usually shared with the consensus client for Engine API authentication.
      # Keep referencing a Docker volume if you like, or use a direct host path:
      - "jwtsecret:/var/lib/geth/ee-secret"

      # Localtime (optional)
      - "/etc/localtime:/etc/localtime:ro"

  ######################################################
  # Prysm: beacon (consensus) client ######################################################

  consensus:
    volumes:
      # By default, prysm.yml uses prysmbeacon-data -&gt; /var/lib/prysm-og
      # and prysmconsensus-data -&gt; /var/lib/prysm
      - "${PRYSM_BEACON_PATH}:/var/lib/prysm-og"
      - "${PRYSM_CONSENSUS_PATH}:/var/lib/prysm"

      # The beacon client needs the JWT secret to talk to Geth:
      - "jwtsecret:/var/lib/prysm/ee-secret"

      - "/etc/localtime:/etc/localtime:ro"

  ######################################################
  # Prysm: validator client
######################################################

  validator:
    volumes:
      # The validator’s data: typically prysmvalidator-data -&gt; /var/lib/prysm
      - "${PRYSM_VALIDATOR_PATH}:/var/lib/prysm"

      # Usually the validator does NOT need the JWT secret. 
      # If you have a specialized setup (e.g., external builder), you might do it differently.
      # - "jwtsecret:/var/lib/prysm/ee-secret"

      - "/etc/localtime:/etc/localtime:ro"</code></pre>



<p>Save this file, and now go to your .env and modify the <code>COMPOSE_FILE</code> line in your <code>.env</code></p>



<pre class="wp-block-code"><code># The settings for eth-docker are in .env, use "nano .env". Don't edit default.env itself.
# Client choice: See https://eth-docker.net/Usage/Advanced for available options
<strong>COMPOSE_FILE=prysm.yml:geth.yml:grafana.yml:grafana-shared.yml:mev-boost.yml:my-volumes.override.yml:deposit-cli.yml:prysm-web-shared.yml
</strong>...</code></pre>



<p>We also want to add the override paths to our <code>.env</code>. I suggest you add them to the end of the <code>.env</code> file</p>



<pre class="wp-block-code"><code># Prysm volumes
PRYSM_BEACON_PATH=/mnt/ethchain/prysm/beacon
PRYSM_CONSENSUS_PATH=/mnt/ethchain/prysm/consensus
PRYSM_VALIDATOR_PATH=/mnt/ethchain/prysm/validator

# Geth volumes
GETH_DATA_PATH=/mnt/ethchain/geth/data
GETH_ETH1DATA_PATH=/mnt/ethchain/geth/eth1data</code></pre>



<p>Now, we can finally start the stack</p>



<pre class="wp-block-code"><code>./ethd up</code></pre>



<h2 class="wp-block-heading">Importing Validator Keys</h2>



<p>At this point, our node is up and the consensus and execution layer should be syncing. With a good internet connection, expect this to take several hours to an entire day, so don&#8217;t fret if it seems to be syncing forever. </p>



<p>From here, follow the <a href="https://ethdocker.com/Usage/ImportKeys">Eth Docker Docs for key creation</a>. </p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="500" height="500" src="https://blog.weew.ee/wp-content/uploads/2025/02/image.png" alt="" class="wp-image-32" srcset="https://blog.weew.ee/wp-content/uploads/2025/02/image.png 500w, https://blog.weew.ee/wp-content/uploads/2025/02/image-300x300.png 300w, https://blog.weew.ee/wp-content/uploads/2025/02/image-150x150.png 150w" sizes="(max-width: 500px) 100vw, 500px" /></figure>



<p>I did personally run into an issue with using the keymanager API. As noted by the docs:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>If you use the&nbsp;<a href="https://ethdocker.com/Usage/PrysmWeb">Prysm Web</a>, you can use it or this command-line process to import keys.</p>
</blockquote>



<p>As seen in the <code>.env</code>, we have enabled Prysm Web so we can bypass the keymanager API. This is where you want to import the <code>keystore-xxxxxxxx.json</code> that was generated when you create the keys. </p>



<h2 class="wp-block-heading">Deposit at launchpad</h2>



<p>I think this part deserves its own section. It&#8217;s honestly pretty nerve-wracking to send 32 Eth and the <a href="https://launchpad.ethereum.org/">Mainnet launchpad </a>honestly sucks, but following the steps does get you there. I refreshed the page after depositing and it put me back to the start of the launchpad, which was not ideal. At any rate, after depositing, you can check the status of your deposit on the Prysm Web UI</p>



<figure class="wp-block-image size-full"><img decoding="async" width="870" height="589" src="https://blog.weew.ee/wp-content/uploads/2025/02/Screenshot-2025-02-07-at-1.35.58 PM.png" alt="" class="wp-image-33" srcset="https://blog.weew.ee/wp-content/uploads/2025/02/Screenshot-2025-02-07-at-1.35.58 PM.png 870w, https://blog.weew.ee/wp-content/uploads/2025/02/Screenshot-2025-02-07-at-1.35.58 PM-300x203.png 300w, https://blog.weew.ee/wp-content/uploads/2025/02/Screenshot-2025-02-07-at-1.35.58 PM-768x520.png 768w" sizes="(max-width: 870px) 100vw, 870px" /></figure>



<p>Once it makes it past the Consensus Layer, pop the champagne as you just set up a validator node! <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f37e.png" alt="🍾" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">After-party and Security Notes</h2>



<p>Remember to:</p>



<ul class="wp-block-list">
<li>Keep your system updated regularly</li>



<li>Use strong passwords for all services</li>



<li>Consider implementing additional firewall rules, as you should have completed in the <a href="https://launchpad.ethereum.org/en/checklist">Validator Checklist</a></li>



<li>Regularly backup your validator keys and wallet information</li>
</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Running eth-docker in a Proxmox LXC container provides a flexible and maintainable environment for your Ethereum node. This setup offers good isolation while maintaining performance and allowing for easy backups and migrations.</p>



<p>As recommended by the Mainnet Launchpad checklists, join the Discord communities for your consensus and execution clients, and check the <a href="https://github.com/eth-educators/eth-docker">eth-docker GitHub repository</a> for updates and best practices. </p>



<p>Thanks for reading!</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.weew.ee/2025/02/07/ethereum-solo-staking-on-proxmox/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Self-Hosting WordPress, Pt. 1</title>
		<link>https://blog.weew.ee/2025/01/28/self-hosting-wordpress-pt-1/</link>
					<comments>https://blog.weew.ee/2025/01/28/self-hosting-wordpress-pt-1/#respond</comments>
		
		<dc:creator><![CDATA[j]]></dc:creator>
		<pubDate>Tue, 28 Jan 2025 07:36:22 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[homelab]]></category>
		<guid isPermaLink="false">https://blog.weew.ee/?p=23</guid>

					<description><![CDATA[For a while, my other blog (https://gunkata.blog) was hosted on EasyWP. There&#8217;s nothing inherently wrong with EasyWP, it is in fact the quickest way to get something hosted on WordPress and not worry about servers, databases, or anything at all. However, EasyWP monthly does cost $6.88, and if you don&#8217;t switch to a yearly plan, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://blog.weew.ee/wp-content/uploads/2025/01/DALL·E-2025-01-27-23.17.23-A-whimsical-illustration-of-a-guinea-pig-interacting-with-WordPress-featuring-a-cute-guinea-pig-sitting-at-a-computer-desk-working-on-a-large-monito.webp" alt="" class="wp-image-24" srcset="https://blog.weew.ee/wp-content/uploads/2025/01/DALL·E-2025-01-27-23.17.23-A-whimsical-illustration-of-a-guinea-pig-interacting-with-WordPress-featuring-a-cute-guinea-pig-sitting-at-a-computer-desk-working-on-a-large-monito.webp 1024w, https://blog.weew.ee/wp-content/uploads/2025/01/DALL·E-2025-01-27-23.17.23-A-whimsical-illustration-of-a-guinea-pig-interacting-with-WordPress-featuring-a-cute-guinea-pig-sitting-at-a-computer-desk-working-on-a-large-monito-300x300.webp 300w, https://blog.weew.ee/wp-content/uploads/2025/01/DALL·E-2025-01-27-23.17.23-A-whimsical-illustration-of-a-guinea-pig-interacting-with-WordPress-featuring-a-cute-guinea-pig-sitting-at-a-computer-desk-working-on-a-large-monito-150x150.webp 150w, https://blog.weew.ee/wp-content/uploads/2025/01/DALL·E-2025-01-27-23.17.23-A-whimsical-illustration-of-a-guinea-pig-interacting-with-WordPress-featuring-a-cute-guinea-pig-sitting-at-a-computer-desk-working-on-a-large-monito-768x768.webp 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>For a while, my other blog (<a href="https://gunkata.blog">https://gunkata.blog</a>) was hosted on EasyWP. There&#8217;s nothing inherently wrong with EasyWP, it is in fact the quickest way to get something hosted on WordPress and not worry about servers, databases, or anything at all. However, EasyWP monthly does cost $6.88, and if you don&#8217;t switch to a yearly plan, that is over $80 a year. Since then, I&#8217;ve switched it over to host it myself on my server. In this quick writeup, I&#8217;ll show how you can get WordPress up and running on your local machine and be well on your way to self-host WordPress and save yourself $80 a year. </p>



<p>Given the nature of self-hosting, we assume you have a server that is up and running 24/7. WordPress is lightweight so any computer that could run Linux would do. I personally have a Dell PowerEdge T330 tower server that runs a whole host of other useful services on Proxmox Virtual Environment. </p>



<p>Let&#8217;s start by assuming you have a computer that runs Ubuntu Linux already, and let&#8217;s install Docker and <code>docker-compose</code>. </p>



<pre class="wp-block-code"><code># Update package index
sudo apt update

# Install prerequisites
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# Add Docker's GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Add Docker's official repository
echo "deb &#91;arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker and Docker Compose
sudo apt update &amp;&amp; sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Start Docker and enable it to run on boot
sudo systemctl start docker
sudo systemctl enable docker

# Add current user to Docker group (optional but recommended)
if ! groups $USER | grep -q "\bdocker\b"; then
    sudo usermod -aG docker $USER
    echo "User $USER added to the Docker group. Please log out and log back in to use Docker without sudo."
fi</code></pre>



<p>That was a flurry of commands but hopefully you&#8217;re still with me. Now, we want to set up a <code>docker-compose.yml</code> that creates our WordPress container and a MySQL container. We&#8217;re going to go with the LAMP stack, which is <strong>L</strong>inux, <strong>A</strong>pache, <strong>M</strong>ySQL, and <strong>P</strong>HP. The <code>docker-compose.yml</code> file can be created and placed anywhere you&#8217;d like.</p>



<p>example <code>docker-compose.yml</code>:</p>



<pre class="wp-block-code"><code>version: '3.7'

services:
  wordpress:
    image: wordpress
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpresspass
      WORDPRESS_DB_NAME: wordpress
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: strongpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpresspass
</code></pre>



<p>Now we&#8217;ve made the <code>docker-compose.yml</code>, we can fire up the containers!</p>



<pre class="wp-block-code"><code>docker-compose up -d</code></pre>



<p>Now that the containers are up and running, we want to connect to that WordPress website. As we had configured on our <code>docker-compose.yml</code>, WordPress runs on port 8080. Let&#8217;s run <code>ip -a</code> to see what the specific IP are running on to access WordPress.</p>



<pre class="wp-block-code"><code>root@hostname:~# ip a
1: lo: &lt;LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: eth0@if32: &lt;BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet <strong>192.168.1.12/24</strong> brd 192.168.x.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 xxxx:xxxx:xxxx:xxxx::xxxx/64 scope global dynamic mngtmpaddr 
       valid_lft 1780sec preferred_lft 1780sec
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever</code></pre>



<p>As noted in bold, that is our local IP. So if we go to the browser, we want to access <code>192.168.1.12:8080</code> and we would be able to finish setting up WordPress. </p>



<p>And that pretty much wraps up part 1! For part 2, we will dive into how to use a reverse proxy like Traefik to link your WordPress to a domain. Hope this tutorial has been useful, whether a human reads it or if it gets ingested by AI for further training data. </p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.weew.ee/2025/01/28/self-hosting-wordpress-pt-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
