{"id":1022,"date":"2025-08-06T17:14:54","date_gmt":"2025-08-06T17:14:54","guid":{"rendered":"https:\/\/yairmartinezcybersecurityportfolio.com\/?p=1022"},"modified":"2025-12-26T22:42:02","modified_gmt":"2025-12-26T22:42:02","slug":"setting-up-my-wordpress-job-portfolio-site-on-digitalocean","status":"publish","type":"post","link":"https:\/\/yairmartinezcybersecurityportfolio.com\/?p=1022","title":{"rendered":"Setting Up My WordPress Job Portfolio Site"},"content":{"rendered":"\n<p>This blog post walks through how I set up my WordPress job portfolio site using a cloud server, a custom domain, and a bit of trial and error. I\u2019m still early in my learning journey, so this project was mostly about <strong>getting hands-on experience<\/strong> with hosting, SSH, domains, and a basic WordPress setup.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Starting with DigitalOcean<\/h2>\n\n\n\n<p>I started by creating a free account on <a>DigitalOcean<\/a> and launched a <strong>Droplet<\/strong> (their term for a virtual server). I used the <strong>WordPress on Ubuntu<\/strong> image to keep things simple.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Chose the lowest-cost option ($6\/month)<\/li>\n\n\n\n<li>Basic shared CPU, SSD storage<\/li>\n\n\n\n<li>Used <strong>SSH-only login<\/strong> for better security<\/li>\n<\/ul>\n\n\n\n<p>This was my second time working with SSH keys, so it took some extra reading and troubleshooting, from memory i believe the process of connecting my local machine to a local virtual machine was different.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1004\" height=\"120\" src=\"https:\/\/yairmartinezcybersecurityportfolio.com\/wp-content\/uploads\/2025\/08\/Screenshot-from-2025-08-06-12-27-31-1.png\" alt=\"\" class=\"wp-image-1027\" srcset=\"https:\/\/yairmartinezcybersecurityportfolio.com\/wp-content\/uploads\/2025\/08\/Screenshot-from-2025-08-06-12-27-31-1.png 1004w, https:\/\/yairmartinezcybersecurityportfolio.com\/wp-content\/uploads\/2025\/08\/Screenshot-from-2025-08-06-12-27-31-1-300x36.png 300w, https:\/\/yairmartinezcybersecurityportfolio.com\/wp-content\/uploads\/2025\/08\/Screenshot-from-2025-08-06-12-27-31-1-768x92.png 768w\" sizes=\"auto, (max-width: 1004px) 100vw, 1004px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Dealing with SSH Key Errors<\/h2>\n\n\n\n<p>I set up an SSH key pair on my local machine, but at first, I couldn\u2019t connect to the server. I ran into this error:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>sign_and_send_pubkey: signing failed for ED25519 \"yair@Ubuntu\" from agent<br>Permission denied (publickey).<br><\/code><\/pre>\n\n\n\n<p>After some searching, I figured out the fix was to start the SSH agent and manually add my key:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>eval \"$(ssh-agent -s)\"<br>ssh-add ~\/.ssh\/id_ed25519_digitalocean<br><\/code><\/pre>\n\n\n\n<p>Once I did that, I was able to connect using:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>ssh root@206.189.194.182<br><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Connecting My Domain<\/h2>\n\n\n\n<p>To make the site easier to access (and more professional), I bought a domain from <a class=\"\" href=\"https:\/\/www.namecheap.com\">Namecheap.com<\/a>:<\/p>\n\n\n\n<p><strong><code>yairmartinezcybersecurityportfolio.com<\/code><\/strong><\/p>\n\n\n\n<p>I chose <code>.com<\/code> over <code>.online<\/code> because it felt a bit more trustworthy. I then added these DNS records to point the domain to my server\u2019s IP:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"984\" height=\"188\" src=\"https:\/\/yairmartinezcybersecurityportfolio.com\/wp-content\/uploads\/2025\/08\/Screenshot-from-2025-08-06-12-27-09-1.png\" alt=\"\" class=\"wp-image-1024\" srcset=\"https:\/\/yairmartinezcybersecurityportfolio.com\/wp-content\/uploads\/2025\/08\/Screenshot-from-2025-08-06-12-27-09-1.png 984w, https:\/\/yairmartinezcybersecurityportfolio.com\/wp-content\/uploads\/2025\/08\/Screenshot-from-2025-08-06-12-27-09-1-300x57.png 300w, https:\/\/yairmartinezcybersecurityportfolio.com\/wp-content\/uploads\/2025\/08\/Screenshot-from-2025-08-06-12-27-09-1-768x147.png 768w\" sizes=\"auto, (max-width: 984px) 100vw, 984px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Basic Server Configuration<\/h2>\n\n\n\n<p>When I first logged into the server, a script automatically guided me through the WordPress setup. It asked for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>My domain name<\/li>\n\n\n\n<li>Email<\/li>\n\n\n\n<li>WordPress username &amp; password<\/li>\n<\/ul>\n\n\n\n<p>It also installed <strong>Let\u2019s Encrypt (Certbot)<\/strong> for SSL for encryption in my site, which was helpful now the site is available at <code>https:\/\/yairmartinezcybersecurityportfolio.com<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">A Bit of Extra Security<\/h2>\n\n\n\n<p>I installed two plugins to help make the site more secure:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>WP fail2ban<\/strong> \u2013 logs login attempts to help prevent brute force attacks<\/li>\n\n\n\n<li><strong>WP fail2ban Blocklist<\/strong> \u2013 blocks known malicious IPs<\/li>\n<\/ul>\n\n\n\n<p>These were simple to install and required very little setup.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Building the Site Itself<\/h2>\n\n\n\n<p>Once WordPress was running, I picked a clean theme and installed a few helpful plugins:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/yairmartinezcybersecurityportfolio.com\/wp-content\/uploads\/2025\/08\/Screenshot-from-2025-08-06-12-31-16-1024x420.png\" alt=\"\" class=\"wp-image-1026\"\/><\/figure>\n\n\n\n<p>I then used WordPress\u2019s block editor to add basic sections and display my work.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What I Got Out of This<\/h2>\n\n\n\n<p>This was my first time setting up a personal website from scratch using a cloud provider and custom domain. Some of the key things I learned and did:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>How to create and troubleshoot SSH key access<\/li>\n\n\n\n<li>Basic DNS setup (A records and CNAME)<\/li>\n\n\n\n<li>How SSL certificates work with Let\u2019s Encrypt<\/li>\n\n\n\n<li>How to configure and manage WordPress plugins<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Final Thoughts<\/h2>\n\n\n\n<p>This wasn\u2019t a super advanced or flashy project, but it helped me learn by doing it. I wanted to get a basic WordPress site online, secure it, and connect it to a custom domain to have my portfolio up and available to others and I did.<\/p>\n\n\n\n<p>There\u2019s still a ton I want to learn, but this gave me a small taste of how hosting and web infrastructure actually works in practice.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This blog post walks through how I set up my WordPress job portfolio site using a cloud server, a custom domain, and a bit of trial and error. I\u2019m still early in my learning journey, so this project was mostly about getting hands-on experience with hosting, SSH, domains, and a basic WordPress setup. Starting with [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1273,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[39,1],"tags":[26,55],"class_list":["post-1022","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-miscellaneous","category-projects","tag-tech","tag-web-deployment"],"_links":{"self":[{"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=\/wp\/v2\/posts\/1022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1022"}],"version-history":[{"count":4,"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=\/wp\/v2\/posts\/1022\/revisions"}],"predecessor-version":[{"id":1328,"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=\/wp\/v2\/posts\/1022\/revisions\/1328"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=\/wp\/v2\/media\/1273"}],"wp:attachment":[{"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yairmartinezcybersecurityportfolio.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}