مقدمة
لم أتمكن من التوصل إلى اسم مناسب للمنشور ، لذلك سأصف بإيجاز ما سيتم مناقشته.
معظمنا لديه بعض الحرف الشخصية الصغيرة التي لا تتجاوز حدود منازلنا. شخص ما يستضيفهم على جهاز كمبيوتر يعمل ، شخص على Heroku ، شخص على VPS ، وآخر لديه خادم منزلي. حتى أن هناك مجتمع r / homelab على reddit ، حيث يناقش الأشخاص أجزاء مختلفة من الأجهزة والبرامج لما يسمى ب. مختبر المنزل .
لست حريصًا جدًا على هذه المشكلة ، ولكن لدي Intel NUC في مكاني ، والذي يشغل الموسيقى من NAS باستخدام MPD . بالإضافة إلى MPD ، فإن الحرف الصغيرة الخاصة بي تدور حولها ، مما يساعدني على العمل معها: الآن روبوت ميت لبرقية ، HTTP API على سيناترا وواجهة خرقاء لها.
في منشور سأفعل بدون تفاصيل خاصة (وأنا لا أفهم الكثير منها) عملية تثبيت خادم DNS للعمل مع أسماء النطاقات للخدمات ، ومخطط التشغيل المتزامن للعديد من الخدمات باستخدام Docker ، وتثبيت Gitlab مع CI. أنت لا تتعلم أي شيء جديد ، ولكن فجأة هذا "الدليل" مفيد لشخص ما. بالإضافة إلى ذلك ، أود سماع اقتراحات حول كيفية جعله أسهل / أكثر أناقة / أكثر صحة.
في البداية ، كان رمز خدماتي على bitbucket / github ، وبعد إنشاء صور عامل الميناء ، اضطررت للذهاب تحت SSH وتشغيل بعض البرامج النصية التي أنشأت / حدّثت الحاويات مع الخدمات. مسكت نفسي أفكر في أنني أرى خللًا صغيرًا مزعجًا في التطبيق ، والذي لا أصلحه فقط لأنني كسول جدًا لأداء هذا الإجراء بالكامل. من الواضح أن الوقت قد حان لأتمتة كل شيء. ثم ظهرت فكرة تثبيت Gitlab + CI.
المجالات المحلية باستخدام DNS
تم إنشاء جميع الحاويات باستخدام علامة --network=host
للبساطة - كان يكفي استخدام منافذ مختلفة في التطبيقات. ومع ذلك ، مع زيادة عدد الخدمات ، تذكر التطبيق الذي يستخدمه المنفذ. نعم ، وإدخال عنوان IP مع المنفذ في المتصفح في كل مرة ليس لطيفًا جدًا ، لذلك قبل تثبيت gitlab ، قررت التعامل مع استضافة العديد من التطبيقات على نفس الخادم.
الفكرة بسيطة: نقوم بتكوين DNS وإطعامه إلى جهاز التوجيه وتثبيت Nginx واستخدام تكوينه لإعادة توجيه الطلبات إلى منافذ مختلفة اعتمادًا على المجال. هذا سيسمح لك بعدم الإزعاج مع الموانئ أثناء التطوير ، مثل ستبدأ الحاويات في استخدام --publish
بدلاً من --network=host
.
أثناء التثبيت ، تم استخدام هذا الدليل . في ذلك ، تم التكوين لـ Ubuntu 16.04 ، لدي Debian.
يتم تنفيذ إجراءات أخرى root
.
بادئ bind9
، قم بتثبيت bind9
والمرافق:
apt-get install -y bind9 bind9utils bind9-doc dnsutils
بعد ذلك ، نحتاج إلى تكوين منطقة المجال. للقيام بذلك ، أضف ما يلي إلى الملف /etc/bind/named.conf.local
:
zone "nondv.home" IN { // type master; file "/etc/bind/fwd.nondv.home.db"; // Forward lookup file allow-update { none; }; // Since this is the primary DNS, it should be none. };
أيضًا ، تمت إضافة تهيئة البحث العكسي إلى الدليل ، ولكن لأكون صريحًا ، لا أفهم حقًا سبب ضرورة ذلك ، لذلك لم أفعل ذلك.
الآن قم بإنشاء الملف /etc/bind/fwd.nondv.home.db
:
$TTL 604800 @ IN SOA ns1.mydomain.home. root.mydomain.home. ( 20 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ;Name Server Information IN NS ns1.nondv.home. ;IP address of Name Server ns1 IN A 192.168.0.3 ;A - Record HostName To Ip Address nuc IN A 192.168.0.3 gitlab IN A 192.168.0.3 mpd IN A 192.168.0.3 @ IN A 192.168.0.3
بعد ذلك ، أعد تشغيل bind9 وقم بتعيين التشغيل التلقائي:
systemctl restart bind9 systemctl enable bind9
لاحظ أنني استخدمت .home
بدلاً من .local
. تم ذلك لأن المجال nondv.local
يتم حله بدون نطاقات فرعية. حسنًا ، تم التعرف عليه بشكل أكثر دقة بشكل طبيعي ، ولكن المتصفحات curl
لم تفعل ذلك. كما أوضح لي أحد الزملاء ، هذا على الأرجح بسبب برامج مختلفة مثل Bonjour (جهاز الكمبيوتر المحمول الخاص بالعمل مع تفاحة على الغطاء). بشكل عام ، يجب ألا تكون هناك مثل هذه المشاكل في نطاق .home
.
هذا كل شيء في الواقع. بعد ذلك ، أضفت DNS /etc/resolve.conf
الاتصال به (بحيث يتم تحديث ملف /etc/resolve.conf
تلقائيًا).
Nginx
كما قلت ، لكي نتمكن من الوصول إلى جميع الخدمات في نفس الوقت عبر HTTP على المنفذ 80 ، نحتاج إلى تكوين Nginx بحيث يقوم بتوصيل الطلبات إلى منافذ مختلفة اعتمادًا على المجال.
وثائق صورة nginx متاحة على موقع Docker Hub .
قم بإعداد ملف التكوين الرئيسي /srv/nginx/nginx.conf
:
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name nondv.home; rewrite ^/$ http://mpd.nondv.home redirect;
بعد ذلك ، قم بتكوين المجالات. سأظهر واحدة فقط:
# /srv/nginx/conf.d/gitlab.conf server { listen 80; server_name gitlab.nondv.home; location / { proxy_pass http://127.0.0.1:3080; } }
يتم تشغيل الحاوية بواسطة الأمر:
docker run --detach \ --network host \ --name nginx \ --restart always \ --volume /srv/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \ --volume /srv/nginx/conf.d:/etc/nginx/conf.d:ro \ nginx:alpine
هذا كل شيء ، سيتم الآن القبض على طلبات HTTP إلى المنفذ 80 باستخدام nginx وإعادة توجيهه إلى المنفذ المطلوب.
جيتلاب
كل شيء بسيط حسب الدليل الرسمي :
docker run --detach \ --hostname gitlab.nondv.home \ --publish 3080:80 --publish 3022:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab:Z \ --volume /srv/gitlab/logs:/var/log/gitlab:Z \ --volume /srv/gitlab/data:/var/opt/gitlab:Z \ gitlab/gitlab-ce:latest
نحن في انتظار تكوين كل شيء (ننظر في docker logs -f gitlab
) وبعد ذلك ندخل الحاوية ( docker exec -it gitlab bash
) لمزيد من المعلومات. الإعدادات:
nano /etc/gitlab/gitlab.rb # or vim # /etc/gitlab/gitlab.rb external_url 'http://gitlab.nondv.home' gitlab_rails['gitlab_shell_ssh_port'] = 3022 # /etc/gitlab/gitlab.rb gitlab-ctl reconfigure
للحصول على الموثوقية ، يمكنك إعادة تشغيل الحاوية ( docker container restart gitlab
).
Ci
تم دمج Gitlab CI بالفعل ، ولكنه يحتاج إلى Gitlab Runner ( وثائق ).
للقيام بذلك ، كتبت نصًا صغيرًا:
NAME="gitlab-runner$1" echo $NAME docker run -d --name $NAME --restart always \ --network=host \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:alpine
بعد إنشاء العداء ، نحتاج إلى تسجيله. للقيام بذلك ، انتقل إلى gitlab (من خلال المتصفح) ، وانتقل إلى منطقة المسؤول → نظرة عامة → العدائين. يصف تركيب العدائين. باختصار ، يمكنك ببساطة:
docker exec -it gitlab-runner register
والإجابة على الأسئلة.
خدمات HTTP الخاصة بك
يتم إطلاقها عن طريق القياس مع gitlab. نشرها على بعض المنافذ وإضافة التكوين إلى nginx.
الخلاصة
يمكنك الآن استضافة مشاريعك على خادمك المنزلي واستخدام قوة Gitlab CI لأتمتة تجميع مشاريعك ونشرها. من المريح القيام git push
ولا تقلق بشأن البدء ، أليس كذلك؟
أوصي أيضًا بإعداد البريد لـ gitlab. أنا شخصياً استخدمت صندوق بريد على Yandex. التوثيق