chore: 初始化 idsync 项目

飞书通讯录 ↔ LDAP 同步工具的首个提交。

- internal/feishu: 飞书通讯录客户端、快照与重试
- internal/ldaplib: LDAP 读写与批量操作
- internal/mapping: 飞书部门/用户到 LDAP 条目的映射
- internal/syncer: 同步计划生成、执行与调度
- internal/store: SQLite 台账
- internal/server + internal/webui: 管理后台与内嵌前端产物
- internal/password: SSHA 口令处理
- config.example.yml / Dockerfile / Makefile / web 前端源码

真实凭据(config.yml)、运行时数据(data/、backup/)与构建产物(bin/)不入库。
This commit is contained in:
2026-09-29 00:10:59 +08:00
commit 947b1a1475
43 changed files with 10079 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
# idsync 配置示例。复制为 config.yml 后按实际环境修改。
#
# 注意:本工具不参与认证链路,用户登录、密码重置、发信全部由 Authelia 负责。
# 它只把飞书通讯录物化到 OpenLDAP,因此这里没有也不需要任何认证相关配置。
system:
# debug 会输出更详细的日志;生产环境用 release
mode: release
# 台账数据库与运行数据目录
data-dir: data
server:
listen: 0.0.0.0:8899
# 管理界面自身的登录凭据(仅用于保护这个界面,与 LDAP 用户无关)
admin-user: admin
# 明文密码只在首次启动时用于生成哈希;建议改用 hash-password 生成下面的哈希
admin-password: change-me
# 用 `./idsync -hash-password '你的密码'` 生成,留空则使用上面的明文密码
admin-password-hash: ""
# 会话签名密钥,用 `./idsync -gen-secret` 生成。
# 留空会自动生成临时密钥,但重启后需要重新登录。
session-secret: ""
# 经 HTTPS 反代访问时设为 true
secure-cookie: false
feishu:
app-id: "cli_xxxxxxxxxxxx"
app-secret: "xxxxxxxxxxxxxxxxxxxxxxxx"
# 留空使用飞书开放平台;Lark 国际版填 https://open.larksuite.com
base-url: ""
# 留空表示同步全部部门;填部门 ID 则只同步这些部门,
# 前缀 ^ 表示排除该部门及其子部门(例如 ["^odxxxx"])
dept-list: []
# 调用飞书的速率上限(次/秒),避免触发频控
qps: 5
timeout-sec: 30
ldap:
# 生产环境务必使用 ldaps:// 或开启 start-tls:
# Authelia 重置密码时会把新密码经此连接发送。
url: ldaps://ldap.example.com:636
base-dn: "dc=example,dc=com"
admin-dn: "cn=admin,dc=example,dc=com"
admin-pass: "change-me"
# 在职用户所在 OU。必须落在 Authelia 的 base_dn 之内。
user-ou: "ou=people"
# 离职用户迁往的 OU。必须落在 Authelia 的 base_dn 之外,
# 这样离职者会自动失去登录能力,无需在 Authelia 侧加过滤条件。
inactive-ou: "ou=Inactive"
# 部门树根 OU 的名称(仅名称,不含 ou=)
group-root-name: "feishuroot"
timeout-sec: 15
start-tls: false
# 仅自签证书的测试环境使用
insecure-skip-verify: false
# 新建用户的初始密码。留空则每个用户随机生成,
# 用户首次登录应走 Authelia 的“忘记密码”自助重置。
initial-password: ""
database:
source: data/idsync.db
sync:
# 是否启用定时同步
enable: true
# 秒级 cron:秒 分 时 日 月 周。默认每天 00:40 执行。
schedule: "0 40 0 * * *"
# true 表示定时任务只生成计划不写入。建议先观察几轮再改为 false。
default-dry-run: true
# 单次同步允许停用的账号数上限,0 表示不限制
max-deactivate: 0
# 单次同步允许停用的账号比例上限(0-1)。
# 用于防止飞书应用权限范围被误改导致大批账号被判定为离职。
max-deactivate-percent: 0.2