Authentik: self-hosted SSO দিয়ে সব app-এ এক login
Docker Compose-এ Authentik চালিয়ে সব app-এ এক login দিন। গুরুত্বপূর্ণ env value, akadmin bootstrap এবং Traefik forward auth-এর ধাপসহ Version 2026.5-এর তথ্য জানুন।
আপনার হোস্ট করা প্রতিটি অ্যাপের জন্য একটি লগইন
Authentik একটি self-hosted SSO (single sign-on) server। ব্যবহারকারীরা একবার sign in করেন, এবং এর পেছনে থাকা প্রতিটি app নিজের password চাওয়ার বদলে সেই session গ্রহণ করে। ইনস্টলেশনের জন্য একটি official Docker Compose file এবং দুটি generated secret প্রয়োজন। আসল পরিকল্পনার কাজ শুরু হয় এর পরে: একটি reverse proxy-কে এর দিকে নির্দেশ করা এবং forward auth ব্যবহার করে একটি বিদ্যমান app-কে এর সুরক্ষার পেছনে রাখা।
Authentik ওই Compose file-এ তিনটি service হিসেবে প্রকাশিত হয়: একটি PostgreSQL database, একটি server process এবং একটি worker process। Server container-এ embedded outpost-ও চলে। এটিই প্রতিটি সুরক্ষিত app-এর জন্য “এই request-এ sign in করা হয়েছে কি না?” প্রশ্নের উত্তর দেয়। July 2026 অনুযায়ী Version 2026.5 বর্তমান release, এবং project-টি অন্তত 2টি CPU core ও 2 GB RAM-সহ host চায়। এটিকে সর্বনিম্ন সীমা হিসেবে ধরুন। Server চালু থাকার এক দিন পর PostgreSQL এবং worker—দুটিই memory ব্যবহার করে।
শুরু করার আগে যা প্রয়োজন
আপনার Docker Engine-এর সঙ্গে Compose v2 plugin প্রয়োজন। এটি docker compose version দিয়ে যাচাই করতে পারেন। এটি version-এর পরিবর্তে error দেখালে পরবর্তী ধাপে যাওয়ার আগে plugin ইনস্টল করুন। প্রাথমিক বিষয়গুলো VPS-এ Docker Compose দিয়ে app চালানো-এ ব্যাখ্যা করা হয়েছে। আপনার এমন একটি DNS A record-ও প্রয়োজন, যা server-কে নির্দেশ করে। নিচের উদাহরণে এটি হলো auth.example.com। কারণ browser যে hostname ব্যবহার করেছে, Authentik সেই hostname থেকে redirect URL তৈরি করে।
root হিসেবে নয়, docker group-এর একটি সাধারণ user হিসেবে stack চালান। এই group-এর সদস্যপদ host-এ root-এর সমতুল্য। তাই VPS-এ সর্বনিম্ন-সুবিধার 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 -ddocker compose ps-এ তিনটি container তালিকাভুক্ত থাকা উচিত। postgresql-এ healthy এবং server রিপোর্ট করা উচিত। worker-এ running রিপোর্ট করা উচিত। প্রথমবার চালু হলে database migration চলে। তাই web interface সাড়া দেওয়ার আগে এক মিনিট অপেক্ষা করুন।
দুটি তৈরি করা মানই গুরুত্বপূর্ণ, তবে ভিন্ন কারণে। PG_PASS হলো PostgreSQL password, এবং এর সর্বোচ্চ সীমা 99 characters। AUTHENTIK_SECRET_KEY session ও token-এ স্বাক্ষর করে। তাই পরে এটি পরিবর্তন করলে সব user লগ-আউট হয়ে যাবে এবং আপনি জারি করা প্রতিটি API token অকার্যকর হবে। .env-এর mode 600 বজায় রাখুন এবং এর একটি কপি নিরাপদ স্থানে রাখুন। কারণ সংশ্লিষ্ট secret key ছাড়া restore করা database-এ কেউ লগ-ইন করতে পারে না।
Compose file দুটি মানই ${PG_PASS:?database password required} form ব্যবহার করে পড়ে। তাই file অনুপস্থিত থাকলে Compose চালু হতে অস্বীকার করে। ভুল directory থেকে docker compose up -d চালালে required variable AUTHENTIK_SECRET_KEY is missing a value: secret key required প্রদর্শন করে এবং থেমে যায়। এটি path-এর সমস্যা, config-এর সমস্যা নয়।
গুরুত্বপূর্ণ পরিবেশের মান
বাকি সবকিছু একই .env ফাইলে লিখুন। Authentik ডাবল আন্ডারস্কোরকে নেস্টেড কনফিগারেশন কী হিসেবে ম্যাপ করে, তাই AUTHENTIK_EMAIL__HOST, email.host সেট করে। সিঙ্গেল আন্ডারস্কোর কোনো সতর্কতা ছাড়াই উপেক্ষিত হয়। কোনো সেটিং কার্যকর না হওয়ার এটি সবচেয়ে সাধারণ কারণ।
- প্রথমবার চালু হওয়ার সময়
AUTHENTIK_BOOTSTRAP_PASSWORDবিল্ট-ইনakadminব্যবহারকারীর পাসওয়ার্ড সেট করে। তাই কোনো পাবলিক ওয়েব ফর্মে পাসওয়ার্ড লিখতে হয় না। একইভাবেAUTHENTIK_BOOTSTRAP_EMAILএবংAUTHENTIK_BOOTSTRAP_TOKENওই ব্যবহারকারীর ঠিকানা ও একটি API token সেট করে। COMPOSE_PORT_HTTPএবংCOMPOSE_PORT_HTTPSপ্রকাশিত port-গুলোকে ডিফল্ট 9000 এবং 9443 থেকে সরিয়ে দেয়।AUTHENTIK_EMAIL__HOST,AUTHENTIK_EMAIL__PORT,AUTHENTIK_EMAIL__USERNAME,AUTHENTIK_EMAIL__PASSWORD,AUTHENTIK_EMAIL__USE_TLSএবংAUTHENTIK_EMAIL__FROMবহির্মুখী mail কনফিগার করে। এগুলো না থাকলে Authentik port 25-এlocalhostব্যবহার করার চেষ্টা করে। ফলে password-reset mail পাঠানো ব্যর্থ হয়ে worker log-এ connection error দেখা যায়।- Login flow-তে সমস্যা হলে প্রয়োজনীয় বিস্তারিত তথ্য দেখাতে
AUTHENTIK_LOG_LEVEL=debugচালু করে। পরে এটিকেinfo-এ ফিরিয়ে দিন। - ডিফল্টভাবে
AUTHENTIK_ERROR_REPORTING__ENABLEDহলোfalse। Upstream-এ crash report পাঠাতে সম্মত থাকলেই কেবল এটিকেtrueসেট করুন।
এগুলো একটি সাধারণ ফাইলে রাখা secret, তাই directory-টিকে অন্য যেকোনো credential store-এর মতোই সুরক্ষিত রাখুন। আপনার laptop-এ লেখা নোটের চেয়ে নিজে পরিচালিত Vaultwarden instance-এর মতো একটি password manager recovery copy রাখার জন্য ভালো স্থান।
প্রথম লগইন এবং admin account
ব্রাউজারে http://SERVER_IP:9000 খুলুন। Authentik-এর প্রাথমিক সেটআপ প্রবাহ প্রদর্শিত হবে এবং ডিফল্ট akadmin ব্যবহারকারীর জন্য একটি 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 দেখা যায় এবং কে কাজটি করেছে তা বোঝা যায় না।
আপনার reverse proxy-এর পেছনে Authentik রাখুন
ইন্টারনেটে 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: truedocker 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-এ নেই। Traefik এমন container-এ network traffic পাঠাতে পারে না, যেটিতে সে পৌঁছাতে পারে না।
hostname কাজ করার পর override-এ প্রকাশিত ports-গুলো 127.0.0.1-এর সঙ্গে bind করুন। এতে proxy-এর মাধ্যমেই প্রবেশের একমাত্র পথ থাকবে।
forward auth দিয়ে একটি অ্যাপ সুরক্ষিত করুন
Authentik-এর proxy provider-এ 3টি mode আছে। ভুল mode বেছে নিলে 1 ঘণ্টা নষ্ট হতে পারে। Proxy mode-এ outpost নিজেই upstream app-এ traffic forward করে। Forward auth (single application) mode-এ আপনার নিজস্ব reverse proxy traffic পরিচালনা করে এবং request-টি sign in করা অবস্থায় আছে কি না, শুধু তা Authentik-এর কাছে যাচাই করে। Forward auth (domain level) mode-এ একটি provider দিয়ে একই parent domain-এর অধীনে থাকা সব app সুরক্ষিত হয়, তবে প্রতিটি app-এর authorization rule আলাদাভাবে নির্ধারণ করা যায় না। Traefik সামনে থাকলে আপনাকে forward auth (single application) ব্যবহার করতে হবে।
Web interface-এ Applications এবং এরপর Providers খুলুন। একটি Proxy Provider তৈরি করুন, forward auth single application mode নির্বাচন করুন এবং external host হিসেবে https://app.example.com সেট করুন। ওই provider-কে নির্দেশ করে এমন একটি Application তৈরি করুন। এরপর Outposts খুলে authentik Embedded Outpost সম্পাদনা করুন এবং নতুন application-টিকে selected applications-এ স্থানান্তর করুন। Outpost কেবল তাকে দেওয়া application-গুলোর জন্য উত্তর দেয়। তাই শেষ ধাপটি বাদ দিলে সঠিকভাবে configure করা provider-ও কোনো response দেয় না।
Middleware-টি একবার Authentik container-এ সংজ্ঞায়িত করুন এবং প্রতিটি সুরক্ষিত 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-versionauthResponseHeaders হলো সেই header-গুলোর তালিকা, যেগুলো Traefik Authentik-এর উত্তর থেকে কপি করে upstream-এ পাঠানো request-এ যুক্ত করে। এটি বাদ দিলে app সুরক্ষিত থাকবে, কিন্তু user কে তা জানতে পারবে না। ফলে automatic login-এর জন্য X-authentik-username পড়ে এমন যেকোনো ব্যবস্থা sign in অবস্থায় থাকবে না।
সুরক্ষিত app-টির জন্য 1টির বদলে 2টি 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 উত্তর দেয় এবং login সম্পূর্ণ হয় না। বেশি priority-এর কারণে একই domain-এ থাকা সাধারণ Host() rule-এর বদলে নির্দিষ্ট path rule কার্যকর হয়।
Private browser window-এ এটি পরীক্ষা করুন। আপনাকে auth.example.com-এ পাঠানো হবে। Sign in করুন এবং app-এ ফিরে আসুন। Authentik পাশের docker compose logs -f server প্রতিটি প্রচেষ্টার জন্য একটি authorization event দেখায়। এতে বোঝা যায় request-টি Authentik-এ আদৌ পৌঁছেছিল কি না।
যে ব্যর্থতাগুলোর মুখোমুখি আপনি বাস্তবে হবেন
অ্যাপ এবং login page-এর মধ্যে অন্তহীন redirect loop। Provider-এ নির্ধারিত external host ব্রাউজার যে host ব্যবহার করছে তার সঙ্গে মেলে না। সাধারণত provider-এ এটি থাকে http://, আর address bar-এ থাকে https://। তখন session cookie ভিন্ন origin-এর জন্য সেট হয়। ফলে প্রতিবার ফিরে আসার অনুরোধটি নতুন anonymous request হিসেবে বিবেচিত হয়। পুনরায় পরীক্ষা করার আগে external host ঠিক করুন এবং উভয় domain-এর cookies মুছে ফেলুন।
/outpost.goauthentik.io/start-এ 404। Outpost router অনুপস্থিত, অথবা ওই host-এর catch-all router-এর তুলনায় এর priority কম।
কোনও login না চেয়েই অ্যাপ load হয়। middlewares label এমন একটি middleware-এর নাম নির্দেশ করে, যেটি বিদ্যমান নয়। Traefik এ বিষয়ে সতর্ক করে না। তাই authentik@docker-এ typo থাকলে কোনও middleware চালু হয় না। Traefik dashboard খুলে router-এ middleware-টি তালিকাভুক্ত আছে কি না নিশ্চিত করুন।
সফল login-এর পর Authentik থেকে 403। ব্যবহারকারী authenticated, কিন্তু authorized নন। Application-এ এমন একটি policy binding বা group requirement রয়েছে, যা এই ব্যবহারকারী পূরণ করেন না। Admin interface-এর Events log কোন policy অনুরোধটি প্রত্যাখ্যান করেছে তা দেখায়।
Keycloak কখন বেশি উপযুক্ত
Keycloak পুরোনো প্রকল্প, যার পেছনে Red Hat-এর সমর্থন আছে। প্রচলিত enterprise identity ব্যবস্থাপনার জন্য এটি বেশি শক্তিশালী। এর মধ্যে রয়েছে ভারী SAML federation, একসঙ্গে একাধিক external identity provider থেকে login broker করা, এবং নথিভুক্ত migration পথ হিসেবে realm export ও import। কিছু প্রতিষ্ঠানের কাছে কাগজে-কলমে এর commercial support গুরুত্বপূর্ণ। তবে এর বিনিময়ে Keycloak-এর নিজস্ব proxy নেই। তাই OIDC (OpenID Connect) সমর্থন করে না এমন app সুরক্ষিত করতে এর পাশে oauth2-proxy-এর মতো কিছু চালাতে হয়। Authentik-এর built-in proxy provider এই কাজটি আগে থেকেই সমন্বিতভাবে করে। এ কারণেই বিভিন্ন ধরনের app ব্যবহারকারী অধিকাংশ self-hosting ব্যবহারকারী শেষ পর্যন্ত Authentik বেছে নেন।
ব্যাকআপ এবং আপগ্রেড
একটি পুনরুদ্ধার সম্ভব করতে তিনটি জিনিস প্রয়োজন: PostgreSQL ডেটাবেস, ./data ডিরেক্টরি এবং .env।
cd /opt/authentik
docker compose exec -T postgresql pg_dump -U authentik authentik | gzip > authentik-$(date +%F).sql.gzএই ডাম্প এবং .env একসঙ্গে সংরক্ষণ করুন। শুধু ডাম্প যথেষ্ট নয়, কারণ সেশন এবং টোকেন ডেটা সুরক্ষিত রাখে এমন গোপন কী .env-এ থাকে।
আপগ্রেড হলো একটি tag পরিবর্তন। .env-এ AUTHENTIK_TAG আপনার পছন্দের release-এ সেট করুন, তারপর docker compose pull এবং এরপর docker compose up -d চালান। আগে release notes পড়ুন, কারণ Authentik তারিখভিত্তিক version ব্যবহার করে এবং কিছু release-এ এমন migration থাকে, যেগুলোর জন্য আগের release থেকে আপগ্রেড করে আসা প্রত্যাশিত। pull চালানোর পরে নয়, তার আগে ডেটাবেস ডাম্প নিন।
FAQ
Authentik নিজে হোস্ট করতে কি বিনামূল্যে ব্যবহার করা যায়?
Open source সংস্করণটি বিনামূল্যে এবং এতে উপরে বর্ণিত সবকিছু রয়েছে: proxy provider, forward auth, OIDC (OpenID Connect), SAML এবং flows engine। অর্থপ্রদত্ত enterprise স্তরে সহায়তা ও কিছু enterprise বৈশিষ্ট্য যোগ হয়, তবে এখানে কোনো licence প্রয়োজন নেই।
Authentik ব্যবহার করতে কি Traefik প্রয়োজন?
না। auth_request-এর মাধ্যমে nginx এবং forward_auth-এর মাধ্যমে Caddy-এর সঙ্গে forward auth কাজ করে। প্রতিটি ক্ষেত্রেই পদ্ধতিটি একই: reverse proxy প্রতিটি request সম্পর্কে Authentik-এর কাছে যাচাই করে, এবং সুরক্ষিত hostname-এর /outpost.goauthentik.io/ path prefix-টি app-এর পরিবর্তে Authentik-এ route করতে হবে।
আমার সুরক্ষিত app কেন বারবার login এবং error-এর মধ্যে ঘুরতে থাকে?
Proxy provider-এ কনফিগার করা external host browser যে URL ব্যবহার করছে, তার সঙ্গে মেলে না। সাধারণত এটি http বনাম https সমস্যার কারণে ঘটে। Session cookie একটি origin-এর জন্য জারি হয়, কিন্তু অন্য origin-এ পড়া হয়। তাই Authentik প্রতিবার anonymous request দেখতে পায়। External host ঠিক করুন। এরপর আবার পরীক্ষা করার আগে উভয় hostname-এর cookies মুছে ফেলুন।
Authentik-এর কত RAM প্রয়োজন?
2026 সালের July অনুযায়ী নথিভুক্ত ন্যূনতম প্রয়োজন হলো 2 CPU cores এবং 2 GB RAM। এতে PostgreSQL, server এবং worker একসঙ্গে চলে। 2 GB-এর server-এ memory pressure হলে kernel প্রথমে worker process বন্ধ করে। এর ফলে login page কাজ করলেও background tasks এবং outbound email বন্ধ হয়ে যায়। একই server-এ সুরক্ষিত app-গুলোও চললে 4 GB RAM দিন।