Files
Team b6e3cef844 feat: add xui-deploy skill with lessons learned
- SKILL.md v1.1: full deployment workflow for 3x-ui on VPS via SSH
- Covers Docker/native install, Nginx+TLS, Xray inbound config
- references/xray-inbound-config.md: VLESS+WS+TLS and Reality configs
- references/lessons-learned.md: lessons from first real deployment
  - /app/x-ui binary vs shell wrapper in Docker
  - correct API path: panel/api/inbounds/add
  - subPath-only DB write (subURI causes blank settings page)
  - --network host port exposure workaround
- Agent prompt and eval configs included
2026-04-25 14:07:55 +08:00

1 line
14 KiB
XML

<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="842px" preserveAspectRatio="none" style="width:1009px;height:842px;background:#FAFAFA;" version="1.1" viewBox="0 0 1009 842" width="1009px" zoomAndPan="magnify"><defs/><g><rect fill="#FAFAFA" height="842" style="stroke:none;stroke-width:1.0;" width="1009" x="0" y="0"/><rect fill="none" height="46.2656" style="stroke:#000000;stroke-width:1.5;" width="402.5" x="10" y="185.6953"/><rect fill="none" height="46.2656" style="stroke:#000000;stroke-width:1.5;" width="402.5" x="10" y="275.0938"/><rect fill="none" height="116.2031" style="stroke:#000000;stroke-width:1.5;" width="265.5" x="701" y="393.625"/><rect fill="none" height="75.3984" style="stroke:#000000;stroke-width:1.5;" width="794" x="10" y="611.2266"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="58" x2="58" y1="81.2969" y2="761.8906"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="360.5" x2="360.5" y1="81.2969" y2="761.8906"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="752" x2="752" y1="81.2969" y2="761.8906"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="961.5" x2="961.5" y1="81.2969" y2="761.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="71" x="20" y="77.9951">Developer</text><ellipse cx="58.5" cy="13.5" fill="#E2E2F0" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M58.5,21.5 L58.5,48.5 M45.5,29.5 L71.5,29.5 M58.5,48.5 L45.5,63.5 M58.5,48.5 L71.5,63.5 " fill="none" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="71" x="20" y="773.8857">Developer</text><ellipse cx="58.5" cy="785.6875" fill="#E2E2F0" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M58.5,793.6875 L58.5,820.6875 M45.5,801.6875 L71.5,801.6875 M58.5,820.6875 L45.5,835.6875 M58.5,820.6875 L71.5,835.6875 " fill="none" style="stroke:#181818;stroke-width:0.5;"/><rect fill="#E2E2F0" height="46.5938" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="84" x="318.5" y="33.7031"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70" x="325.5" y="53.6982">xui-deploy</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="26" x="347.5" y="69.9951">Skill</text><rect fill="#E2E2F0" height="46.5938" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="84" x="318.5" y="760.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70" x="325.5" y="780.8857">xui-deploy</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="26" x="347.5" y="797.1826">Skill</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="83" x="711" y="50"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="69" x="718" y="69.9951">VPS (SSH)</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="83" x="711" y="760.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="69" x="718" y="780.8857">VPS (SSH)</text><rect fill="#E2E2F0" height="46.5938" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="84" x="919.5" y="33.7031"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="47" x="938" y="53.6982">GitHub</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70" x="926.5" y="69.9951">(install.sh)</text><rect fill="#E2E2F0" height="46.5938" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="84" x="919.5" y="760.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="47" x="938" y="780.8857">GitHub</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70" x="926.5" y="797.1826">(install.sh)</text><polygon fill="#181818" points="348.5,108.4297,358.5,112.4297,348.5,116.4297,352.5,112.4297" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="58.5" x2="354.5" y1="112.4297" y2="112.4297"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="119" x="65.5" y="107.3638">deploy x-ui on VPS</text><polygon fill="#181818" points="69.5,137.5625,59.5,141.5625,69.5,145.5625,65.5,141.5625" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="359.5" y1="141.5625" y2="141.5625"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="278" x="75.5" y="136.4966">collect host, SSH user, key, panel password</text><polygon fill="#181818" points="740.5,166.6953,750.5,170.6953,740.5,174.6953,744.5,170.6953" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="360.5" x2="746.5" y1="170.6953" y2="170.6953"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="198" x="367.5" y="165.6294">ssh echo OK (connectivity test)</text><path d="M10,185.6953 L74,185.6953 L74,192.8281 L64,202.8281 L10,202.8281 L10,185.6953 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="46.2656" style="stroke:#000000;stroke-width:1.5;" width="402.5" x="10" y="185.6953"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="19" x="25" y="198.7622">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="67" x="89" y="197.9058">[SSH fails]</text><polygon fill="#181818" points="69.5,219.9609,59.5,223.9609,69.5,227.9609,65.5,223.9609" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="359.5" y1="223.9609" y2="223.9609"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110" x="75.5" y="218.895">report error, stop</text><polygon fill="#181818" points="740.5,256.0938,750.5,260.0938,740.5,264.0938,744.5,260.0938" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="360.5" x2="746.5" y1="260.0938" y2="260.0938"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="119" x="367.5" y="255.0278">cat /etc/os-release</text><path d="M10,275.0938 L74,275.0938 L74,282.2266 L64,292.2266 L10,292.2266 L10,275.0938 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="46.2656" style="stroke:#000000;stroke-width:1.5;" width="402.5" x="10" y="275.0938"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="19" x="25" y="288.1606">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="113" x="89" y="287.3042">[unsupported OS]</text><polygon fill="#181818" points="69.5,309.3594,59.5,313.3594,69.5,317.3594,65.5,313.3594" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="359.5" y1="313.3594" y2="313.3594"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="129" x="75.5" y="308.2935">warn, ask to confirm</text><polygon fill="#181818" points="740.5,345.4922,750.5,349.4922,740.5,353.4922,744.5,349.4922" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="360.5" x2="746.5" y1="349.4922" y2="349.4922"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="126" x="367.5" y="344.4263">curl install.sh | bash</text><polygon fill="#181818" points="949.5,374.625,959.5,378.625,949.5,382.625,953.5,378.625" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="752.5" x2="955.5" y1="378.625" y2="378.625"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="120" x="759.5" y="373.5591">download install.sh</text><path d="M701,393.625 L765,393.625 L765,400.7578 L755,410.7578 L701,410.7578 L701,393.625 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="116.2031" style="stroke:#000000;stroke-width:1.5;" width="265.5" x="701" y="393.625"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="19" x="716" y="406.6919">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="146" x="780" y="405.8354">[x-ui already installed]</text><line style="stroke:#181818;stroke-width:1.0;" x1="752.5" x2="794.5" y1="431.8906" y2="431.8906"/><line style="stroke:#181818;stroke-width:1.0;" x1="794.5" x2="794.5" y1="431.8906" y2="444.8906"/><line style="stroke:#181818;stroke-width:1.0;" x1="753.5" x2="794.5" y1="444.8906" y2="444.8906"/><polygon fill="#181818" points="763.5,440.8906,753.5,444.8906,763.5,448.8906,759.5,444.8906" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="152" x="759.5" y="426.8247">update to latest version</text><line style="stroke:#000000;stroke-width:1.0;stroke-dasharray:2.0,2.0;" x1="701" x2="966.5" y1="453.8906" y2="453.8906"/><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="87" x="706" y="464.1011">[fresh install]</text><line style="stroke:#181818;stroke-width:1.0;" x1="752.5" x2="794.5" y1="488.8281" y2="488.8281"/><line style="stroke:#181818;stroke-width:1.0;" x1="794.5" x2="794.5" y1="488.8281" y2="501.8281"/><line style="stroke:#181818;stroke-width:1.0;" x1="753.5" x2="794.5" y1="501.8281" y2="501.8281"/><polygon fill="#181818" points="763.5,497.8281,753.5,501.8281,763.5,505.8281,759.5,501.8281" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="195" x="759.5" y="483.7622">install 3x-ui + systemd service</text><polygon fill="#181818" points="740.5,533.9609,750.5,537.9609,740.5,541.9609,744.5,537.9609" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="360.5" x2="746.5" y1="537.9609" y2="537.9609"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="368" x="367.5" y="532.895">x-ui setting -port / -username / -password / -webBasePath</text><polygon fill="#181818" points="740.5,563.0938,750.5,567.0938,740.5,571.0938,744.5,567.0938" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="360.5" x2="746.5" y1="567.0938" y2="567.0938"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="70" x="367.5" y="562.0278">x-ui restart</text><polygon fill="#181818" points="740.5,592.2266,750.5,596.2266,740.5,600.2266,744.5,596.2266" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="360.5" x2="746.5" y1="596.2266" y2="596.2266"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="67" x="367.5" y="591.1606">x-ui status</text><path d="M10,611.2266 L74,611.2266 L74,618.3594 L64,628.3594 L10,628.3594 L10,611.2266 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="75.3984" style="stroke:#000000;stroke-width:1.5;" width="794" x="10" y="611.2266"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="19" x="25" y="624.2935">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="134" x="89" y="623.437">[service not running]</text><polygon fill="#181818" points="740.5,645.4922,750.5,649.4922,740.5,653.4922,744.5,649.4922" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="360.5" x2="746.5" y1="649.4922" y2="649.4922"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="136" x="367.5" y="644.4263">x-ui log (last 30 lines)</text><polygon fill="#181818" points="69.5,674.625,59.5,678.625,69.5,682.625,65.5,678.625" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="359.5" y1="678.625" y2="678.625"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74" x="75.5" y="673.5591">report error</text><polygon fill="#181818" points="740.5,710.7578,750.5,714.7578,740.5,718.7578,744.5,714.7578" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="360.5" x2="746.5" y1="714.7578" y2="714.7578"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="279" x="367.5" y="709.6919">ufw allow &lt;port&gt; OR firewall-cmd --add-port</text><polygon fill="#181818" points="69.5,739.8906,59.5,743.8906,69.5,747.8906,65.5,743.8906" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="63.5" x2="359.5" y1="743.8906" y2="743.8906"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="213" x="75.5" y="738.8247">panel URL + username + version</text><!--SRC=[ZLF1Qjj04BtlLmpfnIPMNSZDb43Q4hl4r24cFUMobiRMul6ks9crOkZ7ToGvjjEgK0H2k_FclRTlLhnrlhBHxg30jKqazy7B3xj3k8lEak5JVMNpxIQ6v8klWKA43_TtpMECpKMNtt2F52gCHk7YSbTPBt3rcbnMO4NXyEANMqTq1PPX-V1zFdyF_FcuXC5oEHks05szBq-TpDBgnG-SPx547xdiaDEPCITjo6uxRfX0fmglMN8GVClObHHpRfX07eWm5oW3omZK0IJ6E88j7aQWuaZwPgv3BCoPeR4x0UOIC2y3B1vWa0VlbSZjdHn0a6LeB4dBkBQEs03q6eXOXIY0CGQLPGcLGV-tLcu5nYZvE70MaT0ojlp9SweQ1YnWiVoNI6sZ7sbUMv2WH_Ph5tVzCYaId4E6NpfuBarJLCnqrYGRQa_15XUmraaRjQM8jZYyrR1GHyVcJY1LXHLiR91jKe8zHdR16oH6M4TKqMFpdwt7RRXfbQw13oouAq3djNSvzfwdXJAAEB-1h4rw35apOj_SSlr-csxpNUFgYmRxQANi9L9tejUoNqIi93Pj54T7u8D0JDwh-ELaBheeR610LdEu-GJaFFBmVovAxrdJkjRyATJmkK7Umk89TD1OwsQMQr1PPekY3S7q_mpTVNz-cckwfuoktqRq6m00]--></g></svg>