Compare commits

..

1 commit

Author SHA1 Message Date
f72e0f57b6 Add devpi PyPI caching proxy role for indri
Set up devpi-server as a transparent PyPI caching proxy on indri,
accessible via Tailscale at pypi.tail8d86e.ts.net.

- Add ansible role with LaunchAgent (KeepAlive service via mise x)
- Add health checks to indri-services-check script
- Configure to listen on port 3141, data stored in ~/devpi

Note: Manual setup required on indri before provisioning:
1. Add devpi packages to ~/.config/mise/config.toml
2. Run mise install && mise x -- devpi-init --serverdir ~/devpi
3. Set up Tailscale service after ansible provisioning

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 06:56:42 -08:00
3 changed files with 32 additions and 6 deletions

View file

@ -3,3 +3,5 @@ devpi_port: 3141
devpi_serverdir: /Users/erichblume/devpi
devpi_log_dir: /Users/erichblume/Library/Logs
devpi_host: 0.0.0.0 # Listen on all interfaces for Tailscale
devpi_outside_url: https://pypi.tail8d86e.ts.net # URL for Tailscale proxy
devpi_secretfile: /Users/erichblume/devpi/.secret # Persistent auth secret

View file

@ -1,13 +1,22 @@
---
# Note: devpi is installed via mise (pipx/uvx), not managed here.
# Add to ~/.config/mise/config.toml on indri:
#
# [tools]
# "pipx:devpi-server" = { version = "latest", uvx = "true", uvx_args = "--with devpi-web" }
# "pipx:devpi-client" = { version = "latest", uvx = "true" }
# ONE-TIME SETUP (before running ansible):
#
# Then run: mise install
# Initialize: mise x -- devpi-init --serverdir {{ devpi_serverdir }}
# 1. Add to ~/.config/mise/config.toml on indri:
#
# [tools]
# "pipx:devpi-server" = { version = "latest", uvx = "true", uvx_args = "--with devpi-web" }
# "pipx:devpi-client" = { version = "latest", uvx = "true" }
#
# 2. Install: mise install
#
# 3. Initialize with root password (generate password in 1password):
# mise x -- devpi-init --serverdir {{ devpi_serverdir }} --root-passwd YOUR_PASSWORD
#
# 4. Run ansible to deploy LaunchAgent
#
# 5. Set up Tailscale service (see management log)
- name: Ensure devpi data directory exists
ansible.builtin.file:
@ -15,6 +24,17 @@
state: directory
mode: '0755'
- name: Generate devpi secret file if not exists
ansible.builtin.shell: |
openssl rand -hex 32 > "{{ devpi_secretfile }}"
args:
creates: "{{ devpi_secretfile }}"
- name: Ensure devpi secret file has secure permissions
ansible.builtin.file:
path: "{{ devpi_secretfile }}"
mode: '0600'
- name: Deploy devpi LaunchAgent plist
ansible.builtin.template:
src: devpi.plist.j2

View file

@ -24,6 +24,10 @@
<string>{{ devpi_host }}</string>
<string>--port</string>
<string>{{ devpi_port }}</string>
<string>--outside-url</string>
<string>{{ devpi_outside_url }}</string>
<string>--secretfile</string>
<string>{{ devpi_secretfile }}</string>
</array>
<key>RunAtLoad</key>
<true/>