SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-28

Authentik দিয়ে self-hosted SSO সেটআপ করার নিয়ম

Docker Compose-এ Authentik চালিয়ে সব অ্যাপে এক login ব্যবহার করুন। গুরুত্বপূর্ণ env value, akadmin bootstrap এবং Traefik forward auth কনফিগার করার ধাপ দেখুন।

আপনার host করা প্রতিটি অ্যাপের জন্য একটি login

Authentik একটি self-hosted SSO (single sign-on) server: ব্যবহারকারীরা একবার sign in করেন, এবং এর পেছনে থাকা প্রতিটি অ্যাপ নিজস্ব password চাওয়ার পরিবর্তে সেই session গ্রহণ করে। Installation-এর জন্য একটি official Docker Compose file এবং 2টি generated secret প্রয়োজন। আসল পরিকল্পনার কাজ শুরু হয় এর পরে: reverse proxy-কে এর দিকে নির্দেশ করা এবং একটি বিদ্যমান অ্যাপকে forward auth-এর পেছনে রাখা।

Authentik ওই Compose file-এ 3টি service হিসেবে চলে: একটি PostgreSQL database, একটি server process এবং একটি worker process। Server container-এ embedded outpost-ও চলে। সুরক্ষিত প্রতিটি অ্যাপের জন্য “এই request-এ sign in করা হয়েছে কি না?”—এই প্রশ্নের উত্তর দেওয়া outpost-এর কাজ। July 2026 অনুযায়ী Version 2026.5 বর্তমান release, এবং project-এর হিসাবে host-এ অন্তত 2টি CPU core ও 2 GB RAM থাকা উচিত। এটিকে সর্বনিম্ন প্রয়োজন হিসেবে ধরুন। Server 1 দিন চালু থাকার পর PostgreSQL এবং worker উভয়ই memory ব্যবহার করে।

শুরু করার আগে যা প্রয়োজন

আপনার Docker Engine-এর সঙ্গে Compose v2 plugin প্রয়োজন। এটি docker compose version চালিয়ে যাচাই করতে পারেন। Version-এর বদলে এটি error দেখালে পরবর্তী ধাপে যাওয়ার আগে plugin ইনস্টল করুন। প্রাথমিক নির্দেশনা VPS-এ Docker Compose দিয়ে অ্যাপ চালানো-এ রয়েছে। আপনার এমন একটি DNS A record-ও প্রয়োজন, যা server-এর দিকে নির্দেশ করে। নিচের উদাহরণে এটি auth.example.com, কারণ browser যে hostname ব্যবহার করেছে, Authentik সেটি থেকে redirect URL তৈরি করে।

root হিসেবে নয়, docker group-এর সাধারণ user হিসেবে stack চালান। এই group-এর সদস্যপদ host-এ root access-এর সমতুল্য। তাই VPS-এ least-privilege user account-এর নীতির মতো, এই group শুধু একটি deploy account-কে দিন এবং অন্য কাউকে নয়।

অফিশিয়াল Compose ফাইল দিয়ে ইনস্টল করুন

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-এ তিনটি container তালিকাভুক্ত থাকা উচিত। এর মধ্যে postgresql-এ healthy এবং server দেখাবে, আর worker-এ running দেখাবে। প্রথমবার চালু হলে database migration সম্পন্ন হয়। তাই web interface সাড়া দেওয়ার আগে এক মিনিট অপেক্ষা করুন।

দুটি generated value-ই গুরুত্বপূর্ণ, তবে ভিন্ন কারণে। PG_PASS হলো PostgreSQL password, এবং এর সর্বোচ্চ সীমা 99 characters। AUTHENTIK_SECRET_KEY session ও token sign করে। তাই পরে এটি পরিবর্তন করলে সব user লগ-আউট হয়ে যাবে এবং আপনি তৈরি করা সব API token invalid হয়ে যাবে। .env-এর mode 600 বজায় রাখুন এবং এর একটি copy নিরাপদ স্থানে রাখুন। কারণ matching secret key ছাড়া restore করা database-এ কেউ লগ ইন করতে পারে না।

Compose file উভয় value-ই ${PG_PASS:?database password required} form ব্যবহার করে পড়ে। তাই file অনুপস্থিত থাকলে Compose start করতে অস্বীকার করে। ভুল directory থেকে docker compose up -d চালালে required variable AUTHENTIK_SECRET_KEY is missing a value: secret key required দেখিয়ে থেমে যায়। এটি path-এর সমস্যা, config-এর সমস্যা নয়।

গুরুত্বপূর্ণ environment value

বাকি সব একই .env ফাইলে থাকবে। Authentik double underscore-কে nested configuration key হিসেবে বিবেচনা করে, তাই AUTHENTIK_EMAIL__HOST, email.host সেট করে। একটি single underscore কোনো warning ছাড়াই উপেক্ষা করা হয়। কোনো setting কাজ করছে না বলে মনে হওয়ার এটিই সবচেয়ে সাধারণ কারণ।

  • প্রথমবার চালু হওয়ার সময় AUTHENTIK_BOOTSTRAP_PASSWORD বিল্ট-ইন akadmin user-এর password সেট করে। তাই public web form-এ password লিখতে হয় না। একইভাবে AUTHENTIK_BOOTSTRAP_EMAILAUTHENTIK_BOOTSTRAP_TOKEN ওই user-এর address এবং একটি API token সেট করে।
  • COMPOSE_PORT_HTTPCOMPOSE_PORT_HTTPS published port-কে default 9000 ও 9443 থেকে সরিয়ে দেয়।
  • AUTHENTIK_EMAIL__HOST, AUTHENTIK_EMAIL__PORT, AUTHENTIK_EMAIL__USERNAME, AUTHENTIK_EMAIL__PASSWORD, AUTHENTIK_EMAIL__USE_TLSAUTHENTIK_EMAIL__FROM outbound mail configure করে। এগুলো না থাকলে Authentik port 25-এ localhost-এর সঙ্গে সংযোগের চেষ্টা করে। ফলে password-reset mail পাঠানো যায় না এবং worker log-এ connection error দেখা যায়।
  • Login flow-এ সমস্যা হলে যে detail দরকার, AUTHENTIK_LOG_LEVEL=debug তা চালু করে। পরে এটিকে info-এ ফিরিয়ে দিন।
  • Default অবস্থায় AUTHENTIK_ERROR_REPORTING__ENABLED হল false। Upstream-এ crash report পাঠাতে আপত্তি না থাকলেই কেবল এটিকে true সেট করুন।

এগুলো plain file-এ থাকা secret। তাই directory-টিকে অন্য যেকোনো credential store-এর মতো সুরক্ষিত রাখুন। আপনার laptop-এ রাখা note-এর চেয়ে নিজে host করা Vaultwarden instance-এর মতো password manager-এ recovery copy রাখা ভালো।

প্রথম লগইন এবং admin account

ব্রাউজারে http://SERVER_IP:9000 খুলুন। Authentik-এর প্রাথমিক সেটআপ প্রবাহ দেখাবে এবং ডিফল্ট akadmin user-এর জন্য একটি password সেট করতে বলবে। আপনি যদি ইতিমধ্যে AUTHENTIK_BOOTSTRAP_PASSWORD সেট করে থাকেন, তাহলে এই ধাপ সম্পন্ন হয়েছে এবং আপনি সরাসরি login page-এ চলে যাবেন।

Directory এবং তারপর Users-এ নিজের জন্য একটি সাধারণ admin user তৈরি করুন, তাকে authentik Admins group-এ যোগ করুন এবং সেই account দিয়ে sign in করুন। akadmin-কে একটি break-glass account হিসেবে রাখুন এবং এর দীর্ঘ password offline-এ সংরক্ষণ করুন। একটি shared built-in account দিয়ে প্রতিদিনের কাজ করলে audit log-এর কার্যকারিতা নষ্ট হয়, কারণ প্রতিটি event-এ akadmin দেখা যায় এবং কে কাজটি করেছে তা বোঝা যায় না। এই যুক্তি Authentik-এর পরবর্তী স্তরেও প্রযোজ্য: প্রতিটি ব্যক্তির জন্য নিজস্ব agent দেয় এমন self-hosted OneCLI harness-এ পৌঁছানো identity-টি যদি একজন মানুষের সঙ্গে যুক্ত থাকে, তাহলে readable trail তৈরি হয়; পুরো team-এর ব্যবহৃত একটি shared login-এর সঙ্গে যুক্ত থাকলে তা হয় না।

আপনার reverse proxy-এর পেছনে Authentik চালান

Internet-এ port 9000 প্রকাশ করলে কাজ হয়, কিন্তু আপনি TLS (transport layer security) এবং একটি প্রকৃত hostname চান। আপনি যদি ইতিমধ্যে একাধিক Compose app-এর জন্য Traefik-কে reverse proxy হিসেবে ব্যবহার করা সেটআপ চালান, তাহলে একটি override file ব্যবহার করে Authentik-কে একই external proxy network-এ যুক্ত করুন। compose.yml-এর পাশে docker-compose.override.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

docker compose up -d দিয়ে এটি প্রয়োগ করুন। Compose স্বয়ংক্রিয়ভাবে override একত্র করে। তাই server service official file-এর সবকিছু বজায় রাখে এবং labels পায়। curl -I https://auth.example.com/if/user/ দিয়ে পরীক্ষা করুন; এর HTTP/2 200 উত্তর দেওয়া উচিত। Traefik থেকে 404 page not found পাওয়ার অর্থ হলো container-টি proxy network-এ নেই। যে container-এ Traefik পৌঁছাতে পারে না, সেখানে Traefik route করতে পারে না।

Hostname কাজ করার পরে override-এ প্রকাশিত port-গুলো 127.0.0.1-এ bind করুন। তাহলে proxy-এর মাধ্যমেই কেবল প্রবেশ করা যাবে।

forward auth দিয়ে একটি অ্যাপ সুরক্ষিত করুন

Authentik-এর proxy provider-এ তিনটি mode আছে, এবং ভুল mode বেছে নিলে এক ঘণ্টা সময় নষ্ট হতে পারে। Proxy mode-এ outpost নিজেই upstream app-এ traffic forward করে। Forward auth (single application) mode-এ আপনার নিজের reverse proxy traffic forward করে, আর অনুরোধটি signed in কি না তা শুধু Authentik-এর কাছে যাচাই করে। Forward auth (domain level) mode-এ একটি parent domain-এর অধীনে থাকা প্রতিটি app একটি provider দিয়ে সুরক্ষিত হয়, তবে প্রতিটি application-এর জন্য আলাদা authorization rule নির্ধারণ করা যায় না। Traefik সামনে থাকলে আপনার forward auth (single application) ব্যবহার করা উচিত। অনুশীলনের জন্য নির্দিষ্ট কোনো app চাইলে নিজে host করা AFFiNE workspace ভালো প্রথম প্রার্থী হতে পারে। কারণ এটি এমন একটি internal tool, যা আপনি নিজের device থেকে ব্যবহার করতে চান, অন্য কোথাও থেকে নয়। Team tool হলে এই ব্যবহারের কারণ আরও শক্তিশালী হয়: একই provider-এর পেছনে নিজে host করা Chatwoot support desk রাখুন। তাহলে inbox-এর উত্তরদাতারা সবার সঙ্গে আরও একটি password ভাগ না করে দিনের শুরুতে একবার sign in করলেই হবে।

Web interface-এ Applications খুলে Providers-এ যান। একটি Proxy Provider তৈরি করুন, forward auth single application mode বেছে নিন এবং external host হিসেবে https://app.example.com নির্ধারণ করুন। ওই provider-কে নির্দেশ করে একটি Application তৈরি করুন। এরপর Outposts খুলে authentik Embedded Outpost edit করুন এবং নতুন application-টিকে তার selected applications-এ যোগ করুন। outpost শুধু তাকে দেওয়া application-এর জন্য response দেয়। তাই শেষ ধাপটি বাদ দিলে provider সঠিকভাবে configured হলেও কোনো response পাওয়া যায় না।

একবার Authentik container-এ middleware সংজ্ঞায়িত করুন এবং প্রতিটি সুরক্ষিত app থেকে সেটি reference করুন:

      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 হলো সেই header-গুলোর তালিকা, যেগুলো Traefik Authentik-এর response থেকে কপি করে upstream-এ পাঠানো request-এ যোগ করে। এটি বাদ দিলে app সুরক্ষিত থাকে, কিন্তু user কে তা জানতে পারে না। ফলে automatic login-এর জন্য X-authentik-username পড়ে এমন সব feature logged out অবস্থায় থাকে।

সুরক্ষিত app-টির একটি নয়, দুটি router প্রয়োজন:

    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-টিই সবাই সাধারণত বাদ দেয়। sign-in-এর পরে Authentik browser-কে /outpost.goauthentik.io/-এর অধীনে থাকা একটি path-এ app-এর hostname-এ ফেরত পাঠায়, auth.example.com-এ নয়। ওই path prefix Authentik service-এ পাঠানোর জন্য কোনো router না থাকলে request আপনার app-এ পৌঁছায়। app 404 response দেয় এবং login সম্পন্ন হয় না। একই domain-এ থাকা সাধারণ Host() rule-এর চেয়ে নির্দিষ্ট path rule-কে অগ্রাধিকার দেওয়ার জন্য priority-এর মান বেশি হতে হবে।

Private browser window-এ পরীক্ষা করুন। আপনাকে auth.example.com-এ পাঠানো হবে, সেখানে sign in করুন, তারপর app-এ ফিরে আসুন। Authentik side-এর docker compose logs -f server প্রতি প্রচেষ্টার জন্য একটি authorization event দেখায়। এতে বোঝা যায় request আদৌ Authentik-এ পৌঁছেছে কি না।

আপনি বাস্তবে যে সমস্যাগুলোর মুখোমুখি হবেন

অ্যাপ এবং login page-এর মধ্যে অন্তহীন redirect loop। Provider-এ নির্ধারিত external host browser যে host ব্যবহার করে তার সঙ্গে মেলে না। সাধারণত provider-এ থাকা http:// এবং address bar-এ থাকা https://-এর মধ্যে এই অমিল দেখা যায়। ফলে session cookie ভিন্ন origin-এর জন্য সেট হয় এবং প্রতিবার ফিরে আসা অনুরোধকে নতুন anonymous request হিসেবে গণ্য করা হয়। Retest করার আগে external host ঠিক করুন এবং উভয় domain-এর cookie মুছে দিন।

/outpost.goauthentik.io/start-এ 404। Outpost router অনুপস্থিত, অথবা ওই host-এর catch-all router-এর তুলনায় তার priority কম।

Login চাওয়া ছাড়াই অ্যাপ load হয়। middlewares label এমন একটি middleware নির্দেশ করে, যা বিদ্যমান নয়। Traefik এ বিষয়ে warning দেখায় না। তাই authentik@docker-এ typo থাকলে কোনো middleware চালু হয় না। Traefik dashboard খুলে router-এর তালিকায় middleware-টি আছে কি না নিশ্চিত করুন।

সফল login-এর পরে Authentik থেকে 403। User authenticated হলেও authorized নয়। Application-এ এমন একটি policy binding বা group requirement রয়েছে, যা user পূরণ করেন না। Admin interface-এর Events log কোন policy অনুরোধটি প্রত্যাখ্যান করেছে তা দেখায়।

Keycloak কখন বেশি উপযোগী

Keycloak একটি পুরোনো প্রকল্প, যার পেছনে Red Hat-এর সমর্থন রয়েছে। প্রচলিত enterprise identity ব্যবস্থাপনার জন্য এটি বেশি শক্তিশালী। বিশেষ করে ব্যাপক SAML federation, একই সময়ে একাধিক external identity provider থেকে login broker করা, এবং নথিবদ্ধ migration path হিসেবে realm export ও import-এর ক্ষেত্রে এটি উপযোগী। কিছু organisation-এর জন্য এর পেছনে থাকা commercial support নীতিগতভাবে গুরুত্বপূর্ণ। এর বিনিময়ে, Keycloak-এর নিজস্ব proxy নেই। তাই OIDC (OpenID Connect) সমর্থন করে না এমন কোনো app সুরক্ষিত করতে এর পাশে oauth2-proxy-এর মতো একটি টুল চালাতে হয়। Authentik-এর built-in proxy provider এই কাজটি করে এবং এটি আগে থেকেই সমন্বিত। এই কারণেই বিভিন্ন ধরনের app চালানো অধিকাংশ self-hoster শেষ পর্যন্ত Authentik বেছে নেন।

ব্যাকআপ এবং আপগ্রেড

Restore করার জন্য তিনটি জিনিস প্রয়োজন: PostgreSQL database, ./data directory এবং .env

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

ওই dump এবং .env একসঙ্গে সংরক্ষণ করুন। শুধু dump যথেষ্ট নয়, কারণ session এবং token data সুরক্ষিত রাখার secret key .env-এ থাকে।

Upgrade হলো tag পরিবর্তন। .env-এ AUTHENTIK_TAG আপনি যে release চান সেটিতে নির্ধারণ করুন। এরপর docker compose pull চালিয়ে docker compose up -d চালান। আগে release notes পড়ুন, কারণ Authentik date-based version ব্যবহার করে এবং কিছু release-এ এমন migration থাকে যেগুলোর জন্য আগের release থেকে upgrade করে আসা প্রয়োজন। Pull করার আগে database dump নিন, পরে নয়।

FAQ

Authentik নিজে হোস্ট করতে কি এটি বিনামূল্যে?

Open source edition বিনামূল্যে এবং এতে উপরে বর্ণিত সবকিছু রয়েছে: proxy provider, forward auth, OIDC (OpenID Connect), SAML এবং flows engine। একটি paid enterprise tier-এ support ও কিছু enterprise feature যোগ হয়, তবে এখানে কোনো licence প্রয়োজন নেই।

Authentik ব্যবহার করতে কি Traefik প্রয়োজন?

না। auth_request ব্যবহার করে nginx-এর সঙ্গে এবং forward_auth ব্যবহার করে Caddy-এর সঙ্গে forward auth কাজ করে। প্রতিটি ক্ষেত্রেই পদ্ধতিটি একই: reverse proxy প্রতিটি request সম্পর্কে Authentik-এর কাছে জিজ্ঞাসা করে, এবং protected hostname-এর /outpost.goauthentik.io/ path prefix-টি অ্যাপের পরিবর্তে Authentik-এ route করতে হয়।

Protected app login এবং error-এর মধ্যে বারবার ঘুরতে থাকে কেন?

Proxy provider-এ configured external host browser যে URL ব্যবহার করছে, তার সঙ্গে মেলে না। সবচেয়ে সাধারণ ক্ষেত্রে এটি http বনাম https হয়। Session cookie একটি origin-এর জন্য issue করা হয় এবং অন্য origin-এ পড়া হয়। তাই Authentik প্রতিবার anonymous request দেখতে পায়। External host সংশোধন করুন। এরপর আবার পরীক্ষা করার আগে উভয় hostname-এর cookies clear করুন।

Authentik-এর কত RAM প্রয়োজন?

July 2026 অনুযায়ী documented minimum হলো 2 CPU cores এবং 2 GB RAM। এতে PostgreSQL, server এবং worker একসঙ্গে অন্তর্ভুক্ত। 2 GB-এর server-এ memory pressure হলে kernel প্রথমে worker process বন্ধ করে। এর লক্ষণ হলো login page কাজ করলেও background task এবং outbound email বন্ধ হয়ে যাওয়া। একই server-এ সুরক্ষিত অ্যাপগুলোও চললে 4 GB RAM দিন।