Cách cài đặt Gitea DevOps Platform bằng Docker trên Debian 12

theanh

Administrator
Nhân viên
Gitea là giải pháp lưu trữ mã nguồn mở dựa trên nền tảng Git. Nó được viết bằng ngôn ngữ Go và có thể cài đặt trên nhiều hệ điều hành, bao gồm Linux, macOS, Windows và các kiến trúc như amd64, i386, ARM và các kiến trúc khác. Nó bao gồm trình chỉnh sửa tệp kho lưu trữ, theo dõi sự cố, yêu cầu kéo, quản lý người dùng, thông báo, wiki tích hợp, Hỗ trợ LFS, Git hook và nhiều hơn nữa.

Đây là ứng dụng nhẹ. Do đó, nó có thể được cài đặt trên các hệ thống có công suất thấp. Nếu bạn đang tìm kiếm một nền tảng Git tự lưu trữ với nền tảng bộ nhớ nhỏ hơn, bạn nên xem qua Gitea.

Bài viết này sẽ đề cập đến việc cài đặt và cấu hình Gitea trên máy chủ Debian 12 và thiết lập kho lưu trữ Git đầu tiên của bạn. Gitea có thể được cài đặt từ nguồn, nhị phân, gói docker hoặc gói. Đối với hướng dẫn của chúng tôi, chúng tôi sẽ cài đặt nó bằng Docker.

Điều kiện tiên quyết​


  • Máy chủ chạy Debian 12.

  • Người dùng không phải root có quyền sudo.

  • Tên miền đủ điều kiện (FQDN) như gitea.example.com trỏ đến máy chủ của bạn.

  • Đảm bảo máy chủ của bạn đã bật bộ nhớ hoán đổi nếu bạn đang sử dụng máy chủ có RAM 1GB.

  • Đảm bảo mọi thứ đều đã cập nhật.
Mã:
$ sudo apt update && sudo apt upgrade
[*]
Cần có một số gói thiết yếu trước khi chúng ta tiến hành. Một số trong số này sẽ được cài đặt trên máy chủ của bạn.
Mã:
$ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y

Bước 1 - Cấu hình Tường lửa​

Bước đầu tiên là cấu hình tường lửa. Debian đi kèm với ufw (Uncomplicated Firewall) theo mặc định.

Kiểm tra xem tường lửa có đang chạy không.
Mã:
$ sudo ufw status
Bạn sẽ nhận được kết quả sau.
Mã:
Status: inactive
Cho phép cổng SSH để tường lửa không làm gián đoạn kết nối hiện tại khi bật nó.
Mã:
$ sudo ufw allow OpenSSH
Cho phép cả cổng HTTP và HTTPS.
Mã:
$ sudo ufw allow http
$ sudo ufw allow https
Kích hoạt Tường lửa
Mã:
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Kiểm tra lại trạng thái của tường lửa.
Mã:
$ sudo ufw status
Bạn sẽ thấy thông báo tương tự đầu ra.
Mã:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)

Bước 2 - Cài đặt Docker và Docker Compose​

Debian 12 đi kèm với phiên bản Docker cũ hơn. Để cài đặt phiên bản mới nhất, trước tiên, hãy nhập khóa GPG của Docker.
Mã:
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
Tạo kho lưu trữ Docker tập tin.
Mã:
$ echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Cập nhật danh sách kho lưu trữ hệ thống.
Mã:
$ sudo apt update
Cài đặt phiên bản mới nhất của Docker.
Mã:
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Xác minh rằng nó đang chạy.
Mã:
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: enabled) Active: active (running) since Sat 2023-11-18 07:13:39 UTC; 10s ago
TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 1891 (dockerd) Tasks: 8 Memory: 27.2M CPU: 338ms CGroup: /system.slice/docker.service ??1891 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Theo mặc định, Docker yêu cầu quyền root. Nếu bạn muốn tránh sử dụng sudo mỗi khi bạn chạy lệnh docker, hãy thêm tên người dùng của bạn vào docker nhóm.
Mã:
$ sudo usermod -aG docker $(whoami)
Bạn sẽ cần phải đăng xuất khỏi máy chủ và đăng nhập lại với cùng một người dùng để kích hoạt thay đổi này hoặc sử dụng lệnh sau lệnh.
Mã:
$ su - ${USER}
Xác nhận rằng người dùng của bạn đã được thêm vào nhóm Docker.
Mã:
$ groups
navjot sudo users docker

Bước 3 - Tạo người dùng Git​

Để người dùng có thể truy cập máy chủ qua SSH, bạn sẽ cần tạo một người dùng git riêng trên máy chủ. Chạy lệnh sau để tạo người dùng git.
Mã:
$ sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
Chúng ta hãy xem qua tất cả các tùy chọn và cờ trong lệnh trên để có cái nhìn tốt hơn hiểu biết.
  • --system - tạo người dùng hệ thống thay vì người dùng thông thường. Người dùng hệ thống dùng để chạy các dịch vụ hệ thống và không thể sử dụng để đăng nhập tương tác.
  • --shell /bin/bash - thiết lập shell đăng nhập cho người dùng hệ thống thành shell Bash.
  • --gecos 'Git Version Control' - thiết lập trường mô tả cho người dùng. Tùy chọn này có thể bỏ qua nhưng hữu ích nếu hệ thống của bạn có nhiều người dùng.
  • --group - tạo một nhóm có cùng tên với người dùng.
  • --disabled-password - vô hiệu hóa đăng nhập bằng mật khẩu cho người dùng, giúp bảo mật tài khoản.
  • --home /home/git - đặt thư mục gốc cho người dùng thành /home/git nơi lưu trữ các tệp của người dùng và cấu hình.
  • git - chỉ định tên người dùng. Ở đây chúng ta sử dụng git làm tên người dùng cho tài khoản.
Bạn sẽ nhận được kết quả đầu ra sau khi chạy lệnh.
Mã:
Adding system user `git' (UID 105) ...
Adding new group `git' (GID 111) ...
Adding new user `git' (UID 105) with group `git' ...
Creating home directory `/home/git' ...
Lưu ý các giá trị của biến UID và GID mà chúng ta sẽ cần ở bước tiếp theo. Trong trường hợp của chúng tôi, UID là 105 và GID là 111.

Bước 4 - Cấu hình và cài đặt Gitea​

Cấu hình múi giờ hệ thống​

Bạn có thể kiểm tra múi giờ hiện tại của hệ thống bằng lệnh sau.
Mã:
$ timedatectl Local time: Sat 2023-11-18 07:15:53 UTC Universal time: Sat 2023-11-18 07:15:53 UTC RTC time: Sat 2023-11-18 07:15:53 Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes NTP service: active RTC in local TZ: no
Bạn có thể thấy hệ thống được đặt thành múi giờ GMT hoặc UTC. Nếu bạn sống ở khu vực có múi giờ khác hoặc muốn thay đổi, hãy sử dụng lệnh sau để thực hiện.
Mã:
$ sudo timedatectl set-timezone Asia/Kolkata
Kiểm tra lại múi giờ.
Mã:
$ timedatectl Local time: Sat 2023-11-18 12:46:29 IST Universal time: Sat 2023-11-18 07:16:29 UTC RTC time: Sat 2023-11-18 07:16:29 Time zone: Asia/Kolkata (IST, +0530)
System clock synchronized: yes NTP service: active RTC in local TZ: no
Bạn có thể thấy múi giờ đã được cập nhật thành IST, tức là GMT+5:30.

Tạo Gitea Thư mục​

Tạo thư mục cho Gitea.
Mã:
$ mkdir ~/gitea-docker
Chuyển sang thư mục Gitea.
Mã:
$ cd ~/gitea-docker
Tạo thư mục để lưu trữ dữ liệu Gitea và PostgreSQL cơ sở dữ liệu.
Mã:
$ mkdir {gitea,postgres}

Cấu hình tệp Gitea Docker Compose​

Tạo và mở tệp Docker Compose để chỉnh sửa.
Mã:
$ nano docker-compose.yml
Dán mã sau vào đó. Dán các giá trị UID và GID đã tạo trước đó.
Mã:
services: server: image: gitea/gitea:1.21.0 container_name: gitea environment: - USER_UID=105 - USER_GID=111 - GITEA__database__DB_TYPE=postgres - GITEA__database__HOST=db:5432 - GITEA__database__NAME=gitea - GITEA__database__USER=gitea - GITEA__database__PASSWD=gitea restart: always networks: - gitea volumes: - ./gitea:/data - /home/git/.ssh/:/data/git/.ssh - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "3000:3000" - "2221:22" depends_on: - db db: image: postgres:15 restart: always environment: - POSTGRES_USER=gitea - POSTGRES_PASSWORD=gitea - POSTGRES_DB=gitea networks: - gitea volumes: - ./postgres:/var/lib/postgresql/data
networks: gitea: external: false
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Chúng tôi đang sử dụng các giá trị UID (Mã định danh người dùng) và GID (Mã định danh nhóm) cho người dùng mà chúng tôi đã tạo ở bước trước.

Tệp Docker Compose ở trên triển khai hai container - một cho Gitea và một cho PostgreSQL. Chúng tôi đã thêm một vài biến môi trường để cấu hình chi tiết cơ sở dữ liệu. Để kết nối cơ sở dữ liệu PostgreSQL với vùng chứa Gitea, chúng tôi đã chỉ định máy chủ làm tên của dịch vụ PostgreSQL trong tệp.

Các tham số cổng "3000:3000""2221:22" chỉ định ánh xạ cổng trong đó cổng bên trái biểu thị cổng máy chủ và cổng bên phải biểu thị cổng vùng chứa. Gitea sử dụng cổng 3000 cho dịch vụ web của mình, đây cũng là cổng mà chúng tôi đã đưa lên máy chủ. Đối với SSH, hệ thống của chúng tôi đã sử dụng cổng 22 cho mục đích ghi nhật ký. Do đó, chúng tôi chỉ định một cổng tùy chỉnh để thực hiện các hoạt động SSH. Trong trường hợp của chúng tôi, chúng tôi đang sử dụng cổng 2221. Cổng này cũng cần được mở thông qua tường lửa của bạn, chúng tôi đã thực hiện ở bước 1 của hướng dẫn này.

Cả Gitea và các container PostgreSQL đều được kết nối thông qua một mạng Docker nội bộ chung có tên là gitea. Các lần gắn kết ổ đĩa sẽ tự động tạo các thư mục giteapostgres trong thư mục hiện tại khi bạn bắt đầu cài đặt Docker. ID người dùng được chỉ định trong tệp soạn thảo là ID mà vùng chứa Gitea sẽ sử dụng để tạo thư mục gitea. Mặt khác, vùng chứa PostgreSQL sẽ được quản lý bởi người dùng systemd-coredump, đây là hành vi mặc định. Bạn có thể thay đổi hành vi đó, nhưng không cần thiết.

Tùy chỉnh Cài đặt Gitea của bạn​

Bạn có thể tùy chỉnh cài đặt Gitea của mình bằng cách thêm tệp app.ini vào thư mục ~/gitea-docker/gitea/gitea/conf. Sau khi cài đặt, tệp này có thể được chỉnh sửa từ bên trong vùng chứa từ vị trí /data/gitea/conf/app.ini. Bạn có thể sử dụng tệp ini mẫu từ kho lưu trữ Github của Gitea để tham khảo.

Cài đặt Gitea​

Chạy lệnh sau để khởi chạy các container Gitea.
Mã:
$ docker compose up -d
Kiểm tra trạng thái của các container để đảm bảo chúng đang chạy đúng cách.
Mã:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b5ce50a04fe gitea/gitea:1.21.0 "/usr/bin/entrypoint…" 43 seconds ago Up 42 seconds 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:2221->22/tcp, :::2221->22/tcp gitea
0908cb9ec3b7 postgres:15 "docker-entrypoint.s…" 43 seconds ago Up 42 seconds 5432/tcp gitea-docker-db-1
Bạn cũng có thể sử dụng lệnh sau để kiểm tra trạng thái.
Mã:
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
gitea gitea/gitea:1.21.0 "/usr/bin/entrypoint /bin/s6-svscan /etc/s6" server About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:2221->22/tcp, :::2221->22/tcp
gitea-docker-db-1 postgres:15 "docker-entrypoint.sh postgres" db About a minute ago Up About a minute 5432/tcp

Bước 5 - Cài đặt Nginx​

Debian 12 đi kèm với phiên bản Nginx cũ hơn. Để cài đặt phiên bản mới nhất, bạn cần tải xuống kho lưu trữ Nginx chính thức.

Nhập khóa ký của Nginx.
Mã:
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Thêm kho lưu trữ cho phiên bản ổn định của Nginx.
Mã:
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list
Cập nhật hệ thống kho lưu trữ.
Mã:
$ sudo apt update
Cài đặt Nginx.
Mã:
$ sudo apt install nginx
Xác minh cài đặt. Trên hệ thống Debian, lệnh sau chỉ hoạt động với sudo.
Mã:
$ sudo nginx -v
nginx version: nginx/1.24.0
Khởi động Nginx máy chủ.
Mã:
$ sudo systemctl start nginx
Kiểm tra trạng thái dịch vụ.
Mã:
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled) Active: active (running) since Sat 2023-11-18 15:47:20 IST; 1s ago Docs: https://nginx.org/en/docs/ Process: 4225 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 4226 (nginx) Tasks: 2 (limit: 2315) Memory: 1.8M CPU: 7ms CGroup: /system.slice/nginx.service ??4226 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf" ??4227 "nginx: worker process"
Mở địa chỉ IP của máy chủ trong trình duyệt web của bạn. Bạn sẽ thấy trang sau, nghĩa là máy chủ của bạn đã hoạt động.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22574%22%20height=%22268%22%3E%3C/svg%3E

Bước 6 - Cài đặt SSL​

Chúng ta cần cài đặt Certbot để tạo chứng chỉ SSL. Bạn có thể cài đặt Certbot bằng kho lưu trữ của Debian hoặc tải phiên bản mới nhất bằng công cụ Snapd. Chúng ta sẽ sử dụng phiên bản Snapd.

Debian 12 không đi kèm Snapd đã cài đặt. Cài đặt gói Snapd.
Mã:
$ sudo apt install snapd
Chạy các lệnh sau để đảm bảo phiên bản Snapd của bạn được cập nhật.
Mã:
$ sudo snap install core && sudo snap refresh core
Cài đặt Certbot.
Mã:
$ sudo snap install --classic certbot
Sử dụng lệnh sau để đảm bảo lệnh Certbot có thể chạy được bằng cách tạo liên kết tượng trưng đến /usr/bin thư mục.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Xác minh xem Certbot có hoạt động bình thường không.
Mã:
$ certbot --version
certbot 2.7.4
Tạo SSL chứng chỉ.
Mã:
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d gitea.example.com
Lệnh trên sẽ tải chứng chỉ xuống thư mục /etc/letsencrypt/live/gitea.example.com trên máy chủ của bạn.

Tạo nhóm Diffie-Hellman chứng chỉ.
Mã:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Kiểm tra dịch vụ lập lịch gia hạn Certbot.
Mã:
$ sudo systemctl list-timers
Bạn sẽ tìm thấy snap.certbot.renew.service là một trong những dịch vụ được lên lịch chạy.
Mã:
NEXT LEFT LAST PASSED UNIT ACTIVATES
---------------------------------------------------------------------------------------------------------------------------
Sat 2023-11-18 18:41:45 IST 2h 49min left Sat 2023-11-18 12:22:34 IST 3h 29min ago apt-daily.timer apt-daily.service
Sat 2023-11-18 20:40:00 IST 4h 47min left - - snap.certbot.renew.timer snap.certbot.renew.service
Sun 2023-11-19 00:00:00 IST 8h left - - dpkg-db-backup.timer dpkg-db-backup.service
Thực hiện chạy thử quy trình để kiểm tra xem việc gia hạn SSL có hoạt động không tốt.
Mã:
$ sudo certbot renew --dry-run
Nếu bạn không thấy lỗi nào, bạn đã hoàn tất. Chứng chỉ của bạn sẽ tự động gia hạn.

Bước 7 - Cấu hình Nginx​

Chạy lệnh sau để thêm tệp cấu hình cho trang web của bạn.
Mã:
$ sudo nano /etc/nginx/conf.d/gitea.conf
Dán mã sau vào trình chỉnh sửa.
Mã:
# Connection header for WebSocket reverse proxy
map $http_upgrade $connection_upgrade { default upgrade; "" close;
}
map $remote_addr $proxy_forwarded_elem { # IPv4 addresses can be sent as-is ~^[0-9.]+$ "for=$remote_addr"; # IPv6 addresses need to be bracketed and quoted ~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\""; # Unix domain socket names cannot be represented in RFC 7239 syntax default "for=unknown";
}
map $http_forwarded $proxy_add_forwarded { # If the incoming Forwarded header is syntactically valid, append to it "~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*([ \\t]*,([ \\t]*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*)?)*$" "$http_forwarded, $proxy_forwarded_elem"; # Otherwise, replace it default "$proxy_forwarded_elem";
}
# Redirect all non-encrypted to encrypted
server { listen 80; listen [::]:80; server_name gitea.example.com; return 301 https://$host$request_uri;
}
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name gitea.example.com; ssl_certificate /etc/letsencrypt/live/gitea.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/gitea.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/gitea.example.com/chain.pem; ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; ssl_dhparam /etc/ssl/certs/dhparam.pem; resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s; resolver_timeout 2s; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; access_log /var/log/nginx/gitea.access.log main; error_log /var/log/nginx/gitea.error.log; tcp_nopush on; # security headers add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self' http: https: ws: wss: data: blob: 'unsafe-inline'; frame-ancestors 'self';" always; add_header Permissions-Policy "interest-cohort=()" always; # . files location ~ /\.(?!well-known) { deny all; } location / { client_max_body_size 100M; proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_cache_bypass $http_upgrade; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header Forwarded $proxy_add_forwarded; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; }
}
Sau khi hoàn tất, nhấn Ctrl + X để đóng trình chỉnh sửa và nhấn Y khi được nhắc lưu tệp.

Mở tệp /etc/nginx/nginx.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/nginx/nginx.conf
Thêm dòng sau vào trước dòng include /etc/nginx/conf.d/*.conf;.
Mã:
server_names_hash_bucket_size 64;
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc. Kiểm tra cấu hình Nginx.
Mã:
$ sudo nginx -t
Bạn sẽ thấy đầu ra sau cho biết cấu hình của bạn là chính xác.
Mã:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Tải lại Nginx dịch vụ.
Mã:
$ sudo systemctl reload nginx

Bước 8 - Truy cập và thiết lập Gitea​

Truy cập URL https://gitea.example.com trong trình duyệt của bạn và màn hình cài đặt sau sẽ xuất hiện.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22705%22%20height=%22750%22%3E%3C/svg%3E


Hầu hết các trường sẽ được điền sẵn cho bạn dựa trên các giá trị từ tệp Docker compose.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22740%22%20height=%22750%22%3E%3C/svg%3E


Nhập gitea.example.com làm Miền máy chủhttps://gitea.example.com làm URL Gitea Base. Thay đổi giá trị cho SSH Server Port từ 22 thành 2221. Giữ nguyên các thiết lập còn lại.

Nếu bạn muốn sử dụng các tính năng thư, bạn có thể thêm thông tin chi tiết về máy chủ SMTP của mình. Mở rộng phần Thiết lập email của trang và nhập các giá trị như trong ảnh chụp màn hình. Đảm bảo bao gồm cổng SMTP của bạn với tên máy chủ như được hiển thị. Đối với hướng dẫn của chúng tôi, chúng tôi đang sử dụng dịch vụ Amazon SES. Bạn có thể sử dụng bất kỳ dịch vụ SMTP nào bạn chọn.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22660%22%20height=%22411%22%3E%3C/svg%3E


Có một số cài đặt khác bạn nên kiểm tra trước khi cài đặt. Để thay đổi chúng, hãy mở rộng phần Cài đặt máy chủ và dịch vụ của bên thứ ba của trang.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22669%22%3E%3C/svg%3E


Thay đổi cài đặt theo yêu cầu của bạn. Chúng tôi đã bật tùy chọn Ẩn địa chỉ email theo mặc định để đảm bảo quyền riêng tư cao hơn và Yêu cầu đăng nhập để xem trang để giữ cho trang Git của chúng tôi riêng tư. Nếu bạn không muốn mọi người đăng ký tài khoản, hãy bật tùy chọn Tắt tự đăng ký.

Cuối cùng nhưng không kém phần quan trọng, hãy thiết lập tài khoản quản trị viên của bạn. Mở rộng phần Cài đặt tài khoản quản trị viên của trang và điền các giá trị bắt buộc.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22511%22%3E%3C/svg%3E


Nhấp vào nút Cài đặt Gitea khi hoàn tất để hoàn tất quá trình cài đặt. Bạn sẽ được chuyển hướng đến bảng điều khiển Gitea. Nếu vì lý do nào đó, bạn nhận được lỗi 502, hãy làm mới trang.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22406%22%3E%3C/svg%3E

Bước 8 - Tạo kho lưu trữ đầu tiên​

Chúng ta hãy tạo kho lưu trữ đầu tiên. Để thực hiện điều đó, hãy nhấp vào dấu + trên bảng điều khiển.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22597%22%20height=%22236%22%3E%3C/svg%3E


Nhập thông tin chi tiết về kho lưu trữ. Chọn nhãn Sự cố mặc định bằng cách chọn từ menu thả xuống. Chọn giấy phép phù hợp cho kho lưu trữ của bạn.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22668%22%20height=%22750%22%3E%3C/svg%3E


Chọn nhánh mặc định cho kho lưu trữ của bạn.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22677%22%20height=%22510%22%3E%3C/svg%3E


Sau khi đã hài lòng, hãy nhấp vào nút Tạo kho lưu trữ để tạo kho lưu trữ đầu tiên trên Cài đặt Gitea. Bạn sẽ được chuyển hướng đến trang chủ kho lưu trữ của mình.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22457%22%3E%3C/svg%3E

Bước 9 - Thiết lập SSH​

Chúng ta hãy thiết lập SSH để sử dụng với kho lưu trữ mới tạo của mình.

Đối với hướng dẫn này, chúng ta sẽ sử dụng một máy tính cục bộ đã cài đặt sẵn Ubuntu. Tuy nhiên, các lệnh này có thể hoạt động trên bất kỳ thiết bị đầu cuối hệ điều hành nào mà không cần thay đổi nhiều.

Tạo khóa SSH mới để sử dụng với Gitea trên PC cục bộ của bạn.
Mã:
$ ssh-keygen -f ~/.ssh/gitea-demo -t rsa -b 4096 -C "HowtoForge Gitea Demo" -q -N "yourpassphrase"
Nhập cụm mật khẩu mạnh thay cho chỗ giữ chỗ trong lệnh trên. Thao tác này sẽ tạo khóa SSH tại vị trí ~/.ssh/gitea-demo.

Tiếp theo, mở cài đặt hồ sơ Gitea của bạn như hiển thị bằng cách nhấp vào menu thả xuống trên ảnh hồ sơ của bạn và chọn tùy chọn Cài đặt.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22200%22%20height=%22384%22%3E%3C/svg%3E


Tiếp theo, chuyển sang SSH/GPG Tab Khóa trên trang.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22339%22%3E%3C/svg%3E


Thêm tên cho khóa SSH của bạn. Quay lại thiết bị đầu cuối trên PC cục bộ của bạn và chạy lệnh sau để xuất khóa công khai cho Gitea.
Mã:
$ cat ~/.ssh/gitea-demo.pub
Sao chép đầu ra kết quả và dán lại vào hộp Nội dung trên trang khóa SSH của Gitea.

Nhấp vào nút Thêm khóa để hoàn tất việc thêm khóa.





Quay lại PC cục bộ của bạn và thiết lập tác nhân SSH để duy trì hoạt động trong 1 giờ.
Mã:
$ eval $(ssh-agent -t 3600)
Thêm khóa SSH mới tạo vào tác nhân SSH.
Mã:
$ ssh-add ~/.ssh/gitea-demo
Enter passphrase for /home/navjot/.ssh/gitea-demo:
Identity added: /home/navjot/.ssh/gitea-demo (HowtoForge Gitea Demo)
Bạn sẽ được nhắc nhập mật khẩu.

Bước 10 - Sao chép kho lưu trữ sử dụng SSH Truy cập lại trang kho lưu trữ và sao chép URL SSH sau khi chọn tùy chọn SSH.​


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22541%22%20height=%2293%22%3E%3C/svg%3E


Nó sẽ trông như sau.
Mã:
ssh://[emailprotected]:2221/navjot/howtoforge.git
Chạy lệnh sau trên PC cục bộ của bạn để sao chép kho lưu trữ bằng SSH.
Mã:
$ git clone ssh://[emailprotected]:2221/navjot/howtoforge.git
Cloning into 'howtoforge'...
The authenticity of host '[gitea.example.com]:2221 ([128.199.48.13]:2221)' can't be established.
ED25519 key fingerprint is SHA256:H7t5hNmEpZkYC9u3sXbA1mnGXCnoqaUZGL+gpAG9uNs.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[gitea.example.com]:2221' (ED25519) to the list of known hosts.
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.
Bạn sẽ được nhắc thêm thông tin đăng nhập máy chủ. Nhập yes để tiến hành sao chép kho lưu trữ.

Bạn sẽ thấy kho lưu trữ đã sao chép trên hệ thống của mình.
Mã:
$ ls
howtoforge
Chuyển sang thư mục.
Mã:
$ cd howtoforge
Kiểm tra trạng thái Git của kho lưu trữ mới được sao chép. Để thực hiện việc này, bạn nên cài đặt Git trên PC cục bộ của mình.
Mã:
$ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
Điều này kết luận rằng SSH đang hoạt động hoàn hảo.

Bước 11 - Kiểm tra lần cam kết đầu tiên​

Bây giờ chúng ta đã thiết lập kho lưu trữ đầu tiên, đã đến lúc thực hiện một số thay đổi và cam kết chúng trở lại.

Chúng ta hãy cập nhật Tệp README.md. Trên PC cục bộ của bạn, hãy mở tệp readme để chỉnh sửa.
Mã:
$ nano README.md
Chỉnh sửa tệp và khi hoàn tất, hãy lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Kiểm tra lại trạng thái Git.
Mã:
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git restore ..." to discard changes in working directory) modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
Điều này cho thấy tệp Readme đã được chỉnh sửa nhưng chưa được cam kết. Thêm tệp để chuẩn bị cho việc xác nhận.
Mã:
$ git add README.md
Xác nhận tệp.
Mã:
$ git commit -m "Update the Readme file for Gitea tutorial."
[main bb2956f] Update the Readme file for Gitea tutorial. 1 file changed, 3 insertions(+), 1 deletion(-)
Đẩy tệp lên Gitea của bạn Máy chủ.
Mã:
$ git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 378 bytes | 378.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To ssh://gitea.example.com:2221/navjot/howtoforge.git bd1248f..bb2956f main -> main
Để xác nhận, hãy quay lại trang kho lưu trữ Gitea.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22228%22%3E%3C/svg%3E


Bạn có thể nhận thấy rằng tệp Readme đã được cập nhật và thông báo cam kết mới nhất cũng được hiển thị. Để xem các thay đổi, hãy nhấp vào thông báo xác nhận và bạn có thể xem trang sau với các điểm khác biệt.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22282%22%3E%3C/svg%3E


Đây là lần xác nhận đầu tiên của chúng tôi cho kho lưu trữ. Bạn có thể bắt đầu làm việc trên bản cài đặt Gitea cho các dự án của mình.

Bước 12 - Sao lưu và khôi phục Gitea​

Gitea đi kèm với một công cụ dòng lệnh có thể thực hiện sao lưu bằng một lệnh duy nhất. Để chạy công cụ dòng lệnh bên trong vùng chứa docker để thực hiện sao lưu, hãy chạy lệnh sau.
Mã:
$ docker exec -u git -it -w /app/gitea gitea bash -c '/usr/local/bin/gitea dump -c /data/gitea/conf/app.ini'
Chúng tôi đang chạy lệnh với tư cách là cùng một người dùng mà chúng tôi đã tạo ở bước 3 và được định cấu hình trong quá trình cài đặt bằng cách sử dụng cờ -u git trong lệnh trên. Cờ -w /app/gitea định nghĩa thư mục bên trong vùng chứa docker nơi tệp sao lưu sẽ được lưu trữ. Thư mục sao lưu phải được chọn sao cho người dùng git có quyền ghi vào đó. Bên trong vùng chứa docker, chỉ có hai thư mục như vậy. Một là thư mục /data và thư mục còn lại là thư mục /app/gitea. Chúng ta không thể sử dụng thư mục /data vì công cụ dòng lệnh sẽ sao lưu toàn bộ thư mục dữ liệu, khiến nó rơi vào vòng lặp vô thời hạn nếu chúng ta sử dụng thư mục này làm đích, có thể làm đầy không gian máy chủ của bạn. Do đó, chúng ta chỉ có thể lưu trữ bản sao lưu trong thư mục /app/gitea.

Điều tiếp theo trong lệnh là tên vùng chứa, gitea. Sau đó, chúng ta chỉ định loại shell Linux được sử dụng để thực thi lệnh bên trong vùng chứa. Cờ -c chỉ định lệnh bạn cần chạy bên trong vùng chứa. Và lệnh cần chạy là /usr/local/bin/gitea dump -c /data/gitea/conf/app.ini lệnh này sẽ chạy công cụ dòng lệnh và chỉ định vị trí của tệp cấu hình đi kèm với lệnh đó.

Sau khi lệnh được chạy, bạn sẽ thấy đầu ra sau.
Mã:
2023/11/20 06:21:41 ...les/setting/cache.go:75:loadCacheFrom() [I] Cache Service Enabled
2023/11/20 06:21:41 ...les/setting/cache.go:90:loadCacheFrom() [I] Last Commit Cache Service Enabled
2023/11/20 06:21:41 ...s/setting/session.go:74:loadSessionFrom() [I] Session Service Enabled
2023/11/20 06:21:41 ...es/setting/mailer.go:237:loadMailerFrom() [I] Mail Service Enabled
2023/11/20 06:21:41 ...es/setting/mailer.go:259:loadNotifyMailFrom() [I] Notify Mail Service Enabled
2023/11/20 06:21:41 ...s/storage/storage.go:176:initAttachments() [I] Initialising Attachment storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/attachments
2023/11/20 06:21:41 ...s/storage/storage.go:166:initAvatars() [I] Initialising Avatar storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/avatars
2023/11/20 06:21:41 ...s/storage/storage.go:192:initRepoAvatars() [I] Initialising Repository Avatar storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/repo-avatars
2023/11/20 06:21:41 ...s/storage/storage.go:186:initLFS() [I] Initialising LFS storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/git/lfs
2023/11/20 06:21:41 ...s/storage/storage.go:198:initRepoArchives() [I] Initialising Repository Archive storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/repo-archive
2023/11/20 06:21:41 ...s/storage/storage.go:208:initPackages() [I] Initialising Packages storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/packages
2023/11/20 06:21:41 ...s/storage/storage.go:219:initActions() [I] Initialising Actions storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/actions_log
2023/11/20 06:21:41 ...s/storage/storage.go:223:initActions() [I] Initialising ActionsArtifacts storage with type: local
2023/11/20 06:21:41 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /data/gitea/actions_artifacts
2023/11/20 06:21:41 cmd/dump.go:265:runDump() [I] Dumping local repositories... /data/git/repositories
2023/11/20 06:21:41 cmd/dump.go:306:runDump() [I] Dumping database...
2023/11/20 06:21:41 cmd/dump.go:318:runDump() [I] Adding custom configuration file from /data/gitea/conf/app.ini
2023/11/20 06:21:41 cmd/dump.go:334:runDump() [I] Custom dir /data/gitea is inside data dir /data/gitea, skipped
2023/11/20 06:21:41 cmd/dump.go:346:runDump() [I] Packing data directory.../data/gitea
2023/11/20 06:21:41 cmd/dump.go:430:runDump() [I] Finish dumping in file gitea-dump-1700441501.zip
Bây giờ, chúng ta hãy thực hiện quy trình khôi phục. Bạn sẽ có một bản cài đặt Docker mới của Gitea đang chạy. Nhưng đừng thực hiện quy trình cài đặt.

Đăng nhập vào Docker shell.
Mã:
$ docker exec --user git -it gitea bash
Chuyển sang app/gitea thư mục.
Mã:
$ cd app/gitea
Giải nén tệp sao lưu.
Mã:
$ unzip gitea-dump-1700441501.zip
Chuyển sang tệp đã giải nén thư mục.
Mã:
$ cd gitea-dump-1700441501
Khôi phục /data/gitea thư mục.
Mã:
$ mv data/* /data/gitea
Khôi phục kho lưu trữ.
Mã:
$ mv repos/* /data/git/gitea-repositories/
Sửa tệp quyền.
Mã:
$ chown -R git:git /data
Tạo lại Git Hooks.
Mã:
$ /usr/local/bin/gitea -c '/data/gitea/conf/app.ini' admin regenerate hooks
Thoát khỏi docker shell.
Mã:
$ exit

Bước 13 - Nâng cấp Gitea​

Nâng cấp Gitea là một quá trình đơn giản.

Tắt và xóa các vùng chứa hiện có. Vì dữ liệu được lưu bên ngoài các vùng chứa trên máy chủ nên dữ liệu sẽ được giữ lại.
Mã:
$ cd ~/gitea-docker
$ docker compose down --remove-orphans
Mở tệp docker-compose.yml và thay đổi phiên bản vùng chứa Gitea. Tiếp theo, kéo hình ảnh Gitea mới.
Mã:
$ docker pull
Khởi động các vùng chứa mới.
Mã:
$ docker compose up -d
Kiểm tra trạng thái.
Mã:
$ docker ps

Kết luận​

Đây là kết thúc hướng dẫn của chúng tôi, trong đó chúng tôi đã cài đặt Gitea Code Hosting Service bằng Docker trên máy chủ Debian 12. Chúng tôi cũng đã cài đặt máy chủ Nginx để hoạt động như một proxy và hiển thị Gitea qua URL công khai bằng SSL. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng trong phần bình luận bên dưới.
 
Back
Bên trên