菜单

初始化和部署目录 (/init, /deployments)

相关源文件

本文档解释了标准 Go 项目布局中 /init/deployments 目录的用途和用法。这些目录对于系统初始化和部署配置至关重要,是应用程序代码与其运行时环境之间的连接纽带。

目的与范围

在应用程序的生命周期中,/init/deployments 目录扮演着不同但互补的角色。

  1. /init:包含系统初始化和进程管理配置。
  2. /deployments:存放将应用程序部署到各种平台的配置文件。

这些目录不属于核心代码结构(如 /cmd/internal/pkg),而是支持应用程序的运行方面。有关配置文件的信息,请参阅 Configs Directory).

初始化目录 (/init)

/init 目录包含系统初始化和进程管理配置。

目的

/init 目录的主要目的是存储配置文件,这些文件定义了应用程序应如何由宿主操作系统启动、管理和监督。

来源:init/README.md1-3 README.md120-122

常见内容

/init 目录通常包含:

  1. 系统初始化配置:

    • systemd 单元文件.service.socket.timer
    • upstart 作业配置.conf
    • sysv init 脚本(可执行的 shell 脚本)
  2. 进程管理器配置:

    • supervisord 配置.conf.ini
    • runit 服务脚本(服务目录中的可执行文件)

示例组织结构

典型的 /init 目录可能组织如下:

/init
├── systemd/
│   ├── myapp.service        # Service unit file
│   └── myapp.socket         # Socket unit file
├── upstart/
│   └── myapp.conf           # Upstart job configuration
├── sysv/
│   └── myapp                # SysV init script
├── supervisord/
│   └── myapp.conf           # Supervisord program configuration
└── runit/
    └── myapp/
        ├── run              # Run script
        └── log/
            └── run          # Log run script

来源:init/README.md1-3 README.md120-122

部署目录 (/deployments)

/deployments 目录包含将应用程序部署到各种平台和环境的配置文件和模板。

目的

/deployments 目录的主要目的是存储基础架构配置,这些配置定义了应用程序应如何跨不同环境进行部署、扩展和管理。

来源:deployments/README.md1-3 README.md140-142

常见内容

/deployments 目录通常包含:

  1. 容器编排配置:

    • Docker Compose 文件docker-compose.yml
    • Kubernetes Manifests(用于 deployments、services 等的 .yaml 文件)
    • Helm Charts(包含 Chart.yaml、模板等的目录结构)
  2. 基础架构即代码 (IaC) 配置:

    • Terraform 文件.tf
    • CloudFormation 模板.yaml.json
    • Ansible Playbooks.yml
  3. 特定平台的部署配置:

    • Mesos/Marathon 配置
    • Bosh 部署清单
    • Nomad 作业规范

示例组织结构

典型的 /deployments 目录可能组织如下:

/deployments
├── docker/
│   └── docker-compose.yml              # Docker Compose configuration
├── kubernetes/
│   ├── base/                           # Base Kubernetes manifests
│   │   ├── deployment.yaml
│   │   ├── service.yaml
│   │   └── configmap.yaml
│   └── overlays/                       # Environment-specific overlays
│       ├── development/
│       │   └── kustomization.yaml
│       ├── staging/
│       │   └── kustomization.yaml
│       └── production/
│           └── kustomization.yaml
├── helm/
│   └── myapp/                          # Helm chart
│       ├── Chart.yaml
│       ├── values.yaml
│       └── templates/
├── terraform/
│   ├── modules/                        # Reusable Terraform modules
│   └── environments/                   # Environment-specific configurations
│       ├── dev/
│       ├── staging/
│       └── prod/
└── cloudformation/
    └── myapp-stack.yaml                # CloudFormation template

来源:deployments/README.md1-3 README.md140-142

与部署工作流的关系

下图说明了 /init/deployments 目录如何融入 Go 应用程序的整体部署工作流。

来源:init/README.md1-3 deployments/README.md1-3 README.md120-122 README.md140-142

部署基础架构组件

下图显示了部署配置与它们所针对的基础架构组件之间的关系。

来源:init/README.md1-3 deployments/README.md1-3 README.md120-122 README.md140-142

最佳实践

针对 Init 目录

  1. 按系统类型组织:为每个 init 系统或进程管理器创建子目录(例如,systemd/supervisord/)。
  2. 包含清晰的文档:在每个子目录中添加 README 文件,解释其用法。
  3. 使用模板:提供可适应不同环境的模板配置。
  4. 包含环境变量:定义应用程序所需的环境变量。
  5. 确保适当的权限:确保 init 脚本具有适当的可执行权限。

针对 Deployments 目录

  1. 按平台和环境组织:为每个部署平台和环境创建子目录。
  2. 使用参数化:利用特定于环境的参数或变量。
  3. 遵循基础架构即代码原则:保持配置的声明性和版本控制。
  4. 包含部署说明:添加 README 文件,解释如何使用部署配置。
  5. 分离敏感信息:不要将机密信息直接包含在部署文件中;使用环境变量或机密管理系统。

常用工具

Init 系统和进程管理器

工具描述文件格式位于 /init/ 中的位置
systemd现代 Linux init 系统单元文件(.service.socketsystemd/
upstart早期 Ubuntu 版本的 Init 系统作业配置(.confupstart/
SysV init传统的 Unix init 系统Shell 脚本sysv/
supervisord进程控制系统配置文件(.conf.inisupervisord/
runit服务监控套件基于目录的 run 脚本runit/

部署平台

平台描述文件格式位于 /deployments/ 中的位置
Docker Compose用于开发的容器编排YAML(.ymldocker/
Kubernetes容器编排平台YAML Manifestskubernetes/
HelmKubernetes 包管理器包含 YAML 模板的 Chartshelm/
Terraform基础架构即代码工具HCL(.tfterraform/
CloudFormationAWS 基础架构即代码YAML/JSON 模板cloudformation/
Ansible配置管理YAML Playbooksansible/

来源:init/README.md1-3 deployments/README.md1-3 README.md120-122 README.md140-142

替代命名

在一些仓库中,特别是那些使用 Kubernetes 部署的仓库,/deployments 目录可能被称为 /deploy。这是一个可接受的替代命名约定,但标准布局建议使用 /deployments 以保持一致性。

来源:README.md140-142

结论

/init/deployments 目录在 Go 应用程序的运行方面起着至关重要的作用。它们弥合了您的应用程序代码与运行环境之间的差距。通过正确组织这些目录,您可以简化部署流程,并确保应用程序在不同环境中的行为一致。