SSD Nodes Learn 8GB RAM — $66/năm
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-01

Hướng dẫn cài đặt Authentik SSO qua Docker Compose

Triển khai Authentik làm máy chủ SSO tự lưu trữ với Docker Compose. Hướng dẫn cấu hình biến môi trường, thiết lập akadmin và tích hợp forward auth qua Traefik cho ứng dụng.

Một lần đăng nhập cho mọi ứng dụng bạn lưu trữ

Authentik là một máy chủ SSO (đăng nhập một lần) tự lưu trữ: người dùng của bạn đăng nhập một lần và mọi ứng dụng phía sau nó sẽ chấp nhận phiên đó thay vì yêu cầu mật khẩu riêng. Việc cài đặt sử dụng một file Docker Compose chính thức và hai secret được tạo sẵn. Phần cần suy nghĩ kỹ nằm ở phía sau: trỏ một reverse proxy vào nó và đặt một ứng dụng hiện có phía sau forward auth.

Authentik được phát hành dưới dạng ba dịch vụ trong file Compose đó: một cơ sở dữ liệu PostgreSQL, một tiến trình server và một tiến trình worker. Container máy chủ cũng chạy embedded outpost, đây là thành phần trả lời câu hỏi "yêu cầu này đã đăng nhập chưa?" cho mọi ứng dụng được bảo vệ. Phiên bản 2026.5 là bản phát hành hiện tại tính đến tháng 7 năm 2026 và dự án yêu cầu một máy chủ có ít nhất 2 nhân CPU và 2 GB RAM. Hãy coi đó là mức tối thiểu. PostgreSQL và worker đều chiếm dụng bộ nhớ sau khi máy chủ đã hoạt động được một ngày.

Những thứ bạn cần trước khi bắt đầu

Bạn cần Docker Engine với plugin Compose v2, bạn có thể xác nhận điều này bằng docker compose version. Nếu lệnh đó in ra lỗi thay vì phiên bản, hãy cài đặt plugin trước khi tiếp tục; các bước cơ bản đã được đề cập trong chạy ứng dụng với Docker Compose trên VPS. Bạn cũng cần một bản ghi DNS A trỏ đến máy chủ, auth.example.com trong các ví dụ dưới đây, vì Authentik xây dựng các URL chuyển hướng từ hostname mà trình duyệt đã sử dụng.

Hãy chạy stack với tư cách là người dùng thông thường trong nhóm docker thay vì chạy dưới quyền root. Việc là thành viên của nhóm này tương đương với quyền root trên máy chủ, vì vậy chỉ cấp quyền này cho một tài khoản triển khai duy nhất và không cấp cho bất kỳ ai khác, theo hướng dẫn tại tài khoản người dùng với đặc quyền tối thiểu trên VPS.

Cài đặt bằng file Compose chính thức

sudo install -d -o "$USER" -g "$USER" /opt/authentik
cd /opt/authentik
wget https://docs.goauthentik.io/compose.yml
echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env
docker compose pull
docker compose up -d

docker compose ps sẽ liệt kê ba container, với postgresql báo trạng thái healthyserver cùng worker báo trạng thái running. Lần khởi chạy đầu tiên sẽ thực hiện các migration cơ sở dữ liệu, vì vậy hãy đợi một phút trước khi giao diện web phản hồi.

Cả hai giá trị được tạo ra đều quan trọng vì những lý do khác nhau. PG_PASS là mật khẩu PostgreSQL và nó có giới hạn tối đa là 99 ký tự. AUTHENTIK_SECRET_KEY dùng để ký các phiên làm việc và token, vì vậy việc thay đổi nó sau này sẽ đăng xuất mọi người dùng và làm mất hiệu lực mọi API token mà bạn đã cấp. Hãy giữ .env ở chế độ 600 và lưu một bản sao ở nơi an toàn, vì cơ sở dữ liệu được khôi phục mà không có secret key tương ứng sẽ là cơ sở dữ liệu mà không ai có thể đăng nhập được.

File Compose đọc cả hai giá trị bằng định dạng ${PG_PASS:?database password required}, nghĩa là Compose sẽ từ chối khởi chạy khi file này bị thiếu. Việc chạy docker compose up -d từ sai thư mục sẽ in ra required variable AUTHENTIK_SECRET_KEY is missing a value: secret key required và dừng lại. Thông báo đó là vấn đề về đường dẫn, không phải vấn đề về cấu hình.

Các giá trị môi trường quan trọng

Mọi thứ khác đều nằm trong cùng một tệp .env. Authentik ánh xạ dấu gạch dưới kép thành một khóa cấu hình lồng nhau, vì vậy AUTHENTIK_EMAIL__HOST thiết lập email.host. Dấu gạch dưới đơn sẽ bị bỏ qua mà không có cảnh báo, đây là lý do phổ biến nhất khiến một thiết lập dường như không có tác dụng.

  • AUTHENTIK_BOOTSTRAP_PASSWORD thiết lập mật khẩu cho người dùng akadmin tích hợp sẵn khi khởi động lần đầu, vì vậy bạn không bao giờ phải nhập mật khẩu vào biểu mẫu web công khai. AUTHENTIK_BOOTSTRAP_EMAILAUTHENTIK_BOOTSTRAP_TOKEN thiết lập địa chỉ và API token của người dùng đó theo cùng cách.
  • COMPOSE_PORT_HTTPCOMPOSE_PORT_HTTPS thay đổi các cổng được xuất bản khỏi mặc định là 9000 và 9443.
  • AUTHENTIK_EMAIL__HOST, AUTHENTIK_EMAIL__PORT, AUTHENTIK_EMAIL__USERNAME, AUTHENTIK_EMAIL__PASSWORD, AUTHENTIK_EMAIL__USE_TLSAUTHENTIK_EMAIL__FROM cấu hình gửi thư đi. Nếu thiếu chúng, Authentik sẽ thử localhost trên cổng 25, khiến các thư khôi phục mật khẩu kết thúc bằng lỗi kết nối trong log của worker.
  • AUTHENTIK_LOG_LEVEL=debug bật các chi tiết bạn cần khi luồng đăng nhập gặp sự cố. Hãy đặt lại thành info sau khi hoàn tất.
  • AUTHENTIK_ERROR_REPORTING__ENABLED mặc định là false. Chỉ đặt thành true nếu bạn đồng ý gửi báo cáo lỗi về hệ thống nguồn.

Đây là các thông tin bí mật trong một tệp văn bản thuần, vì vậy hãy xử lý thư mục này giống như cách bạn xử lý bất kỳ kho lưu trữ thông tin xác thực nào khác. Một trình quản lý mật khẩu như instance Vaultwarden tự lưu trữ là nơi lưu trữ bản sao khôi phục an toàn hơn là ghi chú trên máy tính xách tay của bạn.

Đăng nhập lần đầu và tài khoản quản trị

Mở http://SERVER_IP:9000 trong trình duyệt. Authentik hiển thị quy trình thiết lập ban đầu và yêu cầu bạn đặt mật khẩu cho người dùng mặc định akadmin. Nếu bạn đã thiết lập AUTHENTIK_BOOTSTRAP_PASSWORD, bước này đã hoàn tất và bạn sẽ đi thẳng đến trang đăng nhập.

Tạo một người dùng quản trị bình thường cho chính bạn trong mục Directory rồi đến Users, thêm người dùng đó vào nhóm authentik Admins, và đăng nhập bằng tài khoản đó. Để akadmin làm tài khoản dự phòng khẩn cấp với mật khẩu dài được lưu trữ ngoại tuyến. Làm việc hàng ngày bằng một tài khoản tích hợp dùng chung sẽ làm hỏng nhật ký kiểm toán, vì mọi sự kiện đều ghi là akadmin và không có thông tin về người thực hiện.

Đưa Authentik vào sau reverse proxy của bạn

Việc mở port 9000 ra internet có thể hoạt động, nhưng bạn cần TLS (transport layer security) và một hostname thực tế. Nếu bạn đã chạy thiết lập từ Traefik làm reverse proxy cho nhiều ứng dụng Compose, hãy kết nối Authentik vào cùng network external proxy bằng một file override. Tạo docker-compose.override.yml bên cạnh compose.yml:

services:
  server:
    networks:
      - default
      - proxy
    labels:
      traefik.enable: "true"
      traefik.docker.network: proxy
      traefik.http.routers.authentik.rule: Host(`auth.example.com`)
      traefik.http.routers.authentik.entrypoints: websecure
      traefik.http.routers.authentik.tls.certresolver: le
      traefik.http.services.authentik.loadbalancer.server.port: "9000"

networks:
  proxy:
    external: true

Áp dụng cấu hình với docker compose up -d. Compose tự động gộp file override, vì vậy service server giữ lại mọi thứ từ file gốc và nhận thêm các labels. Kiểm tra bằng curl -I https://auth.example.com/if/user/, lệnh này sẽ trả về HTTP/2 200. Lỗi 404 page not found từ Traefik nghĩa là container không nằm trên network proxy, và Traefik không thể định tuyến đến một container mà nó không kết nối được.

Khi hostname đã hoạt động, hãy bind các port đã publish vào 127.0.0.1 trong file override, để cách duy nhất truy cập vào là thông qua proxy.

Bảo vệ một ứng dụng bằng forward auth

Proxy provider của Authentik có ba chế độ, và chọn sai chế độ sẽ làm bạn mất một giờ đồng hồ. Proxy nghĩa là bản thân outpost sẽ chuyển tiếp traffic đến ứng dụng upstream. Forward auth (single application) nghĩa là reverse proxy của bạn vẫn xử lý traffic và chỉ hỏi Authentik xem request đã đăng nhập hay chưa. Forward auth (domain level) bảo vệ mọi ứng dụng dưới một domain cha với một provider duy nhất, nhưng đánh đổi bằng việc không thể đặt quy tắc ủy quyền riêng cho từng ứng dụng. Với Traefik đứng trước, bạn nên chọn forward auth (single application).

Trong giao diện web, mở Applications rồi chọn Providers, tạo một Proxy Provider, chọn chế độ forward auth single application, và đặt external host thành https://app.example.com. Tạo một Application trỏ đến provider đó. Sau đó mở Outposts, chỉnh sửa authentik Embedded Outpost, và thêm ứng dụng mới vào danh sách selected applications. Outpost chỉ phản hồi cho các ứng dụng đã được chỉ định, vì vậy nếu bỏ qua bước cuối này, provider dù được cấu hình đúng vẫn sẽ không trả về kết quả gì.

Định nghĩa middleware một lần trên container của Authentik, và tham chiếu nó từ mọi ứng dụng được bảo vệ:

      traefik.http.middlewares.authentik.forwardauth.address: http://server:9000/outpost.goauthentik.io/auth/traefik
      traefik.http.middlewares.authentik.forwardauth.trustForwardHeader: "true"
      traefik.http.middlewares.authentik.forwardauth.authResponseHeaders: X-authentik-username,X-authentik-groups,X-authentik-email,X-authentik-name,X-authentik-uid,X-authentik-jwt,X-authentik-meta-jwks,X-authentik-meta-outpost,X-authentik-meta-provider,X-authentik-meta-app,X-authentik-meta-version

authResponseHeaders là danh sách các header mà Traefik sao chép từ phản hồi của Authentik vào request mà nó gửi đến upstream. Nếu bỏ qua nó, ứng dụng vẫn được bảo vệ, nhưng nó sẽ không biết người dùng là ai, vì vậy bất kỳ ứng dụng nào đọc X-authentik-username để đăng nhập tự động sẽ vẫn ở trạng thái đăng xuất.

Bản thân ứng dụng được bảo vệ cần hai router, không phải một:

    labels:
      traefik.enable: "true"
      traefik.http.routers.myapp.rule: Host(`app.example.com`)
      traefik.http.routers.myapp.entrypoints: websecure
      traefik.http.routers.myapp.tls.certresolver: le
      traefik.http.routers.myapp.middlewares: authentik@docker
      traefik.http.routers.myapp-auth.rule: Host(`app.example.com`) && PathPrefix(`/outpost.goauthentik.io/`)
      traefik.http.routers.myapp-auth.entrypoints: websecure
      traefik.http.routers.myapp-auth.tls.certresolver: le
      traefik.http.routers.myapp-auth.priority: "15"
      traefik.http.routers.myapp-auth.service: authentik

Router thứ hai là phần mà mọi người thường bỏ quên. Sau khi đăng nhập, Authentik gửi trình duyệt quay lại một đường dẫn dưới /outpost.goauthentik.io/ trên hostname của ứng dụng, không phải trên auth.example.com. Nếu không có router gửi tiền tố đường dẫn đó đến dịch vụ Authentik, request sẽ rơi vào ứng dụng của bạn, trả về lỗi 404, và quá trình đăng nhập không bao giờ hoàn tất. Giá trị priority cao hơn là yếu tố giúp quy tắc đường dẫn cụ thể được ưu tiên hơn quy tắc Host() thông thường trên cùng một domain.

Kiểm tra trong cửa sổ trình duyệt ẩn danh. Bạn sẽ được chuyển hướng đến auth.example.com, đăng nhập, và quay lại ứng dụng. docker compose logs -f server ở phía Authentik sẽ in ra một sự kiện ủy quyền cho mỗi lần thử, cho bạn biết liệu request đã đến được Authentik hay chưa.

Những lỗi bạn thực sự sẽ gặp phải

Vòng lặp chuyển hướng vô tận giữa ứng dụng và trang đăng nhập. Host bên ngoài trên provider không khớp với host mà trình duyệt sử dụng, thường là http:// trong provider so với https:// trên thanh địa chỉ. Cookie phiên làm việc sau đó được thiết lập cho một origin khác, vì vậy mỗi lần quay lại đều trông như một yêu cầu ẩn danh mới. Hãy sửa lại host bên ngoài và xóa cookie cho cả hai domain trước khi kiểm tra lại.

Lỗi 404 tại /outpost.goauthentik.io/start. Router outpost bị thiếu, hoặc độ ưu tiên của nó thấp hơn router catch-all cho host đó.

Ứng dụng tải mà không bao giờ yêu cầu đăng nhập. Nhãn middlewares chỉ định một middleware không tồn tại. Traefik không cảnh báo về điều này, vì vậy một lỗi đánh máy trong authentik@docker đồng nghĩa với việc không có middleware nào chạy cả. Hãy mở dashboard của Traefik và xác nhận router đã liệt kê middleware đó.

Lỗi 403 từ Authentik sau khi đăng nhập thành công. Người dùng đã được xác thực nhưng không được ủy quyền: ứng dụng có ràng buộc chính sách hoặc yêu cầu về nhóm mà người dùng này không đáp ứng. Nhật ký Events trong giao diện quản trị sẽ nêu tên chính sách đã từ chối quyền truy cập.

Khi nào Keycloak là lựa chọn phù hợp hơn

Keycloak là dự án lâu đời hơn, được Red Hat hỗ trợ và là lựa chọn mạnh mẽ hơn cho các công việc định danh doanh nghiệp truyền thống: liên kết SAML quy mô lớn, làm trung gian đăng nhập từ nhiều nhà cung cấp định danh bên ngoài cùng lúc, và xuất/nhập realm như một lộ trình di chuyển có tài liệu hướng dẫn. Hỗ trợ thương mại phía sau nó là yếu tố quan trọng đối với một số tổ chức trên giấy tờ. Đánh đổi ở đây là Keycloak không có proxy riêng, vì vậy để bảo vệ một ứng dụng không hỗ trợ OIDC (OpenID Connect), bạn cần chạy một thành phần như oauth2-proxy đi kèm. Nhà cung cấp proxy tích hợp sẵn của Authentik chính là thành phần đó, đã được tích hợp sẵn, đó là lý do tại sao hầu hết những người tự lưu trữ (self-hoster) với tập hợp ứng dụng hỗn hợp lại chọn giải pháp này.

Sao lưu và nâng cấp

Ba yếu tố giúp bạn có thể khôi phục hệ thống: cơ sở dữ liệu PostgreSQL, thư mục ./data.env.

cd /opt/authentik
docker compose exec -T postgresql pg_dump -U authentik authentik | gzip > authentik-$(date +%F).sql.gz

Hãy lưu trữ bản dump đó cùng với .env. Chỉ riêng bản dump là không đủ, vì khóa bí mật bảo vệ dữ liệu phiên và token nằm trong .env.

Nâng cấp là quá trình thay đổi tag. Hãy thiết lập AUTHENTIK_TAG trong .env thành phiên bản bạn muốn, sau đó chạy docker compose pull rồi đến docker compose up -d. Hãy đọc ghi chú phát hành trước, vì Authentik sử dụng phiên bản dựa trên ngày tháng và một số bản phát hành có chứa các bước di chuyển dữ liệu yêu cầu bạn phải thực hiện từ phiên bản trước đó. Hãy thực hiện dump cơ sở dữ liệu trước khi pull, không phải sau đó.

FAQ

Authentik có miễn phí để tự host không?

Phiên bản mã nguồn mở là miễn phí và bao gồm mọi thứ nêu trên: proxy provider, forward auth, OIDC (OpenID Connect), SAML và công cụ flows. Gói doanh nghiệp trả phí cung cấp thêm hỗ trợ và một số tính năng doanh nghiệp, nhưng không có tính năng nào ở đây yêu cầu bản quyền.

Tôi có cần Traefik để dùng Authentik không?

Không. Forward auth hoạt động với nginx thông qua auth_request và với Caddy thông qua forward_auth. Mô hình này giống nhau trong mọi trường hợp: reverse proxy hỏi Authentik về từng request, và tiền tố đường dẫn /outpost.goauthentik.io/ trên hostname được bảo vệ phải định tuyến đến Authentik thay vì ứng dụng.

Tại sao ứng dụng được bảo vệ của tôi cứ chuyển hướng liên tục giữa trang đăng nhập và lỗi?

External host được cấu hình trên proxy provider không khớp với URL mà trình duyệt đang sử dụng, thường gặp nhất là http so với https. Session cookie được cấp cho một origin nhưng lại được đọc ở một origin khác, vì vậy Authentik luôn thấy đó là một request ẩn danh. Hãy sửa lại external host, sau đó xóa cookie cho cả hai hostname trước khi bạn kiểm tra lại.

Authentik cần bao nhiêu RAM?

Mức tối thiểu được ghi nhận là 2 nhân CPU và 2 GB RAM tính đến tháng 7 năm 2026, bao gồm cả PostgreSQL, server và worker. Trên một VPS 2 GB, worker là tiến trình đầu tiên bị kernel kill khi thiếu bộ nhớ, triệu chứng là các tác vụ nền và email gửi đi bị dừng trong khi trang đăng nhập vẫn hoạt động. Hãy cấp 4 GB nếu cùng server đó cũng chạy các ứng dụng mà bạn đang bảo vệ.

#authentik#sso#authentication#tự lưu trữ#docker-compose#traefik