رفع Mercurial على خادم Windows (مع Nginx)

في الآونة الأخيرة ، اكتشفت بالصدفة أن BitBucket ، حيث توجد مستودعات Mercurial الخاصة بي ، يتوقف عن دعم Mercurial: لم يعد من الممكن إنشاء مستودعات جديدة ، وسيتم حذف المستودعات الحالية من 1.06.2020. الخيارات الممكنة: انتقل إلى Git ، أو اختر إحدى الخدمات الأخرى ، أو قم بإعداد استضافة Mercurial على الخادم الخاص بك. لدي خادم ، ولا أريد التخلي عن Mercurial وتغيير عاداتي ، ولم يعجبني بدائل BitBucket أيضًا ، لذلك اخترت الخيار الأخير. تبدو المهمة بسيطة ، فقط الخادم يعمل بنظام Windows ، ويبدو أنه خلال عملية الإعداد تمكنت من تجاوز الحد الأقصى الممكن من أشعل النار. نأمل أن تساعد هذه المقالة شخصًا ما على تجنب ذلك وتوفير بعض الوقت.


يتم وصف الخيارات المختلفة لتنظيم استضافة Mercurial في الوثائق . يمكن تقسيمها إلى 3 مجموعات:


  1. زئبق يخدم - أي يبدأ Mercurial نفسه في وضع الخادم.
  2. HgWeb.cgi هو البرنامج النصي الرسمي المتضمن في توزيع Mercurial.
  3. الحلول من المطورين الخارجيين أكثر وظيفية ، ولكن مع قيودها وغالبا ما تدفع.

HG SERVE


الخيار الأبسط والأكثر منطقية هو الخيار الأول. وفقًا للتوثيق ، يحتوي Mercurial على خادم ويب مدمج يقوم بتشغيل HgWeb - وهذا ما يعمل عند تشغيل خدمة hg . لا يعرف هذا الخادم كيفية إجراء المصادقة ، أي لا يمكن طلب تسجيل دخول المستخدم / كلمة المرور ، ولكن يمكنه الحصول على إذن ، أي منح / عدم منح هذا النوع أو ذاك من الوصول إلى المستودعات وفقًا لإعدادات الوصول. إذا كنا بحاجة إلى مستودعات خاصة ، فعندئذ للمصادقة ، يمكنك استخدام Nginx كخادم وكيل يطلب كلمة مرور. يوصف إنشاء مثل هذه الدائرة هنا .


من أجل الراحة ، يتم إطلاق خدمة hg في شكل خدمة تستخدم winsw ، وهي أداة تتيح لك تشغيل أي أمر في شكل خدمة (في هذه الحالة ، يكون هذا ملف خفافيش بشكل عام). ومع ذلك ، لبدء التشغيل ، من الممكن الاستغناء عن الخدمة ، ولكن ، على سبيل المثال ، إنشاء مهمة في "برنامج جدولة المهام" باستخدام المشغل "عند بدء تشغيل النظام" - سيتم تشغيل هذه المهمة عند بدء تشغيل النظام. ولكن هذا خيار أقل موثوقية: في حالة الفشل ، لن يتم إعادة تشغيل المهمة ، ولن تكون هناك معلومات حول ذلك في السجلات.


كن حذرا مع ملفات التكوين (hgweb.conf / hgrc):


  • محتوياتها حساسة لحالة الأحرف: على سبيل المثال ، إذا كتبت [Web]بدلاً من ذلك [web]، فلن تعمل.
  • يجب أن تكون علامة المساواة محاطة بمسافات: إذا كنت تكتب push_ssl=false، فلن تعمل ، تحتاج إلى الكتابة push_ssl = false.

, Mercurial push , "Hello world", . Nginx :


    client_max_body_size 500M;
    proxy_read_timeout 120s;

, , .



hgweb.conf . ( ), : /.hg/hgrc , , , .


, Mercurial , Nginx. : Mercurial , Nginx . Nginx :


proxy_set_header      REMOTE_USER $remote_user;

:


proxy_set_header      X-Forwarded-User $remote_user;

:( HgWeb, ENV('REMOTE_USER'), — .


, Nginx 2 ( ) hg serve, hgweb.conf. , hgweb.conf ( ) . , . .


HgWeb.cgi


, Python- HgWeb. Mercurial , . , (CGI) , — WSGI FCGI.


Nginx CGI, WSGI WSGI- ( Windows ), FCGI — FastCGI. Python, , Python , Mercurial — 2.7. , 2.7. HgWeb Python Flup, , ( Python 2.7). :


pip install flup==1.0.3.dev-20110405

hgweb.fcgi — ( ) , ( ):


WSGIServer(application, bindAddress=("127.0.0.1",5500)).run()

Nginx:


    location / {
        auth_basic "My Repos";
        auth_basic_user_file passwd;    #   
        include fastcgi.conf;
        fastcgi_split_path_info ^()(.*)$;
        fastcgi_param  SCRIPT_NAME        "";
        fastcgi_param  PATH_INFO          $fastcgi_path_info;
        fastcgi_param  AUTH_USER          $remote_user;
        fastcgi_param  REMOTE_USER        $remote_user;
        fastcgi_pass 127.0.0.1:5500;
    }
    location /static/ {
        root e:/Mercurial/templates;
    }

fastcgi.conf, fastcgi location . PATH_INFO — . url , PATH_INFO.


:


python hgweb.fcgi

!



hg serve, HgWeb . winsw. bat-:


    @echo off
    if "%1"=="start" (goto :start)
:stop
    taskkill /F /IM python-hg.exe /T
    goto :end
:start
    "c:\Python27\python-hg.exe" e:\Mercurial-5.3\hgweb.fcgi
:end

, python.exe python-hg.exe taskkill .


: "Local System" — ! , .



, HgWeb ( hg serve) . : , , Nginx location . :


    location /Base/ {   # Base -  ,     
       include fastcgi.conf;
       fastcgi_split_path_info ^()(.*)$;
       fastcgi_param  SCRIPT_NAME        "";
       fastcgi_param  PATH_INFO          $fastcgi_path_info;
       fastcgi_param  AUTH_USER          "pub";   #      hg ( )
       fastcgi_param  REMOTE_USER        "pub";
       fastcgi_pass 127.0.0.1:5500;
    }

Base .


, . ( , Python , , :-)

Source: https://habr.com/ru/post/undefined/


All Articles