Quản lý mã nguồn rất quan trọng trong quá trình phát triển của bất kì một phần mềm nào. Hiện trên thị trường có một số nền tảng hỗ trợ việc trên nhưng đa số là cần phải trả phí để nếu muốn tận dụng được hết các tính năng mà nền tảng cung cấp. Tuy nhiên trong bài viết này, Vietnix sẽ giới thiệu đến bạn cách sử dụng và cài đặt Gitea trên Ubuntu bằng Docker – một nền tảng quản lý mã nguồn miễn phí, đơn giản, gọn nhẹ.
Giới thiệu về cài đặt Gitea trên Ubuntu bằng Docker
Khi phát triển phần mềm, điều quan trọng là làm sao để bạn có thể quản lý mã nguồn một cách hiệu quả và có thể theo dõi được. Các hệ thống SCM (Source Code Management) hay hệ thống quản lý mã nguồn là nơi giúp quản lý quy trình phát triển một cách hiệu quả và linh hoạt giúp làm việc trên các dự án thuộc mọi quy mô với sự tham gia của nhiều nhà phát triển.
Đến nay, đã có nhiều phần mềm SCM khác nhau như CVS đến SubVersion, Perforce và Mercurial, đứng đầu trong đó là Git – cùng với sự phát triển vượt bậc với sự phổ biến của các trang web như GitHub và GitLab.
Tuy nhiên, với các tài khoản miễn phí trên các nền tảng dịch vụ này chủ yếu là hướng đến các kho lưu trữ có mã nguồn mở và công khai, để có khả năng làm việc trên các dự án phần mềm riêng tư hoặc được sở hữu độc quyền thì bạn cần phải trả phí.
Thêm vào đó, quyền để một người có thể truy cập vào kho lưu trữ thuộc về tổ chức sở hữu phần mềm đó và nhiều tổ chức thường sẽ muốn kiểm soát hoàn toàn phần mềm của chính họ từ đầu đến cuối.
Do đó, trong vài năm qua, một số giải pháp tự lưu trữ như Gogs, Gitea và GitLab cũng đã được phát triển. Trong bài hướng dẫn này, Vietnix sẽ tập trung vào việc thiết lập một giải pháp phổ biến có tên là Gitea, để cho phép bạn lưu trữ các kho lưu trữ riêng và quản lý các dự án của riêng mình trong toàn bộ vòng đời của dự án.
Gitea có đặc trưng là nhỏ, khép kín và nhẹ, giúp quá trình triển khai trở nên nhanh chóng mà không yêu cầu quá nhiều về phần cứng. Bạn sẽ sử dụng bản cài đặt Gitea từ Docker nhằm đảm bảo rằng phần mềm ở phiên bản được cập nhật mới nhất.
Yêu cầu tiên quyết để cài đặt Gitea trên Ubuntu bằng Docker
Trước khi bắt đầu hướng dẫn này, bạn cần chuẩn bị:
- Máy chủ Ubuntu 20.04 với user non-root có đặc quyền
sudo
. - Docker và Docker Compose được cài đặt trên máy chủ Ubuntu.
- Có một tên miền trỏ vào máy chủ Ubuntu của bạn. Bài hướng dẫn này sẽ sử dụng tên miền là
your_domain
trong xuyên suốt các ví dụ.
Nếu bạn chưa có máy chủ và tên miền để cài đặt Gitea trên Ubuntu bằng Docker, thì bạn có thể tham khảo thuê các gói VPS và đăng ký tên miền tại Vietnix.
Vietnix là một trong những nhà cung cấp dịch vụ VPS và tên miền uy tín hàng đầu tại Việt Nam, cung cấp các gói dịch vụ VPS tốc độ cao đa dạng và phù hợp với mọi nhu cầu của bạn. Từ các gói dịch vụ VPS Giá Rẻ đến các gói dịch vụ VPS Phổ Thông, VPS Cao Cấp và VPS NVMe.
Khi thuê VPS tại Vietnix, bạn sẽ được tặng bộ theme và plugin WordPress trị giá 50.000.000 VND/Năm. Bên cạnh đó, VPS Vietnix cũng được đánh giá cao về tốc độ và độ ổn định, khả năng bảo mật tốt, giúp bạn triển khai các dự án trên máy chủ hiệu quả, an toàn.
Ngoài ra, đội ngũ kỹ thuật của Vietnix luôn sẵn sàng hỗ trợ bạn 24/7 trong việc cài đặt và sử dụng Gitea trên Ubuntu bằng Docker cũng như giải đáp mọi thắc mắc của bạn khi cần. Liên hệ ngay với Vietnix để được tư vấn chi tiết hơn.
Các bước tiến hành
Bước 1: Tạo người dùng Git
Gitea cũng giống như các kho lưu trữ mã nguồn khác, sử dụng SSH để truy cập các kho lưu trữ từ xa. Điều này cho phép người dùng kiểm soát quyền truy cập vào mã nguồn của họ bằng cách quản lý các khóa SSH trong chính Gitea.
Tuy nhiên, để người dùng có thể truy cập vào máy chủ thông qua SSH, bạn sẽ cần tạo một người dùng git trên máy chủ. Bước này cần được hoàn thành đầu tiên để bạn có thể truy cập được ID của người dùng và nhóm của người dùng.
Đầu tiên, hãy tạo người dùng trên máy chủ sẽ cho phép các kết nối này:
sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
Trong lệnh này, bạn sẽ tạo một người dùng hệ thống sử dụng bash shell nhưng không có mật khẩu đăng nhập. Điều này cho phép bạn sử dụng sudo
để chạy các lệnh với tư cách người dùng đó nhưng không cần phải đăng nhập. Bạn cũng đặt thư mục chính của người dùng thành /home/git
.
Lệnh này sẽ xuất ra một số thông tin về người dùng vừa được tạo như sau:
Output
Adding system user `git' (UID 112) ...
Adding new group `git' (GID 119) ...
Adding new user `git' (UID 112) with group `git' ...
Creating home directory `/home/git' …
Bạn hãy ghi chú lại các giá trị UID và GID được cung cấp tại đây (trong trường hợp này, UID là 112
và GID là 119
), vì chúng sẽ được sử dụng trong bước tiếp theo sau đây.
Bước 2: Cài đặt Gitea Docker Image
Gitea có một image có sẵn trong kho lưu trữ global của Docker, nghĩa là khi sử dụng Docker Compose, bạn có thể cài đặt và chạy image đó như một dịch vụ mà không cần phải làm gì thêm. Bản thân image này sẽ chạy các dịch vụ SSH và web Gitea, cho phép truy cập Git cả từ trình duyệt và command line.
Để khởi động bộ chứa Gitea, bạn sẽ sử dụng Docker Compose, một công cụ khai báo để thiết lập môi trường.
Bạn bắt đầu bằng cách tạo một thư mục để lưu trữ dịch vụ và di chuyển vào trong đó:
mkdir ~/gitea
cd ~/gitea
Khi đó, hãy tạo một tệp có tên docker-compose.yml
bằng trình soạn thảo văn bản tùy thích của bạn. Ví dụ sau đây sử dụng nano
. Tệp này sẽ chứa các mô tả về các container sẽ chạy như một phần của quá trình cài đặt Gitea trên máy bạn:
nano docker-compose.yml
Thêm các nội dung sau sau vào tệp mới tạo này:
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.16.5
container_name: gitea
environment:
- USER_UID=UID_from_step_1
- USER_GID=GID_from_step_1
restart: always
networks:
- gitea
volumes:
- ./gitea:/data
- /home/git/.ssh/:/data/git/.ssh
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "127.0.0.1:3000:3000"
- "127.0.0.1:2222:22"
Hãy xem qua những gì tập tin này thể hiện:
version: "3"
: Điều này cho phép Docker Compose biết về phiên bản của tệp cấu hình này.networks
: Phần này khai báo các thiết lập mạng của bộ các container của bạn. Trong trường hợp này, mạnggitea
được tạo ra nhưng không được hiển thị ra bên ngoài.services
:image: gitea/gitea:1.16.5
: Điều này xác định rằng bạn sẽ sử dụng phiên bản Gitea 1.16.5; tuy nhiên, bạn có thể thay đổi giá trị sau dấu hai chấm để chỉ định các phiên bản khác, đó có thể là một phiên bản release hay một phiên bản lớn khác chẳng hạn như:1
hay một thẻ như:latest
hay:dev
.environment
: Phần môi trường chỉ định các biến môi trường sẽ có sẵn cho các image trong quá trình cài đặt và chạy. Trong trường hợp này, bạn đang chỉ định ID người dùng và nhóm cho môi trường, sử dụng UID và GID được cung cấp trong output của lệnhadduser
ở Bước 1.restart: always
: Dòng này hướng dẫn Docker luôn khởi động lại các container nếu gặp sự cố, dù do là bản thân các container bị hỏng hay do máy chủ; về cơ bản, Gitea sẽ chạy khi được khởi động.networks
: Điều này chỉ định rằng dịch vụ Gitea sẽ có quyền truy cập và có thể truy cập được trên mạng có được xác định ở trên../gitea:/data
và/home/git/.ssh/:/data/git/.ssh
: Đây là những vị trí mà Gitea sẽ lưu trữ các kho lưu trữ và dữ liệu liên quan. Hiện tại, điều này đang trỏ tới thư mục có têngitea
trong thư mục đang làm việc hiện tại. Docker sẽ tạo thư mục này khi container khởi động nếu nó không tồn tại. Thư mục.ssh
sẽ được mô tả thêm ở phần sau trong Bước 6./etc/timezone
và/etc/localtime
: Hai tập tin này chứa thông tin về múi giờ và thời gian trên máy chủ. Bằng cách map những thứ này trực tiếp vào container dưới dạng tệp read-only map(được chỉ định với phần:ro
cuối cùng của định nghĩa), container sẽ có cùng thông tin với máy chủ lưu trữ.port
: Gitea sẽ lắng nghe các kết nối trên hai cổng. Đầu tiên là lắng nghe các kết nối HTTP trên cổng3000
, nơi cung cấp giao diện web cho kho lưu trữ mã nguồn và tiếp theo là lắng nghe các kết nối SSH trên cổng22
. Trong trường hợp này, bạn đang giữ cổng3000
cho các kết nối HTTP bằng cách map nó tới con số tương ứng và bạn đang map vào cổng trên bộ chứa của Gitea từ cổng 22 thông thường đến cổng 2222 để tránh xung đột cổng. Ở Bước 6, bạn sẽ thiết lập SSH shim để điều hướng các lưu lượng truy cập đến Gitea khi được yêu cầu.
Lưu ý: Đây là một ví dụ tối thiểu cần phải có về tệp Docker Compose cho Gitea. Ngoài ra, còn có một số tùy chọn khác mà bạn có thể đưa vào như sử dụng MySQL hoặc PostGreSQL làm cơ sở dữ liệu sao lưu hoặc một ổ đĩa được đặt tên để lưu trữ. Thiết lập ở mức tối thiểu này sử dụng SQLite làm cơ sở dữ liệu sao lưu và một ổ đĩa sử dụng thư mục có tên gitea
để lưu trữ.
Sau khi hoàn thành hãy lưu và đóng file. Nếu bạn đang sử dụng nano
để chỉnh sửa file, có thể làm như vậy bằng cách nhấn CTRL + X
, Y
, rồi ENTER
.
Với tệp docker-compose.yml
trên, bạn có thể đưa các container lên bằng cách sử dụng Docker Compose:
docker-compose up
Lệnh này sẽ kéo các image xuống, khởi động container của Gitea và sẽ trả về kết quả như sau:
Output
[+] Running 9/9
⠿ server Pulled 8.2s
⠿ e1096b72685a Pull complete 1.4s
⠿ ac9df86bb932 Pull complete 3.3s
⠿ 6d34ed99b58a Pull complete 3.4s
⠿ a8913d040fab Pull complete 3.6s
⠿ a5d3a72a2366 Pull complete 5.3s
⠿ 1f0dcaae29cc Pull complete 5.6s
⠿ f284bcea5adb Pull complete 7.3s
⠿ 0f09c34c97e3 Pull complete 7.5s
[+] Running 2/2
⠿ Network gitea_gitea Created 0.2s
⠿ Container gitea Created 0.2s
Attaching to gitea
gitea | Generating /data/ssh/ssh_host_ed25519_key...
gitea | Generating /data/ssh/ssh_host_rsa_key...
gitea | Generating /data/ssh/ssh_host_dsa_key...
gitea | Generating /data/ssh/ssh_host_ecdsa_key...
gitea | Server listening on :: port 22.
gitea | Server listening on 0.0.0.0 port 22.
gitea | 2022/03/31 17:26:21 cmd/web.go:102:runWeb() [I] Starting Gitea on PID: 14
gitea | 2022/03/31 17:26:21 ...s/install/setting.go:21:PreloadSettings() [I] AppPath: /usr/local/bin/gitea
gitea | 2022/03/31 17:26:21 ...s/install/setting.go:22:PreloadSettings() [I] AppWorkPath: /app/gitea
gitea | 2022/03/31 17:26:21 ...s/install/setting.go:23:PreloadSettings() [I] Custom path: /data/gitea
gitea | 2022/03/31 17:26:21 ...s/install/setting.go:24:PreloadSettings() [I] Log path: /data/gitea/log
gitea | 2022/03/31 17:26:21 ...s/install/setting.go:25:PreloadSettings() [I] Configuration file: /data/gitea/conf/app.ini
gitea | 2022/03/31 17:26:21 ...s/install/setting.go:26:PreloadSettings() [I] Prepare to run install page
gitea | 2022/03/31 17:26:21 ...s/install/setting.go:29:PreloadSettings() [I] SQLite3 is supported
gitea | 2022/03/31 17:26:21 cmd/web.go:208:listen() [I] Listen: http://0.0.0.0:3000
gitea | 2022/03/31 17:26:21 cmd/web.go:212:listen() [I] AppURL(ROOT_URL): http://localhost:3000/
Tuy nhiên, điều này sẽ khiến container chạy ở nền trước và sẽ dừng ngay khi bạn thoát khỏi tiến trình bằng Ctrl + C
hoặc do mất kết nối. Để container vẫn chạy trong nền dưới dạng một tiến trình riêng biệt, bạn có thể nối thêm cờ -d
vào lệnh trên như sau:
docker-compose up -d
Bạn sẽ được thông báo khi container khởi động và sau đó quay trở lại trình shell của bạn như bình thường.
Bước 3: Thiết lập NginX thành Reverse Proxy
Chạy một dịch vụ web như Gitea đằng sau một reverse proxy là một việc làm rất phổ biến, vì các phần mềm máy chủ hiện đại như Apache hoặc Nginx có thể dễ dàng xử lý được nhiều dịch vụ trên cùng một máy, cân bằng tải trên nhiều máy chủ và xử lý SSL. Ngoài ra, điều này sẽ cho phép bạn có thể thiết lập một tên miền trỏ đến Gitea instance của mình đang chạy trên các cổng HTTP(S) tiêu chuẩn.
Theo mục đích của bài hướng dẫn này, bạn sẽ sử dụng Nginx. Trước tiên, hãy cập nhật danh sách các package trên máy chủ của bạn:
sudo apt update
Tiếp theo, bạn cần cài đặt Nginx bằng apt
:
sudo apt install nginx
Bây giờ, khi bạn đang sử dụng tường lửa ufw
, nên bạn sẽ cần phải cho phép truy cập vào các cổng này như sau:
sudo ufw allow "Nginx Full"
Khi đã được thiết lập như trên, bạn sẽ có thể truy cập máy chủ của mình trong trình duyệt bằng cách truy cập http://your_domain
. Điều này sẽ dẫn bạn đến một trang rất đơn giản như chào mừng bạn đến với Nginx.
Tại thời điểm này, bạn sẽ cần tạo một đầu vào của reverse proxy để định hướng các lưu lượng truy cập đến thông qua Nginx đến instance đang chạy của Gitea trong Docker. Tạo một tệp mới trong thư mục sites-available
của Nginx bằng trình soạn thảo văn bản tùy thích của bạn. Ví dụ sau sử dụng nano
:
sudo nano /etc/nginx/sites-available/gitea
Trong file này, hãy thiết lập một khối máy chủ mới để hướng các request vào /
chuyển tới Gitea instance đang chạy của bạn:
server {
# Listen for requests on your domain/IP address.
server_name your_domain;
root /var/www/html;
location / {
# Proxy all requests to Gitea running on port 3000
proxy_pass http://localhost:3000;
# Pass on information about the requests to the proxied service using headers
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Khi đã hoàn tất việc chỉnh sửa file thì lưu và đóng file.
Lưu ý: Để hiểu được cách cấu hình cho tệp trên, bạn có thể tìm hiểu thêm về Nginx HTTP Proxying, Load Balancing, Buffering và Caching.
Nginx xác định những trang web sẽ phục vụ dựa trên việc các tệp đó có nằm trong thư mục sites-enabled
của NginX hay không. Điều này được quản lý thông qua các liên kết tượng trưng (symbolic links) trỏ đến các tệp trong thư mục sites-available
có sẵn.
Bạn sẽ cần tạo một trong những liên kết tượng trưng đó để Nginx bắt đầu phục vụ cho Gitea:
sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/gitea
Trước khi bạn khởi động lại Nginx để thực hiện các thay đổi của mình, hãy nên để Nginx tự kiểm tra xem những thay đổi đó có hợp lệ hay không bằng cách kiểm tra cấu hình như sau.
sudo nginx -t
Nếu không có thông báo lỗi xảy ra, lệnh này sẽ trả về output như sau:
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Nếu có bất kỳ vấn đề nào, output trên sẽ cho bạn biết vấn đề đó là gì và nằm ở đâu.
Khi đã hoàn thành việc kiểm tra, hãy khởi động lại dịch vụ hệ thống Nginx:
sudo systemctl restart nginx
Bây giờ, khi bạn truy cập http://your_domain
trong trình duyệt của mình, bạn sẽ thấy mình đang ở trên trang thiết lập ban đầu cho Gitea.
Bước 4: Cài đặt Certbot và thiết lập chứng chỉ SSL
Nhờ có Certbot và hệ thống cấp chứng chỉ miễn phí Let’s Encrypt, việc thêm mã hóa TLS vào ứng dụng cài đặt Gitea của bạn sẽ chỉ nằm vỏn vẹn trong chỉ 2 lệnh.
Đầu tiên, cài đặt Certbot và plugin Nginx của nó:
sudo apt install certbot python3-certbot-nginx
Tiếp theo, hãy chạy certbot
ở chế độ --nginx
và chỉ định cùng một tên miền mà bạn đã sử dụng trong chỉ thị cấu hình Nginx server_name
:
sudo certbot --nginx -d your_domain_here
Bạn sẽ được yêu cầu đồng ý với các điều khoản dịch vụ của Let’s Encrypt và nhập địa chỉ email.
Sau đó, bạn sẽ được hỏi có muốn chuyển hướng tất cả lưu lượng HTTP sang HTTPS hay không. Điều đó sẽ tùy thuộc vào bạn, nhưng điều này thường được khuyến khích đồng ý nhằm để giúp cho trang web được an toàn hơn.
Sau đó, Let’s Encrypt sẽ xác nhận yêu cầu của bạn và Certbot sẽ bắt đầu tải xuống chứng chỉ:
Output
Congratulations! You have successfully enabled https://your_domain
You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/your_domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/your_domain/privkey.pem
Your cert will expire on 2022-05-09. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Certbot sẽ tự động tải lại Nginx với cấu hình và chứng chỉ mới. Tải lại trang web của bạn trong trình duyệt và các sẽ tự động được điều hướng sang HTTPS nếu trước đó bạn đã chọn tùy chọn chuyển hướng.
Trang web của bạn hiện đã được bảo mật và an toàn hơn.
Bước 5: Cấu hình Gitea và thêm người dùng đầu tiên
Bây giờ bạn có thể chuyển sang cấu hình Gitea và tạo người dùng quản trị đầu tiên. Truy cập phiên bản Gitea của bạn bằng cách mở https://your_domain
trong trình duyệt. Trên màn hình cấu hình Gitea ban đầu, sẽ có một số tùy chọn cho dịch vụ:
Một trong số này chẳng hạn như tiêu đề trang web tùy thuộc vào trường hợp sử dụng cụ thể của bạn, và để tiếp tục theo dõi bài hướng dẫn này, bạn sẽ cần thay đổi những điều sau:
- Server domain: Tên miền của máy chủ mà bạn đã thiết lập ở Bước 3.
- Gitea Base URL: URL đầy đủ mà bạn sẽ sử dụng để truy cập Gitea trong trình duyệt, bao gồm cả phần giao thức. Ví dụ:
https://your_domain
.
Khi đã hoàn thành bạn lưu các thay đổi cấu hình của mình, và sẽ được chuyển đến trang đăng nhập Gitea.
Lưu ý: Khi cấu hình đã được lưu, dịch vụ Gitea sẽ khởi động lại. Vì quá trình này có thể mất vài giây nên bạn có thể gặp lỗi Nginx với thông báo 502 Bad Gateway. Nếu gặp phải lỗi này, hãy đợi vài giây và khởi động lại trang.
Vì bạn chưa có user, trước tiên bạn sẽ cần tạo một user. Nhấp vào liên kết Need an Account? Register Now ngay bên dưới form đăng nhập để đăng ký user mới. Là người dùng đầu tiên trên hệ thống, người dùng này sẽ được tạo với tư cách quản trị viên. Nếu bạn thiết lập cài đặt email vào lúc cấu hình, trước tiên bạn có thể cần phải xác minh tài khoản của mình.
Khi đã đăng nhập với tư cách user đó, hãy nhấp vào biểu tượng người dùng của bạn ở góc trên bên phải của trang, sau đó nhấp vào Site Administration từ menu dạng trượt sẽ đưa bạn đến trang nơi bạn có thể vận hành các công việc như bảo trì, quản lý tài khoản user và tổ chức, đồng thời có thể cấu hình thêm cho Gitea.
Tạo một kho lưu trữ thử nghiệm
Để thử nghiệm Gitea, cả trên giao diện web và sử dụng Git, hãy tạo một kho lưu trữ thử nghiệm. Bạn luôn có thể xóa kho lưu trữ này nếu cần thiết.
Nhấp vào dấu + ở góc trên bên phải của trang, sau đó nhấp vào + New Repository từ menu dạng trượt. Tại đây, bạn sẽ thấy một màn hình cho phép bạn đặt tên và tùy chỉnh kho lưu trữ của mình với các thông tin như mô tả, các cài đặt như có riêng tư hay không và các nội dung mặc định chẳng hạn như tệp README
hoặc .gitignore
.
Khi bạn nhấn Create Repository, bạn sẽ có một kho lưu trữ mới để sử dụng.
Bước 6: Cấu hình SSH Shim
Bước cuối cùng của quy trình là chuẩn bị máy chủ với SSH shim. Vì Gitea đang chạy trong container của Docker nên không chấp nhận các kết nối SSH trên cổng mặc định là 22
, vì điều này sẽ gây ra xung đột với máy chủ lưu trữ.
Trong tệp docker-compose.yml
mà bạn đã tạo ở trên, Docker được thiết lập để ánh xạ một cổng trên máy chủ lưu trữ tới cổng 22
trên container để cho phép các kết nối SSH tới cổng 2222
. Ngoài ra, tệp authorized_keys
của SSH sẽ không cho phép các truy cập vào host bằng SSH có khóa không nằm trong tệp theo mặc định.
Để xử lí điều đó, bạn sẽ cần tạo một SSH shim để chuyển các kết nối SSH tới người dùng git trên máy chủ vào container. Trong tệp docker-compose.yml
, bạn cũng đã chỉ định rằng NGƯỜI DÙNG trong container sẽ có ID người dùng và ID nhóm là 1000 và trong lúc cấu cấu hình Gitea, bạn đã yêu cầu dịch vụ sử dụng người dùng có tên git.
Tạo người dùng Git và SSH cho người dùng
Tiếp theo, bạn sẽ cần tạo khóa SSH cho người dùng. Điều này sẽ chỉ được sử dụng trong một bước bên dưới và không được chia sẻ với bất kỳ ai bên ngoài máy chủ lưu trữ.
sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"
Lệnh này sử dụng sudo
để tạo khóa SSH với tư cách là người dùng mà bạn đã tạo ở trên. Trong trường hợp này, khóa sẽ là khóa RSA 4096 bit. Đồng thời, bạn sẽ được hỏi một loạt câu hỏi như bạn muốn mật khẩu nào cho khóa và đặt tên cho tệp khóa là gì. Hãy nhấn ENTER
cho từng mục, để trống chúng để sử dụng các giá trị mặc định.
Cảnh báo: Nếu bạn đã đặt mật khẩu trên khóa thì bạn sẽ không thể sử dụng shim.
Bạn cần đảm bảo rằng người dùng trong vùng chứa Gitea sẽ cho phép khóa mới tạo này. Bạn có thể làm điều này bằng cách thêm khóa đó vào tệp .ssh/authorized_keys
:
sudo -u git cat /home/git/.ssh/id_rsa.pub | sudo -u git tee -a /home/git/.ssh/authorized_keys
sudo -u git chmod 600 /home/git/.ssh/authorized_keys
Tất cả các lệnh này đều hoạt động với shim do là thư mục /home/git/.ssh
trên Máy chủ được mount dưới dạng một ổ đĩa trên container, nghĩa là nội dung sẽ được chia sẻ với nhau giữa chúng. Khi nhận được kết nối đến máy chủ thông qua git bằng SSH, máy chủ sẽ sử dụng cùng một tệp authorized_keys
để xác thực.
Tạo SSH Shim Script
Bước cuối cùng cho shim là tạo một lệnh gitea
sơ khai trên máy chủ. Điều này sẽ cho phép các lệnh git hoạt động trên SSH: khi một kết nối SSH được thiết lập, một lệnh mặc định sẽ được chạy. Lệnh gitea
này trên máy chủ sẽ chuyển các kết nối SSH tới các container.
Đối với script này, hãy sử dụng cat
để ghi vào tệp /usr/local/bin/gitea
:
cat <<"EOF" | sudo tee /usr/local/bin/gitea
#!/bin/sh
ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
EOF
Lệnh trong tập lệnh này sẽ tạo một kết nối SSH đến các container của Gitea Docker, và truyền vào đó các nội dung của lệnh ban đầu được sử dụng bởi git.
Cuối cùng, hãy đảm bảo rằng tập lệnh có thể thực thi được, bằng việc cấp lệnh thực thi như sau:
sudo chmod +x /usr/local/bin/gitea
Kiểm tra kết nối SSH đến Git
Bạn có thể kiểm tra việc pull và push vào Git repo trên máy chủ Gitea hiện tại của mình bằng cách thêm khóa SSH vào người dùng Gitea.
Bạn sẽ cần nội dung của public key SSH của mình. Khóa này thường nằm trong một tệp có tên giống như ~/.ssh/id_rsa.pub
, tùy thuộc vào thuật toán mà bạn đã sử dụng khi tạo khóa của mình:
cat ~/.ssh/id_rsa.pub
Sao chép output của lệnh này (là giá trị của public key).
Trong Gitea, nhấp vào biểu tượng người dùng của bạn ở góc trên bên phải và chọn Settings. Trên trang cài đặt, sẽ có một loạt các tab ở trên cùng. Nhấp vào SSH/GPG Keys, sau đó nhấp vào nút Add Key bên cạnh Manage SSH Keys. Dán khóa của bạn vào vùng văn bản lớn trong biểu mẫu rồi nhấp vào nút Add Key bên dưới.
Bây giờ, điều hướng đến kho lưu trữ thử nghiệm mà bạn đã tạo ở Bước 3 và sao chép URL SSH được cung cấp. Trên máy tính local, hãy tiến hành clone repository như sau:
git clone git@your_domain:username/test
Điều này sẽ sử dụng SSH để kéo kho lưu trữ về máy bạn. Nếu bạn đã đặt mật khẩu cho khóa SSH của mình, bạn sẽ được yêu cầu cung cấp mật khẩu đó.
Di chuyển đến thư mục vừa clone và tạo một tệp mới:
cd test
touch just_testing
Tiếp theo, thêm tệp đó vào staged changes:
git add just_testing
Cuối cùng, commit
tập tin đó:
git commit -am "Just testing pushing over SSH!"
Bây giờ, bạn sẽ có thể push
các thay đổi của mình vào kho lưu trữ từ xa:
git push origin master
Sau đó, hãy làm mới lại trang trong trình duyệt của mình, tệp mới của bạn sẽ xuất hiện trong kho lưu trữ.
Như bậy bạn đã thiết lập dịch vụ Gitea bằng Docker để tự lưu trữ kho lưu trữ mã nguồn của mình. Từ đây, bạn sẽ có thể làm việc trên cả kho lưu trữ công khai và riêng tư, sử dụng các quy trình công việc quen thuộc như pull-request code reviews và tổ chức sắp xếp các dự án.
Gitea cũng hoạt động tốt với nhiều công cụ triển khai và tích hợp liên tục (CI/CD) khác nhau như Drone, Jenkins và GoCD. Ngoài ra, việc sử dụng các volume Docker cho phép mở rộng dung lượng lưu trữ để phù hợp với nội dung Git LFS (lưu trữ tệp lớn) trên mạng hay các block storage.
Lời kết
Cảm ơn bạn đã theo dõi bài viết hướng dẫn cài đặt Gitea trên Ubuntu bằng Docker. Nếu bạn có bất kỳ câu hỏi hay cần hỗ trợ thêm, đừng ngần ngại để lại bình luận, Vietnix sẽ hỗ trợ bạn nhanh chóng nhất.