Let's Go Further استقرار و میزبانی › پیکربندی سرور و نصب نرم‌افزار
قبلی · فهرست مطالب · بعدی
فصل ۲۰.۲.

پیکربندی سرور و نصب نرم‌افزار

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

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

اگر در حال دنبال کردن مراحل هستید، یک پوشه جدید remote/setup در پروژه خود ایجاد کنید و یک فایل اسکریپت به نام 01.sh به آن اضافه کنید، مانند زیر:

$ mkdir -p remote/setup
$ touch remote/setup/01.sh

سپس کد زیر را اضافه کنید:

فایل: remote/setup/01.sh
#!/bin/bash
set -eu

# ==================================================================================== #
# متغیرها
# ==================================================================================== #

# Set the timezone for the server. A full list of available timezones can be found by 
# running timedatectl list-timezones.
TIMEZONE=Europe/Berlin

# Set the name of the new user to create.
USERNAME=greenlight

# Prompt to enter a password for the PostgreSQL greenlight user (rather than hard-coding
# a password in this script).
read -p "Enter password for greenlight DB user: " DB_PASSWORD

# Force all output to be presented in en_US for the duration of this script. This avoids  
# any "setting locale failed" errors while this script is running, before we have 
# installed support for all locales. Do not change this setting!
export LC_ALL=en_US.UTF-8 

# ==================================================================================== #
# منطق اسکریپت
# ==================================================================================== #

# Enable the "universe" repository.
add-apt-repository --yes universe

# Update all software packages.
apt update

# Set the system timezone and install all locales.
timedatectl set-timezone ${TIMEZONE}
apt --yes install locales-all

# Add the new user (and give them sudo privileges).
useradd --create-home --shell "/bin/bash" --groups sudo "${USERNAME}"

# Force a password to be set for the new user the first time they log in.
passwd --delete "${USERNAME}"
chage --lastday 0 "${USERNAME}"

# Copy the SSH keys from the root user to the new user.
rsync --archive --chown=${USERNAME}:${USERNAME} /root/.ssh /home/${USERNAME}

# Configure the firewall to allow SSH, HTTP and HTTPS traffic.
ufw allow 22
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable

# Install fail2ban.
apt --yes install fail2ban

# Install the migrate CLI tool.
curl -L https://github.com/golang-migrate/migrate/releases/download/v4.14.1/migrate.linux-amd64.tar.gz | tar xvz
mv migrate.linux-amd64 /usr/local/bin/migrate

# Install PostgreSQL.
apt --yes install postgresql

# Set up the greenlight DB and create a user account with the password entered earlier.
sudo -i -u postgres psql -c "CREATE DATABASE greenlight"
sudo -i -u postgres psql -d greenlight -c "CREATE EXTENSION IF NOT EXISTS citext"
sudo -i -u postgres psql -d greenlight -c "CREATE ROLE greenlight WITH LOGIN PASSWORD '${DB_PASSWORD}'"

# Add a DSN for connecting to the greenlight database to the system-wide environment 
# variables in the /etc/environment file.
echo "GREENLIGHT_DB_DSN='postgres://greenlight:${DB_PASSWORD}@localhost/greenlight'" >> /etc/environment

# Install Caddy (see https://caddyserver.com/docs/install#debian-ubuntu-raspbian).
apt --yes install debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
apt update
apt --yes install caddy

# Upgrade all packages. Using the --force-confnew flag means that configuration 
# files will be replaced if newer ones are available.
apt --yes -o Dpkg::Options::="--force-confnew" upgrade

echo "Script complete! Rebooting..."
reboot

خوب، اکنون بیایید این اسکریپت را روی droplet جدید DigitalOcean خود اجرا کنیم. این یک فرآیند دو مرحله‌ای خواهد بود:

  1. اول باید اسکریپت را به droplet کپی کنیم (که با استفاده از rsync انجام خواهیم داد).
  2. سپس باید از طریق SSH به droplet متصل شویم و اسکریپت را اجرا کنیم.

بیایید دستور زیر را اجرا کنیم تا محتوای پوشه /remote/setup را با rsync به پوشه خانه کاربر root در droplet کپی کنیم. به یاد داشته باشید که آدرس IP را با آدرس خود جایگزین کنید!

$ rsync -rP --delete ./remote/setup root@161.35.71.158:/root
sending incremental file list
setup/
setup/01.sh
          3,354 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/2)

اکنون که یک کپی از اسکریپت راه‌اندازی ما روی droplet است، بیایید از دستور ssh برای اجرای اسکریپت روی ماشین راه دور به عنوان کاربر root استفاده کنیم. از پرچم -t برای اجبار talloc (talloc terminal) استفاده خواهیم کرد که هنگام اجرای برنامه‌های مبتنی بر صفحه نمایش روی ماشین راه دور مفید است.

بیایید اسکریپت را اجرا کنیم و یک رمز عبور برای کاربر PostgreSQL greenlight وارد کنید، مانند زیر:

$ ssh -t root@161.35.71.158 "bash /root/setup/01.sh"
Enter password for greenlight DB user: pa55word1234
Adding component(s) 'universe' to all repositories.
Hit:1 https://repos.insights.digitalocean.com/apt/do-agent main InRelease
Hit:2 http://mirrors.digitalocean.com/ubuntu jammy InRelease                                                
Hit:3 http://mirrors.digitalocean.com/ubuntu jammy-updates InRelease                                        
Hit:4 https://repos-droplet.digitalocean.com/apt/droplet-agent main InRelease
Hit:5 http://mirrors.digitalocean.com/ubuntu jammy-backports InRelease   
...
Script complete! Rebooting...
Connection to 161.35.71.158 closed by remote host.
Connection to 161.35.71.158 closed.

پس از چند دقیقه، اسکریپت باید با موفقیت کامل شود و droplet راه‌اندازی مجدد شود — که شما را از اتصال SSH خارج خواهد کرد.

اتصال به عنوان کاربر greenlight

پس از انتظار یک دقیقه برای تکمیل راه‌اندازی مجدد، سعی کنید از طریق SSH به عنوان کاربر greenlight به droplet متصل شوید. این باید به درستی کار کند (و کلید SSH که در فصل قبل ایجاد کردید برای احراز هویت اتصال استفاده می‌شود) اما از شما خواسته می‌شود رمز عبور تنظیم کنید.

$ ssh greenlight@161.35.71.158
You are required to change your password immediately (administrator enforced).
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-60-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Thu Feb 23 16:46:00 CET 2023

  System load:  0.0               Users logged in:       0
  Usage of /:   25.7% of 9.51GB   IPv4 address for eth0: 161.35.71.158
  Memory usage: 41%               IPv4 address for eth0: 10.19.0.5
  Swap usage:   0%                IPv4 address for eth1: 10.114.0.2
  Processes:    101

 * Introducing Expanded Security Maintenance for Applications.
   Receive updates to over 25,000 software packages with your
   Ubuntu Pro subscription. Free for personal use.

     https://ubuntu.com/pro

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

WARNING: Your password has expired.
You must change your password now and login again!
New password: 
Retype new password: 
passwd: password updated successfully
Connection to 161.35.71.158 closed.

رمز عبوری که در اینجا وارد می‌کنید، رمز عبور معمولی برای کاربر greenlight در droplet شما خواهد بود (یعنی رمز عبوری که هر بار وارد می‌شوید و می‌خواهید دستور sudo را اجرا کنید باید تایپ کنید). برای شفافیت، این رمز عبور SSH برای اتصال به عنوان کاربر greenlight نیست.

بیایید هر رمز عبوری که می‌خواهید وارد کنید، آن را تأیید کنید و مطمئن شوید که پیامی مبنی بر موفقیت آمیز بودن تغییر رمز عبور می‌بینید. سپس اتصال SSH به طور خودکار قطع خواهد شد.

اگر دوباره به عنوان کاربر greenlight متصل شوید، همه چیز باید به طور عادی کار کند و باید بتوانید روی droplet دستورات را اجرا کنید. مانند زیر:

$ ssh greenlight@161.35.71.158
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-60-generic x86_64)

...

greenlight@greenlight-production:~$ whoami
greenlight

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

اول، بیایید بررسی کنیم که باینری migrate دانلود شده و در مسیر سیستم قرار دارد با اجرای آن با پرچم -version. اگر همه چیز درست باشد، باید شماره نسخه migrate مانند زیر چاپ شود:

greenlight@greenlight-production:~$ migrate -version
4.14.1  

بعد، بیایید تأیید کنیم که PostgreSQL در حال اجرا است و می‌توانیم با استفاده از DSN در متغیر محیطی GREENLIGHT_DB_DSN به آن متصل شویم:

greenlight@greenlight-production:~$ psql $GREENLIGHT_DB_DSN 
psql (14.6 (Ubuntu 14.6-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

greenlight=> exit

در نهایت، بیایید بررسی کنیم که Caddy با فراخوانی systemctl status caddy برای دیدن وضعیت سرویس پس‌زمینه Caddy اجرا می‌شود. در اینجا باید از sudo استفاده کنید تا این دستور را به عنوان root اجرا کنید.

greenlight@greenlight-production:~$ sudo systemctl status caddy
● caddy.service - Caddy
     Loaded: loaded (/lib/systemd/system/caddy.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-04-18 15:23:32 EDT; 37min ago
       Docs: https://caddyserver.com/docs/
   Main PID: 586 (caddy)
      Tasks: 7 (limit: 512)
     Memory: 37.6M
     CGroup: /system.slice/caddy.service
             └─586 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
...

باید ببینید که وضعیت سرویس Caddy active (running) است — که تأیید می‌کند Caddy با موفقیت کار می‌کند.

این بدان معناست که باید بتوانید مستقیماً در مرورگر وب از طریق http://<your_droplet_ip> به droplet خود مراجعه کنید و باید صفحه خوش‌آمدگویی Caddy زیر را ببینید.

20.02-01.png

اتصال به droplet

برای آسان‌تر کردن اتصال به droplet و اینکه مجبور نباشیم آدرس IP را به خاطر بسپاریم، بیایید به سرعت یک قاعده makefile برای مقداردهی اولیه اتصال SSH به droplet به عنوان کاربر greenlight اضافه کنیم. مانند زیر:

فایل: Makefile
...

# ==================================================================================== #
# Production
# ==================================================================================== #

production_host_ip = '161.35.71.158'

## production/connect: connect to the production server
.PHONY: production/connect
production/connect:
	ssh greenlight@${production_host_ip}

پس از اینکه این کار انجام شد، می‌توانید هر زمان که نیاز دارید با تایپ کردن make production/connect به droplet خود متصل شوید:

$ make production/connect 
ssh greenlight@'161.35.71.158'
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-65-generic x86_64)

...

greenlight@greenlight-production:~$ 

اطلاعات تکمیلی

تغییرات آتی در پیکربندی droplet

اگر نیاز به ایجاد تغییرات بیشتر در پیکربندی یا تنظیمات droplet خود دارید، می‌توانید یک اسکریپت اضافی remote/setup/02.sh ایجاد کنید و سپس آن را به شیوه زیر اجرا کنید:

$ rsync -rP --delete ./remote/setup greenlight@161.35.71.158:~
$ ssh -t greenlight@161.35.71.158 "sudo bash /home/greenlight/setup/02.sh"