Poetry proxy: cấu hình biến môi trường và sửa lỗi kết nối PyPI
Poetry proxy là cách cho trình quản lý gói Poetry của Python tải metadata và gói cài đặt từ PyPI qua một máy trung gian. ProxyVN chạy thật Poetry 2.5.1 qua proxy HTTP và SOCKS5 tự dựng có mật khẩu, tới PyPI thật, ghi nguyên văn từng lỗi. Bài chỉ cách khai báo đúng và cách đọc thông báo lỗi mà Poetry hay che mất nguyên nhân thật.
Poetry proxy hoạt động theo cách nào
Poetry không có mục cấu hình proxy riêng
Nhiều người mở poetry config tìm mục proxy và không thấy. Mình thử lệnh poetry config http-proxy kèm địa chỉ proxy, Poetry trả lời ngay Setting http-proxy does not exist. Danh sách cấu hình của Poetry không có khóa nào cho proxy.
Poetry gửi request mạng qua thư viện requests. requests tự đọc các biến môi trường HTTP_PROXY, HTTPS_PROXY, ALL_PROXY và NO_PROXY như mô tả trong tài liệu nâng cao của requests. Đọc mã nguồn Poetry 2.5.1, hàm request trong tệp authenticator.py gọi merge_environment_settings của requests, tức là lấy proxy từ môi trường. Nói gọn: proxy của Poetry chính là biến môi trường của tiến trình chạy Poetry.
Hiểu điểm này thì mọi thứ còn lại dễ đoán. Đặt biến ở cửa sổ dòng lệnh nào thì Poetry trong cửa sổ đó dùng proxy. Mở cửa sổ mới chưa có biến thì Poetry đi thẳng. Trên máy CI, biến khai ở bước nào thì có tác dụng ở bước đó.
Poetry gọi những máy nào
Khi chạy poetry lock với một gói lấy từ PyPI, nhật ký proxy của mình ghi hai đích: pypi.org cổng 443 để đọc danh sách phiên bản, và files.pythonhosted.org cổng 443 để tải tệp gói. Cả hai đều là HTTPS. Khi chạy poetry install, Poetry lại tải tệp gói từ files.pythonhosted.org, lần này mình thấy hai kết nối tới máy này.
Nếu dự án có nguồn gói riêng khai trong mục source của pyproject.toml, Poetry gọi thêm máy chủ đó. Mọi đích đều là HTTPS trong đa số trường hợp, nên biến quan trọng nhất là HTTPS_PROXY.
Môi trường thử trong bài
Mình chạy trên Windows 10, Python 3.12, Poetry 2.5.1 cài trong một môi trường ảo riêng, kèm requests 2.34.2 và urllib3 2.8.0. Proxy thử là một chương trình Python tự viết: cổng 8912 nói HTTP, cổng 8913 nói SOCKS5, cả hai yêu cầu tài khoản qa_user với mật khẩu p@ss#2026. Một proxy thứ hai cố ý chờ 20 giây trước khi trả lời để thử thời gian chờ.
Dự án thử chỉ có một phụ thuộc là six. Mỗi lần chạy dùng thư mục dự án và thư mục cache riêng qua biến POETRY_CACHE_DIR. Nếu không làm vậy, lần chạy sau sẽ lấy dữ liệu từ cache và không đi qua mạng, kết quả thử sẽ sai. Đích là PyPI thật, không có proxy thương mại, không thử nguồn gói riêng có chứng chỉ tự ký.

HTTPS_PROXY mới áp dụng cho PyPI
Cấu hình Poetry proxy bằng biến môi trường
Khai báo trên PowerShell, CMD và bash
Trên PowerShell, biến đặt bằng $env và chỉ sống trong cửa sổ hiện tại:
$env:HTTPS_PROXY = 'http://qa_user:p%40ss%232026@203.0.113.10:8080'
$env:HTTP_PROXY = 'http://qa_user:p%40ss%232026@203.0.113.10:8080'
poetry lock
Trên CMD, dùng lệnh set HTTPS_PROXY=... không có dấu nháy. Trên bash của Linux, macOS hay Git Bash, dùng export HTTPS_PROXY='...' với dấu nháy đơn. Nếu cần biến tồn tại lâu dài trên Windows, lệnh setx ghi vào hồ sơ người dùng, nhưng chỉ cửa sổ mở sau đó mới thấy. Bài PowerShell proxy có thêm cách đặt và xóa biến proxy trên Windows.
Lần chạy có cả hai biến của mình thành công sau 5,4 giây. Nhật ký proxy ghi một CONNECT tới pypi.org và một tới files.pythonhosted.org, cả hai có tài khoản đúng.
Chỉ đặt HTTP_PROXY là đi thẳng
Lỗi khai báo phổ biến nhất là chỉ đặt HTTP_PROXY vì nghĩ chữ HTTP bao luôn HTTPS. Mình chạy poetry lock với đúng một biến HTTP_PROXY. Lệnh thành công sau 4,1 giây, nhưng nhật ký proxy trống trơn. Toàn bộ request tới PyPI đi bằng IP của máy.
Nguy hiểm ở chỗ không có lỗi nào báo. Trên máy có Internet tự do, anh em sẽ tưởng proxy đã chạy. Chỉ khi máy nằm trong mạng bắt buộc dùng proxy, lỗi mới hiện ra dưới dạng không kết nối được. HTTP_PROXY chỉ áp dụng cho đích http://, còn PyPI là https://, nên biến cần đặt là HTTPS_PROXY.
Mã hóa mật khẩu có ký tự đặc biệt
Biến proxy là một địa chỉ URL. Mật khẩu có @, #, :, / hay % phải mã hóa phần trăm: @ thành %40, # thành %23, : thành %3A, / thành %2F, % thành %25. Mật khẩu p@ss#2026 trở thành p%40ss%232026. requests tự giải mã trước khi gửi tiêu đề xác thực, proxy nhận đúng mật khẩu gốc.
Trong Python, hàm urllib.parse.quote với safe rỗng làm việc này. Viết một dòng in ra chuỗi đã mã hóa rồi dán vào biến, đỡ phải tự đổi tay. Bài định dạng proxy hướng dẫn đổi chuỗi ip:port:user:pass của nhà cung cấp sang dạng URL.
NO_PROXY tách đường cho từng máy
Biến NO_PROXY liệt kê các máy đi thẳng, cách nhau bằng dấu phẩy. Mình thử NO_PROXY=pypi.org cùng HTTPS_PROXY. Kết quả lock thành công, nhật ký proxy chỉ còn một CONNECT tới files.pythonhosted.org. Tức là trang danh sách gói đi thẳng, còn tệp gói vẫn qua proxy.
Ví dụ này cho thấy đặt NO_PROXY cho một máy không có nghĩa là cả quá trình cài đi thẳng. Muốn PyPI đi thẳng hẳn, phải liệt kê cả pypi.org và files.pythonhosted.org. Ngược lại, trong công ty có kho gói nội bộ, NO_PROXY nên chứa tên kho nội bộ để Poetry không gửi tài khoản proxy ra ngoài cho một máy trong mạng.
Kiểm Poetry đang thấy proxy nào
Trước khi chạy Poetry, nên xem requests sẽ chọn proxy nào cho từng địa chỉ. Đoạn dưới chạy bằng chính Python của môi trường Poetry, in proxy cho ba địa chỉ mà không gửi request nào:
import urllib.request
import requests.utils as u
print(urllib.request.getproxies())
for url in ["https://pypi.org/simple/six/", "https://pypi.noibo.local/simple/"]:
print(url, "->", u.get_environ_proxies(url) or "di thang")
Mình chạy với HTTPS_PROXY trỏ tới proxy thử và NO_PROXY gồm localhost, 127.0.0.1 và pypi.noibo.local. Địa chỉ pypi.org nhận proxy 127.0.0.1:8912. Địa chỉ pypi.noibo.local in ra đi thẳng vì nằm trong NO_PROXY. Khi in ra màn hình chia sẻ cho người khác, nhớ cắt phần mật khẩu trước dấu @.
Cách kiểm này bắt được hai lỗi hay gặp mà không cần chờ Poetry thử lại 6 lần. Một là biến chưa có trong cửa sổ đang chạy. Hai là NO_PROXY vô tình chứa tên máy cần đi qua proxy. Trên Windows, tên biến không phân biệt hoa thường, nên https_proxy và HTTPS_PROXY là một biến.
Lỗi Poetry proxy hiện thành All attempts to connect failed
Thông báo mặc định che nguyên nhân thật
Đây là điểm gây mất thời gian nhất. Với mọi lỗi kết nối mình thử, từ sai mật khẩu, sai cổng tới thiếu thư viện SOCKS, Poetry in cùng một khung: All attempts to connect to pypi.org failed. Bên dưới là mục Probable Causes liệt kê máy chủ không phản hồi, DNS không phân giải được tên máy, mạng không có Internet.
Không có chữ proxy nào trong danh sách nguyên nhân. Người đọc lần đầu sẽ đi kiểm DNS và đường mạng, trong khi lỗi nằm ở chuỗi proxy. Dòng cuối có gợi ý chạy lại với -v. Đó mới là lối ra.
Thêm -vvv để thấy lỗi gốc
Chạy lại cùng lệnh với poetry lock -vvv, Poetry in thêm một dòng bắt đầu bằng HTTPSConnectionPool. Dòng này chứa lỗi gốc của urllib3, ví dụ ProxyError, NameResolutionError, SSLError hay Read timed out. Mọi mục chẩn đoán bên dưới đều dựa vào dòng này.
Mức -vvv cũng in các dòng Retrying HTTP request in ... seconds. Đếm số dòng này giúp biết Poetry đã thử lại bao nhiêu lần trước khi bỏ cuộc.
Poetry tự thử lại 6 lần
Mã nguồn hàm request trong authenticator.py thử tối đa 6 lần khi gặp lỗi kết nối, mỗi lần chờ thêm 0,5 giây: 0,5, 1, 1,5, 2 rồi 2,5 giây. Nhật ký proxy của mình xác nhận điều này: lần thiếu tài khoản, proxy nhận đúng 6 lệnh CONNECT tới pypi.org trước khi Poetry báo lỗi.
Hệ quả thực tế là một lỗi proxy đơn giản cũng mất 10 đến 25 giây mới hiện thông báo. Với lỗi thời gian chờ, con số còn lớn hơn nhiều, nói ở phần sau. Nếu thấy Poetry đứng lâu ở dòng Resolving dependencies, nhiều khả năng nó đang thử lại trong im lặng.
Mã trạng thái được thử lại gồm 429, 500, 501, 502, 503, 504 theo danh sách STATUS_FORCELIST trong mã nguồn. Mã 407 không nằm trong danh sách này, nhưng khi proxy trả 407 cho lệnh CONNECT, urllib3 coi đó là lỗi kết nối nên vẫn bị thử lại.

Chạy -vvv để thấy lỗi gốc
Lỗi Poetry proxy về tài khoản và địa chỉ
Tunnel connection failed: 407 Proxy Authentication Required
Lần chạy không có tài khoản trong HTTPS_PROXY, dòng -vvv ghi ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 407 Proxy Authentication Required')). Proxy từ chối lệnh mở đường hầm vì thiếu tiêu đề xác thực. Cả quá trình mất 10,4 giây.
Gặp lỗi này, kiểm theo thứ tự: chuỗi proxy có phần user:pass@ chưa, mật khẩu đã mã hóa chưa, tài khoản còn hạn không, gói proxy có giới hạn IP không. Bài sửa lỗi 407 Proxy Authentication Required liệt kê thêm nguyên nhân phía nhà cung cấp. Proxy cho phép theo IP thì 407 thường nghĩa là IP máy chạy Poetry chưa được thêm vào danh sách.
NameResolutionError với tên máy lạ
Mình đặt HTTPS_PROXY với mật khẩu thô p@ss#2026, không mã hóa. Dòng -vvv ghi NameResolutionError cho HTTPSConnection(host='ss', port=80), kèm getaddrinfo failed. Nhật ký proxy trống vì request chưa từng tới proxy.
Lý do: dấu # bắt đầu phần đuôi của URL nên mọi thứ phía sau bị bỏ. Phần còn lại là http://qa_user:p@ss, trong đó ss bị hiểu là tên máy proxy, cổng mặc định 80. Khi thấy Poetry phân giải một tên máy không phải proxy của mình, gần như luôn là mật khẩu có ký tự đặc biệt chưa mã hóa.
WinError 10061 khi sai cổng
Trỏ vào cổng 8999 không có gì nghe, dòng -vvv ghi NewConnectionError với WinError 10061 No connection could be made because the target machine actively refused it. Trên Linux và macOS, thông báo tương ứng là Connection refused. Tên máy và cổng trong thông báo là địa chỉ proxy thật, nghĩa là chuỗi được đọc đúng nhưng không có ai trả lời.
Nguyên nhân hay gặp: gõ nhầm cổng, dùng cổng SOCKS cho biến HTTP, proxy đã tắt, hoặc tường lửa chặn chiều ra. Kiểm nhanh bằng curl -x với cùng chuỗi proxy trên cùng máy. curl cũng lỗi thì vấn đề không nằm ở Poetry.
Bảng tra nhanh lỗi Poetry proxy
Dòng lỗi khi chạy -vvv |
Nguyên nhân thường gặp |
Cách sửa |
|---|---|---|
Tunnel connection failed: 407 |
Thiếu hoặc sai tài khoản, IP chưa được cho phép |
Kiểm user:pass@ và danh sách IP |
NameResolutionError host='ss' |
Mật khẩu có @ hoặc # chưa mã hóa |
Mã hóa phần trăm |
WinError 10061 |
Sai cổng, proxy tắt, tường lửa |
Thử curl -x cùng chuỗi |
Missing dependencies for SOCKS support |
Môi trường của Poetry thiếu PySocks |
Cài PySocks vào môi trường Poetry |
Read timed out. (read timeout=15) |
Proxy chậm hơn 15 giây |
Tăng POETRY_REQUESTS_TIMEOUT |
ReadTimeoutError khi proxy ghi https:// |
Proxy HTTP bị gọi bằng https:// |
Đổi tiền tố về http:// |
CERTIFICATE_VERIFY_FAILED |
Proxy giải mã HTTPS hoặc bộ chứng chỉ sai |
Chỉ REQUESTS_CA_BUNDLE tới chứng chỉ đúng |
Lỗi Poetry proxy với SOCKS5
Missing dependencies for SOCKS support
Mình đặt ALL_PROXY=socks5h://qa_user:[email protected]:8913 khi môi trường của Poetry chưa có PySocks. Poetry vẫn in khung All attempts to connect to pypi.org failed, nhưng dòng bên dưới ghi rõ Missing dependencies for SOCKS support. Lỗi này xuất hiện ngay ở bước đầu, proxy SOCKS không nhận được kết nối nào.
requests cần gói PySocks để nói chuyện với proxy SOCKS. Gói này phải nằm trong môi trường mà Poetry đang chạy, không phải môi trường ảo của dự án. Đây là chỗ nhiều người cài nhầm: chạy poetry add pysocks sẽ thêm PySocks vào dự án, còn Poetry vẫn thiếu.
Cài PySocks đúng chỗ
Tài liệu dòng lệnh của Poetry có lệnh poetry self add để thêm gói vào chính môi trường của Poetry. Lệnh poetry self add pysocks là cách chính thức. Nếu cài Poetry bằng pipx, lệnh tương đương là pipx inject poetry pysocks. Trên máy thử, mình cài PySocks bằng pip của môi trường ảo chứa Poetry, kết quả giống nhau.
Có một vòng lặp cần tránh: nếu proxy là đường ra Internet duy nhất và là SOCKS, lệnh self add cũng cần tải PySocks qua mạng. Lúc đó tạm dùng cổng HTTP của nhà cung cấp cho lần cài này, hoặc tải tệp wheel của PySocks từ máy khác rồi cài từ tệp.
socks5h và socks5 khác nhau ở DNS
Sau khi có PySocks, mình thử cả hai kiểu. Với socks5h, nhật ký proxy ghi tên máy pypi.org và files.pythonhosted.org, nghĩa là proxy tự phân giải tên. Với socks5, nhật ký ghi hai địa chỉ IP 151.101.64.223 và 151.101.0.223, nghĩa là máy chạy Poetry đã tự hỏi DNS rồi chỉ gửi IP cho proxy.
Khác biệt này quan trọng khi DNS của máy bị chặn hoặc trả kết quả khác vùng proxy. Nên dùng socks5h để mọi bước, kể cả DNS, đi qua proxy. Bài proxy HTTP và SOCKS5 giải thích thêm hai loại.

SOCKS cần PySocks trong môi trường Poetry
Lỗi Poetry proxy do thời gian chờ và tiền tố sai
Read timed out với proxy chậm
Proxy thứ hai của mình chờ 20 giây mới trả lời. Chạy poetry lock qua proxy này, Poetry báo HTTPSConnectionPool ... Read timed out. (read timeout=15). Tổng thời gian là 100,6 giây, vì mỗi lần thử chờ đủ 15 giây rồi mới thử lại, cộng thời gian nghỉ giữa các lần.
Trang câu hỏi thường gặp của Poetry ghi thời gian chờ mặc định là 15 giây, giống pip, và cho đổi bằng biến POETRY_REQUESTS_TIMEOUT. Trang này cũng ghi rõ biến đang ở dạng thử nghiệm. Mình chạy lại với POETRY_REQUESTS_TIMEOUT=60, lock thành công sau 44,6 giây.
Tăng thời gian chờ chỉ là cách chữa cháy. Proxy mất 20 giây cho mỗi lần mở kết nối thì mọi lệnh Poetry đều chậm. Nên đo độ trễ proxy trước, nếu cao bất thường thì đổi proxy hoặc đổi vùng gần hơn.
Ghi https:// cho proxy HTTP
Nhiều hướng dẫn trên mạng ghi HTTPS_PROXY=https://... vì tên biến có chữ HTTPS. Mình thử ghi đúng như vậy với proxy HTTP thường. Poetry mất 102,3 giây rồi báo ProxyError kèm ReadTimeoutError.
Nhật ký proxy giải thích lý do. Dòng nhận được không phải lệnh CONNECT mà là một chuỗi ký tự lạ bắt đầu bằng mã 16 03 01, đúng là gói mở đầu của bắt tay TLS. Tiền tố https:// bảo requests mã hóa ngay cả đoạn nói chuyện với proxy, trong khi proxy chỉ hiểu HTTP thường. Hai bên chờ nhau tới hết thời gian.
Quy tắc: tiền tố trong biến proxy mô tả cách nói chuyện với proxy, không phải với website. Proxy HTTP thường luôn ghi http://, kể cả trong HTTPS_PROXY. Chỉ dùng https:// khi nhà cung cấp nói rõ cổng đó nhận TLS.
requests.max-retries chỉ cho bước tải tệp
Poetry có khóa cấu hình requests.max-retries, mặc định 0. Đọc mã nguồn, khóa này dùng cho bộ tải tệp gói trong bước cài đặt, không đổi số lần thử 6 lần ở bước đọc metadata. Đặt khóa này lên cao không giúp lỗi proxy hiện nhanh hơn, cũng không cứu được proxy sai tài khoản.
Lỗi Poetry proxy về chứng chỉ khi proxy công ty giải mã HTTPS
Poetry dùng bộ chứng chỉ nào
Poetry nhận chứng chỉ qua requests, mặc định là bộ certifi đi kèm. Bộ này không biết chứng chỉ gốc do phòng IT của công ty tự cấp. Khi proxy công ty giải mã HTTPS để kiểm tra, Poetry sẽ thấy chứng chỉ lạ và báo lỗi xác minh.
Mình không có proxy giải mã HTTPS để thử trực tiếp. Thay vào đó, mình chứng minh Poetry có đọc biến REQUESTS_CA_BUNDLE bằng cách chỉ biến này tới một tệp chỉ chứa một chứng chỉ gốc không liên quan. Kết quả: SSLCertVerificationError với dòng CERTIFICATE_VERIFY_FAILED unable to get local issuer certificate, proxy vẫn nhận đủ 6 lệnh CONNECT.
Cách sửa đúng
Xin phòng IT tệp chứng chỉ gốc dạng PEM, ghép nó với bộ certifi thành một tệp, rồi đặt REQUESTS_CA_BUNDLE trỏ tới tệp ghép. Lần chạy thử ở trên cho thấy Poetry dùng tệp do biến này chỉ định thay cho certifi.
Với nguồn gói riêng khai trong pyproject.toml, tài liệu nguồn gói của Poetry hướng dẫn lệnh poetry config certificates.tên-nguồn.cert kèm đường dẫn tệp chứng chỉ. Tài liệu cũng cho đặt giá trị false để bỏ xác minh, nhưng ghi rõ cách đó không đạt chuẩn bảo mật. Mình không khuyên tắt xác minh, nhất là khi đi qua proxy.
Poetry proxy trong CI, Docker và môi trường ảo của dự án
Máy CI
Trên GitHub Actions, GitLab CI hay Jenkins, lưu chuỗi proxy vào mục secret rồi đưa vào biến HTTPS_PROXY của bước chạy poetry install. Không ghi mật khẩu proxy vào tệp pyproject.toml hay tệp cấu hình pipeline. Nhớ đặt POETRY_CACHE_DIR vào thư mục được cache giữa các lần chạy, vừa nhanh hơn vừa giảm số lần đi qua proxy.
Ví dụ bước cài phụ thuộc trên GitHub Actions, proxy lấy từ secret có tên PROXY_URL đã mã hóa sẵn mật khẩu:
- name: Cai phu thuoc qua proxy
env:
HTTPS_PROXY: ${{ secrets.PROXY_URL }}
NO_PROXY: localhost,127.0.0.1
POETRY_REQUESTS_TIMEOUT: "30"
run: poetry install --no-interaction -vvv
Biến chỉ khai ở mục env của bước này nên các bước khác không bị ảnh hưởng. Cờ -vvv giúp nhật ký CI có sẵn dòng lỗi gốc khi có sự cố, không phải chạy lại. GitHub tự che giá trị secret trong nhật ký, nhưng đừng in biến môi trường ra bằng lệnh khác.
Máy CI trên đám mây thường đổi IP mỗi lần chạy. Gói proxy chỉ cho phép theo IP sẽ gặp 407 liên tục. Chọn gói xác thực bằng tài khoản cho môi trường này.
Docker
Khai proxy bằng lệnh ENV trong Dockerfile sẽ để lại mật khẩu trong lớp ảnh, ai tải ảnh về cũng đọc được. Nên truyền proxy lúc build thay vì ghi cứng, và không giữ biến đó ở ảnh cuối. Bài proxy Docker mô tả các lớp proxy của daemon, lúc build và trong container.
pip trong môi trường ảo của dự án
Poetry tạo môi trường ảo riêng cho dự án. Khi anh em chạy poetry run pip install, pip trong môi trường đó cũng đọc cùng biến HTTPS_PROXY. pip có tham số --proxy riêng, còn Poetry thì không. Bài pip proxy có cách cấu hình riêng cho pip, bao gồm tệp pip.ini.
Nếu trong dự án còn dùng requests để gọi API, lỗi ProxyError của requests có cùng gốc với lỗi của Poetry. Bài requests.exceptions.ProxyError đi sâu vào nhóm lỗi này.
Quy trình kiểm Poetry proxy trước khi dùng thật
Bốn bước theo thứ tự
Bước một, kiểm proxy độc lập bằng curl -x với cùng chuỗi tới https://pypi.org/simple/six/. Nếu bước này lỗi, chưa cần mở Poetry. Bước hai, chạy đoạn Python in proxy ở trên để chắc biến đã có và NO_PROXY đúng. Bước ba, chạy poetry lock -vvv trong một dự án nhỏ với thư mục cache trống. Bước bốn, xem nhật ký phía proxy nếu có, hoặc hỏi nhà cung cấp, để chắc request đã tới proxy.
Thứ tự này đi từ lớp mạng lên lớp ứng dụng. Lỗi ở bước nào thì sửa ở lớp đó, tránh việc đổi tung cấu hình Poetry trong khi lỗi nằm ở tài khoản proxy.
Đừng quên cache
Poetry giữ cache metadata và tệp gói. Nếu dự án đã từng cài thành công, lần chạy sau có thể không cần mạng, nên proxy sai vẫn qua. Khi kiểm proxy, đặt POETRY_CACHE_DIR tới một thư mục trống như mình làm trong bài. Ngược lại, khi proxy chập chờn, giữ cache ổn định giúp giảm số request phải đi qua proxy.
Ghi lại kết quả
Ghi lại phiên bản Poetry, chuỗi proxy đã che mật khẩu, thời gian lock và dòng lỗi gốc nếu có. Lần sau gặp lỗi, so với bản ghi này sẽ biết ngay thay đổi đến từ proxy, từ phiên bản Poetry hay từ mạng. Poetry 2.x thay đổi khá nhiều so với 1.x, nên số phiên bản là thông tin cần có.
So sánh Poetry proxy với pip, npm và Maven
Mỗi công cụ một chỗ khai proxy
pip có tham số --proxy và tệp cấu hình riêng. npm có lệnh npm config set proxy và https-proxy. Maven khai trong settings.xml, Gradle khai trong gradle.properties. Poetry thì chỉ đọc biến môi trường. Đội phát triển dùng nhiều ngôn ngữ nên thống nhất một bộ biến HTTPS_PROXY và NO_PROXY cho cả máy, rồi chỉ cấu hình riêng cho công cụ nào không đọc biến.
Bài npm proxy và bài Maven Gradle proxy mô tả cách làm bên hai hệ sinh thái đó.
Khi nào nên đổi cách cài
Nếu proxy công ty quá chặt, nhiều đội dựng một kho gói trung gian nội bộ, cho Poetry trỏ vào kho đó qua mục source, kho này mới đi ra PyPI qua proxy. Máy lập trình viên không cần biết proxy nữa. Cách này tốn công dựng nhưng đỡ lỗi proxy lặp lại trên từng máy.
Một lựa chọn nhẹ hơn là để proxy cho máy CI và máy chủ build, còn máy cá nhân đi thẳng nếu chính sách mạng cho phép. Mỗi nơi có bộ biến riêng, ghi trong tài liệu dự án. Người mới vào nhóm chỉ cần đọc một trang là biết máy mình thuộc trường hợp nào.
Dù chọn cách nào, đừng để mỗi người tự đặt proxy theo một kiểu. Một người dùng HTTP_PROXY, người khác dùng ALL_PROXY kiểu SOCKS, người thứ ba ghi https:// cho proxy thường. Cả nhóm sẽ gặp đủ loại lỗi trong bài này mà không ai biết vì sao máy mình chạy còn máy bạn không. Thống nhất một chuỗi mẫu, một đoạn kiểm in proxy và một lệnh lock -vvv là đủ để mọi người tự kiểm trước khi hỏi.
Câu hỏi thường gặp về Poetry proxy
Poetry có lệnh cấu hình proxy không. Không. Lệnh poetry config http-proxy trả lời Setting http-proxy does not exist. Dùng biến môi trường HTTPS_PROXY.
Vì sao đặt HTTP_PROXY mà proxy không thấy request nào. PyPI là HTTPS, HTTP_PROXY không áp dụng. Đặt HTTPS_PROXY.
Lỗi All attempts to connect to pypi.org failed có phải lỗi DNS không. Chưa chắc. Chạy lại với -vvv để thấy lỗi gốc, thường là 407, sai cổng hoặc mật khẩu chưa mã hóa.
Dùng proxy SOCKS5 được không. Được, nếu môi trường của Poetry có PySocks. Cài bằng poetry self add pysocks và dùng tiền tố socks5h.
Proxy chậm thì chỉnh gì. Tăng POETRY_REQUESTS_TIMEOUT, mặc định 15 giây. Biến này đang ở dạng thử nghiệm.
Có nên ghi https:// cho proxy không. Chỉ khi nhà cung cấp nói cổng đó nhận TLS. Proxy HTTP thường ghi http:// kể cả trong HTTPS_PROXY.
Khi cần proxy HTTP có tài khoản cho máy lập trình và máy CI, anh em có thể mua proxy giá rẻ tại trang chủ ProxyVN, rồi chạy poetry lock -vvv một lần để kiểm đường đi.

Kiểm Poetry proxy theo 4 bước
Poetry proxy và những điều cần nhớ
Poetry proxy chỉ đi qua biến môi trường, cần HTTPS_PROXY cho PyPI, mật khẩu phải mã hóa phần trăm, tiền tố http:// cho proxy thường. Lỗi All attempts to connect thường che lỗi proxy, hãy chạy -vvv. SOCKS cần PySocks trong môi trường Poetry. Cần IP ổn định cho Poetry proxy, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam.