From a443e484c5f7d474986f3702edf2e96329fcf682 Mon Sep 17 00:00:00 2001
From: KristienN <knyamutsaka@outlook.com>
Date: Tue, 3 Dec 2024 00:50:03 +0000
Subject: [PATCH] fix: Flesh out deploy step

---
 .github/workflows/main-ci.yml |   9 +++++++-
 main.tf                       |  30 +++++++++++++++++++++------
 scripts/install.sh            |  38 ++++++++++++++++++++--------------
 tfplan                        | Bin 0 -> 6161 bytes
 4 files changed, 54 insertions(+), 23 deletions(-)
 create mode 100644 tfplan

diff --git a/.github/workflows/main-ci.yml b/.github/workflows/main-ci.yml
index 7ce1a71..a84a4f8 100644
--- a/.github/workflows/main-ci.yml
+++ b/.github/workflows/main-ci.yml
@@ -11,6 +11,13 @@ jobs:
     steps:
       - uses: actions/checkout@v4
 
+      - name: "CONFIGURE SSH Key"
+        env:
+          PRIVATE_KEY: ${{ secrets.TF_SSH_PRIVATE_KEY }}
+        run: |
+          echo "$PRIVATE_KEY" > ~/.ssh/id_rsa
+          chmod 600 ~/.ssh/id_rsa
+
       - name: "Set up Terraform"
         uses: hashicorp/setup-terraform@v3
         with:
@@ -20,7 +27,7 @@ jobs:
         run: |
           terraform init
           terraform plan -var digitalocean_access_token=$DIGITALOCEAN_ACCESS_TOKEN -out=tfplan
-          terraform apply -var digitalocean_access_token=$DIGITALOCEAN_ACCESS_TOKEN -auto-approve tfplan
+          terraform apply tfplan -var digitalocean_access_token=$DIGITALOCEAN_ACCESS_TOKEN -auto-approve
         env:
           DIGITALOCEAN_ACCESS_TOKEN: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
       - name: "Post-deployment testing"
diff --git a/main.tf b/main.tf
index 1385ac2..0a855a4 100644
--- a/main.tf
+++ b/main.tf
@@ -13,11 +13,6 @@ provider "digitalocean" {
   token = var.digitalocean_access_token
 }
 
-resource "digitalocean_ssh_key" "portfolio-v2-server" {
-  name = "digitalocean_ssh_key"
-  public_key = file("~/.ssh/id_rsa.pub")
-}
-
 resource "digitalocean_droplet" "portfolio-v2-server" {
   image  = "ubuntu-24-10-x64"
   name   = var.droplet_name
@@ -26,6 +21,18 @@ resource "digitalocean_droplet" "portfolio-v2-server" {
   ssh_keys = [var.ssh_fingerprint]
   tags = ["portfolio-v2", "server"]
 
+  provisioner "file" {
+    source      = "./scripts/install.sh"
+    destination = "/tmp/install.sh"
+
+    connection {
+      type = "ssh"
+      user = "root"
+      private_key = file("~/.ssh/id_rsa")
+      host = self.ipv4_address
+    }
+  }
+
   provisioner "remote-exec" {
     connection {
       type = "ssh"
@@ -34,7 +41,10 @@ resource "digitalocean_droplet" "portfolio-v2-server" {
       host = self.ipv4_address
     }
 
-    script = "./scripts/install.sh"
+    inline = [
+      "chmod +x /tmp/install.sh",
+      "/tmp/install.sh ${var.digitalocean_access_token}"
+    ]
   }
 }
 
@@ -71,4 +81,12 @@ resource "digitalocean_firewall" "portfolio-v2-server" {
     protocol = "icmp"
     destination_addresses = ["0.0.0.0/0", "::/0"]
   }
+}
+
+resource "digitalocean_record" "portfolio-v2-server" {
+  name   = "www"
+  value  = digitalocean_droplet.portfolio-v2-server.ipv4_address
+  domain = "kristiennyamutsaka.com"
+  type   = "A"
+  ttl    = "1800"
 }
\ No newline at end of file
diff --git a/scripts/install.sh b/scripts/install.sh
index 550e2b8..156e520 100644
--- a/scripts/install.sh
+++ b/scripts/install.sh
@@ -1,21 +1,27 @@
-#!/usr/bin/env bash
+#!/bin/sh
 
-# Add Docker's official GPG key:
-sudo apt-get update -y
-sudo apt-get install ca-certificates curl
-sudo install -m 0755 -d /etc/apt/keyrings
-sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
-sudo chmod a+r /etc/apt/keyrings/docker.asc
+DOCTL_ACCESS_TOKEN=$1
 
-# Add the repository to Apt sources:
-echo \
-  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
-  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
-  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-sudo apt-get update
+if [ -z "$DOCTL_ACCESS_TOKEN" ]; then
+  echo "Error: DOCTL_ACCESS_TOKEN is not set"
+  exit 1
+fi
 
-# Install latest version
-sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
+echo "Updating package list and installing dependencies..."
+sudo apt-get update -y || { echo "Failed to update package list"; exit 1; }
+sudo apt install apt-transport-https ca-certificates curl -y
+curl -fsSL https://get.docker.com -o get-docker.sh
+sudo sh get-docker.sh
 
-sudo docker --version
 
+sudo snap install doctl
+sudo snap connect doctl:dot-docker
+sudo mkdir /root/.config
+
+echo "Logging into Digital Ocean Services"
+sudo doctl auth init --access-token $DOCTL_ACCESS_TOKEN
+sudo doctl registry login
+
+echo "Pulling latest image"
+sudo docker pull registry.digitalocean.com/kristien-docr/portfolio-v2:local || { echo "Failed to pull image"; exit 1; }
+sudo docker run --name portfolio-v2 -d -p 80:80 registry.digitalocean.com/kristien-docr/portfolio-v2:local
\ No newline at end of file
diff --git a/tfplan b/tfplan
new file mode 100644
index 0000000000000000000000000000000000000000..3acab46a96e39a4a616fae0a37886aaef53ef81d
GIT binary patch
literal 6161
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
E0mq)dh5!Hn

literal 0
HcmV?d00001