تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

آموزش نصب وردپرس با Docker Compose


۱۴ فروردین ۱۴۰۴

وردپرس، به‌عنوان ابزار مدیریت محتوای متن‌باز و رایگان، به شما این امکان را می‌دهد که بدون نیاز به دانش کدنویسی، وب‌سایت‌های خود را با استفاده از ابزارهای گرافیکی راه‌اندازی کنید. برای اجرای وردپرس، معمولاً نیاز به نصب پشته LAMP (مخفف Linux, Apache, MySQL, PHP) یا LEMP (مخفف Linux, Nginx, MySQL, PHP) است که این فرایند می‌تواند زمان‌بر باشد. برای رفع این مشکل، از ابزارهایی مانند Docker Compose استفاده کنید.

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

پیش‌نیازها

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

  • یک سرور اوبونتو به‌همراه کاربر غیر root با دسترسی Sudo و فایروال فعال
  • Docker نصب‌شده روی سرور، در صورت نیاز مقاله آموزش نصب داکر روی اوبونتو 22.04
    را مطالعه کنید.
  • Docker Compose روی سرور نصب شده باشد.
  • دامنه‌ای که مالکیت و مدیریت آن در‌اختیار خودتان باشد. در تمامی مثال‌های این آموزش، به‌جای دامنه از your_domain استفاده شده است. 
  • دو رکورد ثبت‌شده DNS به‌صورت your_domain و www.your_domain که هر دو به آدرس IP عمومی سرور شما اشاره می‌کنند.

بیشتر بدانیدنحوه راه‌اندازی اولیه سرور مجازی با اوبونتو Ubuntu

آموزش گام‌به‌گام نصب وردپرس با Docker Compose

در ادامه بخوانید:

  • مرحله اول: تعریف پیکربندی وب سرور
  • مرحله دوم: تغییر متغیرهای محیطی
  • مرحله سوم: تعریف سرویس‌ها با استفاده از داکر کامپوز
  • مرحله چهارم: دریافت گواهینامه SSL
  • مرحله پنجم: تغییر پیکربندی وب سرور و تعریف سرویس
  • مرحله ششم: نصب وردپرس با رابط وب
  • مرحله هفتم: تمدید گواهی SSL
  • جمع‌بندی
  • سوالات متداول

پیشنهاد مطالعه: نصب و استفاده از داکر کامپوز (Docker Compose) در اوبونتو

مرحله اول: تنظیم پیکربندی وب سرور

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

mkdir wordpress

سپس با دستور cd، وارد دایرکتوری ایجاد‌شده شوید:

cd wordpress

حالا با دستور زیر، دایرکتوری دیگری برای فایل پیکربندی ایجاد کنید:

mkdir nginx-conf

فایل را با استفاده از ویرایشگر باز کنید. در اینجا ما از ویرایشگر nano استفاده کرده‌ایم:

nano nginx-conf/nginx.conf

برای پیکربندی وب‌سرور، باید یک بلوک سرور برای Name Server، داکیومنت روت، و بلوک‌های لوکیشن (Location Block) اضافه کنید. این تنظیمات به شما امکان پردازش PHP، درخواست‌های کلاینت برای گواهی Certbot و درخواست‌های مربوط به Asset‌های ثابت را می‌دهد.

برای انجام این کار، کد زیر را به فایل پیکربندی اضافه کنید. حتماً قسمت your_domain را با نام دامنه خود جایگزین کنید:

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;
        }
}

پس از وارد کردن کدهای مورد نظر در فایل، آن را ذخیره کرده و ببندید. اگر از ویرایشگر متن nano استفاده می‌کنید، برای خروج از فایل ابتدا کلیدهای ترکیبی Ctrl+X را فشار دهید، سپس کلید Y را برای ذخیره تغییرات بزنید و در نهایت با فشردن Enter از ویرایشگر خارج شوید.

مرحله دوم: تغییر متغیرهای محیطی

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

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

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

nano .env

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

MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_USER=your_wordpress_database_user
MYSQL_PASSWORD=your_wordpress_database_password

همان‌طور که مشاهده می‌کنید، در این فایل رمز عبور کاربر root پایگاه داده MySQL و نام کاربری و رمز عبور دلخواه برای ورود به پایگاه داده تنظیم شده است. بعد از اتمام ویرایش فایل، آن‌را ببندید.

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

اگر می‌خواهید از Git برای کنترل نسخه استفاده کنید، ابتدا با دستور git init دایرکتوری مجازی خود را به‌عنوان ریپوزیتوری مقداردهی اولیه کنید:

git init

برای ایجاد و بازکردن فایل .gitignore دستور زیر را اجرا کنید:

nano .gitignore

اکنون .env را به فایل اضافه کنید:

.env

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

nano .dockerignore

حالا جزء .env را به این فایل نیز اضافه کنید:

.env

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

.env
.git
docker-compose.yml
.dockerignore

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

مرحله سوم: تعریف سرویس‌ها با استفاده از داکر کامپوز

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

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

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

nano docker-compose.yml

بعد از بازکردن فایل، از دستور زیر برای تعریف نسخه فایل Compose و سرویس پایگاه داده استفاده کنید:

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، تعریف سرویس برنامه وردپرس خود را با کدهای زیر اضافه کنید:

...
  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

حالا، نوبت تعریف سرویس وب‌سرور Nginx می‌رسد. با کدهای زیر این‌کار را انجام دهید:

...
  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 را تعریف کنید:

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
تعریف سرویس‌ها با استفاده از Docker Compose

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

...
volumes:
  certbot-etc:
  wordpress:
  dbdata:

networks:
  app-network:
    driver: bridge

با توجه به توضیحات ارائه‌شده تا این مرحله، فایل 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

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

برای ذخیره کردن و بستن فایل در ویرایشگر nano، مراحل زیر را دنبال کنید:

  1. برای ذخیره تغییرات، از کلیدهای ترکیبی Ctrl + O استفاده کنید.
  2. برای تایید نام فایل، Enter را بزنید.
  3. برای خروج از ویرایشگر، از کلیدهای ترکیبی Ctrl + X استفاده کنید.

حالا که فایل به‌طور صحیح تنظیم شده است، می‌توانید کانتینرها را با استفاده از دستور زیر راه‌اندازی کنید:

docker-compose up -d

این دستور کانتینرها را در پس‌زمینه راه‌اندازی می‌کند. حالا می‌توانید درخواست‌های مربوط به گواهی‌نامه Certbot را تست کرده و عملکرد سرویس‌ها را بررسی کنید.

همچنین بخوانید: نحوه نصب انجین ایکس، MySQL و پی اچ پی (LEMP) بر روی سرور مجازی لینوکس

مرحله چهارم: دریافت گواهینامه SSL

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

docker-compose up -d

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

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

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

docker-compose ps

در خروجی مشاهده می‌کنید که سرویس‌های wordpress و db و webserver در وضعیت UP قرار دارند. یعنی این سرویس‌ها بالا و در حال اجرا هستند. همچنین می‌بینید که کانتینر cerbot در وضعیت EXIT 0 قرار دارد:

 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

اگر در خروجی  db و webserver و wordpress چیزی به‌غیر از UP و در خروجی certbot چیزی به‌غیر از EXIT 0 می‌بینید، باید گزارش‌های سرویس را با دستور زیر مجدد بررسی کنید:

docker-compose logs service_name

حالا می‌توانید با docker-compose exec بررسی کنید که آیا گواهینامه‌های شما در کانتینر webserver نصب شده‌اند یا خیر:

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

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

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 را با فلگ --force-renewal جایگزین کنید. این فلگ در واقع به certbot می‌گوید که شما می‌خواهید گواهی جدیدی برای همان دامنه درخواست دهید. کد زیر این مطلب را نشان می‌دهد:

...
  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 را برای ایجاد مجدد کانتینر certbot اجرا کنید. با‌توجه‌به اینکه سرویس webserver در حال اجراست، با اضافه‌کردن –no-deps به دستور، به compose بگویید تا از راه‌اندازی این سرویس صرف‌نظر کند:

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

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

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 تغییر دهید.

مرحله پنجم: تغییر پیکربندی وب سرور و تعریف سرویس

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

برای اعمال تغییرات، باید سرویس webserver را مجددا ایجاد کنید تا این موارد را به آن اضافه کنید. با دستور زیر ابتدا سرویس را متوقف کنید:

docker-compose stop webserver

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

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 fhn از نام دامنه خودتان استفاده کنید:

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;
        }
}

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

nano docker-compose.yml

در قسمتی از فایل که سرویس webserver تعریف شده است، port mapping زیر را اضافه کنید:

...
  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 باید به‌صورت زیر باشد:

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

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

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

سپس، با دستور docker-compose ps سرویس را دوباره تست کنید:

docker-compose ps

خروجی این دستور نشان می‌دهد که سرویس‌های wordpress و db و webserver در حال اجرا هستند:

 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

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

مرحله ششم: نصب وردپرس با رابط وب

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

https://your_domain

در قدم بعدی زبانی که می‌خواهید وردپرس براساس آن نصب شود را انتخاب کنید:

نصب وردپرس با استفاده از رابط وب

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

  1. نام وب‌سایت: نام دلخواه خود را برای وب‌سایت وارد کنید.
  2. نام کاربری: یک نام کاربری برای ورود به پیشخوان وردپرس وارد کنید. از نظر امنیتی، پیشنهاد می‌شود که از نام کاربری پیش‌فرض admin استفاده نکنید.
  3. رمز عبور: رمز عبور قدرتمند و امنی برای ورود به وردپرس تعیین کنید، یا می‌توانید اجازه دهید که وردپرس به‌طور خودکار یک رمز عبور امن برای شما انتخاب کند.

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

نصب وردپرس با استفاده از رابط وب

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

نصب وردپرس با استفاده از رابط وب

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

نصب وردپرس با استفاده از رابط وب

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

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

ما پیچیدگی‌های راه‌اندازی و تنظیمات سرورها را بر عهده گرفته‌ایم تا شما تنها با یک کلیک، نرم‌افزارهای متن‌باز محبوب خود را نصب و اجرا کنید!
✅دامنه رایگان ✅ نصب سریع ✅ ارائه SSL رایگان
خرید برنامه آماده WordPress

مرحله هفتم: تمدید گواهی SSL

گواهی‌نامه‌های SSL صادر شده توسط Let’s Encrypt نود روز اعتبار دارند. برای اطمینان از تمدید خودکار گواهی‌‌ها قبل از تاریخ انقضای آن‌ها، می‌توانید فرایند تمدید را به‌صورت خودکار تنظیم کنید. یکی از روش‌های رایج برای این‌کار، استفاده از برنامه زمان‌بندی Cron است.

در ادامه، روش انجام این کار را شرح خواهیم داد. در این مثال با استفاده از اسکریپت، فرایند تمدید خودکار گواهی و پیکربندی مجدد Nginx انجام می‌شود. برای شروع، اسکریپتی به‌نام ssl_renew.sh ایجاد کنید:

nano ssl_renew.sh

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

#!/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

بعد از ویرایش فایل، آن‌را ببندید و با دستور زیر آن را اجرایی کنید:

chmod +x ssl_renew.sh

سپس، فایل crontab را با sudo باز کنید:

sudo crontab -e

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

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]:
...

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

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

با این‌کار، دستور هر ۵ دقیقه اجرا خواهد شد. بعد از ۵ دقیقه، فایل cron.log را بررسی کنید که آیا درخواست تمدید موفقیت‌آمیز بوده است یا خیر:

tail -f /var/log/cron.log

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** 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 از ترمینال خارج شوید. اگر بخواهید هر روز این‌کار تکرار شود، آخرین خط کد را به صورت زیر تغییر دهید:

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

حالا، فرایند تمدید خودکار گواهی هر روز در ساعت ۱۲ انجام خواهد شد. همچنین می‌توانید گزینه --dry-run را از اسکریپت 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 شما به‌صورت خودکار تمدید شده و وب سرور نیز بدون نیاز به مداخله دستی، به‌روزرسانی خواهد شد.

جمع‌بندی

تبریک:) شما در این آموزش، با استفاده از Docker Compose یک نصب وردپرس با وب‌سرور Nginx ایجاد کردید. به عنوان بخشی از این پروسه، گواهی‌های TLS/SSL برای دامنه‌ای که می‌خواهید به سایت وردپرس خود اختصاص دهید، دریافت کردید. علاوه بر این، یک کرون‌جاب برای تمدید خودکار این گواهی‌ها زمانی که لازم باشد، ایجاد کردید.

سوالات متداول

1- آیا Docker Compose رایگان است؟

بله، Docker Compose یک ابزار متن‌باز و رایگان است که تحت مجوز Apache 2.0 منتشر شده است. می‌توانید آن را بدون پرداخت هزینه روی سیستم خود نصب و استفاده کنید.

2- Docker Compose چه تفاوتی با Docker دارد؟

Docker یک پلتفرم برای اجرای کانتینرها است، درحالی‌که Docker Compose ابزاری برای مدیریت و هماهنگ‌سازی چندین کانتینر به‌صورت هم‌زمان با استفاده از یک فایل YAML است.

3- آیا Docker Compose روی همه سیستم‌عامل‌ها قابل استفاده است؟

بله، Docker Compose روی لینوکس، ویندوز و macOS قابل اجراست. در ویندوز و مک، همراه با Docker Desktop ارائه می‌شود.

به اشتراک بگذارید