پیکربندی سرور و نصب نرمافزار
اکنون که droplet لینوکس Ubuntu ما با موفقیت راهاندازی شده است، باید اقداماتی را برای ایمنسازی سرور و آمادهسازی آن برای استفاده انجام دهیم. به جای انجام دستی این کارها، در این فصل یک اسکریپت قابل استفاده مجدد برای خودکارسازی این وظایف راهاندازی ایجاد خواهیم کرد.
در سطح بالا، میخواهیم اسکریپت راهاندازی ما کارهای زیر را انجام دهد:
بهروزرسانی تمام پکیجها روی سرور، از جمله اعمال بهروزرسانیهای امنیتی.
تنظیم منطقه زمانی سرور (در مورد من آن را روی
Europe/Berlinتنظیم میکنم) و نصب پشتیبانی از تمام locales.ایجاد یک کاربر
greenlightروی سرور، که میتوانیم از آن برای نگهداری روزانه و اجرای برنامه API خود استفاده کنیم (به جای استفاده از حساب کاربریrootبا دسترسی کامل). همچنین باید کاربرgreenlightرا به گروهsudoاضافه کنیم تا در صورت لزوم بتواند اقدامات را به عنوانrootانجام دهد.کپی کردن پوشه
$HOME/.sshکاربرrootبه پوشه خانه کاربرgreenlight. این کار به ما امکان میدهد با استفاده از همان کلید SSH که برای احراز هویت به عنوان کاربرrootاستفاده کردیم، به عنوان کاربرgreenlightاحراز هویت کنیم. همچنین باید کاربرgreenlightرا مجبور کنیم اولین بار که وارد میشود رمز عبور جدیدی تنظیم کند.پیکربندی تنظیمات فایروال برای مجاز دانستن ترافیک فقط در پورتهای
22(SSH)،80(HTTP) و443(HTTPS). همچنین fail2ban را نصب خواهیم کرد تا در صورت تعداد زیاد تلاشهای ناموفق ورود SSH، به طور خودکار یک آدرس IP را به طور موقت مسدود کند.نصب PostgreSQL. همچنین دیتابیس
greenlightو کاربر آن را ایجاد کرده و یک متغیر محیطی سراسریGREENLIGHT_DB_DSNبرای اتصال به دیتابیس ایجاد خواهیم کرد.نصب ابزار
migrate، با استفاده از باینرهای از پیش ساخته شده از GitHub، دقیقاً به همان روشی که قبلاً در کتاب انجام دادیم.نصب Caddy با پیروی از دستورالعملهای رسمی نصب برای Ubuntu.
راهاندازی مجدد droplet.
اگر در حال دنبال کردن مراحل هستید، یک پوشه جدید remote/setup در پروژه خود ایجاد کنید و یک فایل اسکریپت به نام 01.sh به آن اضافه کنید، مانند زیر:
$ mkdir -p remote/setup $ touch 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 خود اجرا کنیم. این یک فرآیند دو مرحلهای خواهد بود:
- اول باید اسکریپت را به droplet کپی کنیم (که با استفاده از
rsyncانجام خواهیم داد). - سپس باید از طریق 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 زیر را ببینید.
اتصال به droplet
برای آسانتر کردن اتصال به droplet و اینکه مجبور نباشیم آدرس IP را به خاطر بسپاریم، بیایید به سرعت یک قاعده makefile برای مقداردهی اولیه اتصال SSH به droplet به عنوان کاربر greenlight اضافه کنیم. مانند زیر:
... # ==================================================================================== # # 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"