inventory/, group_vars/, roles/, and site.ymlinventory/hosts.yml with relay and landing host groups and placeholder connection detailsgroup_vars/all.yml with shared variables (SSH user, common packages)group_vars/relay.yml with relay-specific variables (SS port, cipher, password placeholder)group_vars/landing.yml with landing-specific variables (Trojan password, domain, TLS paths)ansible.cfg with sensible defaults (inventory path, roles path, vault settings)roles/base/tasks/main.yml with package installation taskssshd_config, restart sshd handler)roles/base/templates/sshd_config.j2 with hardened SSH configurationroles/base/handlers/main.yml for service restart handlersroles/shadowsocks/tasks/main.yml — download shadowsocks-rust binary from GitHub releases, create service userroles/shadowsocks/templates/ss-config.json.j2 — JSON config with server port, password, AEAD cipherroles/shadowsocks/templates/shadowsocks.service.j2 — systemd unit file running as dedicated userroles/shadowsocks/handlers/main.yml — restart handler triggered on config changeroles/shadowsocks/defaults/main.yml — default values (version, cipher aes-256-gcm, port)roles/trojan/tasks/main.yml — download Trojan binary, create service user, grant CAP_NET_BIND_SERVICEroles/trojan/templates/trojan-config.json.j2 — JSON config with password, TLS cert/key paths, fallback addressroles/trojan/templates/trojan.service.j2 — systemd unit file running as dedicated userroles/trojan/handlers/main.yml — restart handler triggered on config changeroles/trojan/defaults/main.yml — default values (version, port 443, fallback port)docs/surge-client.conf — reference Surge config with proxy definitions (Relay-SS, Landing-Trojan, Landing-Chain with underlying-proxy)ruleset.skk.moe) — AI ruleset → Chain, streaming ruleset → Chain, with correct ordering (DOMAIN-SET/non_ip before ip rules)site.yml main playbook applying roles in order: base → shadowsocks (relay group) / trojan (landing group)