<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های ebrahim khodadadi</title>
        <link>https://virgool.io/feed/@ebrahimkhodadadi</link>
        <description>Developer</description>
        <language>fa</language>
        <pubDate>2026-06-16 06:05:39</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/113854/avatar/uAavxG.jpg?height=120&amp;width=120</url>
            <title>ebrahim khodadadi</title>
            <link>https://virgool.io/@ebrahimkhodadadi</link>
        </image>

                    <item>
                <title>ارسال email حاوی صفحه وب (Razor page) در Asp.net core Web Api</title>
                <link>https://virgool.io/@ebrahimkhodadadi/%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-email-%D8%AD%D8%A7%D9%88%DB%8C-%D8%B5%D9%81%D8%AD%D9%87-%D9%88%D8%A8-razor-page-%D8%AF%D8%B1-aspnet-core-web-api-iaqv9btfcyx4</link>
                <description>مقدمه: برای این که ایمیل حاوی صفحه html &amp; css به صورت Razor page رو رندر کنید و ارسال کنید روشی که قبلا بود صفحه وب رو خط به خط میخوندن مثل کد زیرhttps://github.com/ebrahimkhodadadi/gitsharp/blob/main/C#/Htmltostring.csو بعد پارامتر ها رو با روخوانی string جایگزین میکردن یا روش دیگه این که صفحه رو رندر میکردن و تبدیل به string میکردن برای ایمیل که مستلزم این بود که razor رو پیاده سازی کرده باشید مثل کد زیرhttps://github.com/ebrahimkhodadadi/gitsharp/blob/main/Asp.netcore/Convert(Render)HtmlPageToText(foremail).txtولی برای هر پروژه ی .net core ای مثل web api که razor پیاده سازی نمیشه میتونید از کتابخونه متن باز FluentEmail استفاده کنید و string ریزور یا مسیر صفحه رو بهش میدید رندر رو انجام میده با ViewModel ای که بهش دادید و ایمیل رو هم ارسال میکنه پیاده سازی خودم به این شکل بودهپکیج هایی که باید نصب کنید  &lt;PackageReference Include=&amp;quotFluentEmail.Razor&amp;quot Version=&amp;quot3.0.2&amp;quot /&gt;  &lt;PackageReference Include=&amp;quotFluentEmail.Smtp&amp;quot Version=&amp;quot3.0.2&amp;quot /&gt;- مدل ها رو پیاده کنید  - سرویس رو پیاده کنید  حالا سرویسی که پیاده کردید رو به pipeline اضافه کنید  services.AddNotificaitons(Configuration);داخل appsetting هم که اطلاعات smtp رو وارد کنید&amp;quotEmailSenderOptions&amp;quot: {
&amp;quotSmtpUser&amp;quot: {
&amp;quotEmail&amp;quot: &amp;quotnoreply@gmail.com&amp;quot
},
&amp;quotSmtpPassword&amp;quot: &amp;quot123456&amp;quot,
&amp;quotSmtpHost&amp;quot: &amp;quotmail.gmail.com&amp;quot,
&amp;quotSmtpPort&amp;quot: 56,
&amp;quotSmtpSsl&amp;quot: false
}مرحله اخر هم razor page رو ایجاد کنید اگر نخواستید داخل wwwroot قرار بدید که طبق مستندات عمل کنیدولی من به این شکل عمل کردمنکته: مسیر این فولدر رو در کلاس FluentEmailSender تعریف کردیماین جا براتون یک صفحه sample ریزور گزاشتم https://gist.github.com/ebrahimkhodadadi/b04bbac946407a73599b86658f915c6dنکته: در صفحات وب ایمیل باید از css 2 استفاده کنید و css 3 ساپورت نمیشه لینک اطلاعات بیشتر:https://www.cerberusemail.comمنابع:https://github.com/lukencode/FluentEmailhttps://lukelowrey.com/dotnet-email-guide-2021</description>
                <category>ebrahim khodadadi</category>
                <author>ebrahim khodadadi</author>
                <pubDate>Wed, 24 May 2023 21:51:22 +0330</pubDate>
            </item>
                    <item>
                <title>قدم به قدم پیاده سازی CI/CD گیتهاب برای دات نت به زبان ساده</title>
                <link>https://virgool.io/@ebrahimkhodadadi/%D9%82%D8%AF%D9%85-%D8%A8%D9%87-%D9%82%D8%AF%D9%85-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-cicd-%DA%AF%DB%8C%D8%AA%D9%87%D8%A7%D8%A8-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-euve5rzyen4v</link>
                <description>آپدیت: میتونید از ابزار هایی مثل dokploy استفاده کنید که تمام این مراحل رو براتون انجام میدن :)چکیده:چطور میتونم بعد از اتفاقی که روی گیت پروژه میفته پروژه دات نتم رو بیلد، تست یا دیپلوی کنم؟در ادامه مطلب به پاسخ این سوال میپردازیم.نکته: بهتره که با docker , github, ubuntu آشنا باشیدمراحل:۱- بعد از ایجاد پروژه دات نت باید فایل های زیر رو به پروژه اضافه کنیم داکر فایل (حاوی اطلاعاتی مثل نحوه بیلد پروژه) فایل داکر کمپوس (حاوی عملیات های ران کردن کانتینر داکر)فایل گیتهاب اکشن (حاوی رخدادی که در گیت اتفاق می افته و عملیاتی که بعد از اون اتفاق باید انجام بشه)دو فایلی که داکر نیاز داره رو خوده visual studio برای ما میسازه پس روی لایه ای که برای استفاده استارتش میکنیم مراحل زیر رو اجرا میکنیمو دو فایل زیر به پروژه اضافه میشنحالا باید خط زیر رو تغییر بدیم و فقط این دو مقدار رو اضافه کنیم که به پروژه بگیم روی چه پورتی ران بشه من پورت ۸۰ رو در نظر گرفتم&quot;--server.urls&quot;, &quot;http://+:80&quot;همین جا کارمون با visual studio تموم میشه و پروژه رو پوش کنید روی گیتهاب (برای بقیه سرویس های گیت مراحل بعد یعنی دستورات اکشن ها متفاوت هست و اینجا گیتهاب رو توضیح میدم)نکته: اگر پروژتون از sql یا هر تکنولوژی دیگه ای استفاده میکنه که میخواید همراه پروژه دیپلوی بشه باید فایل docker-compose.yml رو که اضافه کردیم تغییر بدید مثال های این فایل رو داخل لینک زیر قرار دادمhttps://github.com/ebrahimkhodadadi/gitsharp/blob/main/Docker/asp-docker-compose.ymlنکته بعدی هم این که در docker-compose پورت Api رو باز کنید که بتونید از بیرون ببینیدش پس خط زیر رو اضافه کنیدports:      - &quot;80:80&quot;اگر هم port باز نشد که با دستور sudo ufw allow 80۲- مرحله بعد گیتهاب اکشن ها رو اضافه کنید (بعد از اضافه کردن اکشن ها اگر ویژوال استادیوتون آپدیت باشه و pull کنید شاخه Github Actions در کنار لایه های پروژه اضافه شده) پس وارد ریپوزیتوری گیتهاب بشید و تب Action و روی setup a workflow کلیک کنیدیا میتونید خودتون مثل مسیری که داخل تصویر معلوم هست فولدر بندی کنید و فایل تنظیمات اکشن رو با پسوند yml بسازیدمعمولا دو فایل ایجاد میکنم یکی برای بیلد و تست و یکی هم برای دیپلویکد گیتهاب اکشنی که برای بیلد و تست استفاده میکنم:name: build and teston: [push]jobs:build:runs-on: ubuntu-latestenv:DOTNET_INSTALL_DIR: &amp;quot./.dotnet&amp;quotsteps:- uses: actions/checkout@v3- name: Setup .NETuses: actions/setup-dotnet@v3with:dotnet-version: 6.0.x- name: Restore dependenciesrun: dotnet restore src/Presentation/Api.csproj- name: Buildrun: dotnet build src/Presentation/Api.csproj --no-restoreتنها جایی که باید تغییر بدید دستورات run هست که مسیر ها رو باید تغییر بدیدکد گیتهاب اکشنی که برای دیپلوی استفاده میکنم:name: Deploy Developon:push:
pull_request:    types: [closed]branches:- developjobs:build:runs-on: [self-hosted, linux]steps:- uses: actions/checkout@v3
 - name: build project
 run: docker-compose build- name: start docker containerrun:  docker-compose up -d
 - name: remove old images
run: docker system prune -a -fدر on میتونید رخدادی که اتفاق می افته و برنچی که در اون این رخداد اتفاق افتاده رو معلوم کنید در steps مراحلی که به ترتیب میخواید اجرا بشهمهم تر از همه runs-on خوده گیتهاب به ما یک سری سیستم عامل مثل ubuntu-latest موقت ارائه میده که بتونیم روش دستور اجرا کنیم ولی برای Deploy باید از self-Host runner استفاده کنیم یعنی سرور خودمون رو به گیتهاب وصل کنیم که میشه مثلا [self-hosted, linux] این فایل ها رو روی پروژه کامیت و پوش کنید اگر به self-Host runner نیاز داشتید صفحه ریپوزیتوری گیتهاب رو باز کنید و وارد صفحه زیر بشیدروی دکمه new self-hosted runner که کلیک کنید صفحه بالا باز میشه و یک سری دستور نوشته که دقیقا همین دستورات رو روی سرورتون اجرا کنید بعد از کانفیگ سرور وارد همین مسیر که بشید سرور شما اضافه شدهنکته: مرحله اخر به جای دستور ./run باید به عنوان سرویس رانر اجرا بشه پس دستورات زیر رو در مرحله نهایی اجرا کنید:sudo ./svc.sh installsudo ./svc.sh startsudo ./svc.sh statusو برای حذف همsudo ./svc.sh uninstall./config.sh removeداخل کد گیتهاب اکشنی که برای دیپلوی نوشتید یک کانتینر داکر ران میشه پس باید از قبل داکر رو روی سرور نصب کرده باشیدبرای چک کردن اتفاقاتی که داخل اکشن ها میفته از صفحه repository همون تب Action ها به تاریخچه دسترسی داریدممکنه که وقتی میخواید دیپلوی رو روی داکر انجام بدید به یک سری مشکلات مثل دسترسی بخورید که داخل همین تب میتونید ارورش رو چک کنید. اگر داکر در حال اجرا نبود دستورات زیر رو اجرا کنیدsystemctl start dockersystemctl enable dockerگیتهاب رانر که اجرا شد دسترسی root نمیگیره پس برای این که داکر رو بتونید از بیرون ببینید دسترسیش رو به این شکل باز کنیدCreate a Systemd service file:sudo nano /etc/systemd/system/docker-permissions.serviceAdd the following content:[Unit]Description=Set Docker Socket PermissionsAfter=docker.service[Service]Type=oneshotExecStart=/bin/chmod 666 /var/run/docker.sock[Install]WantedBy=multi-user.targetSave and exit the file.Enable the service:sudo systemctl enable docker-permissionsStart the service:sudo systemctl start docker-permissionsبه عنوان اخرین نکته سعی کنید سرور های هر کشوری به جز ایران رو به عنوان self-host runner انتخاب کنید! عمده مشکلاتی و ارور هایی که پیش میاد به همین دلیل هست یا روی سرور خودتون با تغییر فایل /etc/resolve.conf بیاید و DNS های shecan.ir رو ست کنیدGood luck!</description>
                <category>ebrahim khodadadi</category>
                <author>ebrahim khodadadi</author>
                <pubDate>Thu, 23 Mar 2023 18:32:31 +0330</pubDate>
            </item>
            </channel>
</rss>