十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

piku 安装完全指南:三步在自己的 Linux 服务器上搭起微型 PaaS

piku 安装完全指南:三步在自己的 Linux 服务器上搭起微型 PaaS piku 安装完全指南三步在自己的 Linux 服务器上搭起微型 PaaS【免费下载链接】pikuThe tiniest PaaS youve ever seen. Piku allows you to do git push deployments to your own servers.项目地址: https://gitcode.com/GitHub_Trending/pi/piku导读piku 是一个你见过的最小的 PaaS——它允许你像使用 Heroku 一样通过git push把应用部署到自己的任意一台 Linux 服务器哪怕是 256MB 内存的树莓派上。本文以官方 docs/INSTALL.md 为骨架结合仓库源码 piku.py 与 systemd 服务单元完整讲解 piku 的三类安装方式、手动安装的每一步命令与输出、SSH 公钥接入的底层原理以及安装后的验证与开机自启配置。读完本文你将能够独立在一台全新服务器上完成 piku 的安装、SSH 认证接入并成功跑通第一条ssh pikuhost命令。安装前的准备环境要求与前置依赖根据官方文档运行 piku 需要以下四样东西Python 3具体而言是Python 3.10 及以上参见下文源码校验逻辑[uWSGI]作为通用进程管理器与nginx之后的应用网关ssh含sshd服务与 ssh 客户端用于免密登录与gitover ssh一个运行systemd的 Linux 发行版例如 Raspbian Jessie、Debian 8、Ubuntu、Fedora、CentOS。这里有一个值得注意的细节虽然文档笼统地说需要 Python 3但源码在入口处做了硬性版本断言。查看 piku.py 的开头try: from sys import version_info assert version_info (3, 10) except AssertionError: exit(Piku requires Python 3.10 or above)也就是说如果服务器的系统 Python 低于 3.10piku 脚本会直接拒绝启动。这与 docs/FAQ.md 中的说明一致Piku requires Python 3.10 or above to run (it can deploy apps using any Python version)——运行 piku 本体需要 3.10但它部署的应用可以使用任意 Python 版本例如通过PYTHON_VERSION环境变量为每个应用单独指定 3、3.12 或 3.13详见 docs/ENV.md。另外需要澄清一个常见的误解piku 本体是一个无依赖的单文件脚本piku.py约 1500 行可读代码并不通过 pip 安装。仓库根目录的 requirements.txt 顶部明确写着THIS FILE IS ONLY USED FOR AUTOMATED TESTS - PIKU DOES NOT RELY ON THESE AS PIP INSTALLED PACKAGES其中列出的click、uwsgi、virtualenv仅服务于自动化测试生产环境安装 piku 不需要执行pip install只需把piku.py放到用户主目录即可。快速安装TL;DR如果服务器已经完成基础配置有 root 权限、系统是新装的 Debian/Ubuntu 之类最快的方式是以root身份 SSH 登录后执行官方一键脚本curl https://piku.github.io/get | sh这条命令的本质是调用piku-bootstrap项目来自动化完成下文手动安装中的所有步骤创建用户、下载脚本、配置 SSH 等。如果你的服务器尚未配置或者想完全掌控每个安装环节请继续阅读下面的三种安装方式。三种主流的安装方式官方文档给出了 3 条主要安装路径外加一个 Ansible 方案按场景选择即可方式适用场景说明piku-bootstrap服务器已经准备好可 SSH 登录上面的 TL;DR 一键命令就是用它实现的cloud-initVPS 创建/构建阶段在云厂商的构建阶段自动执行无需人工登录手动安装完全可控、想了解内部结构本文第四节将逐行展开Ansible playbook批量、可重复的服务器运维官方提供了 ansible-setup 剧本提示官方文档还邀请社区成员为特定 Linux 发行版贡献自己的安装说明。如果你在非 Debian/Ubuntu 系的发行版如 Fedora、CentOS上安装成功也可以向 piku 项目补充对应文档。手动安装分步详解这是本文的核心。手动安装一共四步创建系统用户 → 下载并初始化 piku.py → 配置 SSH 公钥 → 验证。第一步创建 piku 专用用户piku 出于安全考虑要求使用一个独立的、非 root 的系统账号来运行。官方推荐将用户加入系统自带的www-data组这是一个权限较低的组适合作为运行用户组# 选择一个用户名可按需修改 export PAAS_USERNAMEpiku # 创建用户无密码、无登录 shell 交互、加入 www-data 组 sudo adduser --disabled-password --gecos PaaS access --ingroup www-data $PAAS_USERNAME # 切换到该用户下载 piku.py 并执行初始化 sudo su - $PAAS_USERNAME -c wget https://raw.githubusercontent.com/piku/piku/master/piku.py python3 ~/piku.py setup注意最后一条命令中的python3 ~/piku.py setup这里直接以python3解释器运行脚本并传入setup子命令其作用见下一步。第二步理解piku.py setup到底做了什么执行完setup后官方文档给出的输出如下Creating /home/piku/.piku/apps. Creating /home/piku/.piku/repos. Creating /home/piku/.piku/envs. Creating /home/piku/.piku/uwsgi. Creating /home/piku/.piku/uwsgi-available. Creating /home/piku/.piku/uwsgi-enabled. Creating /home/piku/.piku/logs. Setting /home/piku/piku.py as executable.结合源码 piku.py 中的cmd_setup()实现可以看到它实际上完成了三件事1. 创建 piku 的全部数据目录。依次创建~/.piku下的apps、cache、data、repos、envs、uwsgi、uwsgi-available、uwsgi-enabled、logs、nginx十个目录。这些目录对应 piku.py 中的全局常量各有分工目录相对~/.piku用途apps每个应用的代码工作目录git 检出结果repos每个应用的裸 git 仓库接收git pushenvs每个应用隔离的运行环境virtualenv / GOPATH / node_modules 等uwsgiuWSGI Emperor 自身配置与日志uwsgi-available/uwsgi-enabled应用的 uWSGI 配置模板available与启用的符号链接enabledlogs各应用运行日志nginx生成的 nginx 站点配置、SSL 证书等2. 生成 uWSGI Emperor 配置文件。cmd_setup()会向~/.piku/uwsgi/uwsgi.ini写入一份 emperor 模式配置关键项包括[uwsgi] chdir /home/piku/.piku/uwsgi emperor /home/piku/.piku/uwsgi-enabled log-maxsize 1048576 logto /home/piku/.piku/uwsgi/uwsgi.log socket /home/piku/.piku/uwsgi/uwsgi.sock uid piku gid www-data enable-threads true threads CPU核数 × 2Emperor 是 uWSGI 的皇帝-仆从模式Emperor 进程监视uwsgi-enabled目录每出现一个应用的.ini符号链接就自动拉起对应的应用进程vassal。这正是 piku 实现多个应用互相隔离、独立启停的进程级基础。3. 将 piku.py 标记为可执行。脚本会检查自身是否具有执行位如果没有则补上chmod x见 piku.py。这一步使后续通过 SSH 的command包装直接调用piku.py成为可能见第四步。第三步配置 SSH 公钥访问piku 通过 SSH 公钥完成身份认证并在authorized_keys中把每个公钥绑定到 piku 脚本上。**在你的本机而非服务器**生成 SSH 密钥对如果你还没有的话ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/youruser/.ssh/id_rsa): Created directory /home/youruser/.ssh. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/youruser/.ssh/id_rsa. Your public key has been saved in /home/youruser/.ssh/id_rsa.pub. The key fingerprint is: 85:29:07:cb:de:ad:be:ef:42:65:00:c8:d2:6b:9e:ff youruseryourlaptop.lan The keys randomart image is: --[ RSA 2048]---- ... -----------------然后把公钥文件id_rsa.pub注意不是私钥id_rsa上传到服务器例如放在/tmp/id_rsa.pub再以 piku 用户执行sudo su - piku python3 piku.py setup:ssh /tmp/id_rsa.pub Adding key 85:29:07:cb:de:ad:be:ef:42:65:00:c8:d2:6b:9e:ff.查看~/.ssh/authorized_keys你会看到一条经过特殊包装的记录sudo su - piku cat .ssh/authorized_keys commandFINGERPRINT85:29:07:cb:de:ad:be:ef:42:65:00:c8:d2:6b:9e:ff NAMEdefault /home/piku/piku.py $SSH_ORIGINAL_COMMAND,no-agent-forwarding,no-user-rc,no-X11-forwarding,no-port-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDhTYZi/... youruseryourlaptop.lan这条记录就是 piku 免密远程控制的全部秘密对应源码中的setup_authorized_keys()函数piku.pycommand强制重定向任何使用这把公钥发起的 SSH 会话其命令都会被替换为/home/piku/piku.py $SSH_ORIGINAL_COMMAND也就是说远程用户只能执行 piku 的命令集无法在服务器上为所欲为FINGERPRINT... NAMEdefault这两个环境变量在后续多钥匙管理如区分不同开发者的部署来源时使用no-agent-forwarding,no-user-rc,no-X11-forwarding,no-port-forwarding关闭所有可能扩大攻击面的 SSH 特性把公钥的权限严格限制在只能操作 piku权限收紧setup_authorized_keys()还会把~/.ssh设为0700、authorized_keys设为0600piku.py符合 SSH 的安全要求。值得一提的细节setup:ssh还支持从标准输入读取公钥。当参数为-时cmd_setup_ssh()会把 stdin 内容写入临时文件再走同一套逻辑见 piku.py例如cat id_rsa.pub | python3 piku.py setup:ssh -方便管道场景。第四步验证安装回到你的本机尝试登录 piku 用户ssh pikupi.lan如果一切正常你看到的将不是 shell 提示符而是 piku 的 CLI 帮助信息Usage: piku.py [OPTIONS] COMMAND [ARGS]... The smallest PaaS youve ever seen Options: --help Show this message and exit. Commands: apps List applications config Show application configuration config:get Retrieve a configuration setting config:live Show live configuration settings config:set Set a configuration setting deploy Deploy an application destroy Destroy an application disable Disable an application enable Enable an application logs Tail an application log ps Show application worker count ps:scale Show application configuration restart Restart an application setup Initialize paths setup:ssh Set up a new SSH key Connection to pi.lan closed.这正是上一步command包装的效果登录即进入 piku 命令分发执行完命令后连接自动关闭不会给你留下任何系统 shell。这些命令由 piku.py 中的 Click 命令行组piku()定义每一个都对应源码中的cmd_*函数例如config:set写配置后会触发一次重新部署piku.pyapps会列出所有应用并标记运行状态piku.py。安装收尾让 piku 随系统自启手动安装步骤本身不会注册开机自启。piku 仓库提供了现成的 systemd 单元文件安装完成后应将其部署到/etc/systemd/system/并启用1. uWSGI Emperor 服务uwsgi-piku.service[Unit] DescriptionPiku uWSGI Emperor Aftersyslog.target [Service] ExecStart/usr/local/bin/uwsgi-piku --ini /home/piku/.piku/uwsgi/uwsgi.ini Userpiku Groupwww-data RuntimeDirectoryuwsgi-piku Restartalways KillSignalSIGQUIT Typenotify StandardErrorsyslog NotifyAccessall [Install] WantedBymulti-user.target可以看到它以piku用户身份运行 Emperor指向setup生成的uwsgi.ini并且Restartalways保证 Emperor 崩溃后自动拉起。2. nginx 热重载服务piku-nginx.path 与 piku-nginx.service# piku-nginx.path监视 ~/.piku/nginx 目录变化 [Unit] DescriptionRestarts NGINX when .piku/nginx changes. [Service] Typesimple ExecStart/usr/bin/systemctl reload nginxpiku 在每次部署或修改配置时会重写~/.piku/nginx下的站点文件这个 path 单元监听到变化后自动执行systemctl reload nginx实现 nginx 配置的热更新无需人工干预。启用方式与常规 systemd 服务一致sudo systemctl enable --now uwsgi-piku sudo systemctl enable --now piku-nginx.path此外如果服务器上还没有 nginx还需要按发行版方式安装 nginx 与 uWSGIDebian/Ubuntu 下为apt install nginx uwsgi uwsgi-plugin-python3等并将uwsgi-piku脚本放到 PATH 中。完整的部署验证可以参考仓库根目录的 README.md 中描述的工作流添加 git remote →git push piku master→ piku 自动检测运行时、安装依赖、按 Procfile 启动 worker。安装后的常见问题结合 docs/FAQ.md安装阶段最常见的几个疑问为什么要单独建一个 piku 用户piku 的理念是运行在低端设备上、向爱好者与学校开放独立低权限用户 SSH 命令重定向可以在不引入容器的情况下获得合理的隔离与安全边界。为什么 piku 本体用 Python 写官方 FAQ 的解释是最初也考虑过 Go但click命令行框架很契合需求而且无论如何都需要 uWSGI于是选择了 Python。这也解释了为什么 piku 的 CLI 输出风格如-----前缀带有浓厚的 Heroku buildpack 色彩。为什么不用 Docker / dokkupiku 诞生于 2016 年当时 Docker 在 ARM 架构树莓派上尚未成熟而 piku 的核心目标恰恰是让树莓派这类小设备也能跑起 PaaS。它选择直接复用系统的 Python、nginx、uWSGI 等发行版软件包从而把依赖降到最低。结语至此你已经完成了 piku 的完整安装链路创建www-data组的专用账号、运行setup生成目录与 uWSGI Emperor 配置、通过setup:ssh注入受约束的公钥、用ssh pikuhost验证 CLI 可用并注册了 uWSGI 与 nginx 热重载两个 systemd 服务。下一步就可以参照 README.md 中的工作流添加 git remote 并推送你的第一个应用了。如果安装中遇到发行版特有问题欢迎参考仓库中的 docs/FAQ.md、docs/ENV.md 等文档或为特定平台补充安装说明。【免费下载链接】pikuThe tiniest PaaS youve ever seen. Piku allows you to do git push deployments to your own servers.项目地址: https://gitcode.com/GitHub_Trending/pi/piku创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表