Basic Server Setup Guide
Purpose: Prepare a Linux server (Amazon Linux or Ubuntu) with hostname, system packages, timezone, utilities, database clients, AWS CLI, and logging setup for applications.
1. Set Hostname
Amazon Linux / Ubuntu:
sudo hostnamectl set-hostname <your-hostname>
2. Update System Packages
Amazon Linux:
sudo yum update -y
Ubuntu:
sudo apt update && sudo apt upgrade -y
3. Set Timezone to IST
Amazon Linux / Ubuntu:
sudo timedatectl set-timezone Asia/Kolkata
4. Install Basic Utilities
Amazon Linux:
sudo yum install -y wget curl git unzip zip tar net-tools bind-utils htop tree vim
Ubuntu:
sudo apt install -y wget curl git unzip zip tar net-tools dnsutils htop tree vim
5. Enable SSH Key Authentication (for Jenkins or root access)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "<your-public-key>" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
6. Install Database Clients
Amazon Linux:
# MySQL client
sudo yum install -y mariadb
# PostgreSQL client
sudo amazon-linux-extras enable postgresql14
sudo yum install -y postgresql
# Verify
mysql --version
psql --version
Ubuntu:
# MySQL client
sudo apt install -y mysql-client
# PostgreSQL client
sudo apt install -y postgresql-client
# Verify
mysql --version
psql --version
7. Install AWS CLI (v2 recommended)
Amazon Linux / Ubuntu:
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
8. Set Up Systemd Service for Applications
Purpose: Run Python or Go apps as systemd services with persistent logging and automatic startup.
8.1 Create Service Unit File
Example: Python (FastAPI with uvicorn)
[Unit]
Description=<app-name> FastAPI Application
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/home/<app-name>
ExecStart=/home/<app-name>/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000
Restart=always
RestartSec=5
StandardOutput=append:/var/log/<app-name>/app.log
StandardError=append:/var/log/<app-name>/app.log
[Install]
WantedBy=multi-user.target
Example: Go Application
[Unit]
Description=<app-name> Go Application
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/home/<app-name>
ExecStart=/home/<app-name>/<app-name>-service
Restart=always
RestartSec=5
StandardOutput=append:/var/log/<app-name>/app.log
StandardError=append:/var/log/<app-name>/app.log
[Install]
WantedBy=multi-user.target
8.2 Register & Start Service
sudo systemctl daemon-reload
sudo systemctl enable <app-name>
sudo systemctl start <app-name>
sudo systemctl status <app-name>
8.3 Set Up Logging Directory
sudo mkdir -p /var/log/<app-name>
sudo chown root:root /var/log/<app-name>
8.4 Configure Log Rotation
Create /etc/logrotate.d/<app-name>
:
/var/log/<app-name>/app.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
copytruncate
dateext
dateformat -%Y-%m-%d
}
Note on
copytruncate
: Ensures Fluent Bit (or any tailing agent) continues reading logs without interruption.
8.5 Force Log Rotation (Testing)
sudo logrotate -f /etc/logrotate.d/<app-name>
ls -lh /var/log/<app-name>/
app.log
→ fresh, current logapp.log-YYYY-MM-DD.gz
→ rotated & compressed
8.6 View Logs
tail -f /var/log/<app-name>/app.log
✅ Logs are written to /var/log/<app-name>/app.log
, rotated daily, and services start automatically on reboot.
9. Set Up Fluent Bit for Log Collection (to Kibana / S3)
Install Fluent Bit:
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
Configure /etc/fluent-bit/fluent-bit.conf
(example):
[SERVICE]
Flush 60
Daemon Off
Log_Level info
Parsers_File parsers.conf
storage.path /var/lib/fluent-bit/storage
storage.sync normal
storage.backlog.mem_limit 128M
[INPUT]
Name systemd
Tag <app-name>
Systemd_Filter
Read_From_Tail On
DB /var/lib/fluent-bit/systemd-<app-name>.db
_SYSTEMD_UNIT=<app-name>.service
[FILTER]
Name modify
Match <app-name>
Rename MESSAGE log
Remove_regex ^(?!log$).*
[OUTPUT] # S3
Name s3
Match <app-name>
bucket example-co-in-aws-application-logs
region ap-south-1
total_file_size 50M
upload_timeout 1m
store_dir /var/lib/fluent-bit/s3
s3_key_format /application-logs/<app-name>-prod/$TAG/%Y/%m/%d/%H/<app-name>-$UUID.json
upload_chunk_size 5M
use_put_object On
content_type application/json
[OUTPUT] # Logstash
Name forward
Match <app-name>
Host <logstash-hostname-or-ip>
Port 5044
# tls settings if needed
# tls On
# tls.verify Off
# tls.ca_file /etc/ssl/certs/ca-bundle.crt
10. Set Up Logstash to Receive Logs
Example /etc/logstash/conf.d/<app-name>.conf
:
input {
tcp {
port 5001 # Use available port
codec json
tags ["app-name"]
}
}
output {
if "app-name" in [tags] {
elasticsearch {
hosts => ["https://localhost:9200"]
user => "elastic"
password => "your-password"
ssl_certificate_verification => false
index => "app-name-%{+YYYY.MM.dd}"
}
}
}
Important Notes:
- Logstash domain usually works internally in VPC (
logstash.internal.example.co.in
). - If Kibana is in another VPC, allow ports (e.g., 5003) via VPC peering.
✅ Outcome:
- Server is fully configured with hostname, packages, timezone, utilities, database clients, AWS CLI.
- Applications run as systemd services with persistent logging.
- Fluent Bit collects logs and forwards them to S3 and Logstash/Kibana reliably.