Server Side Swift Deployment — One Approach
There are many ways to deploy Server Side Swift into production. Let’s explore the topic and go through an approach that is simple and easy to maintain 😊.
Platform as a Service (PaaS)
Cloud solutions provide platform as a service so we can use them to deploy our applications without dealing with infrastructures.
Examples of these platforms are
Google Cloud Platform (GCP) App Engine
GCP App Engine custom flexible environment is suitable to deploy Server Side Swift into the cloud.
Google App Engine lets developers build scalable web and mobile backends in any language on Google's infrastructure.cloud.google.com
Heroku build packs can be used to deploy Serve Side Swift into the cloud easily.
Perfect Heroku Buildpack
Perfect-Heroku-Buildpack - Swift + Perfect Buildpack for Herokugithub.com
Vapor Heroku Buildpack
Amazon Web Services (AWS) Elastic Beanstalk
Deploy & manage web applications in the AWS cloud. Upload your application, and Elastic Beanstalk handles capacity…aws.amazon.com
My preference would be the GCP App Engine because of its simplicity and pricing model.
Infrastructure as a Service (IaaS)
If you need more control over your environment and if you need to manage your own Virtual Machine (VM) then IaaS platforms are the solution.
Examples of these platforms are:
AWS Elastic Compute Cloud (EC2)
Cloud security at AWS is the highest priority. As an AWS customer, you will benefit from a data center and network…aws.amazon.com
GCP Compute Engine
☁️ Private Cloud
If you find the cloud platforms too expensive or you have other legislative requirements that stop you from using cloud platforms then you would need to either host your own server or use a hosting solution and manage your own VMs.
What if you could not decide which approach you should follow or you know that you may need to change the cloud platform.
Portability of Server Side Swift ❓💭
Is there any solution to deploy Server Side Swift that can minimize the migration and porting costs from one platform to another?
The answer as you already guessed is the Docker + nginx 💪.
Running the Server Side Swift in docker containers and using nginx as the reverse proxy is something that would work in most of platforms. Let’s see how we can achieve that.
Create docker images
The easiest way to do it, to use Perfect Assistant (PA). PA will create 2 docker files:
PADockerfile_buildto build a docker image, containing all dependencies
PADockerfile_deployto use the previously created built docker image and deploy the project.
So I use PA to build and deploy my project for Linux and create my own Dockerfiles from the ones created by PA. Unfortunately, PA doesn’t provide a CLI at this time so I need to do it manually. The rest of the process is automated using a bash script I share below:
echo "Update project to version "$1
docker build -f Dockerfile-build -t project-build .
docker build -f Dockerfile-deploy -t project-deploy .
docker tag project-deploy:latest your-docker-registry/project:$1
docker push your-docker-registry/project:$1
echo "Done updating project to version "$1
As you ca see in the script above, I use
Dockerfile-Deploy to create the image and push it to a Private Docker Registry or Cloud Container Registry (e.g. GCP Container Registry) so I can pull and run it anytime I want. You will find these files in upcoming subsections.
To run it, I need to execute the following command in a terminal:
sh project.sh 1.0.0
🚧 Dockerfile for building
Let’s check our
RUN apt-get -y update && apt-get install -y libmysqlclient-dev
RUN sed -i -e 's/-fabi-version=2 -fno-omit-frame-pointer//g' /usr/lib/x86_64-linux-gnu/pkgconfig/mysqlclient.pc
RUN apt-get -y update && apt-get install -y libssl-dev
RUN apt-get -y update && apt-get install -y libcurl4-openssl-dev
RUN apt-get -y update && apt-get install -y uuid-dev
RUN rm -rf /var/lib/apt/lists/*
RUN apt-get -y update && apt-get install -y vim
This is just an example and you will have different commands in it with different dependencies.
🚢 Dockerfile for deployment
In this step, previously built image will be used to deploy our project so here is our
COPY .build_lin/release/Project /perfect-deployed/project/
COPY webroot /perfect-deployed/project/webroot
COPY config /perfect-deployed/project/config
COPY resources /perfect-deployed/project/resources
RUN rm -rf /var/lib/apt/lists/*
CMD cd /perfect-deployed/project/ && ./Project
Definitely, you need to replace the
project with your project name.
Deploy and run the container
As the image already pushed to a docker registry, you can just pull and run it in your Server. Also, you can easily automate the pulling/running process using a CI tool such as Jenkins or using cloud deployment management tools such as AWS CloudFormation and GCP Deployment Manager.
You can follow this guide for serving it with NGINX:
There are many ways to deploy your Server Side Swift either with Docker or without it. This post explained one approach that may not be suitable for everyone and also there are a lot of things that can be improved but as it is, it’s portable and easy to maintain 😐.