后端【免费下载链接】reddithistorical code from reddit.com项目地址https://gitcode.com/gh_mirrors/re/reddit点击查看免费下载导读本指南围绕 reddit 开源仓库中的 install/README.md 展开系统梳理 reddit 在 Ubuntu 14.04trusty上从零搭建完整开发环境的安装脚本体系从单一入口脚本 install-reddit.sh 到install/目录下被拆分的十余个模块化脚本再到环境变量配置中枢 install/install.cfg。读完本文你将理解这套最小安装 完整安装双轨结构的演进动机、每个脚本的职责与调用顺序、关键配置项的语义与默认值以及如何在自己的 fork 分支上验证对安装脚本的改动。一、为什么要把安装脚本拆进install/目录按 install/README.md 的说明reddit 原本把整套安装逻辑全部塞在仓库根目录的install-reddit.sh单一大脚本里。但随着开发需求变化官方需要把镜像拆成两种形态基础安装器base installer用于 CI 自动化测试的最小安装覆盖尽可能短的安装链路完整安装器full installer供本地开发使用的全功能安装。为了复用和维护的便利安装逻辑被重组并打散到 install/ 目录下的多个独立脚本中而根目录的 install-reddit.sh 退化为一个入口/分发器。从该入口脚本头部注释可以看到它的定位reddit dev environment installer并且明确警告不要在用于其他用途的机器上执行因为它可能删除重要文件、清空数据库——这一点在评估是否在本机试跑时务必留意。入口脚本内部维护了一个NEEDED数组见 install-reddit.sh罗列了install/目录中所有必需脚本脚本职责done.sh安装完成后的提示与后续步骤install_apt.shapt 源配置与基础依赖安装install_cassandra.sh安装 Cassandra 并等待就绪install_services.sh安装 memcached/PostgreSQL/RabbitMQ 等服务install_zookeeper.sh安装 ZooKeeper 并等待就绪reddit.sh完整安装主流程clone、构建、配置、启动setup_cassandra.sh创建 keyspace 与 column familysetup_mcrouter.sh生成 mcrouter 路由配置setup_postgres.sh建库建用户并植入 SQL 函数setup_rabbitmq.sh配置 RabbitMQ 用户与权限travis.shTravis CI 最小安装测试README 特别强调如果向install/目录新增文件必须同步更新 install-reddit.sh 中的$NEEDED否则入口脚本在缺文件场景下不会拉取新脚本。入口脚本对缺失文件的处理逻辑是检测$SCRIPTDIR即install/下$NEEDED中每个脚本是否可执行、install.cfg是否存在若有缺失就提示看起来你在没有本地仓库的情况下安装随后从远程 master 分支逐一wget拉取缺失脚本并chmod x见 install-reddit.sh。这也是 README 中在干净 VM 上用 wget 方式测试能工作的底层原因。二、配置中枢install/install.cfg环境变量全解install/下几乎每个脚本的第一行实质性动作都是source $RUNDIR/install.cfg因此 install/install.cfg 是整个安装体系的配置单点。全部变量都遵循VAR${VAR:-默认值}的 Bash 惯用法允许通过环境变量覆盖例如 README 与 reddit.sh 注释中给出的示例sudo REDDIT_DOMAINexample.com ./install/reddit.sh各变量语义如下变量默认值含义与注意事项REDDIT_USER$SUDO_USER调用 sudo 的用户代码的属主用户安装器明确不推荐以 root 运行 redditREDDIT_GROUPnogroup运行 reddit 代码的组必须已存在REDDIT_HOME/home/$REDDIT_USER安装根目录必须已存在REDDIT_SRC$REDDIT_HOME/src源码存放目录各 git 仓库克隆于此REDDIT_DOMAINreddit.local访问域名必须包含点号否则浏览器不为此类无点域名写 Cookie没有别的可用时纯 IP 地址也可以REDDIT_PLUGINSabout gold需要安装的插件前提是宿主上存在符合命名与位置约定的插件目录APTITUDE_OPTIONS-y传给 apt-get 的通用选项CASSANDRA_SOURCES_LIST/etc/apt/sources.list.d/cassandra.sources.listDataStax Cassandra 源的 apt 列表文件路径后续install_cassandra.sh依赖此文件存在DEBIAN_FRONTENDnoninteractive使 apt 全程免交互值得指出的是reddit.sh在安装时会利用REDDIT_DOMAIN生成development.update中的domain与oauth_domain见 install/reddit.sh可见该变量会一路渗透到应用层配置直接影响站点对外可访问性与 OAuth 域名。三、第一层依赖与数据存储安装完整安装器 install/reddit.sh 在完成前置检查后按固定顺序调用四个安装脚本见 install/reddit.sh$RUNDIR/install_apt.sh # 基础包 $RUNDIR/install_cassandra.sh # Cassandra $RUNDIR/install_zookeeper.sh # ZooKeeper $RUNDIR/install_services.sh # 其余服务3.1install_apt.shapt 源与基础依赖install/install_apt.sh 的职责分三步加入 DataStax Cassandra 源把deb http://debian.datastax.com/community stable main写入$CASSANDRA_SOURCES_LIST并导入 repo key。脚本注释明确说明该文件不存在时install_cassandra.sh会反过来重新触发install_apt.sh。加入 reddit PPA先安装python-software-properties再apt-add-repository -y ppa:reddit/ppa随后通过/etc/apt/preferences.d/reddit写入 apt pin 配置Package: * Pin: release oLP-PPA-reddit Pin-Priority: 600优先级 600 意味着PPA 中存在的包会优先于其他仓库除非有更强的 pin这正是保证 reddit 依赖到定制版本的关键机制。 3.安装依赖清单先卸载 Travis 环境带来的系统版libmemcached避免与 PPA 版本冲突随后用 here-doc 配合xargs apt-get install一次性装入全部 Python 依赖与工具链。这份清单里值得注意的有Web 框架层python-pylons、python-routes、python-pyramid、python-flask数据层python-sqlalchemy、python-psycopg2PostgreSQL、python-pycassaCassandra 客户端、python-redis消息与异步python-amqplibRabbitMQ、python-kazooZooKeeper、python-gevent、python-gevent-websocket、python-haigha缓存python-pylibmc1.2.2-1~trusty5注意锁定了精确版本号、python-boto富文本与前端工具链python-snudown、python-l2cs、python-tinycss2、nodejs、node-less、node-uglify、optipng、jpegoptim其它python-bcrypt、python-stripe、geoip-bin、geoip-database、python-geoip、python-raven3.2install_cassandra.sh锁定 Cassandra 1.2.19install/install_cassandra.sh 的逻辑很能体现版本锁定的工程策略检查$CASSANDRA_SOURCES_LIST是否存在不存在则回退执行install_apt.shapt-get install cassandra1.2.19精确指定版本apt-mark hold cassandra把版本钉死脚本注释说明我们还不打算升到 C* 2.0Cassandra 安装后不会自动启动手动service cassandra start用nc -vz localhost 9160轮询 Thrift 端口直到连通才退出。3.3install_zookeeper.sh安装 zookeeperdinstall/install_zookeeper.sh 最为精简apt-get install zookeeperd后同样以nc -vz localhost 2181轮询等待就绪。ZooKeeper 在 reddit 体系中承担配置协调职责——从源码结构看r2/r2/lib/zookeeper.py 的存在印证了应用运行时对 ZooKeeper 的实际依赖。3.4install_services.shmemcached/PostgreSQL/RabbitMQ 等install/install_services.sh 一次性安装mcrouter、memcached、postgresql、postgresql-client、rabbitmq-server、haproxy、nginx、gunicorn、redis-server然后轮询三个端口确认服务可用脚本注释给出了端口含义端口服务11211memcache5432postgres5672rabbitmqmcrouter的管理端口5050、WebSocket 服务的9001、activity 服务的9002则在后续配置阶段由各脚本负责。四、第二层服务配置脚本服务装完后reddit.sh依次执行四个 setup 脚本见 install/reddit.shsetup_cassandra.sh→setup_postgres.sh→setup_mcrouter.sh→setup_rabbitmq.sh。4.1setup_cassandra.sh调栈、建 keyspaceinstall/setup_cassandra.sh 做两件事调整 JVM 线程栈sed -i -e s/-Xss180k/-Xss256k/g /etc/cassandra/cassandra-env.sh因为降到 1.2.11 后默认 180k 过低初始化 schema用内嵌 Python 脚本通过pycassa.SystemManager(localhost:9160)幂等创建keyspaceredditSimpleStrategyreplication_factor1单机开发环境无副本column familypermacache。幂等性体现在两处if ... not in ...判断重复执行不会报错。4.2setup_postgres.sh建库建用户 六个核心 SQL 函数install/setup_postgres.sh 先查询pg_database判断reddit库是否已存在避免重复建库不存在则以 UTF-8 编码、template0模板、en_US.utf8排序规则创建数据库并创建口令为password的reddit用户。随后无条件执行create or replace语句植入 reddit 排名体系依赖的六个 PostgreSQL 函数函数作用hot(ups, downs, date)红迪热帖排序核心算法对数 时间衰减的经典公式score(ups, downs)简单的赞成减反对controversy(ups, downs)争议度评分ip_network(ip)截取 IP 前三段用于网络聚合统计base_url(url)归一化 URL 去协议/子域domain(url)从 URL 提取域名这些函数直接对应 r2/r2/lib/db/sorts.py 中排序逻辑的数据库侧实现是理解 reddit 排序机制时不可跳过的一环。4.3setup_mcrouter.sh生成 memcache 路由配置install/setup_mcrouter.sh 生成两个文件/etc/mcrouter/global.conf核心是一张PrefixSelectorRoute策略表把 reddit 应用层使用的全部缓存 key 前缀rend:、page:、pane:、sr:、account:、link:、comment:、message:、campaign:、award:、trophy:、flair:、friend:、inboxcomment:、inboxmessage:、reportlink:、reportcomment:、reportsr:、reportmessage:、modinbox:、otp:、captcha:、queuedvote:、geoip:、geopromo:、srpromos:、rising:、srid:、defaultsrs:、featuredsrs:、query:、rel:、srmember:、srmemberrel:等三十余个统一路由到本地 memcached127.0.0.1:11211ascii 协议并配置wildcard兜底池。从这些前缀可以反推 reddit 缓存对象覆盖了页面、subreddit、帖子、评论、私信、广告活动、奖项、徽章、flair、好友关系、举报、验证码、投票、IP 地理、流行榜、订阅关系等几乎全部领域。/etc/default/mcrouter写入启动参数含-f配置文件、-p 5050管理端口、--stats-root/var/mcrouter/stats等再写 upstart override 让 mcrouter 随 reddit 启动最后service mcrouter restart使配置生效。4.4setup_rabbitmq.shvhost、用户与权限install/setup_rabbitmq.sh 依次确保/vhost 存在add_vhost /、确保reddit用户存在默认口令reddit、为/vhost 上的reddit用户授予.* .* .*全权限、启用rabbitmq_management插件最后重启服务。reddit用户、reddit口令的组合与上文的 PostgreSQL 保持一致体现了开发环境统一弱口令、单机信任的简化取向。五、第三层reddit 应用本体安装reddit.shinstall/reddit.sh 是完整安装器的主流程前置检查之外核心步骤依次为5.1 前置检查脚本依次校验必须 root 执行、REDDIT_USER必须显式给出直接以 root 跑会被拒绝、CPU 架构必须amd64依赖 PPA 预编译包与 liveupdate 的 ID 生成、系统必须恰好是Ubuntu 14.04/etc/lsb-release判定PPA 只为 trusty 构建、内存至少 2GB不足时交互确认是否继续。5.2 克隆源码仓库按$REDDIT_SRC下reddit、i18n、reddit-service-websockets、reddit-service-activity四个仓库依次 clone均以$REDDIT_USER身份执行并把每个仓库的upstart/目录拷贝到/etc/init/——这正是仓库根目录 upstart/ 下大量reddit-consumer-*.conf、reddit-job-*.conf文件在安装时被部署到系统的方式。5.3 构建与配置生成对每个仓库执行python setup.py build与python setup.py develop --no-deps在i18n目录make clean all生成翻译二进制在r2目录make clean pyx编译 Cython 扩展对应 r2/r2/lib/db/_sorts.pyx、r2/r2/lib/utils/_utils.pyx 等*.pyx源文件生成development.update若已存在则仅替换plugins/domain/oauth_domain三行内容要点包括debug true附警告Pylons stacktrace 允许远程代码执行公网服务器必须置 false、disable_ads/captcha/ratelimit/require_admin_otp true、media_provider filesystem、[server:main] port 8001make ini依据 update 文件产出development.ini并软链run.ini。5.4 运维辅助脚本安装器向/usr/local/bin写入六个 helperinstall/reddit.sh命令作用reddit-runpaster --pluginr2 run run.ini执行应用命令reddit-shell进入 Pylons shell 交互环境reddit-start/reddit-stop通过 upstart 事件启停整个栈reddit-restart支持TARGET参数定向重启如reddit-restart scraper_qreddit-flush向本地 memcache 发flush_all清缓存5.5 Web 接入层nginx、haproxy、click/geoip 服务click 服务器以 gunicorn 运行scripts/tracker:application--bindunix:/var/opt/reddit/click.sock --workers1承接点击统计nginx配置reddit-media监听 9000alias 到/srv/www/media/、reddit-pixel监听 8082/pixel/of_重写为pixel.png/click反代到 click 的 unix socket、reddit-ssl443snakeoil 证书支持 WebSocket Upgrade 头同时把scripts/production.ini软链到 r2 的development.ini供 Flask tracker 使用haproxyinstall/reddit.sh替换原有配置前会先备份前端绑定0.0.0.0:80与127.0.0.1:8080按 ACL 分流——WebSocket 升级请求→websockets后端localhost:9001、/media/→medialocalhost:9000、/pixel/与/click→pixellocalhost:8082、其余→reddit后端localhost:8001roundrobinmaxconn 30并在 8080 端口注入X-Forwarded-Proto: httpswebsockets / activity 服务分别用baseplate-serve2 --bind localhost:9001、localhost:9002启动配 upstart 文件的respawn与respawn limit 10 5geoip 服务gunicorn 单 worker 跑scripts/geoip_service:application127.0.0.1:5000。5.6 消费者Queue Processor与 Cron写入/etc/default/reddit导出REDDIT_ROOT、REDDIT_INI、REDDIT_USER、REDDIT_GROUP、REDDIT_CONSUMER_CONFIG在$REDDIT_HOME/consumer-count.d/下按队列写入消费者数量search_q 0、automoderator_q 0其余del_account_q/scraper_q/markread_q/commentstree_q/newcomments_q/vote_link_q/vote_comment_q/butler_q/author_query_q/subreddit_query_q/domain_query_q均为 1这些队列名与 upstart/ 下的reddit-consumer-*.conf一一对应写入/etc/cron.d/reddit部署定时任务如update_sr_names每日 3:00、update_reddits每日 16:30、update_promos每小时、clean_up_hardcache每 5 分钟、broken_things每 2 分钟、rising每 2 分钟、trylater每小时以及compute_time_listings link/comment year每 15 分钟重算年度热榜最终以reddit-run -c print ok done触发首次数据库初始化避免多进程并发建表竞争再initctl emit reddit-stop/reddit-start启动整栈。六、安装收尾与后续操作done.shinstall/done.sh 在全部安装结束后打印运维指引核心内容包括查看运行中的组件sudo initctl list | grep redditcron 任务以reddit-job-开头、队列处理器以reddit-consumer-开头均由/etc/cron.d/reddit管理重启全部或定向消费者sudo reddit-restart/sudo reddit-restart scraper_q整体停机/启动sudo reddit-stop/sudo reddit-start缓存异常时刷新 memcachereddit-flush配置域名解析确保$REDDIT_DOMAIN解析到本机典型做法是改宿主机/etc/hosts安装器自身不处理灌入测试数据cd $REDDIT_SRC/reddit reddit-run scripts/inject_test_data.py -c inject_test_data()灌库或自建 subreddit 后立即手动执行reddit-job-update_reddits刷新 subreddit 索引。七、安装脚本改动的测试策略README 明确了改动安装脚本时的两条验证路径CI 最小验证Travis 只执行 install/travis.sh 覆盖最小安装链路不会跑完整安装——因此在本地改完脚本后务必在全新 VM 上做一次完整安装验证最基础的安装场景按以下流程从 fork 分支拉取入口脚本并执行命令中的占位符按你的 fork 与测试分支替换wget https://你的fork仓库地址/reddit/测试分支/install-reddit.sh chmod x install-reddit.sh ./install-reddit.sh这条链路之所以能成立正是得益于入口脚本缺文件自动远程拉取$NEEDED的设计——即使本地没有完整仓库只要网络可达入口脚本也能自举出整套安装器。此外仓库中还有 install/drone.sh 用于 Drone CI 场景travis.sh与drone.sh的存在说明该安装体系从一开始就考虑了多种 CI 环境的可复现性。八、模块化安装体系的工程启示回看 install/README.md 与整套脚本可以提炼出几个可迁移的工程实践单入口 可自举入口脚本维护$NEEDED清单、缺件即远程补拉让最小场景裸 wget与完整场景本地仓库共用同一套安装器配置单点化所有脚本统一source install.cfg环境变量可覆盖避免把配置散落在各脚本中版本锁定Cassandra 精确到1.2.19并用apt-mark hold钉死、python-pylibmc1.2.2-1~trusty5锁版本配合 PPA pin 优先级 600保证依赖组合可复现幂等与等待建库、建 keyspace、建用户均带存在性判断每个服务安装后都用nc -vz轮询端口就绪杜绝装完即用的竞态改动守则向install/新增文件必须同步更新install-reddit.sh的$NEEDED这是 README 中唯一明确的协作约束。这套脚本体系是理解 reddit 生产栈PostgreSQL Cassandra ZooKeeper RabbitMQ memcached/mcrouter nginx/haproxy Pylons 应用如何被一键组装的最佳入口也是复刻同类高并发社区站点部署流程的宝贵范本。赞分享后端【免费下载链接】reddithistorical code from reddit.com项目地址https://gitcode.com/gh_mirrors/re/reddit点击查看免费下载相关推荐从零开始RELION冷冻电镜软件完整安装与使用指南 从零开始RELION冷冻电镜软件完整安装与使用指南 你是否对结构生物学研究感兴趣想要解析蛋白质的3D结构却不知从何入手今天我要向你介绍一款在冷冻电镜oh-my-openagent 的 Codex 安装引擎src/install 目录架构与 lazycodex 安装/升级机制深度解析oh my openagent 的 Codex 安装引擎src/install 目录架构与 lazycodex 安装/升级机制深度解析 本文聚焦 oh my人工智能AI Agent代码智能体多智能体MCP ClientsAgent 编排pnpm 重建已安装包构建脚本深入解析 pnpm/building.after-installpnpm 重建已安装包构建脚本深入解析 pnpm/building.after install pnpm/building.after install 是包管理器开发工具CLI上一篇Invidious 缓存完整指南如何让实例页面加载更快下一篇终极音频路由解决方案Windows多设备音频管理完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?