آنچه در این مقاله میخوانید
آموزش نصب وردپرس با 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

در ادامه بخوانید:
- مرحله اول: تعریف پیکربندی وب سرور
- مرحله دوم: تغییر متغیرهای محیطی
- مرحله سوم: تعریف سرویسها با استفاده از داکر کامپوز
- مرحله چهارم: دریافت گواهینامه 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

تا اینجای کار، تمام سرویسهای مورد نیاز خود را تعریف کردید. در ادامه باید شبکه و 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
، مراحل زیر را دنبال کنید:
- برای ذخیره تغییرات، از کلیدهای ترکیبی
Ctrl + O
استفاده کنید. - برای تایید نام فایل،
Enter
را بزنید. - برای خروج از ویرایشگر، از کلیدهای ترکیبی
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، به صفحه اصلی نصب وردپرس هدایت خواهید شد. در این صفحه، شما باید اطلاعات زیر را وارد کنید:
- نام وبسایت: نام دلخواه خود را برای وبسایت وارد کنید.
- نام کاربری: یک نام کاربری برای ورود به پیشخوان وردپرس وارد کنید. از نظر امنیتی، پیشنهاد میشود که از نام کاربری پیشفرض admin استفاده نکنید.
- رمز عبور: رمز عبور قدرتمند و امنی برای ورود به وردپرس تعیین کنید، یا میتوانید اجازه دهید که وردپرس بهطور خودکار یک رمز عبور امن برای شما انتخاب کند.
در مرحله بعد، باید ایمیل خود را وارد کنید و تصمیم بگیرید که آیا میخواهید موتورهای جستوجو صفحات وبسایت شما را ایندکس کنند یا خیر. معمولاً توصیه میشود که وبسایت شما در دسترس 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 ارائه میشود.