[{"data":1,"prerenderedAt":308},["ShallowReactive",2],{"\u002Fposts\u002Fc5d8bf3":3,"surround-\u002Fposts\u002Fc5d8bf3":297},{"id":4,"title":5,"body":6,"categories":272,"date":274,"description":275,"draft":276,"extension":277,"image":278,"meta":279,"navigation":281,"path":282,"permalink":282,"published":278,"readingTime":283,"recommend":278,"references":278,"seo":288,"sitemap":289,"stem":290,"tags":291,"type":295,"updated":274,"__hash__":296},"content\u002Fposts\u002F2026\u002F自部署个人使用的Asciinema服务端.md","自部署个人使用的Asciinema服务端",{"type":7,"value":8,"toc":257},"minimark",[9,14,28,32,35,48,52,60,70,74,82,88,91,109,114,121,127,134,140,146,149,155,165,170,174,180,184,190,196,199,205,209,217,220,223,235,239,245,248,254],[10,11,13],"h1",{"id":12},"自部署私有asciinema服务端","自部署私有Asciinema服务端",[15,16,17],"blockquote",{},[18,19,20,21],"p",{},"想要更详细请查看官方资料:\n",[22,23,27],"a",{"href":24,"rel":25},"https:\u002F\u002Fdocs.asciinema.org\u002Fmanual\u002Fserver\u002Fself-hosting\u002F",[26],"nofollow","Self-hosting - asciinema docs",[29,30,31],"h2",{"id":31},"部署私有特征",[18,33,34],{},"因为要部署私有的存回放的Asciinema的服务端，特征是",[36,37,38,42,45],"ol",{},[39,40,41],"li",{},"禁止所有人注册",[39,43,44],{},"禁止所有人上传",[39,46,47],{},"允许所有人观看",[29,49,51],{"id":50},"生成secret-key","生成Secret key",[18,53,54,55,59],{},"填入Docker-compose文件的",[56,57,58],"code",{"code":58},"SECRET_KEY_BASE","环境变量上",[61,62,68],"pre",{"className":63,"code":65,"language":66,"meta":67},[64],"language-bash","LC_ALL=C tr -dc 'A-Za-z0-9' \u003C \u002Fdev\u002Furandom | head -c 64; echo\n","bash","",[56,69,65],{"__ignoreMap":67},[29,71,73],{"id":72},"docker-composeyml","Docker-compose.yml",[61,75,80],{"className":76,"code":78,"language":79,"meta":67},[77],"language-yaml","services:\n  asciinema:\n    image: ghcr.io\u002Fasciinema\u002Fasciinema-server:20260207\n    ports:\n      # 127.0.0.1只允许宿主机本地访问，禁止外网直连\n      - '127.0.0.1:4000:4000' # 服务端口\n      - '127.0.0.1:4002:4002' # 后台管理端口(没有鉴权，不建议开放)(删除这行吧)\n    environment:\n      - SECRET_KEY_BASE=...  # 填入前面生成的SecretKey\n      - URL_HOST=... #反代后绑定的域名\n      - URL_SCHEME=https  # https或http\n      - UPLOAD_AUTH_REQUIRED=true # 上传需要认证\n      - SIGN_UP_DISABLED=true # 禁止注册:第一次启动改为false，注册完再改回true\n      # 下面三个参数都是用户登录注册发邮件的，如果不填写，需要进docker后台寻找登录注册的激活url。\n      - SMTP_HOST=...\n      - SMTP_USERNAME=...\n      - SMTP_PASSWORD=...\n      - MAIL_FROM_ADDRESS=... #填写你的发件邮件地址，不然会报错`501 Mail from address must be same as authorization user`\n      - MAIL_REPLY_TO_ADDRESS=... #回信邮件地址，自己用可不填。\n      - CONTACT_EMAIL_ADDRESS=... #管理员联系地址,自己用可不填。\n    volumes:\n      - .\u002Fasciinema_data:\u002Fvar\u002Flib\u002Fasciinema # 数据存在当前目录下的asciinema_data文件夹\n    depends_on:\n      postgres:\n        condition: service_healthy\n\n  postgres:\n    image: docker.io\u002Flibrary\u002Fpostgres:14\n    environment:\n      - POSTGRES_HOST_AUTH_METHOD=trust\n    volumes:\n      - .\u002Fpostgres_data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    healthcheck:\n      test: ['CMD-SHELL', 'pg_isready -U postgres']\n      interval: 2s\n      timeout: 5s\n      retries: 10\n","yaml",[56,81,78],{"__ignoreMap":67},[18,83,84,85],{},"然后反代4000端口，这里为假设为",[56,86,87],{"code":87},"https:\u002F\u002Fanm.sky233.top",[29,89,90],{"id":90},"部署后操作",[18,92,93,94,97,98,101,102,105,106],{},"第一次部署后先用",[56,95,96],{"code":96},"docker compose up","，先别用",[56,99,100],{"code":100},"-d","参数。",[56,103,104],{"code":104},"SIGN_UP_DISABLED","先设置为",[56,107,108],{"code":108},"false",[110,111,113],"h3",{"id":112},"_0-预览网页并注册","0. 预览网页并注册",[18,115,116],{},[117,118],"img",{"alt":119,"src":120},"image-20260418015010139","https:\u002F\u002Fimg.sky233.top\u002Fimg\u002F2026\u002F04\u002Ffb4920044a3b90a20f28dfde96104b477519dd87809e97152e0c4e4f559cbf65.png",[18,122,123],{},[117,124],{"alt":125,"src":126},"image-20260418015028736","https:\u002F\u002Fimg.sky233.top\u002Fimg\u002F2026\u002F04\u002Ff32262b1a94794e3fa93ede7451f800c07b51fbe97ba58b8a63fc0529e5e5997.png",[18,128,129,130,133],{},"点击",[56,131,132],{"code":132},"Log In\u002FSign Up","，输入你的用户名，在docker-compose后端找到验证url并访问。",[18,135,136],{},[117,137],{"alt":138,"src":139},"image-20260418015133073","https:\u002F\u002Fimg.sky233.top\u002Fimg\u002F2026\u002F04\u002F2fcaf3bb480813a92fb03e1a2aecbcf37d9413ab9d8452ac46318cd36a958867.png",[18,141,142],{},[117,143],{"alt":144,"src":145},"image-20260418015239685","https:\u002F\u002Fimg.sky233.top\u002Fimg\u002F2026\u002F04\u002F525e25ca94f099417066fde3cca44cd64c4ef6091ed8022454eb1d1948d8a70c.png",[18,147,148],{},"输入用户名注册完成。",[18,150,151],{},[117,152],{"alt":153,"src":154},"image-20260418015307853","https:\u002F\u002Fimg.sky233.top\u002Fimg\u002F2026\u002F04\u002Fc6d84e9476876756a268b1c3a2896f9d915fe188710eb4f3edf432f283513644.png",[18,156,157,158,160,161,164],{},"此时可以回到docker-compose，停止运行，改",[56,159,104],{"code":104},"为",[56,162,163],{"code":163},"true","再启动。",[15,166,167],{},[18,168,169],{},"后续登录需要STMP发送邮件访问登录URL，如果没有那需要进后台找，我建议还是绑定STMP。",[110,171,173],{"id":172},"_1-配置环境变量","1. 配置环境变量",[61,175,178],{"className":176,"code":177,"language":66,"meta":67},[64],"export ASCIINEMA_SERVER_URL=https:\u002F\u002Fanm.sky233.top #CLI 3.x版本\nexport ASCIINEMA_API_URL=https:\u002F\u002Fanm.sky233.top #CLI 2.x版本\n",[56,179,177],{"__ignoreMap":67},[110,181,183],{"id":182},"_2-绑定用户","2.  绑定用户",[61,185,188],{"className":186,"code":187,"language":66,"meta":67},[64],"asciinema auth\n",[56,189,187],{"__ignoreMap":67},[18,191,192],{},[117,193],{"alt":194,"src":195},"image-20260418015549054","https:\u002F\u002Fimg.sky233.top\u002Fimg\u002F2026\u002F04\u002Fd86795581cb183f6201e31c9a5688911c8e0e03b02ca5425493b7ad5afc77b32.png",[18,197,198],{},"访问Url完成绑定。",[18,200,201],{},[117,202],{"alt":203,"src":204},"image-20260418015758865","https:\u002F\u002Fimg.sky233.top\u002Fimg\u002F2026\u002F04\u002Fbfc72e67ec355469ee15be9e89504693f7740ed0e0f9ca67b5be238284c3bcac.png",[110,206,208],{"id":207},"_3上传","3.上传",[61,210,215],{"className":211,"code":213,"language":214,"meta":67},[212],"language-zsh","➜  saa asciinema upload demo.cast\nView the recording at:\n\n    https:\u002F\u002Fanm.sky233.top\u002Fa\u002Fxxxxxxxxxxxxx\n","zsh",[56,216,213],{"__ignoreMap":67},[18,218,219],{},"访问url进行预览，可在网页配置查看权限，标题等其他信息。",[18,221,222],{},"查看权限有以下三个：",[224,225,226,229,232],"ul",{},[39,227,228],{},"私有",[39,230,231],{},"公开",[39,233,234],{},"只能通过链接查看。",[110,236,238],{"id":237},"_4-推流","4. 推流",[61,240,243],{"className":241,"code":242,"language":66,"meta":67},[64],"➜  saa asciinema stream -r\n::: asciinema session started\n::: Live streaming at https:\u002F\u002Fanm.sky233.top\u002Fs\u002Fxxxxxxxxx\n::: Press \u003Cctrl+d> or type 'exit' to end\n",[56,244,242],{"__ignoreMap":67},[18,246,247],{},"开启推流之后可以访问返回的url，实时查看终端操作。",[18,249,250],{},[117,251],{"alt":252,"src":253},"image-20260418152944989","https:\u002F\u002Fimg.sky233.top\u002Fimg\u002F2026\u002F04\u002F041e04e4011246473505410b3dbc9bc4099777a25d97818a058c69b1bc19b07e.png",[18,255,256],{},"推流后可点击网页右下角的配置权限。",{"title":67,"searchDepth":258,"depth":258,"links":259},4,[260,262,263,264],{"id":31,"depth":261,"text":31},2,{"id":50,"depth":261,"text":51},{"id":72,"depth":261,"text":73},{"id":90,"depth":261,"text":90,"children":265},[266,268,269,270,271],{"id":112,"depth":267,"text":113},3,{"id":172,"depth":267,"text":173},{"id":182,"depth":267,"text":183},{"id":207,"depth":267,"text":208},{"id":237,"depth":267,"text":238},[273],"代码","2026-04-18 15:34:30","讲述关于自部署个人使用的Asciinema服务端的故事，并根据Docker、Linux、自部署给出代码。",false,"md",null,{"slots":280},{},true,"\u002Fposts\u002Fc5d8bf3",{"text":284,"minutes":285,"time":286,"words":287},"4 min read",3.15,189000,630,{"title":5,"description":275},{"loc":282},"posts\u002F2026\u002F自部署个人使用的Asciinema服务端",[292,293,294],"Docker","Linux","自部署","tech","kq2XGYUCrg38xLLWPAHFQQxm7mjqiQVAR25Rxr71ADQ",[298,303],{"title":299,"path":300,"stem":301,"date":302,"type":295,"children":-1},"终端操作的录制与回放以及为技术博客添加动态终端演示","\u002Fposts\u002F70c0223","posts\u002F2026\u002FrecordTerminal","2026-04-14 23:07:05",{"title":304,"path":305,"stem":306,"date":307,"type":295,"children":-1},"🚲旧博客内容恢复","\u002F2024","posts\u002F2024\u002F旧博客内容恢复","2024-05-12",1776497848159]