Files
jingji_coder_template/main.tf
2025-05-02 20:52:16 +08:00

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
}
}