آموزش نصب وردپرس با داکر روی لینوکس اوبونتو

نصب وردپرس با داکر

نصب وردپرس با داکر یکی از راه‌های نصب سفارشی این سیستم مدیریت محتواست. همانطور که می‌دانید، وردپرس یک CMS رایگان و منبع‌باز است که از آن برای مدیریت محتوای وب‌سایت‌ها استفاده می‌شود. شما با کمک معماری پلاگین و سیستم قالب توسعه‌پذیر وردپرس، می‌توانید مدیریت محتوای خود را از طریق رابط وب انجام دهید.

برای اجرای صحیح وردپرس، باید پشته‌های LAMP (آپاچی، لینوکس، PHP و MySQL) یا LEMP (MySQL، لینوکس، PHP و Nginx) را نصب کنید که نصب آن‌ها زمان‌بر و خسته‌کننده است. البته، با کمک ابزار‌هایی مانند داکر یا داکر کمپوز می‌توانید فرآیند نصب را بسیار سریع‌تر و راحت‌تر انجام دهید. در‌واقع، از این طریق به جای اینکه فرآیند نصب را به صورت دستی انجام دهید، از ایمیج‌ها استفاده می‌کنید. کار ایمیج این است که مواردی مانند کتابخانه‌ها، فایل‌های پیکربندی و متغیر‌های محیط را به صورت استاندارد نصب کند. علاوه‌بر‌این، با استفاده از کمپوز می‌توانید چندین کانتینر را جوری هماهنگ کنید که با یکدیگر ارتباط برقرار کنند.

در آموزش نصب وردپرس با داکر، نصب وردپرس چند کانتینری را یاد می‌گیریم. کانتینر‌ها شامل وب سرور Nginx، پایگاه داده‌ی MySQL و خود وردپرس هستند. در ادامه، برای ایمن‌سازی وب‌سایت، گواهینامه‌های TLS/SSL را نصب می‌کنیم و در پایان، برای تمدید گواهینامه و امن نگه‌داشتن دامنه، یک cron job را راه‌اندازی می‌کنیم.

پیش‌نیاز‌های نصب وردپرس با داکر

اگر از سیستم‌عامل اوبونتو ورژن 16.04 یا پایین‌تر استفاده می‌کنید، پیشنهاد می‌کنیم که آن را به آخرین نسخه‌ی موجود ارتقا دهید؛ زیرا اوبونتو دیگر از این ورژن‌ها پشتیبانی نمی‌کند و ممکن است در زمان نصب وردپرس با داکر با مشکل مواجه شوید. همچنین، اگر با وردپرس آشنایی ندارید، پیشنهاد می‌کنیم مقاله‌ی وردپرس چیست را با دقت مطالعه کنید.

برای اینکه این آموزش را به صورت عملی انجام دهید، به موارد زیر نیاز دارید:

  • یک سرور که سیستم‌عامل اوبونتو را اجرا می‌کند، به همراه یک کاربر فعال غیر ریشه با فایروال فعال و امتیازات sudo.
  • نصب داکر بر روی سرور. برای آشنایی با داکر، می‌توانید مقاله‌ی داکر چیست را مطالعه کنید.
  • نصب داکر کامپوز بر روی سرور.
  • یک نام دامنه‌ی ثبت‌شده. در این آموزش، نام دامنه را your_domain قرار داده‌ایم.
  • تنظیم هر دو رکورد DNS زیر برای سرور:
    یک رکورد با your_domain که به آدرس IP عمومی سرور شما اشاره دارد.
    یک رکورد با www.your_domain که به آدرس IP عمومی سرور‌تان اشاره دارد.

زمانی که تمام تنظیمات مانند نصب داکر را انجام دادید، می‌توانید مراحل نصب وردپرس با داکر را شروع کنید…

نصب وردپرس با داکر

مرحله ۱: توصیف پیکربندی وب‌سرور

از آنجایی‌که در این آموزش، نصب وردپرس بر روی سیستم‌عامل مبتنی بر لینوکس انجام می‌شود، می‌توانید با خرید سرور مجازی لینوکس کارتان را شروع کنید.

قبل از اینکه یک کانتینر را اجرا کنید، باید برای وب‌سرور Nginx خود یک پیکربندی را توصیف کنید. در فایل پیکربندی، مواردی مانند بلوک‌های مکان مخصوص وردپرس و بلوک مکان برای هدایت درخواست تایید Let’s Encrypt به کلاینت Certbot برای تمدید خودکار گواهینامه وجود دارد.

در قدم اول، باید یک دایرکتوری پروژه برای راه‌اندازی وردپرس ایجاد کنید. در این مثال، نام دایرکتوری را wordpress گذاشته‌ایم. شما می‌توانید نام این دایرکتوری را تغییر دهید:

$ mkdir wordpress

سپس، با دستور زیر به دایرکتوری می‌روید:

$ cd wordpress

در قدم بعدی، با دستور زیر یک دایرکتوری برای فایل پیکربندی می‌سازید:

$ mkdir nginx-conf

با دستور nano یا ویرایشگر مورد علاقه‌ی‌تان، فایل پیکربندی را باز کنید:

$ nano nginx-conf/nginx.conf

در این فایل، باید برای نام سرور و ریشه‌ی سند، یک بلوک سرور با دستورالعمل‌ها اضافه کنید تا هدایت درخواست کلاینت Certbot برای گواهینامه‌ها، پردازش PHP و درخواست‌های دارایی ثابت انجام شود. بدین منظور، کد زیر را به فایل اضافه کنید و قبل از اجرا مطمئن شوید که نام دامنه‌تان با عبارت your_domain جایگزین شده‌ است:

~/wordpress/nginx-conf/nginx.conf
server {
     listen 80;
     listen [:: ]: 80;
     server_name your_domain www.your_domain;
     index index.php index.html index.htm;
     root /var/www/html;
     location ~ /.well-known/acme-challenge {
             allow all;
             root /var/www/html;
     }
     location / {
             try_files $uri $uri/ /index.php$is_args$args;
     }
     location ~ \.php$ {
             try_files $uri =404;
             fastcgi_split_path_info ^(.+\.php)(/.+)$;
             fastcgi_pass wordpress: 9000;
             fastcgi_index index.php;
             include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
     }
     location ~ /\.ht {
             deny all;
     }
     location = /favicon.ico {
                log_not_found off; access_log off;
     }
     location = /robots.txt {
                log_not_found off; access_log off; allow all;
     }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
             expires max;
                log_not_found off;
        }
}

در قطعه کد بالا، بلوک سرور شامل اطلاعات زیر است:

دستور‌ها

  • Listen: این دستور به وب‌سرور Nginx می‌گوید به پورت ۸۰ گوش کند. با اجرای این دستور، می‌توانید از پلاگین webroot برای درخواست‌های گواهینامه استفاده کنید. توجه داشته باشید که در این خط، هنوز پورت ۴۴۳ را وارد نکرده‌اید و می‌توانید پس از دریافت گواهینامه، پیکربندی‌ها را برای اضافه‌کردن SSL بروزرسانی کنید.
  • server_name: این دستور برای مشخص‌کردن نام سرور و بلوک سروری که باید برای درخواست‌ها به سرور استفاده شود، بکار می‌رود. در این خط، باید نام دامنه‌تان را با عبارت your_domain جایگزین کنید.
  • index: این دستور برای توصیف فایل‌هایی که در زمان پردازش درخواست‌ها به سرور به‌عنوان شاخص استفاده می‌شوند، بکار می‌رود. در این خط، ترتیب پیش‌فرض اولویت‌ها تغییر داده شده‌اند و index.php در جلوی index.html منتقل شده‌است تا وب‌سرور Nginx فایل‌هایی به نام index.php را اولویت‌بندی کند.
  • Root: با این دستور، می‌توانید دایرکتوری ریشه را برای درخواست‌های سرور، نامگذاری کنید. این دایرکتوری که با /var/www/html آدرس‌دهی شده‌است، توسط دستورالعمل‌های موجود در Dockerfile وردپرس، به‌عنوان یک نقطه‌ی نصب در هنگام ایجاد، در‌نظر گرفته می‌شود.

با خرید سرور مجازی ایران و نصب سیستم مدیریت محتوای وردپرس، می‌توانید در هزینه‌های کلی کسب‌و‌کارتان صرفه‌جویی کنید.

بلوک‌های مکان

  • location ~ /.well-known/acme-challenge: این بلوک مکان، درخواست‌هایی که به دایرکتوری .well-known می‌روند را رسیدگی می‌کند. در این دایرکتوری، Certbot یک فایل موقت را برای مطمئن‌شدن از اینکه DNS دامنه به سرور منتقل شده‌است، قرار می‌دهد. با کمک این پیکربندی می‌توانید از پلاگین webroot برای اخذ گواهینامه برای دامنه‌تان استفاده کنید.
  • location /: در این بلوک مکان، از دستور try_files برای بررسی فایل‌هایی که با درخواست‌های URL منطبق هستند، استفاده می‌شود. به جای بازگرداندن وضعیت « 404 Not Found » می‌توانید کنترل را به فایل index.php با آرگومان‌های درخواست منتقل کنید.
  • location ~ \.php$: این بلوک مکان برای مدیریت پردازش PHP بکار می‌رود و درخواست‌ها را به کانتینر وردپرس، پراکسی می‌کند. از آنجایی‌که ایمیج داکر وردپرس شما بر اساس ایمیج php: fpm خواهد بود، باید گزینه‌های پیکربندی که مختص پروتکل FastCGI هستند را در این بلوک قرار دید. همچنین، از آنجایی‌که وب‌سرور Nginx برای درخواست‌های PHP به یک پردازنده‌ی PHP مستقل نیاز دارد، این درخواست‌ها توسط پردازنده‌ی php-fpm که همراه با ایمیج php: fpm هستند، رسیدگی می‌شوند. این بلوک شامل دستورات، متغیر‌ها و گزینه‌های مخصوص FastCGI است.
  • location ~ /\.ht: این بلوک برای مدیریت فایل‌های .htaccess بکار می‌رود؛ زیرا وب‌سرور Nginx به این فایل‌ها سرویس نمی‌دهد. دستور deny_all برای تضمین اینکه فایل‌های .htaccess به کاربران ارائه نمی‌شود، بکار می‌رود.
  • location = /favicon.ico, location = /robots.txt: این بلوک‌ها تضمین می‌کنند که درخواست‌های /favicon.ico و /robots.txt هرگز ثبت نشوند.
  • location ~* \.(css|gif|ico|jpeg|jpg|js|png)$: این بلوک برای غیر‌فعال‌کردن ثبت درخواست‌های دارایی ثابت بکار می‌رود.

پس از اینکه ویرایش کد بالا تمام شد، فایل را ذخیره کرده و سپس آن را ببندید. در‌صورتی که از دستور nano استفاده کردید، باید ذخیره‌سازی و بستن فایل را با با فشار دادن CTRL+X، Y و سپس ENTER انجام دهید. با تمام‌شدن پیکربندی Nginx، می‌توانید به سراغ ایجاد متغیر‌های محیطی بروید تا در زمان اجرا، به کانتینر اپلیکیشن و پایگاه داده‌تان منتقل شوید.

مرحله‌ی ۲: توصیف متغیر‌های محیطی

اگر می‌خواهید پس از نصب وردپرس با داکر، داده‌های اپلیکیشن شما باقی بمانند و در‌دسترس اپلیکیشن باشند، باید پایگاه داده و کانتینر‌های اپلیکیشن وردپرس در زمان اجرا به متغیر‌های محیطی خاصی دسترسی داشته باند. این متغیر‌ها، اطلاعات حساس و غیر‌حساس را در‌بر‌می‌گیرند. به‌عنوان مثال، برخی از این اطلاعات شامل مقادیر حساس برای رمز عبور ریشه MySQL، نام کاربری و رمز عبور پایگاه داده‌ی اپلیکیشن، اطلاعات غیر‌حساس برای نام پایگاه داده‌ی اپلیکیشن، هاست و… هستند.

به جای اینکه همه‌ی این مقادیر را در فایل داکر کمپوز که فایل اصلی حاوی اطلاعات درباره‌ی نحوه‌ی اجرای کانتینر‌های شماست تنظیم کنید، می‌توانید مقادیر حساس را در یک فایل .env تنظیم کرده و گردش آن را محدود کنید. با این انجام این کار، مقادیر در مخازن پروژه‌ی شما کپی نمی‌شوند و در معرض دید عموم قرار نمی‌گیرند.

در این مرحله، باید در فهرست اصلی پروژه‌تان که در مسیر ~/wordpress قرار دارد، فایلی به نام .env را باز کنید:

$ nano .env

مقادیر محرمانه‌ای که در این فایل تنظیم می‌کنید شامل رمز عبور برای کاربر ریشه‌ی MySQL، نام کاربری و رمز عبوری است که برای دسترسی به پایگاه داده استفاده می‌شود. با کمک دستور زیر، نام متغیر‌ها و مقادیر خواسته‌شده را به فایل اضافه می‌کنید:

~/wordpress/.env
MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_USER=your_wordpress_database_user
MYSQL_PASSWORD=your_wordpress_database_password

پس از اینکه ویرایش کد تمام شد، فایل را ذخیره کرده و آن را ببندید.

از آنجایی‌که فایل .env شامل اطلاعات حساس است، باید مطمئن شوید که در فایل‌های .gitignore و .dockerignore پروژه‌ی شما قرار دارد. بدین‌صورت، گیت و داکر متوجه می‌شوند که چه فایل‌هایی نباید در مخازن گیت و ایمیج داکر کپی شوند. در‌صورتی که می‌خواهید با گیت کار کنید، با کمک دستور git init دایرکتوری کاری فعلی‌تان را به‌عنوان یک مخزن، مقداردهی اولیه کنید:

$ git init

 سپس، با کمک دستور زیر، یک فایل .gitignore ایجاد کرده و آن را باز کنید:

$ nano .gitignore

در قدم بعدی، باید .env را به فایل خود اضافه کنید:

~/wordpress/.gitignore
.env

پس از اینکه دستورات بالا را اجرا کردید، فایل را ذخیره کرده و آن را ببندید.

برای اضافه‌کردن .env به فایل .dockerignore بهتر است تا زمانی که از این دایرکتوری به‌عنوان بستر ساخت استفاده کنید؛ در کانتینر‌های شما قرار نگیرد. در قدم اول، با دستور زیر فایل را باز کنید:

$ nano .dockerignore

سپس، .env را به فایل اضافه کنید:

~/wordpress/.dockerignore
.env

با استفاده از کد زیر، می‌توانید فایل‌ها و دایرکتوری‌های مرتبط به توسعه‌ی اپلیکیشن‌تان را اضافه کنید (این قسمت از نصب وردپرس با داکر اختیاری است):

~/wordpress/.dockerignore
.env
.git
docker-compose.yml
.dockerignore

پس از اجرای دستورات بالا، فایل را ذخیره کرده و آن را ببندید. حال می‌توانید سرویس‌هایتان را در یک فایل docker-compose.yml توصیف کنید.

مرحله‌ی ۳ – توصیف سرویس با داکر کمپوز

فایل docker-compose.yml شما حاوی برخی از توصیفات سرویس برای راه‌اندازی است. هر سرویس در کمپوز، یک کانتینر در حال اجراست و توصیفات سرویس اطلاعاتی را درباره‌ی نحوه‌ی ارائه‌ی هر کانتینر، مشخص می‌کند. شما با استفاده از کمپوز می‌توانید برای اجرای اپلیکیشن‌های کاربردی، چندین سرویس مختلف را توصیف کنید. در‌واقع، کمپوز به شما کمک می‌کند که این سرویس‌ها را با شبکه‌ها و حجم‌های مشترک، به یکدیگر پیوند دهید.

از آنجایی‌که در زمان نصب وردپرس با داکر، کانتینر‌های مختلفی برای پایگاه داده، اپلیکیشن وردپرس و وب‌سرورتان ایجاد می‌کنید، این ویژگی برایتان خوب است. علاوه‌بر‌این، می‌توانید برای دریافت گواهینامه‌ی وب‌سرورتان، یک کانتینر برای اجرای کلاینت Certbot ایجاد کنید.

در قدم اول، باید با دستور زیر، فایل docker-compose.yml را ایجاد و باز کنید:

$ nano docker-compose.yml

برای توصیف ورژن فایل کمپوز و سرویس پایگاه داده‌ی db خود، کد زیر را اضافه کنید:

~/wordpress/docker-compose.yml
version: '3'



services:
  db:
image: mysql: 8.0
container_name: db
restart: unless-stopped
env_file: .env
environment:
   - MYSQL_DATABASE=wordpress
volumes:
   - dbdata: /var/lib/mysql
command: '--default-authentication-plugin=mysql_native_password'
networks:
   - app-network

در کد بالا، توصیف سرویس db شامل متغیر‌های زیر است:

  • image: این متغیر به کمپوز می‌گوید که چه ایمیجی را برای ایجاد کانتینر pull کند. در کد بالا، ایمیج mysql: 8.0 را پین می‌کنید تا از مشکلات بعدی جلوگیری کنید؛ زیرا ایمیج mysql: latest همچنان بروز می‌شود.
  • container_name: این متغیر برای مشخص‌کردن نام کانتینر بکار می‌رود.
  • restart: این متغیر برای مشخص‌کردن خط‌مشی راه‌اندازی مجدد کانتینر بکار می‌رود که به طور پیش‌فرض بر روی no توصیف شده‌است. در این مثال، شما کانتینر را برای راه‌اندازی مجدد جوری تنظیم کرده‌اید که برای توقف آن باید به صورت دستی اقدام کنید.
  • env_file: با این گزینه، به کمپوز می‌گویید که می‌خواهید متغیر‌های محلی را در فایلی به نام .env که در بستر ساخت شما قرار دارد، اضافه کنید. در این مثال، بستر ساخت همان دایرکتوری فعلی شماست.
  • Environment: با کمک این گزینه، می‌توانید متغیر‌های محلی اضافی بیشتری (بیشتر از آن چیزی که در .env توصیف شده‌اند) را اضافه کنید. در این مثال، متغیر MYSQL_DATABASE را برابر wordpress قرار داده‌ایم تا نامی را برای پایگاه داده‌ی اپلیکیشن توصیف کنیم. از آنجایی‌که این اطلاعات غیر‌حساس هستند، می‌توانید آن را مستقیما در فایل docker-compose.yml قرار دهید.
  • Volumes: با این متغیر، می‌توانید یک volume به نام dbdata را در پوشه‌ای در مسیر /var/lib/mysql روی کانتینر نصب کنید. در اکثر توزیع‌ها، این پوشه، دایرکتوری استاندارد داده برای MySQL است.
  • Command: با این متغیر، یک دستور برای لغو دستور پیش‌فرض CMD برای ایمیج ایجاد می‌شود. در مثال بالا، یک گزینه به دستور استاندارد mysqld ایمیج داکر که سرور MySQL را روی کانتینر راه‌اندازی می‌کند، اضافه شده‌است. عبارت –default-authentication-plugin=mysql_native_password متغیر سیستم –default-authentication-plugin را بر روی mysql_native_password قرار می‌دهد و مشخص می‌کند که برای درخواست‌های احراز هویت جدید به سرور مجازی، از کدام مکانیزم احراز هویت استفاده شود. از آنجایی‌که PHP و ایمیج وردپرس شما از پیش‌فرض احراز هویت جدید MySQL پشتیبانی نمی‌کنند، باید این تنظیمات را برای احراز هویت کاربر پایگاه داده‌ی اپلیکیشن‌تان انجام دهید.
  • Networks: در این مثال، این متغیر برای پیوند سرویس اپلیکیشن شما با شبکه‌ی app-network بکار رفته‌است.

پس از توصیف سرویس db، باید سرویس اپلیکیشن کاربردی وردپرس‌تان را اضافه کنید:

~/wordpress/docker-compose.yml
...
 wordpress:
depends_on:
   - db
image: wordpress: 5.1.1-fpm-alpine
container_name: wordpress
restart: unless-stopped
env_file: .env
environment:
   - WORDPRESS_DB_HOST=db: 3306
   - WORDPRESS_DB_USER=$MYSQL_USER
   - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
   - WORDPRESS_DB_NAME=wordpress
volumes:
   - wordpress: /var/www/html
    networks:
   - app-network

در توصیف سرویس بالا، کانتینر‌تان را نامگذاری می‌کنید و سیاست راه‌اندازی مجدد را توصیف می‌کنید. همچنین، در زمان نصب وردپرس با داکر، برخی از گزینه‌های خاص را به کانتینر‌تان اضافه می‌کنید که این گزینه‌ها عبارتند از:

  • depends_on: با این گزینه، می‌توانید کاری کنید که کانتینر‌ها به ترتیب وابستگی شروع شوند. در این مثال، کانتینر وردپرس بعد از کانتینر db شروع می‌شود. برنامه‌ی وردپرس، به پایگاه داده و اپلیکیشن شما وابسته است. در‌نتیجه، با توصیف این وابستگی، مطمئن می‌شوید که اپلیکیشن شما به‌درستی شروع به کار می‌کند.
  • image: در این مثال، از ایمیج وردپرس 5.1.1-fpm-alpine استفاده شده‌است. همانطور‌که در مرحله‌ی 1 توضیح دادیم، استفاده از این ایمیج تضمین می‌کند که اپلیکیشن شما دارای پردازنده‌ی php-fpm است. این همان پردازنده‌ای است که وب‌سرور Nginx برای مدیریت PHP به آن نیاز دارد. همچنین، این پردازنده یک ایمیج alpine است که از پروژه‌ی Alpine Linux گرفته شده‌است و برای کاهش اندازه‌ی کلی ایمیج استفاده می‌شود.
  • env_file: این متغیر برای مشخص‌کردن استخراج مقادیر از فایل .env بکار می‌رود.
  • Environment: از این متغیر برای استفاده از مقادیر بکار‌رفته در فایل .env استفاده می‌شود. شما این مقادیر را به نام متغیر‌هایی که ایمیج وردپرس انتظار دارد، اختصاص می‌دهید؛ یعنی WORDPRESS_DB_USER و WORDPRESS_DB_PASSWORD. همچنین، در این مثال، یک WORDPRESS_DB_HOST را توصیف کرده‌ایم که همان سرور MySQL است که روی کانتینر db که در پورت پیش‌فرض 3306 در‌دسترس است، اجرا می‌شود. WORDPRESS_DB_NAME نیز همان مقداری است که در توصیف سرویس MySQL مشخص کرده‌اید: MYSQL_DATABASE:  wordpress.
  • Volumes: در این مثال، یک volume جدید به نام wordpress را در مسیر /var/www/html که توسط ایمیج وردپرس ایجاد شده‌است، نصب می‌کنیم. استفاده از یک volume نامگذاری‌شده به شما کمک می‌کند تا اپلیکیشن‌تان را با سایر کانتینر‌ها به اشتراک بگذارید.
  • Networks: با کمک این متغیر می‌توانید کانتینر وردپرس را به شبکه‌ی app-network اضافه کنید.

در قدم بعدی آموزش نصب وردپرس با داکر، باید برخی از توصیف‌ها را به وب‌سرور Nginx اضافه کنید. این کار را می‌توانید با دستورات زیر انجام دهید:

~/wordpress/docker-compose.yml
...
  webserver:
depends_on:
   - wordpress
image: nginx: 1.15.12-alpine
container_name: webserver
restart: unless-stopped
ports:
   - "80: 80"
volumes:
   - wordpress: /var/www/html
      - ./nginx-conf: /etc/nginx/conf.d
   - certbot-etc: /etc/letsencrypt
networks:
   - app-network

تا اینجا، کانتینر خود را نامگذاری و آن را به ترتیب اولیه به کانتینر وردپرس متصل کرده‌اید. همچنین، از یک ایمیج alpine استفاده کرده‌اید که ایمیج 1.15.12-alpine Nginx نام دارد. این توصیف سرویس شامل موارد زیر می‌شود:

  • Ports: این گزینه، پورت 80 را برای فعال‌کردن گزینه‌های پیکربندی‌ای که در فایل nginx.conf در مرحله‌ی ۱ توصیف کرده‌ایم، نمایش می‌دهد.
  • Volumes: با این گزینه، ترکیبی از volume‌های نامگذاری‌شده و پایه‌های اتصال را توصیف می‌کنیم که شامل موارد زیر می شوند:
  • wordpress: /var/www/html: کد برنامه‌ی وردپرس در دایرکتوری /var/www/html (در بلوک سرور Nginx این دایرکتوری را به‌عنوان root توصیف کرده ایم).
  • ./nginx-conf: /etc/nginx/conf.d: برای اتصال پوشه‌ی پیکربندی Nginx روی هاست به دایرکتوری مربوطه در کانتینر بکار می رود.
  • certbot-etc: /etc/letsencrypt: برای نصب گواهینامه‌ها و کلید‌های Let’s Encrypt مربوط به دامنه بر روی کانتینر بکار می رود.
در ادامه، با استفاده از کد زیر، توصیف وب‌سرور را به سرویس certbot اضافه می‌کنید. دقت کنید که باید اطلاعات خودتان را با آدرس ایمیل و نام دامنه‌ی استفاده‌شده در این آموزش جایگزین کنید:

~/wordpress/docker-compose.yml
  certbot:
depends_on:
   - webserver
image: certbot/certbot
container_name: certbot
volumes:
   - certbot-etc: /etc/letsencrypt
   - wordpress: /var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain

توصیف بالا، به کامپوز می‌گوید که ایمیج certbot/certbot را از داکر‌هاب pull کند. همچنین، از volume‌های نامگذاری‌شده مانند گواهینامه‌های دامنه و کلید certbot-etc و کد اپلیکیشن در وردپرس برای به‌اشتراک گذاشتن منابع کانتینر Nginx استفاده می‌کند.

در این مرحله از نصب وردپرس با داکر، از depends_on برای تعیین اینکه کانتینر certbot پس از اجرا‌شدن وب‌سرور راه‌اندازی شود یا خیر، استفاده شده‌است. همچنین، یک گزینه‌ی command اضافه شده‌است که یک فرمان فرعی است که دستور certbot پیش‌فرض کانتینر را مشخص می‌کند. فرمان فرعی certonly برای دریافت گواهی‌های زیر استفاده می‌شود:

  • –webroot: این دستور به Certbot می‌گوید که برای قرار‌دادن فایل‌ها در پوشه‌ی webroot از افزونه‌ی webroot برای احراز هویت استفاده کند. این افزونه با روش اعتبارسنجی HTTP-01 کار می‌کند.
  • –webroot-path: برای مشخص‌کردن مسیر دایرکتوری webroot استفاده می‌شود.
  • –email: برای مشخص‌کردن ایمیل مورد‌نظر برای ثبت‌نام و بازیابی اطلاعات استفاده می‌شود.
  • –agree-tos: این گزینه برای مشخص‌کردن توافق‌نامه‌ی مشترک با ACME بکار می‌رود.
  • –no-eff-email: این گزینه به Certbot می‌گوید که نمی‌خواهید ایمیل‌تان را با EFF به اشتراک بگذارید. در‌صورتی که می‌خواهید به اشتراک بگذارید، این گزینه را حذف کنید.
  • –staging: این گزینه به Certbot می‌گوید که می‌خواهید از محیط مرحله‌بندی Let’s Encrypt برای دریافت گواهینامه‌های آزمایشی استفاده کنید.
  • -d: این گزینه برای مشخص‌کردن نام دامنه‌ای که می‌خواهید برای درخواست استفاده کنید، بکار می‌رود. در این آموزش، ما نام دامنه را your_domain و www.your_domain گذاشته‌ایم. شما باید نام دامنه‌ی خود را با این عبارات جایگزین کنید.

با قطعه کد زیر، توصیف سرویس certbot، تعاریف شبکه و volume را اضافه می‌کنیم:

~/wordpress/docker-compose.yml
...
volumes:
  certbot-etc:
  wordpress:
  dbdata:
networks:
  app-network:
driver: bridge

از کلید volumes برای توصیف volume‌های certbot-etc، wordpress و dbdata استفاده می‌شود. زمانی که داکر volume‌ها را ایجاد می‌کند، محتویات volume در یک دایرکتوری در سیستم فایل میزبان در مسیر /var/lib/docker/volumes/ که توسط داکر مدیریت می‌شود، ذخیره می‌شود. در ادامه، محتویات هر volume از این دایرکتوری، به هر کانتینری که از volume استفاده می‌کند، ماونت می‌شود. با این کار، می‌توانید پس از نصب وردپرس با داکر، کد و داده را بین کانتینر‌ها به‌اشتراک بگذارید.

شبکه‌ی پل توصیف‌شده توسط کاربر (app-network)، ارتباط بین کانتینر‌ها را ممکن می‌سازد. با این‌کار، ترافیک و ارتباط درون اپلیکیشنی ساده‌تر می‌شود؛ زیرا همه‌ی پورت‌ها را بدون اینکه هیچ پورتی در معرض دنیای بیرون قرار بگیرد، بین کانتینر‌ها در همان شبکه‌ی پل باز می‌کند. بنابراین، فقط کافی است که پورت 80 را برای دسترسی front-end به اپلیکیشن فعال کنید تا کانتینر‌های وردپرس، db و وب‌سرور شما با یکدیگر ارتباط برقرار کنند. می‌توانید توضیحات فایل docker-compose.yml را در قسمت زیر مشاهده کنید:

~/wordpress/docker-compose.yml
version: '3'
services:
  db:
image: mysql: 8.0
container_name: db
restart: unless-stopped
env_file: .env
environment:
   - MYSQL_DATABASE=wordpress
volumes:
   - dbdata: /var/lib/mysql
command: '--default-authentication-plugin=mysql_native_password'
networks:
   - app-network
  wordpress:
depends_on:
   - db
image: wordpress: 5.1.1-fpm-alpine
container_name: wordpress
restart: unless-stopped
env_file: .env
environment:
   - WORDPRESS_DB_HOST=db: 3306
   - WORDPRESS_DB_USER=$MYSQL_USER
   - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
   - WORDPRESS_DB_NAME=wordpress
volumes:
   - wordpress: /var/www/html
networks:
   - app-network
  webserver:
depends_on:
      - wordpress
image: nginx: 1.15.12-alpine
container_name: webserver
restart: unless-stopped
ports:
   - "80: 80"
volumes:
   - wordpress: /var/www/html
   - ./nginx-conf: /etc/nginx/conf.d
   - certbot-etc: /etc/letsencrypt
networks:
   - app-network
  certbot:
depends_on:
   - webserver
image: certbot/certbot
container_name: certbot
volumes:
   - certbot-etc: /etc/letsencrypt
   - wordpress: /var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain
volumes:
  certbot-etc:
  wordpress:
  dbdata:
networks:
  app-network:
driver: bridge

پس از اینکه کد بالا را مطابق اطلاعات‌تان ویرایش کردید، آن را ذخیره کرده و ببندید. در پایان این مرحله از نصب وردپرس با داکر، می‌توانید کانتینر‌ها را راه‌اندازی کرده و درخواست‌های گواهینامه‌هایتان را آزمایش کنید.

مرحله‌ی ۴ – دریافت گواهینامه‌ها و اعتبار‌نامه‌های SSL

در این مرحله، می‌توانید کانتینر‌هایتان را با دستور   docker-compose upکه کانتینر‌ها را به روش مشخص‌شده ایجاد و اجرا می‌کند، شروع کنید. زمانی که پرچم -d را به این دستور اضافه می‌کنید، این دستور به اجرای db، وردپرس و وب‌سرور در پس‌زمینه می‌پردازد:

$ docker-compose up -d

اگر خروجی زیر را مشاهده کردید، به این معناست که سرویس شما ایجاد شده‌است:

Output
Creating db ... done
Creating wordpress ... done
Creating webserver ... done
Creating certbot   ... done

با استفاده از دستور  docker-compose ps می‌توانید وضعیت سرویس خود را بررسی کنید:

$ docker-compose ps

پس از انجام مراحل بالا، سرویس‌های وب‌سرور، دیتابیس و وردپرس شما بالا آمده و کانتینر certbot با یک پیام وضعیت 0 خارج می‌شود:

Output
  Name              Command            State        Ports
-------------------------------------------------------------------------
certbot     certbot certonly --webroot ...   Exit 0
db          docker-entrypoint.sh --def ...   Up    3306/tcp, 33060/tcp
webserver   nginx -g daemon off;          Up    0.0.0.0: 80->80/tcp
wordpress   docker-entrypoint.sh php-fpm     Up       9000/tcp

اگر در ستون State برای سرویس‌های db، wordpress یا webserver چیزی به غیر از پیام‌های بالا دیدید و یا برای کانتینر certbot وضعیتی به غیر از Exit 0 نوشته شده‌بود، احتمالا لازم است که گزارش‌های سرویس را با دستور docker-compose logs بررسی کنید:

$ docker-compose logs service_name

با اجرای دستور docker-compose exec می‌توانید بررسی کنید که گواهینامه‌ی شما به کانتینر وب‌سرور ماونت شده‌است یا خیر:

$ docker-compose exec webserver ls -la /etc/letsencrypt/live

در‌صورتی که درخواست گواهینامه‌ی شما با موفقیت انجام شود، خروجی زیر را مشاهده می‌کنید:

Output
total 16
drwx------ 3 root  root          4096 May 10 15: 45 .
drwxr-xr-x 9 root  root       4096 May 10 15: 45 ..
-rw-r--r-- 1 root  root        740 May 10 15: 45 README
drwxr-xr-x 2 root  root       4096 May 10 15: 45 your_domain

پس از مشاهده‌ی پیام بالا، می‌توانید توصیف سرویس certbot را ویرایش کنید تا پرچم –staging حذف شود. برای انجام این کار، docker-compose.yml را باز کنید.

$ nano docker-compose.yml

بخشی از فایل که مربوط به توصیف سرویس certbot است را پیدا کرده و پرچم –staging را در گزینه‌ی command با پرچم –force-renewal جایگزین کنید. با این کار، به Certbot می‌گویید که درخواست یک گواهینامه‌ی جدید با همان دامنه‌ها را دارید. کد زیر، توصیف سرویس Certbot با پرچم بروز‌شده را نشان می‌دهد:

~/wordpress/docker-compose.yml=
...
  certbot:
depends_on:
   - webserver
image: certbot/certbot
container_name: certbot
volumes:
   - certbot-etc: /etc/letsencrypt
   - certbot-var: /var/lib/letsencrypt
   - wordpress: /var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --force-renewal -d your_domain -d www.your_domain
...

حال در این قسمت از نصب وردپرس با داکر، می‌توانید دستور docker-compose up اجرا کنید تا مجددا یک کانتینر certbot ساخته شود. همچنین، از آنجایی‌که وب‌سرور از قبل در حال اجراست، برای صرف‌نظر کردن از راه‌اندازی سرویس وب‌سرور، می‌توانید گزینه‌ی –no-deps را اضافه کنید:

$ docker-compose up --force-recreate --no-deps certbot

در‌صورتی که درخواست گواهی شما با موفقیت ثبت شود، خروجی زیر را مشاهده می‌کنید:

Output
Recreating certbot ... done
Attaching to certbot
certbot   | Saving debug log to /var/log/letsencrypt/letsencrypt.log
certbot   | Plugins selected: Authenticator webroot, Installer None
certbot   | Renewing an existing certificate
certbot   | Performing the following challenges:
certbot   | http-01 challenge for your_domain
certbot   | http-01 challenge for www.your_domain
certbot   | Using the webroot path /var/www/html for all unmatched domains.
certbot   | Waiting for verification...
certbot   | Cleaning up challenges
certbot   | IMPORTANT NOTES:
certbot   |  - Congratulations! Your certificate and chain have been saved at:
certbot   |    /etc/letsencrypt/live/your_domain/fullchain.pem
certbot   | Your key file has been saved at:
certbot   | /etc/letsencrypt/live/your_domain/privkey.pem
certbot   | Your cert will expire on 2019-08-08. To obtain a new or tweaked
certbot   | version of this certificate in the future, simply run certbot
certbot   | again. To non-interactively renew *all* of your certificates, run
certbot   | "certbot renew"
certbot   |  - Your account credentials have been saved in your Certbot
certbot   | configuration directory at /etc/letsencrypt. You should make a
certbot      |    secure backup of this folder now. This configuration directory will
certbot   | also contain certificates and private keys obtained by Certbot so
certbot   | making regular backups of this folder is ideal.
certbot   |  - If you like Certbot, please consider supporting our work by:
certbot   |
certbot   | Donating to ISRG / Let's Encrypt:   https: //letsencrypt.org/donate
certbot   | Donating to EFF:                    https: //eff.org/donate-le
certbot   |
certbot exited with code 0

پس از نصب موفقیت‌آمیز گواهینامه‌ها، می‌توانید پیکربندی Nginx را برای اضافه‌کردن SSL تغییر دهید.

مرحله‌ی 5: تغییر پیکربندی وب‌سرور و توصیف سرویس

برای فعال‌سازی SSL در پیکربندی وب‌سرور Nginx باید HTTP را به HTTPS تغییر دهید، گواهینامه SSL و مکان‌های کلیدی را مشخص کنید و همچنین، پارامتر‌های امنیتی و هدر‌ها را اضافه کنید.

چون در این مرحله از نصب وردپرس با داکر می‌خواهید سرویس وب‌سرور‌تان را مجددا ایجاد کنید تا شامل موارد اضافه‌شده شود، باید آن را با دستور زیر متوقف کنید:

$ docker-compose stop webserver

در مرحله‌ی بعد، قبل از اصلاح فایل پیکربندی، باید پارامتر امنیتی توصیه‌شده‌ی وب‌سرور Nginx را از Certbot و با‌استفاده از دستور curl دریافت کنید:

$ curl -sSLo nginx-conf/options-ssl-nginx.conf https: //raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf

دستور بالا، پارامتر‌ها را در فایلی به نام options-ssl-nginx.conf که در دایرکتوری nginx-conf قرار دارد، ذخیره می‌کند. در مرحله‌ی بعد، باید فایل پیکربندی Nginx که قبلا ایجاد کرده‌اید را حذف کنید:

$ rm nginx-conf/nginx.conf

سپس، با اجرای دستور زیر، نسخه‌ی دیگری از فایل را ایجاد کرده و آن را باز کنید:

$ nano nginx-conf/nginx.conf

برای تغییر HTTP به HTTPS و اضافه‌کردن اعتبارنامه‌ها، پروتکل‌ها و هدر‌های امنیتی SSL، دستور زیر را اجرا کنید. یادتان باشد که قبل از اجرای دستور زیر، نام دامنه‌ی خود را با عبارت your_domain جایگزین کنید:

~/wordpress/nginx-conf/nginx.conf
server {
     listen 80;
     listen [:: ]: 80;
     server_name your_domain www.your_domain;
     location ~ /.well-known/acme-challenge {
             allow all;
             root /var/www/html;
     }
     location / {
             rewrite ^ https: //$host$request_uri? permanent;
     }
}
server {
     listen 443 ssl http2;
    listen [:: ]: 443 ssl http2;
     server_name your_domain www.your_domain;
     index index.php index.html index.htm;
     root /var/www/html;
     server_tokens off;
     ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
     ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
     include /etc/nginx/conf.d/options-ssl-nginx.conf;
     add_header X-Frame-Options "SAMEORIGIN" always;
     add_header X-XSS-Protection "1; mode=block" always;
     add_header X-Content-Type-Options "nosniff" always;
     add_header Referrer-Policy "no-referrer-when-downgrade" always;
     add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
     # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
     # enable strict transport security only if you understand the implications
     location / {
             try_files $uri $uri/ /index.php$is_args$args;
     }
     location ~ \.php$ {
             try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass wordpress: 9000;
                fastcgi_index index.php;
             include fastcgi_params;
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
     }
     location ~ /\.ht {
             deny all;
        }
     location = /favicon.ico {
             log_not_found off; access_log off;
     }
     location = /robots.txt {
                log_not_found off; access_log off; allow all;
     }
     location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
             expires max;
             log_not_found off;
     }
}

بلوک سرور HTTP، webroot را برای درخواست‌های تمدید Certbot به دایرکتوری .well-known/acme-challenge مشخص می‌کند. همچنین، این بلوک شامل یک دستورالعمل rewrite  است که درخواست‌های HTTP را به دایرکتوری ریشه به HTTPS هدایت می‌کند.

بلوک سرور HTTPS، گواهینامه‌های ssl و http2 را فعال می‌کند. همچنین، این بلوک حاوی گواهینامه SSL و مکان‌های کلیدی شما به همراه پارامتر‌های امنیتی توصیه‌شده‌ی Certbot است که در مسیر nginx-conf/options-ssl-nginx.conf ذخیره شده‌اند.

علاوه‌بر‌این، در کد بالا برخی از سرفصل‌های امنیتی درج شده‌اند که به شما کمک می‌کنند تا پس از نصب وردپرس با داکر، در رتبه‌بندی سایت‌های تست سرور مانند SSL Labs یا Security Headers، رتبه‌ی A را کسب کنید. همانطور که در کد بالا مشاهده می‌کنید، این هدر‌ها عبارتند‌از  X-Frame-Options، X-Content-Type-Options، Referrer Policy، Content-Security-Policy و X-XSS-Protection. فقط در‌صورتی می‌توانید هدر HSTS (Strict Transport Security) را فعال کنید که عملکرد آن را به خوبی درک کرده باشید.

دستورالعمل‌های root و index شما نیز مانند سایر بلوک‌های موقعیت مکانی وردپرس که در مرحله‌ی ۱ توضیح دادیم، در این بلوک قرار می‌گیرند.

پس از اینکه کد بالا را ویرایش و اجرا کردید، فایل را ذخیره کرده و آن را ببندید.

قبل از اینکه وب سرویس را مجددا ایجاد کنید، باید یک نگاشت پورت 443 را به توصیف وب سرویس‌تان اضافه کنید. برای این کار، فایل docker-compose.yml خود را با دستور زیر باز کنید:

$ nano docker-compose.yml

سپس، در توصیف وب سرور، نگاشت پورت را اضافه کنی

~/wordpress/docker-compose.yml
...
  webserver:
depends_on:
   - wordpress
image: nginx: 1.15.12-alpine
container_name: webserver
restart: unless-stopped
ports:
   - "80: 80"
   - "443: 443"
volumes:
   - wordpress: /var/www/html
   - ./nginx-conf: /etc/nginx/conf.d
   - certbot-etc: /etc/letsencrypt
networks:
   - app-network
در قسمت زیر، فایل کامل docker-compose.yml را پس از ویرایش می‌بینیم:

~/wordpress/docker-compose.yml
version: '3'
services:
  db:
image: mysql: 8.0
container_name: db
restart: unless-stopped
env_file: .env
environment:
   - MYSQL_DATABASE=wordpress
volumes:
   - dbdata: /var/lib/mysql
command: '--default-authentication-plugin=mysql_native_password'
networks:
   - app-network
  wordpress:
depends_on:
   - db
image: wordpress: 5.1.1-fpm-alpine
container_name: wordpress
restart: unless-stopped
env_file: .env
environment:
   - WORDPRESS_DB_HOST=db: 3306
   - WORDPRESS_DB_USER=$MYSQL_USER
   - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
   - WORDPRESS_DB_NAME=wordpress
volumes:
   - wordpress: /var/www/html
networks:
   - app-network
  webserver:
depends_on:
   - wordpress
    image: nginx: 1.15.12-alpine
container_name: webserver
restart: unless-stopped
ports:
   - "80: 80"
   - "443: 443"
volumes:
   - wordpress: /var/www/html
   - ./nginx-conf: /etc/nginx/conf.d
   - certbot-etc: /etc/letsencrypt
networks:
   - app-network
  certbot:
depends_on:
   - webserver
image: certbot/certbot
container_name: certbot
volumes:
   - certbot-etc: /etc/letsencrypt
   - wordpress: /var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --force-renewal -d your_domain -d www.your_domain
volumes:
  certbot-etc:
  wordpress:
  dbdata:
networks:
  app-network:
driver: bridge

پس از اینکه ویرایش تمام شد، فایل را ذخیره کرده و آن را ببندید. سپس، با اجرای دستور زیر، سرویس وب سرور را دوباره ایجاد کنید:

$ docker-compose up -d --force-recreate --no-deps webserver

در مرحله‌ی بعد نصب وردپرس با داکر، با اجرای دستور docker-compose ps، وضعیت سرویس خود را بررسی کنید:

$ docker-compose ps

خروجی دستور بالا، باید مانند زیر نشان دهد که سرویس وردپرس، db و وب‌سرور شما در حال اجرا هستند:

Output
  Name              Command            State                  Ports
----------------------------------------------------------------------------------------------
certbot  certbot certonly --webroot ...   Exit 0
db          docker-entrypoint.sh --def ...   Up    3306/tcp, 33060/tcp
webserver   nginx -g daemon off;          Up    0.0.0.0: 443->443/tcp, 0.0.0.0: 80->80/tcp
wordpress   docker-entrypoint.sh php-fpm     Up    9000/tcp

زمانی که کانتینر‌های شما در حال اجرا هستند، می‌توانید نصب وردپرس را از طریق رابط وب تکمیل کنید.

مرحله‌ی ۶ – تکمیل نصب وردپرس از طریق رابط وب

در این مرحله از نصب وردپرس با داکر، باید مرورگر وب را باز کنید و به دامنه‌ی سرور‌تان بروید. یادتان باشد که در کد زیر، باید نام دامنه‌تان را با عبارت your_domain جایگزین کنید:

https: //your_domain

زبان  مورد‌نظرتان را انتخاب کنید:

تصویر 1

پس از کلیک بر روی Continue، به صفحه‌ی راه‌اندازی وارد می‌شوید و باید نام سایت و نام کاربری‌تان را در این صفحه انتخاب کنید. بهتر است از یک نام کاربری به‌یاد‌ماندنی و رمز عبور قوی استفاده کنید. البته، می‌توانید از نام کاربری و رمز عبوری که وردپرس به صورت خودکار تولید می‌کند نیز استفاده کنید.

در مرحله‌ی بعد، آدرس ایمیل خود را وارد کرده و اگر می‌خواهید موتور‌های جستجو، سایت شما را در فهرست‌شان نشان دهند، تیک گزینه‌ی آخر را بزنید.

تصویر ۲

همانند تصویر بالا، بر روی گزینه‌ی Install WordPress که در پایین صفحه قرار دارد کلیک کنید تا به صفحه‌ی بعد منتقل شوید.

تصویر ۳

پس از اینکه به سیستم وارد شدید، می‌توانید به داشبورد مدیریت وردپرس دسترسی داشته باشید:

تصویر ۴

زمانی که نصب وردپرس کامل شد، می‌توانید به سراغ تنظیمات گواهینامه‌ی SSL بروید…

مرحله‌ی ۷ – تمدید گواهینامه‌ها

همانطور که می‌دانید، گواهینامه‌های Let’s Encrypt تا ۹۰ روز اعتبار دارند. برای حل مشکل تمام‌شدن اعتبار این گواهینامه‌ها پس از نصب وردپرس با داکر، می‌توانید فرآیند تمدید خودکار را فعال کنید تا از بین نروند. برای این کار، می‌توانید از قابلیت زمان‌بندی دستور cron استفاده کرده تا یک کار روتین را بسازید. در مثال زیر، با استفاده از دستور cron یک اسکریپت ایجاد می‌کنید تا گواهینامه‌ی شما را تمدید کرده و پیکربندی وب‌سرور را دوباره بارگیری کند. در ابتدا، باید یک اسکریپت به نام ssl_renew.sh را با دستور زیر باز کنید:

$ nano ssl_renew.sh

برای تمدید گواهینامه و بارگیری پیکربندی وب‌سرور خود، کد زیر را به اسکریپت اضافه کنید. یادتان باشد که نام کاربری غیر ریشه‌تان را با نام کاربری در این مثال جایگزین کنید:

~/wordpress/ssl_renew.sh
#!/bin/bash
COMPOSE="/usr/local/bin/docker-compose --no-ansi"
DOCKER="/usr/bin/docker"
cd /home/sammy/wordpress/
$COMPOSE run certbot renew --dry-run && $COMPOSE kill -s SIGHUP webserver
$DOCKER system prune -af

اسکریپت بالا، ابتدا docker-compose باینری را به متغیری به نام COMPOSE اختصاص می‌دهد و گزینه‌ی –no-ansi را تعیین می‌کند تا دستورات را بدون کارکتر‌های کنترل docker-compose اجرا کند. سپس، همین کار را با داکر باینری انجام می‌دهد. در‌نهایت، این گزینه به دایرکتوری پروژه‌ی ~/wordpress تغییر می‌کند و دستورات docker-compose را مطابق زیر اجرا می‌کند:

  • docker-compose run: این گزینه، یک کانتینر certbot را راه‌اندازی کرده و دستورات توصیف سرویس certbot را لغو می‌کند. در این دستور، به جای استفاده از فرمان فرعی certonly، از دستور فرعی renew استفاده می‌شود تا گواهینامه‌هایی که به تاریخ انقضایشان نزدیک هستند را تمدید کند. همچنین، می‌توان از گزینه‌ی –dry-run برای تست اسکریپت استفاده کرد.
  • docker-compose kill: این گزینه، یک سیگنال SIGHUP را برای بارگیری مجدد پیکربندی Nginx به کانتینر وب‌سرور ارسال می‌کند.

در اسکریپت بالا، دستور docker system prune برای حذف تمام کانتینر‌ها و ایمیج‌های استفاده‌نشده، اجرا می‌شود.

پس از اتمام، فایل را ذخیره کرده و آن را ببندید. با اجرای دستور زیر، می‌توانید آن را قابل‌اجرا کنید:

$ chmod +x ssl_renew.sh

در قدم بعد، با اجرای دستور زیر، فایل ریشه crontab  را باز کرده تا اسکریپت تمدید در بازه‌های زمانی مشخص‌شده، اجرا شود:

$ sudo crontab -e

اگر برای اولین بار است که نصب وردپرس با داکر را انجام می‌دهید و این فایل را ویرایش می‌کنید، یک پیام برایتان ظاهر می‌شود که در ‌آن از شما خواسته شده‌است تا یک ویرایشگر انتخاب کنید:

Output

no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
  1.  /bin/nano     <---- easiest
  2.  /usr/bin/vim.basic
  3.  /usr/bin/vim.tiny
  4.  /bin/ed
Choose 1-4 [1]:
...

در انتهای پیام بالا، خط زیر را اضافه کنید:

crontab
...
*/5 * * * * /home/sammy/wordpress/ssl_renew.sh >> /var/log/cron.log 2>&1

با اجرای دستور بالا، فاصله‌ی کار‌ها بین هر ۵ دقیقه تنظیم می‌شود و می‌توانید بررسی کنید که آیا درخواست تمدید‌تان مطابق با خواسته‌تان بوده است یا خیر. در ادامه، یک فایل گزارش به نام cron.log برای ثبت خروجی مربوطه ایجاد می‌شود. پس از ۵ دقیقه، می‌توانید cron.log را با دستور زیر بررسی کنید تا ببینید که آیا درخواست تمدید موفقیت‌آمیز بوده یا خیر:

$ tail -f /var/log/cron.log

در‌صورتی که تمدید موفقیت‌آمیز باشد، پیامی شبیه به شکل زیر باز می‌شود:

Output
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**       (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/your_domain/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**       (The test certificates above have not been saved.)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

با زدن کلید‌های CTRL+C در ترمینال، از تنظیمات خارج شوید.

برای تنظیم وقفه‌ی روزانه، می‌توانید فایل crontab را تغییر دهید. به‌عنوان مثال، دستور زیر در آخر اسکریپت قرار می‌گیرد و اجرای اسکریپت را بر روی ظهر تنظیم می‌کند:

crontab

...

0 12 * * * /home/sammy/wordpress/ssl_renew.sh >> /var/log/cron.log 2>&1

همچنین، می‌توانید گزینه‌ی –dry-run را از اسکریپت ssl_renew.sh حذف کنید

~/wordpress/ssl_renew.sh
#!/bin/bash



COMPOSE="/usr/local/bin/docker-compose --no-ansi"
DOCKER="/usr/bin/docker"



cd /home/sammy/wordpress/
$COMPOSE run certbot renew && $COMPOSE kill -s SIGHUP webserver
$DOCKER system prune -af

سخن پایانی

در این آموزش، به طور مفصل درباره‌ی نصب وردپرس با داکر صحبت کردیم. همچنین، یاد گرفتیم که چطور گواهینامه‌های SSL/TLS خود را اضافه کنیم و آن‌ها را تمدید کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

2 × 5 =