From f1468986c9a6dc15692a7be07cdf565120a6e0a1 Mon Sep 17 00:00:00 2001
From: Nathan Rodet <nrodet@grandlyon.com>
Date: Fri, 13 Jan 2023 09:51:22 +0100
Subject: [PATCH] Added scripts configuration

---
 README.md                                     | 65 +++++++++++++++++--
 instance-scripts/cloud-init.yml               |  3 +
 .../{confs => config-files}/atrium.yaml       |  0
 .../{confs => config-files}/config.yaml       |  0
 instance-scripts/scripts/atrium.sh            | 23 +++++++
 instance-scripts/scripts/code-server.sh       | 20 ++++++
 instance-scripts/scripts/docker.sh            |  8 +++
 instance-scripts/scripts/repository.sh        |  7 ++
 instance-scripts/scripts/rust.sh              |  8 +++
 instance-scripts/scripts/webtop.sh            | 21 ++++++
 10 files changed, 151 insertions(+), 4 deletions(-)
 rename instance-scripts/{confs => config-files}/atrium.yaml (100%)
 rename instance-scripts/{confs => config-files}/config.yaml (100%)
 create mode 100644 instance-scripts/scripts/atrium.sh
 create mode 100644 instance-scripts/scripts/code-server.sh
 create mode 100644 instance-scripts/scripts/docker.sh
 create mode 100644 instance-scripts/scripts/repository.sh
 create mode 100644 instance-scripts/scripts/rust.sh
 create mode 100644 instance-scripts/scripts/webtop.sh

diff --git a/README.md b/README.md
index 8a7f22a..508de55 100644
--- a/README.md
+++ b/README.md
@@ -35,6 +35,63 @@ User :
 - Username: abc
 - Password: <Gitlab Stored>
 
+## Cloud-init
+
+### Create file
+
+In this example, you will find how to create a file to a defined path with cloud-init.
+Content inside `%` are meant to be replaced with sed command to be able to use environment variable or user-data.
+
+**cloud-init :**
+```yaml
+write_files:
+  - content: |
+      hostname: %atrium_hostname%.daag.alpha.grandlyon.com
+      debug_mode: false
+      letsencrypt_email: %atrium_letsencrypt_email%
+      tls_mode: Auto
+      apps: # optional : applications served by atrium
+        - id: 1
+          name: Code %atrium_count_index%
+          icon: web_asset
+          color: 4292030255
+          is_proxy: true
+          host: code-%atrium_count_index%
+          target: localhost:8080
+        - id: 2
+          name: Desktop %atrium_count_index%
+          icon: web_asset
+          color: 4292030255
+          is_proxy: true
+          host: desktop-%atrium_count_index%
+          target: localhost:8081
+    path: /root/atrium.yaml
+```
+
+**bash command to replaced `%` content :**
+```bash
+sed -i "s/%atrium_hostname%/$(scw-userdata atrium_hostname)/g" /root/atrium.yaml
+sed -i "s/%atrium_letsencrypt_email%/$(scw-userdata atrium_letsencrypt_email)/g" /root/atrium.yaml
+sed -i "s/%atrium_count_index%/$(scw-userdata atrium_count_index)/g" /root/atrium.yaml
+```
+
+## Use Gitlab variables in instances
+
+### Example
+
+From my instances, I should be able to access the variables as user-data using the command `scw-userdata <my-variable>` after declaring them in Terraform.
+**Some documentation : https://blog.scaleway.com/introducing-scaleway-cloud-init-support/**
+
+```HCL
+user_data = {
+    atrium_count_index = count.index
+    atrium_hostname = scaleway_domain_record.subdomain_record[count.index].name
+    atrium_letsencrypt_email = var.LETSENCRYPT_EMAIL
+    user_password = var.USER_PASSWORD
+    cloud-init = file("../instance-scripts/cloud-init.yml") // this is not a variable, but the declaration of cloud-init file.
+}
+```
+
 ## Setup Terraform Locally
 
 First, you must setup 2 local files for your variables :
@@ -74,7 +131,7 @@ SCW_PROJECT_ID         = ""
 SCW_ACCESS_KEY         = ""
 SCW_SECRET_KEY         = ""
 INSTANCES_COUNT        = "2"
-ENVIRONMENT            = "devrust"
+ENVIRONMENT            = ""
 ```
 
 ### Terraform init - Gitlab remote tfstate
@@ -85,9 +142,9 @@ Command should look like :
 ```bash
 export GITLAB_ACCESS_TOKEN=<YOUR-ACCESS-TOKEN>
 terraform init \
-    -backend-config="address=https://forge.grandlyon.com/api/v4/projects/875/terraform/state/devrust" \
-    -backend-config="lock_address=https://forge.grandlyon.com/api/v4/projects/875/terraform/state/devrust/lock" \
-    -backend-config="unlock_address=https://forge.grandlyon.com/api/v4/projects/875/terraform/state/devrust/lock" \
+    -backend-config="address=https://forge.grandlyon.com/api/v4/projects/<project-id>/terraform/state/<tfstate-name>" \
+    -backend-config="lock_address=https://forge.grandlyon.com/api/v4/projects/<project-id>/terraform/state/<tfstate-name>/lock" \
+    -backend-config="unlock_address=https://forge.grandlyon.com/api/v4/projects/<project-id>/terraform/state/<tfstate-name>/lock" \
     -backend-config="username=xxxxxxx" \
     -backend-config="password=$GITLAB_ACCESS_TOKEN" \
     -backend-config="lock_method=POST" \
diff --git a/instance-scripts/cloud-init.yml b/instance-scripts/cloud-init.yml
index 3bfb36f..2d44f44 100644
--- a/instance-scripts/cloud-init.yml
+++ b/instance-scripts/cloud-init.yml
@@ -9,6 +9,9 @@ packages:
   - curl
   - git
 
+
+
+
 write_files:
 #
 # Atrium config file
diff --git a/instance-scripts/confs/atrium.yaml b/instance-scripts/config-files/atrium.yaml
similarity index 100%
rename from instance-scripts/confs/atrium.yaml
rename to instance-scripts/config-files/atrium.yaml
diff --git a/instance-scripts/confs/config.yaml b/instance-scripts/config-files/config.yaml
similarity index 100%
rename from instance-scripts/confs/config.yaml
rename to instance-scripts/config-files/config.yaml
diff --git a/instance-scripts/scripts/atrium.sh b/instance-scripts/scripts/atrium.sh
new file mode 100644
index 0000000..a99ed7e
--- /dev/null
+++ b/instance-scripts/scripts/atrium.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+#
+# Install Atrium
+#
+
+mkdir -p /root/atrium/data && mkdir -p /root/atrium/letsencrypt_cache
+sed -i "s/%atrium_hostname%/$(scw-userdata atrium_hostname)/g" /root/atrium.yaml
+sed -i "s/%atrium_letsencrypt_email%/$(scw-userdata atrium_letsencrypt_email)/g" /root/atrium.yaml
+sed -i "s/%atrium_count_index%/$(scw-userdata atrium_count_index)/g" /root/atrium.yaml
+mv /root/atrium.yaml /root/atrium/atrium.yaml
+chown -Rf 1000:1000 /root/atrium
+
+#
+# Run Atrium Container
+#
+
+docker run -d --name atrium \
+       --restart unless-stopped \
+       --net=host \
+       -v /root/atrium/atrium.yaml:/app/atrium.yaml \
+       -v /root/atrium/letsencrypt_cache:/app/letsencrypt_cache \
+       -v /root/atrium/data:/app/data nicolaspernoud/atrium:latest
diff --git a/instance-scripts/scripts/code-server.sh b/instance-scripts/scripts/code-server.sh
new file mode 100644
index 0000000..3934c62
--- /dev/null
+++ b/instance-scripts/scripts/code-server.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+#
+# Install Code Server
+#
+
+# cloud-init execute the bash script before HOME and USER are set.
+export HOME=/root
+export USER=root
+
+mkdir -p  /root/.config/code-server/
+sed -i "s/%user_password%/$(scw-userdata user_password)/g" /root/config.yaml
+mv /root/config.yaml /root/.config/code-server/config.yaml
+curl -fsSL https://code-server.dev/install.sh | sh
+
+#
+# Run Code Server
+#
+
+sudo systemctl enable --now code-server@$USER
\ No newline at end of file
diff --git a/instance-scripts/scripts/docker.sh b/instance-scripts/scripts/docker.sh
new file mode 100644
index 0000000..8a3fb37
--- /dev/null
+++ b/instance-scripts/scripts/docker.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+#
+# Install Docker
+#
+
+curl -fsSL https://get.docker.com -o get-docker.sh
+sh get-docker.sh
\ No newline at end of file
diff --git a/instance-scripts/scripts/repository.sh b/instance-scripts/scripts/repository.sh
new file mode 100644
index 0000000..0181e19
--- /dev/null
+++ b/instance-scripts/scripts/repository.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+#
+# Install Repository
+#
+
+git clone https://github.com/NathanRodet/rust-axum-demo /root/rust-axum-demo
\ No newline at end of file
diff --git a/instance-scripts/scripts/rust.sh b/instance-scripts/scripts/rust.sh
new file mode 100644
index 0000000..a2adbf6
--- /dev/null
+++ b/instance-scripts/scripts/rust.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+#
+# Install Rust
+#
+
+curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
+source \"$HOME/.cargo/env\"
\ No newline at end of file
diff --git a/instance-scripts/scripts/webtop.sh b/instance-scripts/scripts/webtop.sh
new file mode 100644
index 0000000..f6d7123
--- /dev/null
+++ b/instance-scripts/scripts/webtop.sh
@@ -0,0 +1,21 @@
+#
+# Run Webtop Container
+#
+docker run -d --name=webtop \
+       --security-opt seccomp=unconfined \
+       -e PUID=0 \
+       -e PGID=0 \
+       -e TZ=Europe/Paris \
+       -e SUBFOLDER=/ \
+       -e KEYBOARD=fr-fr-azerty \
+       -e AUTO_LOGIN=false \
+       -p 8081:3000 \
+       -v /root/webtop:/config \
+       -v /var/run/docker.sock:/var/run/docker.sock \
+       --shm-size=8gb \
+       --cap-add=NET_ADMIN \
+       --privileged \
+       --restart unless-stopped \
+       --sysctl net.ipv6.conf.all.disable_ipv6=0 lscr.io/linuxserver/webtop:ubuntu-xfce
+
+echo "$(scw-userdata user_password)\n$(scw-userdata user_password)" | docker exec -i webtop passwd abc
\ No newline at end of file
-- 
GitLab