321 lines
9.2 KiB
HCL
321 lines
9.2 KiB
HCL
terraform {
|
|
required_providers {
|
|
coder = {
|
|
source = "coder/coder"
|
|
}
|
|
docker = {
|
|
source = "kreuzwerker/docker"
|
|
}
|
|
}
|
|
}
|
|
|
|
locals {
|
|
username = data.coder_workspace_owner.me.name
|
|
image_name = "coder-nodejs-base:latest"
|
|
}
|
|
|
|
data "coder_parameter" "clone_reference" {
|
|
name = "初始化荆棘鸟文学社参考文档"
|
|
type = "bool"
|
|
description = "是否初始化荆棘鸟参考文档"
|
|
mutable = true
|
|
default = "true"
|
|
icon = "/emojis/1f4d6.png"
|
|
}
|
|
|
|
data "coder_parameter" "clone_spbook" {
|
|
name = "初始化荆棘鸟文学社高三特刊"
|
|
type = "bool"
|
|
description = "是否初始化荆棘鸟文学社高三特刊"
|
|
mutable = true
|
|
default = "false"
|
|
icon = "/emojis/1f4da.png"
|
|
}
|
|
|
|
data "coder_parameter" "clone_main" {
|
|
name = "初始化荆棘鸟文学社主站点"
|
|
type = "bool"
|
|
description = "是否初始化荆棘鸟文学社主站点"
|
|
mutable = true
|
|
default = "false"
|
|
icon = "/emojis/1f3e0.png"
|
|
}
|
|
|
|
variable "docker_socket" {
|
|
default = ""
|
|
description = "(Optional) Docker socket URI"
|
|
type = string
|
|
}
|
|
|
|
provider "docker" {
|
|
# Defaulting to null if the variable is an empty string lets us have an optional variable without having to set our own default
|
|
host = var.docker_socket != "" ? var.docker_socket : null
|
|
}
|
|
|
|
data "coder_provisioner" "me" {}
|
|
data "coder_workspace" "me" {}
|
|
data "coder_workspace_owner" "me" {}
|
|
|
|
resource "null_resource" "docker_build" {
|
|
triggers = {
|
|
always_run = "${timestamp()}"
|
|
dockerfile_hash = filemd5("${path.module}/Dockerfile")
|
|
}
|
|
|
|
provisioner "local-exec" {
|
|
command = "docker build -t ${local.image_name} -f ${path.module}/Dockerfile ."
|
|
working_dir = path.module
|
|
}
|
|
}
|
|
|
|
resource "coder_agent" "main" {
|
|
arch = data.coder_provisioner.me.arch
|
|
os = "linux"
|
|
startup_script = <<-EOT
|
|
set -e
|
|
|
|
# Prepare user home with default files on first start.
|
|
if [ ! -f ~/.init_done ]; then
|
|
cp -rT /etc/skel ~
|
|
|
|
# 创建 .ssh 目录并设置权限
|
|
mkdir -p ~/.ssh
|
|
chmod 700 ~/.ssh
|
|
|
|
# 生成 SSH 密钥对
|
|
ssh-keygen -t ed25519 -f ~/.ssh/git -N "" -C "${data.coder_workspace_owner.me.name}(${data.coder_workspace_owner.me.email})-${data.coder_workspace.me.name}"
|
|
|
|
# 创建 SSH 配置文件
|
|
cat > ~/.ssh/config <<EOF
|
|
Host ssh.lionhao.top
|
|
StrictHostKeyChecking accept-new
|
|
Port 4022
|
|
User git
|
|
IdentityFile ~/.ssh/git
|
|
EOF
|
|
|
|
# 设置适当的权限
|
|
chmod 600 ~/.ssh/config
|
|
chmod 600 ~/.ssh/git
|
|
chmod 644 ~/.ssh/git.pub
|
|
|
|
echo "SSH 密钥对创建成功,你的公钥是:"
|
|
cat ~/.ssh/git.pub
|
|
echo "请将以上公钥添加到 Gitea 个人 SSH 密钥中"
|
|
|
|
# 添加 git 全局配置
|
|
git config --global user.name "${data.coder_workspace_owner.me.name}"
|
|
git config --global user.email "${data.coder_workspace_owner.me.email}"
|
|
|
|
cd /home/coder/jingjiniao
|
|
|
|
# 拉取仓库
|
|
if [ "${data.coder_parameter.clone_reference.value}" = "true" ]; then
|
|
echo "正在克隆 荆棘鸟文学社参考文档站点仓库..."
|
|
git clone https://gitea.lionhao.top/jjnwxs/jingji_reference.git
|
|
echo "荆棘鸟文学社参考文档站点仓库 克隆完成"
|
|
cd jingji_reference
|
|
git remote set-url origin git@ssh.lionhao.top:jjnwxs/jingji_reference.git
|
|
echo "荆棘鸟文学社参考文档站点仓库 远程地址设置成功"
|
|
cd ..
|
|
fi
|
|
|
|
if [ "${data.coder_parameter.clone_spbook.value}" = "true" ]; then
|
|
echo "正在克隆 荆棘鸟文学社高三特刊站点仓库..."
|
|
git clone https://gitea.lionhao.top/jjnwxs/jingji_spbook.git
|
|
echo "荆棘鸟文学社高三特刊站点仓库 克隆完成"
|
|
cd jingji_spbook
|
|
git remote set-url origin git@ssh.lionhao.top:jjnwxs/jingji_spbook.git
|
|
echo " 荆棘鸟文学社高三特刊站点仓库 远程地址设置成功"
|
|
cd ..
|
|
fi
|
|
|
|
if [ "${data.coder_parameter.clone_main.value}" = "true" ]; then
|
|
echo "正在克隆 荆棘鸟文学社主站点仓库..."
|
|
git clone https://gitea.lionhao.top/jjnwxs/jingji_main.git
|
|
echo "荆棘鸟文学社主站点仓库 克隆完成"
|
|
cd jingji_main
|
|
git remote set-url origin git@ssh.lionhao.top:jjnwxs/jingji_main.git
|
|
echo "荆棘鸟文学社主站点仓库 远程地址设置成功"
|
|
cd ..
|
|
fi
|
|
|
|
touch ~/.init_done
|
|
fi
|
|
|
|
EOT
|
|
|
|
metadata {
|
|
display_name = "CPU Usage"
|
|
key = "0_cpu_usage"
|
|
script = "coder stat cpu"
|
|
interval = 10
|
|
timeout = 1
|
|
}
|
|
|
|
metadata {
|
|
display_name = "RAM Usage"
|
|
key = "1_ram_usage"
|
|
script = "coder stat mem"
|
|
interval = 10
|
|
timeout = 1
|
|
}
|
|
|
|
metadata {
|
|
display_name = "Home Disk"
|
|
key = "3_home_disk"
|
|
script = "coder stat disk --path $${HOME}"
|
|
interval = 60
|
|
timeout = 1
|
|
}
|
|
|
|
metadata {
|
|
display_name = "CPU Usage (Host)"
|
|
key = "4_cpu_usage_host"
|
|
script = "coder stat cpu --host"
|
|
interval = 10
|
|
timeout = 1
|
|
}
|
|
|
|
metadata {
|
|
display_name = "Memory Usage (Host)"
|
|
key = "5_mem_usage_host"
|
|
script = "coder stat mem --host"
|
|
interval = 10
|
|
timeout = 1
|
|
}
|
|
|
|
metadata {
|
|
display_name = "Load Average (Host)"
|
|
key = "6_load_host"
|
|
# get load avg scaled by number of cores
|
|
script = <<SCRIPT
|
|
echo "`cat /proc/loadavg | awk '{ print $1 }'` `nproc`" | awk '{ printf "%0.2f", $1/$2 }'
|
|
SCRIPT
|
|
interval = 60
|
|
timeout = 1
|
|
}
|
|
|
|
metadata {
|
|
display_name = "Swap Usage (Host)"
|
|
key = "7_swap_host"
|
|
script = <<EOT
|
|
free -b | awk '/^Swap/ { printf("%.1f/%.1f", $3/1024.0/1024.0/1024.0, $2/1024.0/1024.0/1024.0) }'
|
|
EOT
|
|
interval = 10
|
|
timeout = 1
|
|
}
|
|
|
|
metadata {
|
|
display_name = "NodeJS Version"
|
|
key = "8_nodejs_version"
|
|
script = "node -v"
|
|
interval = 1800
|
|
timeout = 1
|
|
}
|
|
|
|
metadata {
|
|
display_name = "pnpm Version"
|
|
key = "9_pnpm_version"
|
|
script = "pnpm -v"
|
|
interval = 1800
|
|
timeout = 1
|
|
}
|
|
}
|
|
|
|
# See https://registry.coder.com/modules/code-server
|
|
module "code-server" {
|
|
count = data.coder_workspace.me.start_count
|
|
source = "registry.coder.com/modules/code-server/coder"
|
|
|
|
# This ensures that the latest version of the module gets downloaded, you can also pin the module version to prevent breaking changes in production.
|
|
version = ">= 1.0.0"
|
|
agent_id = coder_agent.main.id
|
|
extensions = [
|
|
"redhat.vscode-yaml",
|
|
"mhutchie.git-graph"
|
|
]
|
|
settings = {
|
|
"workbench.colorTheme": "Default Dark Modern",
|
|
"git.autofetch": true,
|
|
"workbench.startupEditor": "none",
|
|
"chat.commandCenter.enabled": false,
|
|
"editor.fontSize": 16,
|
|
"redhat.telemetry.enabled": true,
|
|
"editor.cursorStyle": "block",
|
|
"editor.cursorBlinking": "smooth",
|
|
"workbench.activityBar.location": "top",
|
|
"diffEditor.hideUnchangedRegions.enabled": true,
|
|
"diffEditor.experimental.showMoves": true,
|
|
"diffEditor.renderSideBySide": true
|
|
}
|
|
auto_install_extensions = true
|
|
folder = "/home/coder/jingjiniao"
|
|
order = 1
|
|
}
|
|
|
|
resource "docker_volume" "home_volume" {
|
|
name = "coder-${data.coder_workspace.me.id}-home"
|
|
# Protect the volume from being deleted due to changes in attributes.
|
|
lifecycle {
|
|
ignore_changes = all
|
|
}
|
|
# Add labels in Docker to keep track of orphan resources.
|
|
labels {
|
|
label = "coder.owner"
|
|
value = data.coder_workspace_owner.me.name
|
|
}
|
|
labels {
|
|
label = "coder.owner_id"
|
|
value = data.coder_workspace_owner.me.id
|
|
}
|
|
labels {
|
|
label = "coder.workspace_id"
|
|
value = data.coder_workspace.me.id
|
|
}
|
|
# This field becomes outdated if the workspace is renamed but can
|
|
# be useful for debugging or cleaning out dangling volumes.
|
|
labels {
|
|
label = "coder.workspace_name_at_creation"
|
|
value = data.coder_workspace.me.name
|
|
}
|
|
}
|
|
|
|
resource "docker_container" "workspace" {
|
|
depends_on = [null_resource.docker_build]
|
|
count = data.coder_workspace.me.start_count
|
|
image = local.image_name
|
|
# Uses lower() to avoid Docker restriction on container names.
|
|
name = "coder-${data.coder_workspace_owner.me.name}-${lower(data.coder_workspace.me.name)}"
|
|
# Hostname makes the shell more user friendly: coder@my-workspace:~$
|
|
hostname = data.coder_workspace.me.name
|
|
entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "/localhost|127\\.0\\.0\\.1/", "host.docker.internal")]
|
|
env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
|
|
host {
|
|
host = "host.docker.internal"
|
|
ip = "host-gateway"
|
|
}
|
|
volumes {
|
|
container_path = "/home/coder"
|
|
volume_name = docker_volume.home_volume.name
|
|
read_only = false
|
|
}
|
|
|
|
# Add labels in Docker to keep track of orphan resources.
|
|
labels {
|
|
label = "coder.owner"
|
|
value = data.coder_workspace_owner.me.name
|
|
}
|
|
labels {
|
|
label = "coder.owner_id"
|
|
value = data.coder_workspace_owner.me.id
|
|
}
|
|
labels {
|
|
label = "coder.workspace_id"
|
|
value = data.coder_workspace.me.id
|
|
}
|
|
labels {
|
|
label = "coder.workspace_name"
|
|
value = data.coder_workspace.me.name
|
|
}
|
|
} |