VPS Learning Log
Serverless or Virtual Private Servers (VPS)? I've had a hard time choosing between the two. Since I have a good grasp on serverless, I spend the last few days learning about VPS. The post below is a brain-dump of what I've learned for future reference.
Linux Basics
When you setup a VPS, you'll usually have a Linux distribution installed (e.g. Ubuntu) and a few goodies like git, docker, etc. Here are some basic commands to navigate the server via the terminal:
Secure Shell (SSH) Login
ssh keygen
- generate a public and private key pairssh root@server_ip
- connect to the server
The public key is stored on the server and the private key is stored on the local machine in the default .ssh/
directory.
Basic Linux Commands
ls
- list the files in the directory-l
flag to show long format-a
flag to show all files including hidden ones-R
flag to show recursively files in subdirectories
mkdir
- create a directoryrm
- remove a filerm -r
- remove a directory and its contents recursivelyrmdir
- remove an empty directorycd ..
- go up one directorycd /
- go to the root directory
FTP Login on Hetzner (FileZilla)
- Open FileZilla and press Ctrl + S to open Site Manager.
- Configure the connection:
- Protocol: SFTP
- Host: IP address (e.g., 49.12.205.120)
- User: root
- Set up the private key:
- Click "Browse" next to "Key file" and show all the files
- Select the private key that was generated from
ssh-keygen
- Then accept the prompt to convert the key to PuTTY format
- Set a password to protect the converted file
- Keyfile location: Should then point to a
.ppk
file
- Finally click "Connect" to establish the connection
Docker Basics
Keywords
- Dockerfile: A text file containing instructions to build a Docker image. Each instruction creates a layer in the image.
- Docker Image: The output from building a Dockerfile. It's a read-only template with instructions for creating a Docker container.
- Docker Container: A runnable instance of an image that encapsulates an application and its environment isolated from other containers and the host system.
- Volume: Persist data generated by and used by Docker containers. They can be shared and reused among containers and exists outside the lifecycle of a container.
- Docker Compose: Tool for defining and running multi-container Docker applications. Every service defined in the compose file will be run in a separate container.
Docker Commands
docker ps
- list running containersdocker ps -a
- show all containers, including stopped onesdocker inspect <container name>
- get detailed information about a containerdocker images
- list all Docker imagesdocker images -q
- list image IDsdocker rmi $(docker images -q)
- remove all imagesdocker volume ls
- list all volumesdocker volume inspect <volume_name>
- inspect a specific volume
Docker Compose Commands
docker-compose up
- build and start containersdocker-compose up -d
- build and start containers in detached modedocker-compose -f docker-compose.dev.yml up
- build and start using a specific compose filedocker-compose down
- stop and remove containersdocker-compose down -v
- stop and remove containers and volumesdocker-compose exec <service name> <command>
- execute a command in a specific containerdocker-compose logs <service name>
- view logs for a specific containerdocker-compose build
- build the imagesdocker-compose build --no-cache
- build the images without using cache
Containerized PostgreSQL
Accessing the Database in a Container
Open a shell in the container using the following command:
docker exec -it <container_name> bash
From within the container, the PostgreSQL command line interface is available. So you can connect to the database using:
psql -U <username> <database_name>
The username and database name are defined in the docker-compose.yml
file.
docker-compose.yml
file, you need to rebuild the image using docker-compose down -v
and docker-compose up
.
Useful PostgreSQL Commands
\l
- list databases\dt
- list tables in the current database\du
- list users\dt
- list tables in the current database\q
- quit the PostgreSQL command line interface
Notes on Localhost
- Localhost refers to the local machine you are using. It is a hostname that resolves to the IP address
127.0.0.1
, which is the loopback address for your computer. This means you are trying to access a service running on your own machine. - The
:3000
specifies the port number on which the service is listening. In the context of a web application, this is the port where the web server (in my case, a Next.js application) is running. - When you enter
localhost:3000
in your browser, the browser sends an HTTP request to the web server running on your local machine at port 3000. - If you have a Docker container running your Next.js application and you mapped port 3000 of the container to port 3000 of your host (using the
-p 3000:3000
option), the request will be routed to the application running inside the Docker container.
Miscellaneous
- In a docker compose environment, services can communicate with each other using their service names. For example,
db
will resolve to the the IP address of the container running the database service. - Always make sure to rebuild the docker image if you make changes to the docker compose file.
- For local connections, PostgreSQL won't ask for a password because it's configured with "trust" authentication, as indicated by the warning message during initialization.