---
title: "Cách cài đặt Gitea trên Ubuntu bằng Docker"
description: "Cách cài đặt Gitea trên Ubuntu bằng Docker"
url: https://cloudfly.vn/techblog/cach-cai-dat-gitea-tren-ubuntu-bang-docker
image: https://media.cloudfly.vn/posts/techblog_093I9Rt.png
---

# Cách cài đặt Gitea trên Ubuntu bằng Docker

## Giới thiệu
Khi làm việc về phát triển phần mềm, điều quan trọng là có thể quản lý mã nguồn một cách hiệu quả và có thể theo dõi được. Hệ thống quản lý mã nguồn (SCM) là lựa chọn tuyệt vời có thể cung cấp một quy trình hiệu quả và linh hoạt để làm việc trên các dự án ở bất kỳ quy mô nào với bất kỳ số lượng nhà phát triển nào. Những phần mềm SCM khác nhau đã tồn tại qua nhiều năm, từ CVS đến SubVersion, Perforce đến Mercurial, nhưng đơn vị dẫn đầu ngành hiện tại là Git, công ty đã cho thấy sự phát triển lớn mạnh với sự phổ biến của các trang web như GitHub và GitLab.

Tuy nhiên, các tài khoản miễn phí trên các dịch vụ này hướng tới kho lưu trữ mã nguồn mở công khai, khả năng làm việc trên phần mềm riêng tư hoặc độc quyền sẽ khiến nhà phát triển phải trả một khoản chi phí. Ngoài ra, quyền truy cập của một người vào kho lưu trữ thuộc về một tổ chức bên ngoài và nhiều người muốn kiểm soát phần mềm của riêng họ từ đầu đến cuối.

Vì vậy, một số giải pháp tự lưu trữ như Gogs, Gitea và GitLab đã được phát triển trong vài năm qua. Bài viết này tập trung vào việc thiết lập một trong những giải pháp phổ biến hơn - 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 bạn trong toàn bộ vòng đời. Gitea nhỏ, khép kín và nhẹ, làm cho quá trình triển khai nhanh chóng mà không vi phạm các yêu cầu phần cứng. Bạn sẽ sử dụng bản cài đặt Docker của Gitea, điều này đảm bảo rằng phần mềm sẽ được cập nhật.
## Điều kiện 
Trước khi bắt đầu với hướng dẫn này, bạn nên có những điều sau:

* Máy chủ Ubuntu 20.04 với non-root user được thiết lập cấu hình với đặc quyền `sudo` như được mô tả trong Thiết lập máy chủ ban đầu cho Ubuntu 20.04.
* Docker được cài đặt trên máy chủ của bạn. Làm theo **Bước 1 và 2** của Cách cài đặt Docker trên Ubuntu 20.04 để cài đặt Docker.
* Docker Compose được cài đặt trên máy chủ của bạn. Thực hiện theo **Bước 1** trong hướng dẫn của chúng tôi về Cách cài đặt và sử dụng Docker Compose trên Ubuntu 20.04.
* Một tên miền đã trỏ đến máy chủ của bạn. Nếu bạn đang sử dụng CloudFly Droplet, bạn có thể làm theo tài liệu Tên miền và DNS của chúng tôi. Hướng dẫn này sẽ sử dụng `<^>your_domain<^>` trong các ví dụ xuyên suốt.

## Bước 1: Tạo Git user
Gitea, giống như nhiều kho mã nguồn, 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ã của họ bằng cách quản lý các SSH key trong chính Gitea. Tuy nhiên, để người dùng có thể truy cập máy chủ thông qua SSH, bạn sẽ cần tạo **git** user trên máy chủ. Bước này được hoàn thành đầu tiên để bạn có thể truy cập vào group ID và user của người dùng.

Trước tiên, hãy tạo user trên máy chủ lưu trữ, user đó sẽ chấp nhận các kết nối này:
```command
sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
```
Trong lệnh này, bạn tạo một hệ thống user sử dụng bash làm vỏ bọc của nó, 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 là user nhưng ngăn không cho đăng nhập với tư cách là user đó. Bạn đặt thư mục chính của user thành `/home/git`.

Lệnh này sẽ xuất ra một số thông tin về user mà nó vừa tạo:
```
[secondary_label 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' …
```
Ghi 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 một bước ở phần sau.

## Bước 2: Cài đặt Gitea Docker Image

Gitea có một hình ảnh có sẵn trong kho lưu trữ Docker toàn cầu, có nghĩa là, bằng cách sử dụng Docker Compose, bạn có thể cài đặt và chạy hình ảnh đó như một dịch vụ mà không cần làm thêm bất cứ cái gì. Bản thân hình ảnh đó chạy các dịch vụ web và SSH của Gitea, cho phép Git truy cập cả từ trình duyệt và dòng lệnh.

Để tạo vùng 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ắt đầu, hãy tạo một thư mục để lưu trữ dịch vụ của bạn và nhập nó vào:
```command
mkdir ~/gitea
cd ~/gitea
```
Khi đó, hãy tạo một tệp có tên là `docker-compos.yml` bằng cách sử dụng trình soạn thảo văn bản ưa thích của bạn. Ví dụ dưới đây sử dụng `nano`. Tệp này sẽ chứa mô tả của các vùng chứa sẽ chạy như một phần của quá trình cài đặt Gitea của bạn:
```command
nano docker-compose.yml
```
Thêm phần sau vào tệp mới:

```nginx
[label ~/gitea/docker-compose.yml]
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 này thực hiện:

* `version: "3"`: cho thấy Docker Compose là phiên bản nào của tệp cấu hình. 
* `networks`: phần này khai báo thiết lập mạng của bộ sưu tập các vùng chứa của chúng tôi. Trong trường hợp này, một mạng `gitea` được tạo, nhưng không bị lộ ra bên ngoài.
* `services`
1. `image: gitea/gitea:1.16.5`: điều này xác định rằng chúng tôi sẽ sử dụng Gitea phiên bản 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, cho dù là một bản phát hành cụ thể, một phiên bản chính như `:1`, hoặc một thẻ như `:latest` hoặc `:dev`.
2. `environment`: phần môi trường chỉ định các biến môi trường sẽ có sẵn cho hình ảnh trong quá trình cài đặt và hoạt động. Trong trường hợp này, chúng tôi đang chỉ định user và group ID cho môi trường, sử dụng UID và GID được cung cấp trong đầu ra của lệnh `adduser` ở Bước 1.
3. `restart: always`: dòng này hướng dẫn Docker phải luôn khởi động lại vùng chứa nếu nó gặp sự cố, cho dù là do bản thân vùng chứa gặp sự cố hay do máy chủ; về cơ bản, Gitea sẽ bắt đầu khi khởi động.
4. `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ó tên ở trên.
5. `./gitea:/data` và `/home/git/.ssh/:/data/git/.ssh`: đây là những vị trí mà Gitea sẽ lưu trữ kho của nó và dữ liệu liên quan. Hiện tại, chúng được dẫn tới thư mục có tên `gitea` trong thư mục hiện tại. Docker sẽ tạo thư mục này khi vùng chứa bắt đầu nếu nó không tồn tại. Thư mục `.ssh` sẽ được mô tả thêm ở phần sau của Bước 6.
6. `/etc/timezone` và `/etc/localtime`: hai tệp này chứa thông tin về múi giờ và thời gian trên máy chủ. Bằng cách sắp xếp các tệp này vào trong vùng chứa dưới dạng tệp chỉ đọc (read-only) (được chỉ định với phần cuối cùng `:ro` của định nghĩa), vùng chứa sẽ có cùng thông tin với máy chủ.
7. `ports`: Gitea lắng nghe các kết nối trên hai cổng. Nó lắng nghe các kết nối HTTP trên cổng `3000`, nơi nó phục vụ giao diện web cho kho mã nguồn và lắng nghe các kết nối SSH trên cổng `22`. Trong trường hợp này, bạn đang giữ cổng `3000` cho các kết nối HTTP bằng cách sắp xếp nó đến cùng số tương tự, và bạn đang sắp xếp cổng đó trên vùng chứa của Gitea từ `22` thông thường đến `2222` để tránh đụng độ cổng. Ở Bước 6, bạn sẽ thiết lập một miếng đệm SSH để hướng lưu lượng truy cập đến Gitea khi được yêu cầu.

<$>[note]
**Lưu ý:** Đây là một ví dụ tối thiểu về tệp Docker Compose cho Gitea. Có một số tùy chọn khác mà nó có thể bao gồm, chẳng hạn như sử dụng MySQL hoặc PostGreSQL làm cơ sở dữ liệu hỗ trợ hoặc một ổ đĩa được đặt tên để lưu trữ. Thiết lập tối thiểu này sử dụng SQLite làm cơ sở dữ liệu hỗ trợ và một ổ đĩa sử dụng thư mục có tên `gitea` để lưu trữ. Bạn có thể đọc thêm về các tùy chọn này trong Tài liệu của Gitea.
<$>

Lưu và đóng tập tin. Nếu bạn đã sử dụng `nano` để chỉnh sửa tệp, bạn có thể làm như vậy bằng cách nhấn `CTRL + X`, `Y`, sau đó `ENTER`.

Với tệp này bạn có thể đưa các vùng chứa lên bằng cách sử dụng Docker Compose:
```command
docker-compose up
```
Lệnh này sẽ kéo các hình ảnh xuống, khởi động vùng chứa Gitea và sẽ trả về kết quả như sau:
```
[secondary_label 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 vùng chứa chạy ở phía trước và nó sẽ dừng ngay sau khi bạn thoát khỏi quá trình đó bằng `Ctrl + C` hoặc khi bạn mất kết nối. Để vùng chứa chạy trong nền như một quá trình riêng biệt, bạn có thể gắn `-d` vào lệnh Compose:
```command
docker-compose up -d
```
Bạn sẽ được thông báo khi vùng chứa bắt đầu và sau đó quay trở lại vỏ bọc.

## Bước 3: Cài đặt Nginx làm Reverse Proxy
Việc chạy một dịch vụ web như Gitea sau reverse proxy là một thực tế phổ biến, vì phần mềm máy chủ hiện đại như Apache hoặc Nginx có thể dễ dàng xử lý nhiều dịch vụ trên một máy hơn, cân bằng tải (balance load) trên nhiều máy chủ và xử lý SSL. Ngoài ra, điều này sẽ cho phép bạn thiết lập một tên miền trỏ đến phiên bản Gitea của bạn chạy trên các cổng HTTP (S) tiêu chuẩn.

Với mục đích của hướng dẫn này, chúng tôi sẽ sử dụng Nginx. Trước tiên, hãy cập nhật danh sách gói trên máy chủ của bạn:
```command
sudo apt update
```
Tiếp theo, cài đặt Nginx bằng `apt`:
```command
sudo apt install nginx
```
Bây giờ, khi bạn đang sử dụng tường lửa `ufw`, bạn sẽ cần cho phép truy cập vào các cổng sau:
```command
sudo ufw allow "Nginx Full"
```
Sau khi nó đã được cài đặt, bạn 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 chào đón bạn đến với Nginx.

Tại thời điểm này, bạn sẽ cần tạo một mục reverse proxy để hướng lưu lượng truy cập vào thông qua Nginx đến phiên bản Gitea đang chạy trong Docker. Tạo một tệp mới trong thư mục `sites-available` Nginx bằng cách sử dụng trình soạn thảo văn bản ưa thích của bạn. Ví dụ dưới đây sử dụng `nano`:
```command
sudo nano /etc/nginx/sites-available/gitea
```
Trong tệp này, hãy thiết lập một khối máy chủ mới với các yêu cầu gửi đến `/` ủy quyền cho phiên bản Gitea của bạn:

```nginx
[label /etc/nginx/sites-available/gitea]
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;
    }
}
```

Sau khi bạn hoàn tất chỉnh sửa tệp, hãy lưu và đóng tệp đó.

<$>[note]
**Lưu ý:** Để biết thêm thông tin về cách hiểu những gì đang diễn ra trong các hướng dẫn này, hãy xem bài viết Hiểu về Nginx HTTP Proxying, Cân bằng tải, Bộ đệm và Bộ nhớ đệm.
<$>

Nginx xác định những trang web mà nó sẽ phục vụ dựa trên việc các tệp đó có xuất hiện trong thư mục `sites-enabled` của nó hay không. Điều này được quản lý thông qua các liên kết tượng trưng trỏ đến các tệp trong thư mục `sites-available`. 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ụ Gitea:
```command
sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/gitea
```
Trước khi khởi động lại Nginx để thực hiện các thay đổi của mình, bạn nên yêu cầu 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 của nó.
```command
sudo nginx -t
```
Nếu mọi thứ đều ổn, lệnh này sẽ trả về kết quả đầu ra như sau:
```
[secondary_label 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, nó sẽ cho bạn biết chúng đang ở đâu và làm gì.

Khi bạn đã sẵn sàng tiếp tục với thay đổi này, hãy khởi động lại dịch vụ hệ thống Nginx:
```command
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 trên trang thiết lập ban đầu và Gitea đã sẵn sàng cho bạn điền vào.
## Bước 4: Cài đặt Certbot và Thiết lập Chứng chỉ TLS
Nhờ Certbot và tổ chức phát hành 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ỉ mất hai lệnh.

Đầu tiên, hãy cài đặt Certbot và plugin Nginx của nó:
```command
sudo apt install certbot python3-certbot-nginx
```
Tiếp theo, chạy `certbot` ở chế độ `--nginx` và xác định cùng một miền mà bạn đã sử dụng trong chỉ thị cấu hình Nginx `server_name`:
```command
sudo certbot --nginx -d <^>your_domain_here<^>
```
Bạn sẽ được nhắc nhở đồ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 đó là tùy thuộc vào bạn, nhưng điều này thường được khuyến khích và nó an toàn để thực hiện.

Sau đó, Let’s Encrypt sẽ xác nhận yêu cầu của bạn và Certbot sẽ tải xuống chứng chỉ của bạn:
```
[secondary_label 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à nó sẽ tự động chuyển bạn sang HTTPS nếu 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à có thể an toàn khi tiếp tục với các bước thiết lập dựa trên web.

Bạn có thể tìm thêm thông tin về cách bảo mật tên miền bằng Let’s Encrypt trong hướng dẫn Cách bảo mật Nginx với Let’s Encrypt trên Ubuntu 20.04.

## Bước 5: Thiết lập 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 chí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ụ:

![description image](https://media.cloudfly.vn/posts/cach-cai-dat-Gitea-tren-Ubuntu-bang-Docker_2.png)

Một vài tùy chọn  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ì mục đích của hướng dẫn này, bạn sẽ cần thay đổi những điều sau:

* **Server domain:** miền 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ả giao thức. Ví dụ: `https: //<^>your_domain<^>`.
Khi bạn lưu các thay đổi cấu hình của mình, bạn sẽ được chuyển đến trang đăng nhập Gitea.

<$>[note]
**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, bạn có thể gặp phải lỗi Nginx cho biết **502 Bad Gateway**. Nếu bạn 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, nên trước tiên bạn cần tạo một user. Nhấp vào link **Need an account? Register now** (Cần một tài khoản? Đăng ký ngay) liên kết bên dưới biểu mẫu đăng nhập để đăng ký người dùng mới. Là user đầu tiên trên hệ thống, user 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 trên màn hình cấu hình, trước tiên bạn có thể cần xác minh tài khoản của mình.

Khi bạn đã đăng nhập với tư cách là người dùng đó, hãy nhấp vào biểu tượng user của bạn ở góc trên bên phải của trang, sau đó nhấp vào **Site Administration** (Quản trị trang), nó sẽ đưa bạn đến một trang nơi bạn có thể thực hiện các công việc bảo trì , quản lý tài khoản người dùng và tổ chức, đồng thời thiết lập thêm cấu hình Gitea.

### Tạo kho lưu trữ thử nghiệm
Để kiểm tra Gitea, cả trên giao diện web và sử dụng Git, hãy tạo một kho thử nghiệm. Bạn có thể xóa kho lưu trữ này sau đó.

Nhấp vào dấu **+** ở góc trên bên phải của trang, sau đó nhấp vào **+ New Repository** (+ Kho lưu trữ mới). 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 thông tin như mô tả của nó, cài đặt ví dụ như có riêng tư hay không và bất kỳ nội dung mặc định nào như tệp `README` hoặc `.gitignore`.

Sau khi bạn nhấn **Create Repository** (Tạo kho lưu trữ), bạn sẽ có một kho lưu trữ mới để sử dụng.

## Bước 6: Định 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 miếng đệm SSH. Vì Gitea đang chạy trong vùng chứa Docker nên nó không thể 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ẽ xung đột với máy chủ. Trong tệp `docker-compos.yml` mà bạn đã tạo ở trên, Docker được hướng dẫn sắp xếp một cổng trên máy chủ tới cổng `22` trên vùng chứa để nó chấp nhận các kết nối SSH đến cổng `2222`. Ngoài ra, tệp SSH `authorized_keys` sẽ không thể truy cập đến ai đó SSHing vào máy chủ theo mặc định.

Để đưa vào tài khoản, bạn sẽ cần tạo một miếng đệm SSH chuyển các kết nối SSH tới người dùng **git** trên máy chủ lưu trữ vào vùng chứa. Trong tệp soạn thảo, bạn cũng đã xác định rằng USER trong vùng chứa sẽ có user và group ID là 1000, và trên màn hình cấu hình Gitea, bạn đã yêu cầu dịch vụ sử dụng user có tên **git**.
### Tạo Git user và SSH key của nó
Tiếp theo, bạn sẽ cần tạo SSH key cho user. Điều này sẽ chỉ được sử dụng trong một bước dưới đây và không được chia sẻ với bất kỳ ai bên ngoài máy chủ.
```command
sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"
```
Lệnh này sử dụng `sudo` để tạo SSH key với tư cách là người dùng mà bạn đã tạo ở trên. Trong trường hợp này, key sẽ là key RSA 4096-bit. Bạn sẽ được hỏi một loạt câu hỏi như mật khẩu và đặt tên cho tệp key. Nhấn `ENTER` cho từng câu hỏi, để trống nếu chấp nhận giá trị mặc định.

<$>[warning]
**Cảnh báo:** Nếu bạn đặt mật khẩu trên key, bạn sẽ không thể sử dụng miếng đệm.
<$>

Bạn sẽ cần đảm bảo rằng user trong vùng chứa Gitea sẽ chấp nhận key này. Bạn có thể thực hiện việc này bằng cách thêm nó vào tệp `.ssh/authorized_keys`:
```command
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 miếng đệm vì thực tế là thư mục `/home/git/.ssh` trên máy chủ được gắn như một ổ đĩa trên vùng chứa, có nghĩa là nội dung được chia sẻ giữa chúng. Khi nhận được kết nối tới máy chủ lưu trữ thông qua git trên SSH, nó sẽ sử dụng cùng một tệp `authorized_keys` như vùng chứa.

### 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ủ. Đây là điều cho phép các lệnh git hoạt động trên SSH: khi kết nối SSH được thực hiện, một lệnh mặc định sẽ được chạy. Lệnh `gitea` này trên máy chủ sẽ ủy quyền kết nối SSH đến vùng chứa.

Đối với script, hãy sử dụng `cat` để ghi vào tệp `/usr/local/bin/gitea`:
```command
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 những script SSH này vào vùng chứa Gitea Docker, truyền 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 script có thể thực thi được:
```command
sudo chmod +x /usr/local/bin/gitea
```
### Kiểm tra kết nối Git SSH
Bạn có thể kiểm tra việc kéo và đẩy đến kho lưu trữ Git trên phiên bản Gitea của mình bằng cách thêm SSH key vào Gitea user của bạn.

Bạn sẽ cần nội dung của khóa công khai SSH của mình. Nó thường nằm trong một tệp có tên như `~/.ssh/id_rsa.pub`, tùy thuộc vào thuật toán bạn đã sử dụng khi tạo khóa của mình:
```command
cat ~/.ssh/id_rsa.pub
```

<$>[note]
**Lưu ý:** Nếu bạn cần tạo SSH key lần đầu tiên, bạn có thể tìm hiểu cách thực hiện việc này với hướng dẫn Cách cài đặt SSH key trên Ubuntu 20.04 này.
<$>

Sao chép đầu ra của lệnh này.

Trong Gitea, nhấp vào biểu tượng user của bạn ở góc trên bên phải và chọn **Settings** (Cài đặt). 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 key của bạn vào vùng văn bản lớn trong biểu mẫu và sau đó nhấp vào nút **Add Key** bên dưới nó.

Bây giờ, điều hướng đến kho lưu trữ thử nghiệm bạn đã tạo ở Bước 3 và sao chép URL SSH được cung cấp. Trên máy cục bộ của bạn, sao chép kho lưu trữ:
```command
git clone git@<^>your_domain<^>:<^>username<^>/test
```
Điều này sẽ sử dụng SSH để sao chép kho lưu trữ. Nếu bạn đã đặt mật khẩu trên SSH key 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 đó, tạo một tệp mới:
```command
cd test
touch just_testing
```
Tiếp theo, thêm nó vào các thay đổi theo giai đoạn của bạn:
```command
git add just_testing
```
Cuối cùng, cam kết tệp đó:
```command
git commit -am "Just testing pushing over SSH!"
```
Bây giờ, bạn sẽ có thể đẩy các thay đổi của mình vào kho lưu trữ từ xa:
```command
git push origin master
```
Khi bạn làm mớ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ữ.

## Kết luận
Bạn đã thiết lập một dịch vụ Gitea bằng Docker để tự lưu trữ kho 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 cộng và riêng tư, sử dụng các quy trình công việc quen thuộc như đánh giá mã pull-request và các dự án do tổ chức sắp xếp. Gitea cũng hoạt động tốt với nhiều công cụ tích hợp và triển khai liên tục (CI / CD) như Drone, Jenkins và GoCD. Ngoài ra, việc sử dụng các ổ đĩa Docker như vậy cho phép bạn mở rộng bộ nhớ của mình để phù hợp với nội dung Git LFS (bộ nhớ tệp lớn) trên mạng hoặc khối lưu trữ.
