Ubuntu sunucu ilk kurulum: Yeni kurulmuş bir Ubuntu sunucuda başlamak için 9 adım
Yeni bir sunucu aldığınızda, üzerine hizmet kurmadan önce Ubuntu sunucu ilk kurulumunu bir kez yaparsınız. DigitalOcean'da oluşturulan bir Ubuntu 24.04 sunucuya root olarak bağlanıp paket güncellemesinden sudo kullanıcısına, anahtarla girişe, güvenlik duvarına, saat dilimine, otomatik güvenlik güncellemelerine ve swap'e kadar sırayla ayarladık ve yeniden başlattıktan sonra da ayarların yerinde kaldığını doğruladık.
Aşağıdaki sonuç kutuları, komutların bu sırayla çalıştırılmasının çıktısıdır. Sunucu IP'si 203.0.113.10 örnek bir değerdir ve yeni oluşturulan normal kullanıcının adı deploy olarak belirlendi.
1️⃣ Ubuntu paket güncellemesi
Yeni oluşturulan bir sunucuda da kurulmayı bekleyen güncellemeler vardır. Paket listesini yeniden indirdikten sonra, gerçekten bir şey kurmadan önce neyin değişeceğini kontrol edin.
🔲 apt-get update
export DEBIAN_FRONTEND=noninteractiveAşağıdaki apt-get komutları bu değer önce ayarlandıktan sonra çalıştırıldı. Bu değer ayarlanınca paket kurulumu sırasında ayar soran pencereler açılmaz ve varsayılan yanıtlar uygulanır.
apt-get updateHit:1 http://mirrors.digitalocean.com/ubuntu noble InRelease
Hit:2 http://mirrors.digitalocean.com/ubuntu noble-updates InRelease
Hit:3 http://mirrors.digitalocean.com/ubuntu noble-backports InRelease
Hit:4 https://repos-droplet.digitalocean.com/apt/droplet-agent main InRelease
Hit:5 http://security.ubuntu.com/ubuntu noble-security InRelease
Reading package lists...🔲 apt-get -s upgrade
apt-get -s upgradeCalculating upgrade...
The following upgrades have been deferred due to phasing:
libsqlite3-0
The following packages will be upgraded:
apt apt-transport-https apt-utils bind9-dnsutils bind9-host bind9-libs
cloud-init distro-info-data gir1.2-glib-2.0 git git-man libapt-pkg6.0t64
libbrotli1 libglib2.0-0t64 libglib2.0-bin libglib2.0-data liblzma5
libmspack0t64 libpcre2-8-0 python3-jwt python3-twisted tmux
ubuntu-pro-client ubuntu-pro-client-l10n xz-utils zlib1g
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.-s seçeneği, hiçbir şey kurmadan yalnızca sonucu hesaplayan deneme çalıştırmasıdır. Bu sunucuda 26 paket yükseltilecekti ve libsqlite3-0 [deferred due to phasing] olarak bu yükseltmenin dışında kaldı. Paket sayısı, sunucunun oluşturulduğu zamana ve kullanılan imaja göre sunucudan sunucuya değişir.
🔲 apt-get -y upgrade
apt-get -y upgrade26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 15.4 MB of archives.
After this operation, 398 kB of additional disk space will be used.Kurulum bittikten sonra yeniden başlatılan hizmetlerin listesi gelir.
Running kernel seems to be up-to-date.
Restarting services...
/etc/needrestart/restart.d/systemd-manager
systemctl restart cron.service fwupd.service multipathd.service packagekit.service polkit.service ssh.service systemd-journald.service systemd-networkd.service systemd-resolved.service systemd-timesyncd.service systemd-udevd.service udisks2.service
Service restarts being deferred:
systemctl restart ModemManager.service
/etc/needrestart/restart.d/dbus.service
systemctl restart systemd-logind.service
systemctl restart unattended-upgrades.serviceYeniden başlatma gerektiren bir güncelleme kurulduğunda /var/run/reboot-required dosyası oluşur. Bu sefer [Running kernel seems to be up-to-date.] çıktı ve dosya da oluşmadı, bu yüzden yeniden başlatmadan sonraki adıma geçtik.
2️⃣ Ubuntu kullanıcı ekleme ve sudo yetkisi
Günlük işler normal kullanıcıyla yapılır, yalnızca yönetim komutları sudo ile çalıştırılır. sudo, yetkiyi root parolası yerine kendi parolanızla yükselttiği için hangi komutu kimin çalıştırdığı kayıt altında kalır.
🔲 adduser deploy
adduser deployinfo: Adding user `deploy' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `deploy' (1000) ...
info: Adding new user `deploy' (1000) with group `deploy (1000)' ...
info: Creating home directory `/home/deploy' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for deploy
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
info: Adding new user `deploy' to supplemental / extra groups `users' ...
info: Adding user `deploy' to group `users' ...adduser, useradd komutunu saran bir araçtır; ev klasörünü ve grubu oluşturduktan sonra parolayı ve kullanıcı bilgilerini sırayla sorar. Parola yazarken ekranda görünmez, ad ve telefon numarası gibi bilgileri Enter ile boş bırakabilirsiniz.
🔲 usermod -aG sudo deploy
usermod -aG sudo deploygroups deploydeploy : deploy sudo users🔲 su
sudo grubundaki kullanıcılar yönetim komutlarını sudo ile çalıştırabilir. su ile deploy hesabına geçip yetkileri kontrol edin.
su - deployTo run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.whoamideploysudo whoami[sudo] password for deploy:
rootexitsudo eklendiğinde deploy'un parolası sorulur ve doğruysa komut root yetkisiyle çalışır.
3️⃣ Yeni kullanıcı için SSH anahtarını kaydetme
Başlangıçta yalnızca root için SSH anahtarı kayıtlı olduğundan deploy ile anahtarla giriş yapılamaz. root'un authorized_keys dosyasını deploy'un ev klasörüne kopyalayın.
🔲 install -o deploy -g deploy
install -d -m 700 -o deploy -g deploy /home/deploy/.sshinstall -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keysls -la /home/deploy/.sshtotal 12
drwx------ 2 deploy deploy 4096 Nov 5 11:48 .
drwxr-x--- 3 deploy deploy 4096 Nov 5 11:48 ..
-rw------- 1 deploy deploy 100 Nov 5 11:48 authorized_keysinstall, klasör oluşturmayı, kopyalamayı ve sahip ile izinleri belirlemeyi tek seferde yapar. sshd girişi kabul etmeden önce kullanıcı dosyalarının izinlerini ve sahibini denetlediği için (StrictModes) .ssh klasörünü 700, authorized_keys dosyasını 600 yapın.
🔲 ssh deploy@203.0.113.10
Şu an açık olan root penceresini kapatmayın; önce yeni bir terminal penceresinde deploy olarak bağlanabildiğinizi kontrol edin.
ssh deploy@203.0.113.10whoamideploy4️⃣ SSH root girişini engelleme
Ubuntu 24.04'te sshd_config dosyasının en üstündeki Include satırı önce /etc/ssh/sshd_config.d/ klasöründeki dosyaları yükler ve aynı ayar için ilk okunan değer uygulanır. Bu yüzden ayarı değiştirmeden önce şu an uygulanan değeri ve o değerin bulunduğu dosyayı kontrol edin.
/etc/ssh└─ sshd_config en üstte: Include /etc/ssh/sshd_config.d/*.conf ├─ ① sshd_config.d/50-cloud-init.conf PasswordAuthentication no ├─ ② sshd_config.d/60-cloudimg-settings.conf PasswordAuthentication no └─ ③ sshd_config 42. satır PermitRootLogin yes → no
🔲 sshd -T
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin yes
passwordauthentication nosudo grep -rn 'PasswordAuthentication' /etc/ssh/sshd_config.d//etc/ssh/sshd_config.d/60-cloudimg-settings.conf:1:PasswordAuthentication no
/etc/ssh/sshd_config.d/50-cloud-init.conf:1:PasswordAuthentication noParolayla giriş sshd_config.d içindeki iki dosyada zaten kapalıdır; değiştirilecek tek şey ana dosyadaki root girişi satırıdır.
🔲 sed -i PermitRootLogin
sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config42:PermitRootLogin yessudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_configsudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config42:PermitRootLogin no🔲 systemctl reload ssh
sudo sshd -tsudo systemctl reload sshsudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin no
passwordauthentication nosshd -t ayar sözdizimini denetler, hiçbir şey çıkmazsa hata yoktur. Yeniden okuttuktan sonra yeni pencerede deploy bağlantısının hâlâ çalıştığını doğrulayın, ardından root olarak bağlanıp reddedildiğini görün.
ssh root@203.0.113.10root@203.0.113.10: Permission denied (publickey).Anahtar doğru olsa da root olarak girilemez; yönetim işleri deploy olarak bağlanıp sudo ile yapılır.
5️⃣ Ubuntu güvenlik duvarı ufw
ufw, Ubuntu'nun varsayılan güvenlik duvarı aracıdır ama başlangıçta kapalıdır. Açıldığı anda izin verilmeyen bağlantılar engellendiği için önce SSH izin kuralını ekleyin ve en son açın.
sudo ufw status verboseStatus: inactive🔲 ufw allow OpenSSH
sudo ufw app listAvailable applications:
OpenSSHsudo ufw allow OpenSSHRules updated
Rules updated (v6)sudo ufw allow 80/tcpRules updated
Rules updated (v6)sudo ufw allow 443/tcpRules updated
Rules updated (v6)sudo ufw show addedAdded user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcpOpenSSH, 22 numaralı portu açan bir profildir; 80 ve 443 ise web sunucusunun kullandığı portlardır. Kurallar IPv4 ve IPv6 için birlikte eklenir.
🔲 ufw enable
sudo ufw enableCommand may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupsudo ufw status verboseStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6) Gelen bağlantılar varsayılan olarak engellenir, yalnızca izin verilen üç port açık olur ve güvenlik duvarı açılışta da etkinleşir. Açtıktan sonra yeni pencerede deploy olarak yeniden bağlanıp kural numaralarını kontrol edin.
sudo ufw status numberedStatus: active
To Action From
-- ------ ----
[ 1] OpenSSH ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] OpenSSH (v6) ALLOW IN Anywhere (v6)
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6) 6️⃣ Ubuntu saat dilimi ayarı
Başlangıçtaki saat dilimi Etc/UTC'dir. Günlüklerin ve zamanlanmış işlerin saatini sunucunun bölgesine uydurmak için Singapur bölgesinde oluşturulan bu sunucu Asia/Singapore olarak ayarlandı.
timedatectl Local time: Thu 2026-11-05 12:00:31 UTC
Universal time: Thu 2026-11-05 12:00:31 UTC
RTC time: Thu 2026-11-05 12:00:31
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no🔲 timedatectl list-timezones
timedatectl list-timezones | grep SingaporeAsia/Singapore🔲 timedatectl set-timezone
sudo timedatectl set-timezone Asia/Singaporetimedatectl Local time: Thu 2026-11-05 20:00:32 +08
Universal time: Thu 2026-11-05 12:00:32 UTC
RTC time: Thu 2026-11-05 12:00:32
Time zone: Asia/Singapore (+08, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: noYalnızca Local time ve Time zone satırları değişir; saat eşitlemesi (NTP) ve UTC saati aynı kalır.
7️⃣ unattended upgrades otomatik güvenlik güncellemeleri
Ubuntu güvenlik güncellemelerini unattended-upgrades paketiyle otomatik kurar ve bu paket baştan kurulu ve açıktır. Bu yüzden bu adımda açık olup olmadığını ve neyi otomatik kurduğunu kontrol edersiniz.
🔲 dpkg-query -W
dpkg-query -W unattended-upgradesunattended-upgrades 2.9.1+nmu4ubuntu1systemctl is-enabled unattended-upgrades apt-daily.timer apt-daily-upgrade.timerenabled
enabled
enabled🔲 cat 20auto-upgrades
cat /etc/apt/apt.conf.d/20auto-upgradesAPT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";İki değerdeki 1 günde bir kez demektir; 0 yapılırsa otomatik güncellemeler kapanır. Neyin kurulacağını 50unattended-upgrades dosyası belirler.
grep -vE '^[[:space:]]*(//|$)' /etc/apt/apt.conf.d/50unattended-upgradesUnattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::DevRelease "auto";İzin verilen kaynaklarda -security var ama -updates yok; bu yüzden normal güncellemeler otomatik kurulmaz, yalnızca güvenlik güncellemeleri kurulur. Normal güncellemeleri de otomatik almak için bu dosyada -updates satırının yorum işaretini kaldırın.
🔲 unattended-upgrade
sudo unattended-upgrade --dry-run --debugStarting unattended upgrades script
Allowed origins are: o=Ubuntu,a=noble, o=Ubuntu,a=noble-security, o=UbuntuESMApps,a=noble-apps-security, o=UbuntuESM,a=noble-infra-securityAynı çalıştırmanın son iki satırı.
No packages found that can be upgraded unattended and no pending auto-removals
The list of kept packages can't be calculated in dry-run mode.--dry-run hiçbir şey kurmadan yalnızca otomatik güncellemenin yapacağı işi hesaplar. Paket güncellemeleri zaten yapıldığı için otomatik kurulacak paket olmadığını gösterdi. Gerçek çalıştırmaların kayıtları /var/log/unattended-upgrades/ klasöründe tutulur.
sudo ls -l /var/log/unattended-upgrades/total 32
-rw-r--r-- 1 root root 0 Nov 5 20:00 unattended-upgrades-dpkg.log
-rw-r--r-- 1 root root 0 Nov 5 17:34 unattended-upgrades-shutdown.log
-rw-r--r-- 1 root root 29093 Nov 5 20:04 unattended-upgrades.log8️⃣ Ubuntu swap bellek ayarı
Bu sunucunun belleği 1GB ve başlangıçta swap 0'dır. Uygulama kurmadan önce 2GB'lık bir swap dosyası oluşturun ve yeniden başlatmadan sonra da açılması için /etc/fstab dosyasına kaydedin.
free -h total used free shared buff/cache available
Mem: 961Mi 328Mi 161Mi 4.0Mi 631Mi 633Mi
Swap: 0B 0B 0Bdf -h /Filesystem Size Used Avail Use% Mounted on
/dev/vda1 24G 2.0G 22G 9% /🔲 fallocate -l 2G /swapfile
sudo fallocate -l 2G /swapfilesudo chmod 600 /swapfilels -lh /swapfile-rw------- 1 root root 2.0G Nov 5 20:04 /swapfile🔲 mkswap /swapfile
sudo mkswap /swapfileSetting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=0b43ccd8-5b4a-4048-9b84-eee12667b387🔲 swapon /swapfile
sudo swapon /swapfileswapon --showNAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2free -h total used free shared buff/cache available
Mem: 961Mi 328Mi 160Mi 4.0Mi 632Mi 632Mi
Swap: 2.0Gi 0B 2.0Gi🔲 tee -a /etc/fstab
swapon yalnızca şu an açar; yeniden başlatmadan sonra da açık olması için fstab dosyasına bir satır ekleyin.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab/swapfile none swap sw 0 09️⃣ Ubuntu sunucu ilk kurulum kontrolü
Ayarların yeniden başlatmadan sonra da korunduğunu doğruladığınızda Ubuntu ilk kurulumu tamamlanır.
🔲 systemctl reboot
sudo systemctl reboot🔲 uptime -p
Yeniden başlattıktan sonra deploy olarak yeniden bağlanın.
uptime -pup 2 minutesswapon --showNAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin no
passwordauthentication nosudo ufw status verboseStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6) timedatectl | head -n 4 Local time: Thu 2026-11-05 20:06:35 +08
Universal time: Thu 2026-11-05 12:06:35 UTC
RTC time: Thu 2026-11-05 12:06:35
Time zone: Asia/Singapore (+08, +0800)systemctl is-active unattended-upgrades ssh.socketactive
activeSwap, SSH ayarları, güvenlik duvarı, saat dilimi ve otomatik güncellemeler yeniden başlatmadan öncekiyle aynı. Bu sunucuya sırada PM2 ve Nginx ile bir Node.js uygulaması kurulacak.
🔢 SSS & önerilen içerikler
SSH ayarları
SSH ayarları - /etc/ssh/sshd_config dosyasının işlevleri ve ayarları
PermitRootLogin dışında sshd_config içinde sık değiştirilen seçenekleri ve anlamlarını ele alan yazı.
Takas (swap)
Swap bellek (Swap Memory) ayarı: bölüm & dosya olmak üzere 2 yöntem
Swap dosyası yerine bölümle swap oluşturmayı ve swapon, mkswap komutlarını ele alan yazı.
Paketler
[Ubuntu] apt komutu | apt-get komutu kullanımı ve farkları
apt ile apt-get arasındaki farkı ve paket kurma, kaldırma komutlarını ele alan yazı.
ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.