هنوز خاطره تلخ بن شدن ایرانیا از طرف گیتهاب رو یادم هست! نه مقصر بودیم و نه کاری از دستمون برمیومد ولی خب بههرحال قربانی شده بودیم! تصمیم گرفتم یه چیز self-hosted دست و پا کنم و دیگه ریسک بودن کارای غیر شخصیم روی پلتفرمایی که خطری هستن رو به جون نخرم! یه کم بعدترش بود که با Gitea آشنا شدم. یه پلتفرم محشر که تا به امروز هم همراهم هست(شایدم همراهش هستم!) و خداییش خجالتزدهم نکرده. سراغ گیتلب هم رفتم اما خب از اونجایی که بازیهای سیاسیای که ما توش اسیریم هیچ ثباتی نداره تصمیم گرفتم یه چیزی استفاده کنم که هم کارم رو کامل راه بندازه و اذیتم هم نکنه.
فرآیند نصب Gitlab و دردسرایی که داره خیلی بهنظرم اذیت کننده بود و جدای از اون خیلی اضافات و چیزای بهدردنخوری داره که مطمئنم سراغشون نمیرفتم. توی سایت Gitea راجبش نوشته:
Gitea is a painless, self-hosted, all-in-one software development service. It includes Git hosting, code review, team collaboration, package registry, and CI/CD. It is similar to GitHub, Bitbucket and GitLab.
اون واژه painless واقعیه! و اگر به مقایسهاش با بقیه پلتفرما نگاه کنید(اینم نگاه کنید باحاله) میبینید که ارزشش رو داره!
به قول خارجیا: First things first!
من آموزش نصبش روی Ubuntu 22.04 رو اینجا براتون میذارم:
اولش همون کارای روتین مثل آپدیت و آپگرید و اینا: (میدونید که، اون # یعنی با یوزر root لاگین کردید به سرور)
# apt-get update # apt-get upgrade
بعدش اگر git رو نصب ندارید نصبش میکنید:
# apt install git
و بعدش ورژنش رو میگیریم که مطمئن بشیم درست نصب شده:
# git --version
که باید یه همچین خروجیای بده:
# git version 2.43.0
من از پایگاهداده MariaDB استفاده میکنم. اگر نصب نداریدش پس:
# apt install mariadb-server
و برای یه کانفیگ اولیه این دستور رو اجرا کنید:
# mysql_secure_installation
بعدش این پیغام رو میبینید:
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, you'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here.
Enter current password for root (enter for none):
و چون یوزر root تون پسوورد نداره یه اینتر بزنید بره که این پیغام میاد:
Setting the root password or using the unix_socket ensures that nobody can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n]
همونطور که خودش گفته میتونید با خیال راحت n بزنید.
مورد بعدی:
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation.
Set root password? [Y/n]
که اینجا هم n بزنید.
برای سوالات بعدی هم Y بزنید تا دیتابیس تست و یوزرای ناشناس حذف بشن و دسترسی ریموت به یوزر روت هم بسته بشه.
(برای مشاهده توضیحات مفصلتر نصب پایگاه داده به این پست مراجعه کنید. شاید خودمم یه پست راجب نصب مفصل MariaDB نوشتم).
حالا وارد محیط دیتابیس بشید:
# mariadb -u root -p
و اینتر بزنید(اگر طبق آموزش نصب دیتابیس بالاتر همین پست پیش رفتید اون -p رو هم لازم نیست بنویسید).
بعد از اینکه واردش شدید میخوایم برای Gitea یه دیتابیس و یه یوزر با دسترسی مناسب بسازیم و بعدش فلاش رو بکشیم(به معنای واقعی کلمه!) و خارج بشیم:
MariaDB [(none)]>CREATE DATABASE gitea;
MariaDB [(none)]>GRANT ALL PRIVILEGES ON gitea.* to 'gitea'@'localhost' IDENTIFIED BY 'Passworde-Taraz';
MariaDB [(none)]>FLUSH PRIVILEGES; -- کشیدن فلاش
MariaDB [(none)]>exit;
حالا بریم سروقت ساختن یه دایرکتوری و دانلود فایلش و بقیه کارا:
# adduser --system --shell /bin/bash --group --disabled-password git
این --system یعنی یه یوزر سیستمی میسازید و مثلا توی لیست یوزرایی که موقع لاگین نمایششون میده این رو نمایش نمیده و بهطور خودکار هم براشون دایرکتوری home نمیسازه. بهتره که یوزرای اینشکلی که خودمون نمیخوایم بهطور مستقیم ازشون استفاده کنیم و رو بهعنوان یوزر سیستمی تعریف کنیم.
این --shell /bin/bash یعنی یوزرش دیفالت روی bash باشه(و نه روی sh).
این --group یعنی توی گروه خودشه.
این --disabled-password یعنی پسوورد برای این یوزر ست نمیشه(ولی خب کماکان میشه با کلید ssh به این یوزر ssh زد)
این --home /home/git یعنی دایرکتوری homeاش توی این مسیر باشه.
و درنهایت git هم اسم یوزرمون هست! هوف!
خب! فایلش رو(که یه دونه فایل باینری هست که با go نوشته شده) رو دانلود میکنیم و بهش دسترسی مناسب میدیم و میفرستیمش توی دایرکتوی /usr/bin که مخصوص فایلای اجراییه:
# wget -O gitea https://dl.gitea.com/gitea/1.22.3/gitea-1.22.3-linux-amd64 # chmod 755 gitea # cp gitea /usr/bin/
به wget هم گفتیم که اسمش رو بذاره gitea و در ادامه دایرکتوریهای مورد نیاز رو برای gitea میسازیم و سطح دسترسیشون رو هم تنظیم میکنیم:
# mkdir -p /etc/gitea /var/lib/gitea/{custom,data,indexers,public,log}
# chown git:git /etc/gitea /var/lib/gitea/{custom,data,indexers,public,log}
# chmod 750 /var/lib/gitea/{data,indexers,log}
# chmod 770 /etc/gitea
بعدش یه سرویس systemd براش میسازیم که مجبور نباشیم هربار دستی اجراش کنیم:
# nano /etc/systemd/system/gitea.service
محتوای فایل سرویس:
[Unit] Description=Gitea After=syslog.target After=network.target [Service] RestartSec=3s Type=simple User=git Group=git WorkingDirectory=/var/lib/gitea/ ExecStart=/usr/bin/gitea web --config /etc/gitea/app.ini Restart=always Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea [Install] WantedBy=multi-user.target
و Ctrl+S میزنیم که ذخیره بشه و Ctrl+X میزنیم که خارج بشیم از ادیتور.
بعد systemd رو ریلاود میکنیم که فایل سرویس جدیدی که ساختیم رو بشناسه:
# systemctl daemon-reload
و Gitea رو از طریق سرویسش اجرا میکنیم و فعالش هم میکنیم که وقتی سرور ریستارت شد بهطور خودکار استارت بخوره:
# systemctl start gitea # systemctl enable gitea
یه استاتوس هم از سرویسش میگیریم که مطمئن شیم سالم و سرحال درحال اجراست:
# systemctl status gitea
که باید یه همچین خروجیای داشته باشه:
● gitea.service - Gitea (Git with a cup of tea)
Loaded: loaded (/etc/systemd/system/gitea.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2024-11-09 14:31:51 UTC; 2 week 3 days ago
Main PID: 111 (gitea)
Tasks: 11 (limit: 11111)
Memory: 1.1G
CPU: 1h 11min 1.165s
CGroup: /system.slice/gitea.service
└─2377 /usr/bin/gitea web --config /etc/gitea/app.ini
بهطور پیشفرض Gitea روی پورت 3000 اجرا میشه که میتونید از طریق:
http://server-ip:3000
بهش دسترسی داشته باشید. واسه اینکه فایروال جلوتون رو نگیره:
# ufw allow 3000/tcp
از اونجایی که خیلی جالب نیست که یه همچین چیز خفنی همینجوری روی یه پورت ران باشه و زیردامنه مخصوص خودشو نداشته باشه چیکار میکنیم؟ آفرین! nginx رو نصب میکنیم و Gitea رو میبریم پشت reverse proxy و شیک و پیک و تر و تمیزش میکنیم مثل:
http://git.example.ir
نصب nginx آسونه(البته اگه واسه کارای دیگه هم نیازش داشته باشید کمی دنگ و فنگ داره ولی خب نصب ابتداییش دقیقا همینقدر آسونه):
# apt install nginx
یه فایل کانفیگ واسه زیردامنه Giteaمون میسازیم:
# nano /etc/nginx/conf.d/git.example.ir.conf
و به شرح زیر پرش میکنیم:
server { listen 80 http2; server_name git.example.ir; proxy_read_timeout 720s; proxy_connect_timeout 720s; proxy_send_timeout 720s; client_max_body_size 50m; # Proxy headers proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; # log files access_log /var/log/nginx/git.example.com.access.log; error_log /var/log/nginx/git.example.com.error.log; # Handle / requests location / { proxy_redirect off; proxy_pass http://127.0.0.1:3000; } }
بعدا یه پست مفصل راجب نصب و بالا آوردن وبسایت روی nginx مینویسم ولی خب این باید کار کنه. دقت کنید که https فعال نیست و یه چیز ابتداییه.
خب nginx رو ریلاود میکنیم تا فایل کانفیگ جدید رو بشناسه:
# nginx -s reload
میریم توی فایل کانفیگ Gitea و دامنه رو بهش معرفی میکنیم:
# nano /etc/gitea/app.ini
اینا رو وارد میکنیم:
[server] DOMAIN = git.example.ir ROOT_URL = https://git.example.ir/
و در نهایت سرویس Gitea رو ریستارت میکنیم تا فایل کانفیگ جدید رو بشناسه:
# systemctl restart gitea
و تادااااااا!!!!! Gitea شما روی دامنهای که ست کردید بالا اومده!
بار اولی که وارد میشید با یه همچین صحنهای روبرو میشید.
اطلاعات دیتابیس رو بهش بدید و اگر میخواید چیز دیگهای مثل پورت خود Gitea یا پورت ssh و ... هم تغییر بدید انجام بدید.
بعدش از قسمت Signup یه حساب کاربری بسازید. دقت کنید اولین اکانتی که میسازید میشه ادمین سیستم!
البته همیشه میتونید با این دستور:
# gitea admin user create --username <USERNAME> --admin --password <PASSWORD> --email <EMAIL> -c /etc/gitea/app.ini
یوزر ادمین جدید بسازید.
توی بخش بعدی راجب کانفیگای مفصلتر Gitea صحبت میکنم و بعدش راجب Gitea actions که میتونید باهاش بهراحتی فرآیندای CI/CD مدنظرتونو پیادهسازی کنید.
امیدوارم بهدردتون بخوره!